@redocly/cli
Version:
[@Redocly](https://redocly.com) CLI is your all-in-one API documentation utility. It builds, manages, improves, and quality-checks your API descriptions, all of which comes in handy for various phases of the API Lifecycle. Create your own rulesets to make
64 lines • 3.16 kB
JavaScript
import { resourceFromAttributes } 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 './package.js';
import { OTEL_TRACES_URL, DEFAULT_FETCH_TIMEOUT } from './constants.js';
import { ulid } from 'ulid';
export class OtelServerTelemetry {
constructor() {
this.nodeTracerProvider = new NodeTracerProvider({
resource: resourceFromAttributes({
[ATTR_SERVICE_NAME]: `redocly-cli`,
[ATTR_SERVICE_VERSION]: `@redocly/cli@${version}`,
session_id: `ses_${ulid()}`,
}),
spanProcessors: [
new SimpleSpanProcessor(new OTLPTraceExporter({
url: OTEL_TRACES_URL,
headers: {},
timeoutMillis: DEFAULT_FETCH_TIMEOUT,
})),
],
});
}
send(cloudEvent) {
const time = cloudEvent.time ? new Date(cloudEvent.time) : new Date();
const tracer = this.nodeTracerProvider.getTracer('CliTelemetry');
const spanName = `event.${cloudEvent.data.command}`;
const attributes = {
'cloudevents.event_id': cloudEvent.id,
'cloudevents.event_type': cloudEvent.type,
'cloudevents.event_source': cloudEvent.source,
'cloudevents.event_spec_version': cloudEvent.specversion,
'cloudevents.productType': cloudEvent.productType,
'cloudevents.event_data_content_type': cloudEvent.datacontenttype || 'application/json; charset=utf-8',
'cloudevents.event_time': time.toISOString(),
'cloudevents.event_version': '1.0.0',
'cloudevents.origin': cloudEvent.origin,
'cloudevents.project.id': '',
'cloudevents.project.slug': '',
'cloudevents.organization.id': '',
'cloudevents.organization.slug': '',
'cloudevents.event_origin': cloudEvent.productType,
'cloudevents.event_source_details.id': cloudEvent.sourceDetails?.id ?? `ann_${ulid()}`,
'cloudevents.event_source_details.object': cloudEvent.sourceDetails?.object ?? 'anonymous',
'cloudevents.event_source_details.uri': cloudEvent.sourceDetails?.uri ?? '',
'cloudevents.event_data.os_platform': cloudEvent.os_platform,
'cloudevents.event_data.environment': cloudEvent.environment,
};
for (const [key, value] of Object.entries(cloudEvent.data)) {
const keySnakeCase = key.replace(/([A-Z])/g, '_$1').toLowerCase();
if (value !== undefined) {
attributes[`cloudevents.event_data.${keySnakeCase}`] = value;
}
}
const span = tracer.startSpan(spanName, {
attributes,
startTime: time,
});
span.end(time);
}
}
export const otelTelemetry = new OtelServerTelemetry();
//# sourceMappingURL=otel.js.map