add opentelemetr logging

This commit is contained in:
Peter Maquiran
2024-07-22 13:28:52 +01:00
parent cd1c61fe86
commit f4589aa96e
12 changed files with 243 additions and 55 deletions
@@ -0,0 +1,26 @@
import { Injectable } from "@angular/core";
import { v4 as uuidv4 } from 'uuid';
import { WebSocketGraylogService } from "../socket/socket";
import { Span } from "@opentelemetry/sdk-trace-web";
export class OpenTelemetryLogging {
socket = new WebSocketGraylogService()
constructor() {
this.socket.start()
}
send(data: Object & { type: string; payload: any, spanContext:any }): void {
this.socket.send({
type: data.type,
payload: data.payload,
requestId: uuidv4(),
spanContext: data.spanContext
});
}
}
export const openTelemetryLogging = new OpenTelemetryLogging()
@@ -3,6 +3,7 @@ import { WebTracerProvider } from '@opentelemetry/sdk-trace-web';
import { ZipkinExporter } from '@opentelemetry/exporter-zipkin';
import { SemanticResourceAttributes } from '@opentelemetry/semantic-conventions'
import { Resource } from '@opentelemetry/resources';
import { context, trace, propagation } from '@opentelemetry/api';
function createProvider(serviceName) {
const provider = new WebTracerProvider({
@@ -32,3 +33,55 @@ export const OpentelemetryAgendaProvider = createProvider('FO-agenda-service');
export const OpentelemetryNotificationProvider = createProvider('FO-notification');
export const OpentelemetryInterceptorProvider = createProvider('FO-interceptor');
export const OpentelemetryPublicationProvider = createProvider('FO-publication-service');
export const OpentelemetryLogging = createProvider('logging');
const tracerInstance = OpentelemetryAgendaProvider.getTracer('example-tracer-hole', '111', {})
function parentSpanExample() {
// Create a tracer instance
const tracer = trace.getTracer('FO-chat-service');
// Start a parent span
const parentSpan = tracer.startSpan('parent-span');
parentSpan.setAttribute('key', 'value')
const traceId = parentSpan.spanContext().traceId;
const spanId = parentSpan.spanContext().spanId;
parentSpan.end(); // End the parent span
const spanContext = {
traceId: traceId,
spanId: spanId,
traceFlags: 1 // 1 means the trace is sampled
};
// Create a new context with the parent span
const parentContext = trace.setSpan(context.active(), parentSpan);
const parentContext1 = trace.setSpan(context.active(), trace.wrapSpanContext(spanContext));
// Start a new child span
const childSpan = tracer.startSpan('child-span1', {root: false}, parentContext1);
childSpan.end();
// Simulate some work
setTimeout(() => {
childSpanExample(parentContext); // Pass the context to child span
}, 500);
}
function childSpanExample(parentContext) {
// Create a new child span with the parent context
const tracer = trace.getTracer('FO-chat-service');
const childSpan = tracer.startSpan('child-span', undefined, parentContext);
// Simulate some work
setTimeout(() => {
childSpan.end(); // End the child span
}, 500);
}
parentSpanExample()
@@ -1,11 +1,12 @@
import { v4 as uuidv4 } from 'uuid';
import { SemanticAttributes } from '@opentelemetry/semantic-conventions';
import { Tracer, Span } from '@opentelemetry/sdk-trace-base';
import { OpentelemetryAgendaProvider, OpentelemetryInterceptorProvider, OpentelemetryNotificationProvider } from './opentelemetry';
import { OpentelemetryAgendaProvider, OpentelemetryInterceptorProvider, OpentelemetryLogging, OpentelemetryNotificationProvider } from './opentelemetry';
import { Device, DeviceInfo } from '@capacitor/device';
import { SessionStore } from 'src/app/store/session.service';
import { environment } from 'src/environments/environment';
import { UseCaseCounter } from './matrix';
import { openTelemetryLogging } from './logging';
// import { context, propagation } from '@opentelemetry/api';
const tracerInstance = OpentelemetryAgendaProvider.getTracer('example-tracer-hole', '111', {})
@@ -18,6 +19,25 @@ Device.getInfo().then(e => {
device = e
});
function convertAttributesToString(obj) {
const result = {};
for (const key in obj) {
if (obj.hasOwnProperty(key)) {
if (typeof obj[key] === 'object' && obj[key] !== null) {
// Convert only the object attribute to string
result[key] = JSON.stringify(obj[key], null, 2);
} else {
// Convert primitive values to string
result[key] = String(obj[key]);
}
}
}
return result;
}
const createTracingInstance = ({bugPrint, name, module, autoFinish}): TracingType => {
const requestId = uuidv4()
@@ -30,7 +50,6 @@ const createTracingInstance = ({bugPrint, name, module, autoFinish}): TracingTyp
}
const span = _tracerInstance.startSpan(name);
let hasBug:Boolean
const data = {
event: {},
@@ -63,6 +82,28 @@ const createTracingInstance = ({bugPrint, name, module, autoFinish}): TracingTyp
span.setAttribute('error', 'true')
}
},
log(message: string, data: Object) {
const spanId = span.spanContext().spanId;
const _tracer = OpentelemetryLogging.getTracer('logging')
const spanContext = _tracer.startSpan(name)
data = convertAttributesToString(data)
openTelemetryLogging.send({
type: 'graylog',
spanContext,
payload: {
message: message,
object: {
...data,
spanId,
name,
user: SessionStore?.user?.FullName,
device_name: device?.name || device?.model,
commit_date: environment.version.lastCommitTime,
}
}
})
},
getAttribute: (key: string) => {
return data.tags[key]
},
@@ -76,9 +117,7 @@ const createTracingInstance = ({bugPrint, name, module, autoFinish}): TracingTyp
console.error(name, data)
}
},
bugFlag:() => {
hasBug = true
},
bugFlag:() => {},
createSpan: (name, parent?: any) => {
return tracerInstance.startSpan(name, { root: false }, parent) as Span;
}
@@ -176,7 +215,7 @@ export type TracingType = {
attributes: typeof SemanticAttributes;
// axios: (config?: AxiosRequestConfig) => AxiosInstance;
setStatus: (status: any) => void;
//logEvent: (name: string, attributesOrStartTime?: AttributeValue | TimeInput) => void;
log: (message: string, data: Object) => void;
addEvent: (context: string, message?: any, obj?: any) => void;
setAttribute: (key: string, value: string) => void;
getAttribute: (key: string) => string;