@redocly/cli
Version:
[@Redocly](https://redocly.com) CLI is your all-in-one OpenAPI utility. It builds, manages, improves, and quality-checks your OpenAPI descriptions, all of which comes in handy for various phases of the API Lifecycle. Create your own rulesets to make API g
60 lines (51 loc) • 1.95 kB
text/typescript
import { trace } from '@opentelemetry/api';
import { Resource as OtelResource } from '@opentelemetry/resources';
import { NodeTracerProvider, SimpleSpanProcessor } from '@opentelemetry/sdk-trace-node';
import { OTLPTraceExporter } from '@opentelemetry/exporter-trace-otlp-http';
import { ATTR_SERVICE_NAME, ATTR_SERVICE_VERSION } from '@opentelemetry/semantic-conventions';
import { version } from './utils/update-version-notifier';
import { DEFAULT_FETCH_TIMEOUT } from './utils/fetch-with-timeout';
import type { Analytics } from './utils/miscellaneous';
type Events = {
[key: string]: Analytics;
};
const OTEL_TRACES_URL = process.env.OTEL_TRACES_URL || 'https://otel.cloud.redocly.com/v1/traces';
export class OtelServerTelemetry {
init() {
const nodeTracerProvider = new NodeTracerProvider({
resource: new OtelResource({
[ATTR_SERVICE_NAME]: `redocly-cli`,
[ATTR_SERVICE_VERSION]: `@redocly/cli@${version}`,
}),
});
nodeTracerProvider.addSpanProcessor(
new SimpleSpanProcessor(
new OTLPTraceExporter({
url: OTEL_TRACES_URL,
headers: {},
timeoutMillis: DEFAULT_FETCH_TIMEOUT,
})
)
);
nodeTracerProvider.register();
}
send<K extends keyof Events>(event: K, data: Events[K]): void {
const time = new Date();
const eventId = crypto.randomUUID();
const span = trace.getTracer('CliTelemetry').startSpan(`event.${event}`, {
attributes: {
'cloudevents.event_client.id': eventId,
'cloudevents.event_client.type': event,
},
startTime: time,
});
for (const [key, value] of Object.entries(data)) {
const keySnakeCase = key.replace(/([A-Z])/g, '_$1').toLowerCase();
if (value !== undefined) {
span.setAttribute(`cloudevents.event_data.${keySnakeCase}`, value);
}
}
span.end(time);
}
}
export const otelTelemetry = new OtelServerTelemetry();