Files
element-call/src/otel/otel.ts
T

110 lines
3.5 KiB
TypeScript
Raw Normal View History

2023-03-16 14:41:55 +00:00
/*
Copyright 2023, 2024 New Vector Ltd.
2023-03-16 14:41:55 +00:00
SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial
Please see LICENSE in the repository root for full details.
2023-03-16 14:41:55 +00:00
*/
2023-04-24 19:52:56 +01:00
import { SimpleSpanProcessor } from "@opentelemetry/sdk-trace-base";
import { OTLPTraceExporter } from "@opentelemetry/exporter-trace-otlp-http";
import { WebTracerProvider } from "@opentelemetry/sdk-trace-web";
import opentelemetry, { type Tracer } from "@opentelemetry/api";
import { Resource } from "@opentelemetry/resources";
import { SemanticResourceAttributes } from "@opentelemetry/semantic-conventions";
import { logger } from "matrix-js-sdk/src/logger";
2023-04-12 18:14:59 -04:00
import { PosthogSpanProcessor } from "../analytics/PosthogSpanProcessor";
import { Config } from "../config/Config";
2023-04-12 17:07:18 -04:00
import { RageshakeSpanProcessor } from "../analytics/RageshakeSpanProcessor";
2023-03-29 12:28:04 +01:00
const SERVICE_NAME = "element-call";
let sharedInstance: ElementCallOpenTelemetry;
export class ElementCallOpenTelemetry {
private _provider: WebTracerProvider;
private _tracer: Tracer;
2023-06-30 16:43:28 +01:00
private otlpExporter?: OTLPTraceExporter;
2023-04-12 17:07:18 -04:00
public readonly rageshakeProcessor?: RageshakeSpanProcessor;
2023-09-22 18:05:13 -04:00
public static globalInit(): void {
2023-04-11 01:09:52 -04:00
const config = Config.get();
// we always enable opentelemetry in general. We only enable the OTLP
// collector if a URL is defined (and in future if another setting is defined)
// Posthog reporting is enabled or disabled
// within the posthog code.
2023-04-11 01:09:52 -04:00
const shouldEnableOtlp = Boolean(config.opentelemetry?.collector_url);
if (!sharedInstance || sharedInstance.isOtlpEnabled !== shouldEnableOtlp) {
logger.info("(Re)starting OpenTelemetry debug reporting");
sharedInstance?.dispose();
sharedInstance = new ElementCallOpenTelemetry(
2023-04-11 01:09:52 -04:00
config.opentelemetry?.collector_url,
2023-10-11 10:42:04 -04:00
config.rageshake?.submit_url,
);
}
2023-03-22 12:41:33 +00:00
}
2023-09-22 18:05:13 -04:00
public static get instance(): ElementCallOpenTelemetry {
return sharedInstance;
}
2023-09-22 18:05:13 -04:00
private constructor(
2023-04-11 01:09:52 -04:00
collectorUrl: string | undefined,
2023-10-11 10:42:04 -04:00
rageshakeUrl: string | undefined,
2023-04-11 01:09:52 -04:00
) {
2023-04-27 14:00:27 +02:00
// This is how we can make Jaeger show a reasonable service in the dropdown on the left.
const providerConfig = {
resource: new Resource({
2023-03-29 12:28:04 +01:00
[SemanticResourceAttributes.SERVICE_NAME]: SERVICE_NAME,
}),
};
this._provider = new WebTracerProvider(providerConfig);
if (collectorUrl) {
logger.info("Enabling OTLP collector with URL " + collectorUrl);
2023-04-11 01:09:52 -04:00
this.otlpExporter = new OTLPTraceExporter({
url: collectorUrl,
});
this._provider.addSpanProcessor(
2023-10-11 10:42:04 -04:00
new SimpleSpanProcessor(this.otlpExporter),
);
} else {
logger.info("OTLP collector disabled");
}
2023-04-11 01:09:52 -04:00
if (rageshakeUrl) {
2023-04-12 17:07:18 -04:00
this.rageshakeProcessor = new RageshakeSpanProcessor();
this._provider.addSpanProcessor(this.rageshakeProcessor);
2023-04-11 01:09:52 -04:00
}
2023-04-12 18:14:59 -04:00
this._provider.addSpanProcessor(new PosthogSpanProcessor());
opentelemetry.trace.setGlobalTracerProvider(this._provider);
this._tracer = opentelemetry.trace.getTracer(
// This is not the serviceName shown in jaeger
2023-10-11 10:42:04 -04:00
"my-element-call-otl-tracer",
);
}
public dispose(): void {
2023-06-30 16:43:28 +01:00
opentelemetry.trace.disable();
this._provider?.shutdown().catch((e) => {
logger.error("Failed to shutdown OpenTelemetry", e);
});
}
public get isOtlpEnabled(): boolean {
2023-04-11 01:09:52 -04:00
return Boolean(this.otlpExporter);
}
public get tracer(): Tracer {
return this._tracer;
}
public get provider(): WebTracerProvider {
return this._provider;
}
}