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

118 lines
3.7 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
*/
2025-05-28 16:50:03 -04:00
import {
SimpleSpanProcessor,
type SpanProcessor,
} 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";
2025-05-28 16:50:03 -04:00
import { resourceFromAttributes } from "@opentelemetry/resources";
import { ATTR_SERVICE_NAME } from "@opentelemetry/semantic-conventions";
2025-03-13 13:58:43 +01:00
import { logger } from "matrix-js-sdk/lib/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";
import { getRageshakeSubmitUrl } from "../settings/submit-rageshake";
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 {
// this is only supported in the full package as the is currently no support for passing in the collector URL from the widget host
const collectorUrl =
import.meta.env.VITE_PACKAGE === "full"
? Config.get().opentelemetry?.collector_url
: undefined;
// 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.
const shouldEnableOtlp = Boolean(collectorUrl);
if (!sharedInstance || sharedInstance.isOtlpEnabled !== shouldEnableOtlp) {
logger.info("(Re)starting OpenTelemetry debug reporting");
sharedInstance?.dispose();
sharedInstance = new ElementCallOpenTelemetry(
collectorUrl,
getRageshakeSubmitUrl(),
);
}
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
) {
2025-05-28 16:50:03 -04:00
const spanProcessors: SpanProcessor[] = [];
if (collectorUrl) {
logger.info("Enabling OTLP collector with URL " + collectorUrl);
2023-04-11 01:09:52 -04:00
this.otlpExporter = new OTLPTraceExporter({
url: collectorUrl,
});
2025-05-28 16:50:03 -04:00
spanProcessors.push(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();
2025-05-28 16:50:03 -04:00
spanProcessors.push(this.rageshakeProcessor);
2023-04-11 01:09:52 -04:00
}
2025-05-28 16:50:03 -04:00
spanProcessors.push(new PosthogSpanProcessor());
2025-05-28 16:50:03 -04:00
this._provider = new WebTracerProvider({
resource: resourceFromAttributes({
// This is how we can make Jaeger show a reasonable service in the dropdown on the left.
[ATTR_SERVICE_NAME]: SERVICE_NAME,
}),
spanProcessors,
});
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;
}
}