HTTP instrumentation for Tempo
Note
The source code for this library can be found in the grafana/jslib.k6.io GitHub repository.
The http-instrumentation-tempo
module allows you to instrument HTTP requests so that they emit traces as the test runs. Use it to include a tracing context in HTTP requests, which can then be used by a tracing backend such as Grafana Tempo.
Migration from k6/experimental/tracing
This jslib is a drop in replacement, so all you need to migrate to it is to replace 'k6/experimental/tracing'
import with 'https://jslib.k6.io/http-instrumentation-tempo/1.0.0/index.js'
About trace contexts
A trace context is a set of standardized HTTP headers added to a request that lets a tracing system correlate it with other requests as they navigate through a system. The trace context specifications, such as the supported W3C Trace Context and Jaeger Trace Context, define specific header names and an encoding format for the header values.
A trace context generally consists of, at least, a trace_id
, a span_id
, and a sampled
flag. The trace_id
is a unique identifier for the trace, the span_id
is a unique identifier for the request, and the sampled
flag is a boolean that indicates whether the request should be traced. For instance, the W3C Trace Context defines the Traceparent
header, whose value contains a trace_id
, a span_id
and a sampled
flag, encoded as a dash (-
) separated list of hexadecimal values. When a trace context header is attached to an HTTP request, we refer to it as being propagated to the downstream service.
API
Class/Function | Description |
---|---|
instrumentHTTP | Instruments the k6 http module with tracing capabilities. |
Client | A configurable client that exposes instrumented HTTP operations and allows selectively instrumenting requests with tracing. |
Example
This example demonstrates how to use the tracing API to instrument every HTTP request made in a script with tracing information.
import { check } from 'k6';
import tempo from 'https://jslib.k6.io/http-instrumentation-tempo/1.0.0/index.js';
import http from 'k6/http';
// instrumentHTTP will ensure that all requests made by the http module
// from this point forward will have a trace context attached.
//
// The first argument is a configuration object that
// can be used to configure the tracer.
tempo.instrumentHTTP({
// possible values: "w3c", "jaeger"
propagator: 'w3c',
});
export default () => {
// the instrumentHTTP call in the init context replaced
// the http module with a version that will automatically
// attach a trace context to every request.
//
// Because the instrumentHTTP call was configured with the
// w3c trace propagator, this request will as a result have
// a `traceparent` header attached.
const res = http.get('http://httpbin.org/get', {
headers: {
'X-Example-Header': 'instrumented/get',
},
});
};