import { ClientRequest, IncomingMessage, ServerResponse } from "http";
import * as opentracing from "opentracing";
import { SpanOptions } from "opentracing/lib/tracer";
export { SpanOptions };
/**
* Tracer is the entry-point of the Datadog tracing implementation.
*/
export declare interface Tracer extends opentracing.Tracer {
/**
* Starts and returns a new Span representing a logical unit of work.
* @param {string} name The name of the operation.
* @param {SpanOptions} [options] Options for the newly created span.
* @returns {Span} A new Span object.
*/
startSpan(name: string, options?: SpanOptions): Span;
/**
* Injects the given SpanContext instance for cross-process propagation
* within `carrier`
* @param {SpanContext} spanContext The SpanContext to inject into the
* carrier object. As a convenience, a Span instance may be passed
* in instead (in which case its .context() is used for the
* inject()).
* @param {string} format The format of the carrier.
* @param {any} carrier The carrier object.
*/
inject(spanContext: SpanContext | Span, format: string, carrier: any): void;
/**
* Returns a SpanContext instance extracted from `carrier` in the given
* `format`.
* @param {string} format The format of the carrier.
* @param {any} carrier The carrier object.
* @return {SpanContext}
* The extracted SpanContext, or null if no such SpanContext could
* be found in `carrier`
*/
extract(format: string, carrier: any): SpanContext | null;
/**
* Initializes the tracer. This should be called before importing other libraries.
*/
init(options?: TracerOptions): this;
/**
* Enable and optionally configure a plugin.
* @param plugin The name of a built-in plugin.
* @param config Configuration options. Can also be `false` to disable the plugin.
*/
use
(plugin: P, config?: Plugins[P] | boolean): this;
/**
* Returns a reference to the current scope.
*/
scope(): Scope;
/**
* Instruments a function by automatically creating a span activated on its
* scope.
*
* The span will automatically be finished when one of these conditions is
* met:
*
* * The function returns a promise, in which case the span will finish when
* the promise is resolved or rejected.
* * The function takes a callback as its second parameter, in which case the
* span will finish when that callback is called.
* * The function doesn't accept a callback and doesn't return a promise, in
* which case the span will finish at the end of the function execution.
*/
trace(name: string, fn: (span?: Span, fn?: (error?: Error) => any) => T): T;
trace(name: string, options: TraceOptions & SpanOptions, fn: (span?: Span, done?: (error?: Error) => string) => T): T;
/**
* Wrap a function to automatically create a span activated on its
* scope when it's called.
*
* The span will automatically be finished when one of these conditions is
* met:
*
* * The function returns a promise, in which case the span will finish when
* the promise is resolved or rejected.
* * The function takes a callback as its last parameter, in which case the
* span will finish when that callback is called.
* * The function doesn't accept a callback and doesn't return a promise, in
* which case the span will finish at the end of the function execution.
*/
wrap any>(name: string, fn: T): T;
wrap any>(name: string, options: TraceOptions & SpanOptions, fn: T): T;
}
export declare interface TraceOptions {
/**
* The resource you are tracing. The resource name must not be longer than
* 5000 characters.
*/
resource?: string,
/**
* The service you are tracing. The service name must not be longer than
* 100 characters.
*/
service?: string,
/**
* The type of request.
*/
type?: string,
/**
* Set the sample rate for Trace Analytics. Setting to `true` or `false` will
* set the rate to `1` and `0` respectively.
*/
analytics?: boolean | number
}
/**
* Span represents a logical unit of work as part of a broader Trace.
* Examples of span might include remote procedure calls or a in-process
* function calls to sub-components. A Trace has a single, top-level "root"
* Span that in turn may have zero or more child Spans, which in turn may
* have children.
*/
export declare interface Span extends opentracing.Span {
context(): SpanContext;
}
/**
* SpanContext represents Span state that must propagate to descendant Spans
* and across process boundaries.
*
* SpanContext is logically divided into two pieces: the user-level "Baggage"
* (see setBaggageItem and getBaggageItem) that propagates across Span
* boundaries and any Tracer-implementation-specific fields that are needed to
* identify or otherwise contextualize the associated Span instance (e.g., a
* tuple).
*/
export declare interface SpanContext extends opentracing.SpanContext {
/**
* Returns the string representation of the internal trace ID.
*/
toTraceId(): string;
/**
* Returns the string representation of the internal span ID.
*/
toSpanId(): string;
}
/**
* List of options available to the tracer.
*/
export declare interface TracerOptions {
/**
* Whether to enable the tracer.
* @default true
*/
enabled?: boolean;
/**
* Enable debug logging in the tracer.
* @default false
*/
debug?: boolean;
/**
* Whether to enable trace ID injection in log records to be able to correlate
* traces with logs.
* @default false
*/
logInjection?: boolean,
/**
* Enable Trace Analytics.
* @default false
*/
analytics?: boolean;
/**
* The service name to be used for this program. If not set, the service name
* will attempted to be inferred from package.json
*/
service?: string;
/**
* The url of the trace agent that the tracer will submit to.
* Takes priority over hostname and port, if set.
*/
url?: string;
/**
* The address of the trace agent that the tracer will submit to.
* @default 'localhost'
*/
hostname?: string;
/**
* The port of the trace agent that the tracer will submit to.
* @default 8126
*/
port?: number | string;
/**
* Options specific for the Dogstatsd agent.
*/
dogstatsd?: {
/**
* The port of the Dogstatsd agent that the metrics will submitted to.
* @default 8125
*/
port?: number
};
/**
* Set an application’s environment e.g. prod, pre-prod, stage.
*/
env?: string;
/**
* Percentage of spans to sample as a float between 0 and 1.
* @default 1
*/
sampleRate?: number;
/**
* Whether to enable runtime metrics.
* @default false
*/
runtimeMetrics?: boolean
/**
* Experimental features can be enabled all at once by using true or individually using key / value pairs.
* @default {}
*/
experimental?: boolean | {
b3?: boolean
};
/**
* Whether to load all built-in plugins.
* @default true
*/
plugins?: boolean;
/**
* Custom logger to be used by the tracer (if debug = true),
* should support debug() and error() methods
* see https://datadog.github.io/dd-trace-js/#custom-logging
*/
logger?: {
debug: (message: string) => void;
error: (err: Error | string) => void;
};
/**
* Global tags that should be assigned to every span.
*/
tags?: { [key: string]: any };
/**
* Specifies which scope implementation to use. The default is to use the best
* implementation for the runtime. Only change this if you know what you are
* doing.
*/
scope?: 'async_hooks' | 'async-listener' | 'noop'
}
/** @hidden */
interface EventEmitter {
emit(eventName: string | symbol, ...args: any[]): any;
on?(eventName: string | symbol, listener: (...args: any[]) => any): any;
off?(eventName: string | symbol, listener: (...args: any[]) => any): any;
addListener?(eventName: string | symbol, listener: (...args: any[]) => any): any;
removeListener?(eventName: string | symbol, listener: (...args: any[]) => any): any;
}
/**
* The Datadog Scope Manager. This is used for context propagation.
*/
export declare interface Scope {
/**
* Get the current active span or null if there is none.
*
* @returns {Span} The active span.
*/
active(): Span | null;
/**
* Activate a span in the scope of a function.
*
* @param {Span} span The span to activate.
* @param {Function} fn Function that will have the span activated on its scope.
* @returns The return value of the provided function.
*/
activate(span: Span, fn: ((...args: any[]) => T)): T;
/**
* Binds a target to the provided span, or the active span if omitted.
*
* @param {Function|Promise|EventEmitter} target Target that will have the span activated on its scope.
* @param {Span} [span=scope.active()] The span to activate.
* @returns The bound target.
*/
bind void>(fn: T, span?: Span | null): T;
bind V>(fn: T, span?: Span | null): T;
bind(fn: Promise, span?: Span | null): Promise;
bind(emitter: EventEmitter, span?: Span | null): EventEmitter;
}
/** @hidden */
interface Plugins {
"amqp10": plugins.amqp10;
"amqplib": plugins.amqplib;
"bluebird": plugins.bluebird;
"bunyan": plugins.bunyan;
"cassandra-driver": plugins.cassandra_driver;
"connect": plugins.connect;
"dns": plugins.dns;
"elasticsearch": plugins.elasticsearch;
"express": plugins.express;
"fastify": plugins.fastify;
"generic-pool": plugins.generic_pool;
"graphql": plugins.graphql;
"hapi": plugins.hapi;
"http": plugins.http;
"ioredis": plugins.ioredis;
"knex": plugins.knex;
"koa": plugins.koa;
"memcached": plugins.memcached;
"mongodb-core": plugins.mongodb_core;
"mysql": plugins.mysql;
"mysql2": plugins.mysql2;
"net": plugins.net;
"paperplane": plugins.paperplane;
"pg": plugins.pg;
"pino": plugins.pino;
"promise-js": plugins.promise_js;
"promise": plugins.promise;
"q": plugins.q;
"redis": plugins.redis;
"restify": plugins.restify;
"router": plugins.router;
"tedious": plugins.tedious;
"when": plugins.when;
"winston": plugins.winston;
}
declare namespace plugins {
/** @hidden */
interface Integration {
/**
* The service name to be used for this plugin.
*/
service?: string;
/** Whether to enable the plugin.
* @default true
*/
enabled?: boolean;
/**
* Trace Analytics configuration.
* @default false
*/
analytics?: boolean | {
/**
* Whether to enable Trace Analytics.
* @default false
*/
enabled?: boolean;
/**
* Global sample rate.
* @default 1
*/
sampleRate?: number;
/**
* Sample rate by operation name.
*
* For example:
*
* ```javascript
* sampleRates: {
* 'express.request': 0.1
* }
* ```
*/
sampleRates?: {
[key: string]: number;
}
};
}
/** @hidden */
interface Http extends Integration {
/**
* List of URLs that should be instrumented.
*
* @default /^.*$/
*/
whitelist?: string | RegExp | ((url: string) => boolean) | (string | RegExp | ((url: string) => boolean))[];
/**
* List of URLs that should not be instrumented. Takes precedence over
* whitelist if a URL matches an entry in both.
*
* @default []
*/
blacklist?: string | RegExp | ((url: string) => boolean) | (string | RegExp | ((url: string) => boolean))[];
/**
* An array of headers to include in the span metadata.
*
* @default []
*/
headers?: string[];
/**
* Callback function to determine if there was an error. It should take a
* status code as its only parameter and return `true` for success or `false`
* for errors.
*
* @default code => code < 500
*/
validateStatus?: (code: number) => boolean;
}
/** @hidden */
interface HttpServer extends Http {
/**
* Callback function to determine if there was an error. It should take a
* status code as its only parameter and return `true` for success or `false`
* for errors.
*
* @default code => code < 500
*/
validateStatus?: (code: number) => boolean;
/**
* Hooks to run before spans are finished.
*/
hooks?: {
/**
* Hook to execute just before the request span finishes.
*/
request?: (span?: opentracing.Span, req?: IncomingMessage, res?: ServerResponse) => any;
};
}
/** @hidden */
interface HttpClient extends Http {
/**
* Use the remote endpoint host as the service name instead of the default.
*
* @default false
*/
splitByDomain?: boolean;
/**
* Callback function to determine if there was an error. It should take a
* status code as its only parameter and return `true` for success or `false`
* for errors.
*
* @default code => code < 400
*/
validateStatus?: (code: number) => boolean;
/**
* Hooks to run before spans are finished.
*/
hooks?: {
/**
* Hook to execute just before the request span finishes.
*/
request?: (span?: opentracing.Span, req?: ClientRequest, res?: IncomingMessage) => any;
};
}
/**
* This plugin automatically instruments the
* [amqp10](https://github.com/noodlefrenzy/node-amqp10) module.
*/
interface amqp10 extends Integration {}
/**
* This plugin automatically instruments the
* [amqplib](https://github.com/squaremo/amqp.node) module.
*/
interface amqplib extends Integration {}
/**
* This plugin patches the [bluebird](https://github.com/squaremo/amqp.node)
* module to bind the promise callback the the caller context.
*/
interface bluebird extends Integration {}
/**
* This plugin patches the [bunyan](https://github.com/trentm/node-bunyan)
* to automatically inject trace identifiers in log records when the
* [logInjection](interfaces/traceroptions.html#logInjection) option is enabled
* on the tracer.
*/
interface bunyan extends Integration {}
/**
* This plugin automatically instruments the
* [cassandra-driver](https://github.com/datastax/nodejs-driver) module.
*/
interface cassandra_driver extends Integration {}
/**
* This plugin automatically instruments the
* [connect](https://github.com/senchalabs/connect) module.
*/
interface connect extends HttpServer {}
/**
* This plugin automatically instruments the
* [dns](https://nodejs.org/api/dns.html) module.
*/
interface dns extends Integration {}
/**
* This plugin automatically instruments the
* [elasticsearch](https://github.com/elastic/elasticsearch-js) module.
*/
interface elasticsearch extends Integration {}
/**
* This plugin automatically instruments the
* [express](http://expressjs.com/) module.
*/
interface express extends HttpServer {}
/**
* This plugin automatically instruments the
* [fastify](https://www.fastify.io/) module.
*/
interface fastify extends HttpServer {}
/**
* This plugin patches the [generic-pool](https://github.com/coopernurse/node-pool)
* module to bind the callbacks the the caller context.
*/
interface generic_pool extends Integration {}
/**
* This plugin automatically instruments the
* [graphql](https://github.com/graphql/graphql-js) module.
*
* The `graphql` integration uses the operation name as the span resource name.
* If no operation name is set, the resource name will always be just `query`,
* `mutation` or `subscription`.
*
* For example:
*
* ```graphql
* # good, the resource name will be `query HelloWorld`
* query HelloWorld {
* hello
* world
* }
*
* # bad, the resource name will be `query`
* {
* hello
* world
* }
* ```
*/
interface graphql extends Integration {
/**
* The maximum depth of fields/resolvers to instrument. Set to `0` to only
* instrument the operation or to `-1` to instrument all fields/resolvers.
*
* @default -1
*/
depth?: number;
/**
* An array of variable names to record. Can also be a callback that returns
* the key/value pairs to record. For example, using
* `variables => variables` would record all variables.
*/
variables?: string[] | ((variables: { [key: string]: any }) => { [key: string]: any });
/**
* Whether to collapse list items into a single element. (i.e. single
* `users.*.name` span instead of `users.0.name`, `users.1.name`, etc)
*
* @default true
*/
collapse?: boolean;
/**
* Whether to enable signature calculation for the resource name. This can
* be disabled if your GraphQL operations always have a name.
*
* @default true
*/
signature?: boolean;
}
/**
* This plugin automatically instruments the
* [hapi](https://hapijs.com/) module.
*/
interface hapi extends HttpServer {}
/**
* This plugin automatically instruments the
* [http](https://nodejs.org/api/http.html) module.
*
* By default any option set at the root will apply to both clients and
* servers. To configure only one or the other, use the `client` and `server`
* options.
*/
interface http extends HttpClient, HttpServer {
/**
* Configuration for HTTP clients.
*/
client?: HttpClient,
/**
* Configuration for HTTP servers.
*/
server?: HttpServer
/**
* Hooks to run before spans are finished.
*/
hooks?: {
/**
* Hook to execute just before the request span finishes.
*/
request?: (
span?: opentracing.Span,
req?: IncomingMessage | ClientRequest,
res?: ServerResponse | IncomingMessage
) => any;
};
}
/**
* This plugin automatically instruments the
* [ioredis](https://github.com/luin/ioredis) module.
*/
interface ioredis extends Integration {}
/**
* This plugin patches the [knex](https://knexjs.org/)
* module to bind the promise callback the the caller context.
*/
interface knex extends Integration {}
/**
* This plugin automatically instruments the
* [koa](https://koajs.com/) module.
*/
interface koa extends HttpServer {}
/**
* This plugin automatically instruments the
* [memcached](https://github.com/3rd-Eden/memcached) module.
*/
interface memcached extends Integration {}
/**
* This plugin automatically instruments the
* [mongodb-core](https://github.com/mongodb-js/mongodb-core) module.
*/
interface mongodb_core extends Integration {}
/**
* This plugin automatically instruments the
* [mysql](https://github.com/mysqljs/mysql) module.
*/
interface mysql extends Integration {}
/**
* This plugin automatically instruments the
* [mysql2](https://github.com/brianmario/mysql2) module.
*/
interface mysql2 extends Integration {}
/**
* This plugin automatically instruments the
* [net](https://nodejs.org/api/net.html) module.
*/
interface net extends Integration {}
/**
* This plugin automatically instruments the
* [paperplane](https://github.com/articulate/paperplane) module.
*/
interface paperplane extends HttpServer {}
/**
* This plugin automatically instruments the
* [pg](https://node-postgres.com/) module.
*/
interface pg extends Integration {}
/**
* This plugin patches the [pino](http://getpino.io)
* to automatically inject trace identifiers in log records when the
* [logInjection](interfaces/traceroptions.html#logInjection) option is enabled
* on the tracer.
*/
interface pino extends Integration {}
/**
* This plugin patches the [promise-js](https://github.com/kevincennis/promise)
* module to bind the promise callback the the caller context.
*/
interface promise_js extends Integration {}
/**
* This plugin patches the [promise](https://github.com/then/promise)
* module to bind the promise callback the the caller context.
*/
interface promise extends Integration {}
/**
* This plugin patches the [q](https://github.com/kriskowal/q)
* module to bind the promise callback the the caller context.
*/
interface q extends Integration {}
/**
* This plugin automatically instruments the
* [redis](https://github.com/NodeRedis/node_redis) module.
*/
interface redis extends Integration {}
/**
* This plugin automatically instruments the
* [restify](http://restify.com/) module.
*/
interface restify extends HttpServer {}
/**
* This plugin automatically instruments the
* [router](https://github.com/pillarjs/router) module.
*/
interface router extends Integration {}
/**
* This plugin automatically instruments the
* [tedious](https://github.com/tediousjs/tedious/) module.
*/
interface tedious extends Integration {}
/**
* This plugin patches the [when](https://github.com/cujojs/when)
* module to bind the promise callback the the caller context.
*/
interface when extends Integration {}
/**
* This plugin patches the [winston](https://github.com/winstonjs/winston)
* to automatically inject trace identifiers in log records when the
* [logInjection](interfaces/traceroptions.html#logInjection) option is enabled
* on the tracer.
*/
interface winston extends Integration {}
}
/**
* Singleton returned by the module. It has to be initialized before it will
* start tracing. If not initialized, or initialized and disabled, it will use
* a no-op implementation.
*/
export declare const tracer: Tracer;
export default tracer;