Skip to content

yob/buildkite-trace

Repository files navigation

buildkite-trace

If you want to get your build time under control, first you need to measure it.

This is a mini rack app that accepts buildkite webhooks and submits them to a datadog agent as traces.

The traces become available in the datadog web UI, and look something like this:

Build waterfall

The spans in the trace also generate metrics that can be used in dashboards and monitors:

Build chart

Usage

Begin by adding buildkite-trace to your Gemfile.

gem "buildite-trace"

Then create a config.ru file in the same directory, with the following content:

require 'buildkite-trace'
run Buildkite::Trace::App

Finally, run this:

bundle exec rackup

If you have an alternative method of running rack apps, that should work fine too. A popular option is puma - add it to your Gemfile (gem "puma"), and start the server with:

bundle exec puma

Deployment

The app should be deployed to a public webserver somewhere, with a domain name and (ideally) TLS enabled.

Once deployed, use the web UI on buildkite.com to send webhooks to:

https://yourdomain.example.com/events

In the webhook settings on buildkite.com, enable at least the following events:

  • build.finished
  • job.finished

The deployed service must have access to an instance of the datadog agent. Each time it receives a webhook from buildkite, it'll translate it into trace data that's sent to the datadog agent at http://<dd-agent-ip>:8126/

Configuration

There is only one configurable value at this stage - the IP or hostname of the datadog agent. To override the default (127.0.0.1) set the DATADOG_AGENT_HOST_IP ENV var.

Developing

I typically use docker to setup a consistent development. You can start a development server like this:

./auto/start

... and post sample webhooks to it:

curl -v --data @spec/fixtures/buildkite_job_finished.json http://127.0.0.1:9393/events
curl -v --data @spec/fixtures/buildkite_build_finished.json http://127.0.0.1:9393/events

You'll need to have a datadog agent listening for traces on http://127.0.0.1:8126, or you'll get a "Errno::ECONNREFUSED: Failed to open TCP connection to 127.0.0.1:8126" exception.

To run the tests:

./auto/test

About

A mini HTTP server that converts buildkite webhooks into datadog APM traces

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published