mirror of
https://code.equilibrium.co.ao/ITO/doneit-web.git
synced 2026-04-19 04:57:52 +00:00
merge chat
This commit is contained in:
@@ -12,18 +12,18 @@ export class OpenTelemetryLogging {
|
||||
constructor() {
|
||||
|
||||
if(environment.apiURL != 'https://gdqas-api.oapr.gov.ao/api/') {
|
||||
this.socket.start()
|
||||
// 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
|
||||
});
|
||||
// this.socket.send({
|
||||
// type: data.type,
|
||||
// payload: data.payload,
|
||||
// requestId: uuidv4(),
|
||||
// spanContext: data.spanContext
|
||||
// });
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
import { metrics } from '@opentelemetry/api';
|
||||
import { Histogram, metrics } from '@opentelemetry/api';
|
||||
import { OTLPMetricExporter } from '@opentelemetry/exporter-metrics-otlp-http';
|
||||
import { MeterProvider, PeriodicExportingMetricReader } from '@opentelemetry/sdk-metrics';
|
||||
import { Subject } from 'rxjs';
|
||||
@@ -10,34 +10,22 @@ const meterProvider = new MeterProvider();
|
||||
metrics.setGlobalMeterProvider(meterProvider);
|
||||
|
||||
if (window.location.protocol !== 'https:' && environment.apiURL != 'https://gdqas-api.oapr.gov.ao/api/') {
|
||||
const metricReader = new PeriodicExportingMetricReader({
|
||||
exporter: new OTLPMetricExporter({
|
||||
//url: 'https://5-180-182-151.cloud-xip.com:85/collector2/v1/metrics',
|
||||
url: 'https://185-229-224-75.cloud-xip.com:85/collector2/v1/metrics',
|
||||
//url: 'http://5-180-182-151.cloud-xip.com:4318/v1/metrics',
|
||||
//url: 'http://185-229-224-75.cloud-xip.com:4318/v1/metrics'
|
||||
// headers: {
|
||||
// 'Authorization': 'Basic ' + btoa('tabteste@006:tabteste@006'),
|
||||
// }
|
||||
}),
|
||||
exportIntervalMillis: 30000,
|
||||
});
|
||||
|
||||
meterProvider.addMetricReader(metricReader);
|
||||
|
||||
const subject = new Subject()
|
||||
|
||||
subject
|
||||
.pipe(
|
||||
throttleTime(5000) // 5000 milliseconds = 5 seconds
|
||||
)
|
||||
.subscribe(() => {
|
||||
metricReader.forceFlush().then(() => {
|
||||
console.log('Metrics exported');
|
||||
});
|
||||
});
|
||||
// const metricReader = new PeriodicExportingMetricReader({
|
||||
// exporter: new OTLPMetricExporter({
|
||||
// //url: 'https://5-180-182-151.cloud-xip.com:85/collector2/v1/metrics',
|
||||
// url: 'https://185-229-224-75.cloud-xip.com:85/collector2/v1/metrics',
|
||||
// //url: 'http://5-180-182-151.cloud-xip.com:4318/v1/metrics',
|
||||
// //url: 'http://185-229-224-75.cloud-xip.com:4318/v1/metrics'
|
||||
// // headers: {
|
||||
// // 'Authorization': 'Basic ' + btoa('tabteste@006:tabteste@006'),
|
||||
// // }
|
||||
// }),
|
||||
// exportIntervalMillis: 30000,
|
||||
// });
|
||||
|
||||
// meterProvider.addMetricReader(metricReader);
|
||||
}
|
||||
|
||||
export const meter = meterProvider.getMeter('example-exporter-collector');
|
||||
export const RequestCounter = meter.createCounter('post_requests', {
|
||||
description: 'Example of a Counter',
|
||||
@@ -46,3 +34,10 @@ export const RequestCounter = meter.createCounter('post_requests', {
|
||||
export const UseCaseCounter = meter.createCounter('use_case', {
|
||||
description: 'use case counter',
|
||||
});
|
||||
|
||||
|
||||
// Assuming `meter` is your initialized Meter instance
|
||||
export const useCaseDurationHistogram: Histogram = meter.createHistogram('use_case_duration', {
|
||||
description: 'Duration of use cases',
|
||||
unit: 'milliseconds',
|
||||
});
|
||||
|
||||
@@ -1,13 +1,9 @@
|
||||
import { ConsoleSpanExporter, SimpleSpanProcessor } from '@opentelemetry/sdk-trace-base';
|
||||
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 { OTLPTraceExporter } from '@opentelemetry/exporter-otlp-http';
|
||||
import { context, trace, propagation } from '@opentelemetry/api';
|
||||
import { OTLPTraceExporter } from '@opentelemetry/exporter-trace-otlp-http';
|
||||
// const { OTLPTraceExporter: OTLPTraceExporterProto } = require("@opentelemetry/exporter-trace-otlp-proto");
|
||||
|
||||
|
||||
function createProvider(serviceName) {
|
||||
const provider = new WebTracerProvider({
|
||||
|
||||
@@ -1,20 +1,19 @@
|
||||
import { v4 as uuidv4 } from 'uuid';
|
||||
import { SemanticAttributes } from '@opentelemetry/semantic-conventions';
|
||||
import { Tracer, Span } from '@opentelemetry/sdk-trace-base';
|
||||
import { OpentelemetryAgendaProvider, OpentelemetryInterceptorProvider, OpentelemetryLogging, OpentelemetryNotificationProvider } from './opentelemetry';
|
||||
import { OpentelemetryAgendaProvider, OpentelemetryChatProvider, 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 { UseCaseCounter, useCaseDurationHistogram } from './matrix';
|
||||
import { openTelemetryLogging } from './logging';
|
||||
// import { context, propagation } from '@opentelemetry/api';
|
||||
import {
|
||||
SpanStatus, SpanStatusCode
|
||||
} from '@opentelemetry/api';
|
||||
import { Logger } from '../../logger/main/service';
|
||||
const tracerInstance = OpentelemetryAgendaProvider.getTracer('example-tracer-hole', '111', {})
|
||||
const tracerNotificationInstance = OpentelemetryNotificationProvider.getTracer('example-tracer-hole', '111', {})
|
||||
// const logger: ILoggerAdapter = new ColoredLoggerService()
|
||||
|
||||
const tracerChat = OpentelemetryChatProvider.getTracer('OpentelemetryChatProvider','some' ,{})
|
||||
let device: DeviceInfo;
|
||||
|
||||
Device.getInfo().then(e => {
|
||||
@@ -40,17 +39,22 @@ function convertAttributesToString(obj) {
|
||||
}
|
||||
|
||||
|
||||
const createTracingInstance = ({bugPrint, name, module, autoFinish}): TracingType => {
|
||||
const requestId = uuidv4()
|
||||
const createTracingInstance = ({bugPrint, name, module, autoFinish, waitNThrow = 0}): TracingType => {
|
||||
|
||||
const startTime = Date.now();
|
||||
const requestId = uuidv4()
|
||||
let _tracerInstance:Tracer
|
||||
|
||||
if(module == 'notification') {
|
||||
_tracerInstance = tracerNotificationInstance
|
||||
} else if (module == 'chat') {
|
||||
_tracerInstance = tracerChat
|
||||
} else {
|
||||
_tracerInstance = tracerInstance
|
||||
}
|
||||
|
||||
let waitNThrowFunction: NodeJS.Timeout | undefined
|
||||
|
||||
const span = _tracerInstance.startSpan(name);
|
||||
let finish = false
|
||||
|
||||
@@ -58,10 +62,12 @@ const createTracingInstance = ({bugPrint, name, module, autoFinish}): TracingTyp
|
||||
event: {},
|
||||
tags: {},
|
||||
status: {} as any,
|
||||
logs:[]
|
||||
logs:[],
|
||||
errors: []
|
||||
}
|
||||
|
||||
const returnObject = {
|
||||
name,
|
||||
span: span as any,
|
||||
tracer: tracerInstance,
|
||||
tracerId: requestId,
|
||||
@@ -69,12 +75,10 @@ const createTracingInstance = ({bugPrint, name, module, autoFinish}): TracingTyp
|
||||
setStatus: (status: SpanStatus) => {
|
||||
span.setStatus(status);
|
||||
},
|
||||
addEvent: (context: string, message?: any, obj?: any) => {
|
||||
addEvent: (context: string, message: string = "") => {
|
||||
|
||||
data.event[context] = message;
|
||||
|
||||
const value = [JSON.stringify(message)] as any
|
||||
span.addEvent(context, value);
|
||||
span.addEvent(context, message as any);
|
||||
},
|
||||
LocalLogEvent:(context: string, message: any, obj: any) => {
|
||||
data.tags[context] = message;
|
||||
@@ -84,7 +88,9 @@ const createTracingInstance = ({bugPrint, name, module, autoFinish}): TracingTyp
|
||||
span.setAttribute(key, value);
|
||||
|
||||
if(key =='outcome' && value == 'failed') {
|
||||
returnObject.hasError('error')
|
||||
if(data.errors.length == 0) {
|
||||
returnObject.hasError('error')
|
||||
}
|
||||
if(!autoFinish) {
|
||||
returnObject.finish()
|
||||
}
|
||||
@@ -129,8 +135,13 @@ const createTracingInstance = ({bugPrint, name, module, autoFinish}): TracingTyp
|
||||
finish: () => {
|
||||
if(finish) return
|
||||
|
||||
if(waitNThrowFunction) {
|
||||
clearTimeout(waitNThrowFunction);
|
||||
}
|
||||
|
||||
if(environment.apiURL != 'https://gdqas-api.oapr.gov.ao/api/') {
|
||||
span.end();
|
||||
span.setAttribute('error.list', data.errors.join(','))
|
||||
// span.end();
|
||||
UseCaseCounter.add(1, {user: SessionStore?.user?.FullName, outcome:data.tags['outcome'] || data.status?.code , usecase: name})
|
||||
}
|
||||
|
||||
@@ -138,23 +149,36 @@ const createTracingInstance = ({bugPrint, name, module, autoFinish}): TracingTyp
|
||||
console.error(name, data)
|
||||
}
|
||||
|
||||
const duration = Date.now() - (startTime as unknown as number);
|
||||
useCaseDurationHistogram.record(duration, { use_case: name });
|
||||
useCaseDurationHistogram.record(duration, { use_case: name, user: SessionStore.user.UserName });
|
||||
|
||||
finish = true
|
||||
},
|
||||
hasError:(message: string) => {
|
||||
if(data.status?.code != SpanStatusCode.ERROR) {
|
||||
data.status = {code: SpanStatusCode.ERROR, message}
|
||||
span.setStatus({code: SpanStatusCode.ERROR, message})
|
||||
span.setAttribute('outcome','failed')
|
||||
}
|
||||
hasError:(message: string, obj:Object = {}) => {
|
||||
const spanId = span.spanContext().spanId;
|
||||
|
||||
data.errors.push(message)
|
||||
data.status = {code: SpanStatusCode.ERROR, message}
|
||||
span.setStatus({code: SpanStatusCode.ERROR, message})
|
||||
Logger.error(message, {...obj, spanId, name})
|
||||
},
|
||||
createSpan: (name, parent?: any) => {
|
||||
return tracerInstance.startSpan(name, { root: false }, parent) as Span;
|
||||
}
|
||||
}
|
||||
|
||||
if(waitNThrow > 0) {
|
||||
waitNThrowFunction = setTimeout(()=> {
|
||||
returnObject.hasError('waitNThrowFunction')
|
||||
returnObject.finish()
|
||||
}, waitNThrow)
|
||||
}
|
||||
|
||||
return returnObject
|
||||
}
|
||||
|
||||
export function XTracerAsync({ name, bugPrint, module = null, autoFinish = true, daley =0 }) {
|
||||
export function XTracerAsync({ name, bugPrint, module = null, autoFinish = true, daley =0, waitNThrow = 0 }) {
|
||||
return (
|
||||
target: unknown,
|
||||
propertyKey: string,
|
||||
@@ -164,7 +188,8 @@ export function XTracerAsync({ name, bugPrint, module = null, autoFinish = true,
|
||||
descriptor.value = async function (...args: unknown[]) {
|
||||
|
||||
|
||||
const tracing = createTracingInstance({bugPrint, name, module, autoFinish})
|
||||
|
||||
const tracing = createTracingInstance({bugPrint, name, module, autoFinish, waitNThrow})
|
||||
|
||||
tracing.setAttribute('User', SessionStore?.user?.FullName);
|
||||
tracing.setAttribute('current.page', window.location.pathname);
|
||||
@@ -185,6 +210,9 @@ export function XTracerAsync({ name, bugPrint, module = null, autoFinish = true,
|
||||
return result
|
||||
} catch (e) {
|
||||
tracing.setAttribute('catch', 'true')
|
||||
tracing.log("cath", {
|
||||
error: e
|
||||
})
|
||||
|
||||
if(autoFinish) {
|
||||
setTimeout(tracing.finish , daley)
|
||||
@@ -197,7 +225,7 @@ export function XTracerAsync({ name, bugPrint, module = null, autoFinish = true,
|
||||
}
|
||||
|
||||
|
||||
export function XTracer({ name, bugPrint, module, autoFinish = true, daley =0 }) {
|
||||
export function XTracer({ name, bugPrint, module, autoFinish = true, daley =0, waitNThrow =0 }) {
|
||||
return (
|
||||
target: unknown,
|
||||
propertyKey: string,
|
||||
@@ -206,7 +234,7 @@ export function XTracer({ name, bugPrint, module, autoFinish = true, daley =0 })
|
||||
const originalMethod = descriptor.value;
|
||||
descriptor.value = function (...args: unknown[]) {
|
||||
|
||||
const tracing = createTracingInstance({bugPrint, name, module, autoFinish})
|
||||
const tracing = createTracingInstance({bugPrint, name, module, autoFinish, waitNThrow})
|
||||
|
||||
tracing.setAttribute('User', SessionStore?.user?.FullName);
|
||||
tracing.setAttribute('current.page', window.location.pathname);
|
||||
@@ -227,6 +255,9 @@ export function XTracer({ name, bugPrint, module, autoFinish = true, daley =0 })
|
||||
} catch (e) {
|
||||
|
||||
tracing.setAttribute('catch', 'true')
|
||||
tracing.log("cath", {
|
||||
error: e
|
||||
})
|
||||
|
||||
if(autoFinish) {
|
||||
setTimeout(tracing.finish , daley)
|
||||
@@ -239,6 +270,7 @@ export function XTracer({ name, bugPrint, module, autoFinish = true, daley =0 })
|
||||
}
|
||||
|
||||
export type TracingType = {
|
||||
name: string,
|
||||
span: Span;
|
||||
tracer: Tracer;
|
||||
tracerId: string;
|
||||
@@ -251,7 +283,7 @@ export type TracingType = {
|
||||
getAttribute: (key: string) => string;
|
||||
LocalLogEvent: (name: string, attributesOrStartTime: any, obj?:any) => void;
|
||||
finish: () => void;
|
||||
hasError:(message: string) => void;
|
||||
hasError:(message: string, obj?: Object) => void;
|
||||
createSpan:(name, parent?: any) => Span;
|
||||
};
|
||||
|
||||
|
||||
Reference in New Issue
Block a user