Skip to main content

SLA Monitor Worker

This is the test runner portion of the SLA monitor/reporter. It performs tests (or any command you want) repeatedly, and publishes success/failure to an SNS topic for external processing (for example, using lambda to write to a custom cloudwatch metric), as well as optionally uploading logs to an S3 bucket.

TODO: Unit tests not working

Installing

To install simply install via pip

pip install --user sla-runner

Highly recommended is iam-docker run:

pip install --user iam-docker-run

This project assumes you are using role based authentication, as would be used in a production environment in AWS. This mimics that environment by running with an actual role.

Terraform

Excute the following in the root folder to run terraform. Obviously, have Terraform installed. Set the bucket and table variables to existing backend resources for remote state.

# pip install iam-starter
cd terraform
export AWS_ENV="dev"
export TF_DATA_DIR="./.$AWS_ENV-terraform/"
export AWS_DEFAULT_REGION="us-east-1"
export TF_STATE_REGION="us-east-1"
export TF_STATE_BUCKET="mycompany-tfstate-$AWS_ENV"
export TF_STATE_TABLE="tfstate_$AWS_ENV"

iam-starter \
    --profile $AWS_ENV \
    --command \
        "terraform init \
        -backend-config=\"region=$TF_STATE_REGION\" \
        -backend-config=\"bucket=$TF_STATE_BUCKET\" \
        -backend-config=\"dynamodb_table=$TF_STATE_TABLE\" && \
        terraform apply \
        -var \"aws_env=$AWS_ENV\" \
        -var \"aws_region=$AWS_DEFAULT_REGION\""

Using

Use iam-docker-run outside of AWS to run tests. In real life scenarios on ECS, instead install sla-runner via pypi in your service container, and set --image to the image of the service container which contains your test.

docker build -t sla-monitor/sla-runner:latest .

export AWS_ENV="dev"
iam-docker-run \
    -e SLARUNNER_COMMAND="/bin/bash /src/test-scripts/run-tests.sh" \
    -e SLARUNNER_SERVICE=example-service \
    -e SLARUNNER_GROUPS="dev-team,critical" \
    -e SLARUNNER_DELAY=30 \
    -e SLARUNNER_SNSTOPICNAME="sla-monitor-result-published-$AWS_ENV" \
    -e SLARUNNER_S3BUCKETNAME="sla-monitoring-logs-$AWS_ENV" \
    --full-entrypoint "sla-runner" \
    --region us-east-1 \
    --profile $AWS_ENV \
    --role sla-monitor-runner-role-$AWS_ENV \
    --image sla-monitor/sla-runner:latest

In ECS, add these as environment variables in the task definition or load from ssm via ssm-starter:

--full-entrypoint "ssm-starter --ssm-name slarunner --command 'sla-runner'"

Variables

The runner takes the following values which are provided by environment variable.

Global variables

When loading variables via SSM and ssm-starter, you can define default variables by adding a globals path before the service path.

For example, in your task definition in terraform:

    "entryPoint": ["ssm-starter"],
    "command": [
        "--ssm-name", "sla-monitor-globals",
        "--ssm-name", "${var.application}",
        "--command", "sla-runner" // or script that runs sla-runner
    ]

command

$SLARUNNER_COMMAND

Command to be run repeatedly. Pretty straightforward. If there is an interrupt, the runner will attempt to finish the command gracefully before exit.

service

$SLARUNNER_SERVICE

Name of the component service you're testing. This will be used as the prefix for s3 uploads, and will be passed in the JSON event as "service" to SNS.

groups

$SLARUNNER_GROUPS

Name of the grouping of components you're testing, in csv format. This will be passed in the JSON event as "groups" to SNS as a list, and is meant to provide secondary statistics if multiple services are part of the same component.

delay

$SLARUNNER_DELAY

How long to wait between commands being run in seconds.

disabled

$SLARUNNER_DISABLED

To disable sla-runner at startup.

sns-topic-arn

$SLARUNNER_SNSTOPICARN

SNS topic arn to publish results to. It will be published as a JSON object. For example, the command above would produce the following:

{
    "service": "example-service",
    "group": ["dev-team", "critical"],
    "succeeded": true,
    "timestamp": "1574515200",
    "testExecutionSecs": "914"
}

s3-bucket-name

$SLARUNNER_S3BUCKETNAME

Bucket to write logs to. This is an optional parameter. The object will be named as the timestamp followed by the result for easily searching by result, and will be prefixed by the service name. For example "example-service/1574514000_SUCCESS"

dry-run

$SLARUNNER_DRYRUN

If there is any value at all in this variable, the test will run once, output the sns topic it would publish to, the result message, the log output of the command, and the name of the object that would be written to the bucket. It will NOT publish to sns or write the object to s3. Only for testing purposes.

Development and Testing

docker build -t sla-runner:latest .
iam-docker-run \
    --image sla-runner:latest \
    --role sla-monitor-runner-role \
    --profile dev \
    --region us-east-1 \
    --host-source-path . \
    --container-source-path /src \
    --shell

Publishing Updates to PyPi

For the maintainer - to publish an updated version of ssm-search, increment the version number in version.py and run the following:

docker build -t sla-runner . &&
docker run --rm -it --entrypoint make sla-runner publish

At the prompts, enter the username and password to the pypi.org repo.

Metadata

Release files for sla-runner 0.0.21

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for sla-runner 0.0.21
File Size Uploaded Provenance
sla-runner-0.0.21.tar.gz 7.0 kB Without provenance Details

Release files / sla-runner-0.0.21.tar.gz

Download URL sla-runner-0.0.21.tar.gz
Size 7.0 kB
Tags Source
SHA-256 checksum
How to use checksums
1e789b5bbeffba14ec42d2415c79a349d54538f88d8b564bb9fcadbbcad9a6e4
BLAKE2b-256 checksum
How to use checksums
e69f34b1e159011925a92995f21475ccfcbd05d787a139a003c764c2f60064f1
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/3.4.2 importlib_metadata/4.8.1 pkginfo/1.7.1 requests/2.26.0 requests-toolbelt/0.9.1 tqdm/4.62.2 CPython/3.8.9

Security for sla-runner 0.0.21

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

No provenance found

None of the files in this release were uploaded with provenance metadata.

A note on package security

PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.

To learn more about protecting yourself from malicious actors, visit our package security documentation.

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page