diff --git a/gabinete-digital-fo.code-workspace b/gabinete-digital-fo.code-workspace
index d93990a04..ae4388414 100644
--- a/gabinete-digital-fo.code-workspace
+++ b/gabinete-digital-fo.code-workspace
@@ -7,7 +7,16 @@
"path": "../socket-server"
},
{
- "path": "../_________________"
+ "path": "../logs"
+ },
+ {
+ "path": "../../../Downloads/opentelemetry-js-main/opentelemetry-js-main"
+ },
+ {
+ "path": "../grayLog"
+ },
+ {
+ "path": "../../../Downloads/equilibriumito-gabinete-digital-fo-4f51cb55504b"
}
],
"settings": {
diff --git a/package-lock.json b/package-lock.json
index fea146ec4..be9f672a9 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -97,6 +97,13 @@
"@ngrx/store": "^10.1.2",
"@ngx-translate/core": "^13.0.0",
"@ngxs/store": "^3.8.2",
+ "@opentelemetry/exporter-metrics-otlp-http": "^0.52.1",
+ "@opentelemetry/exporter-zipkin": "^1.25.1",
+ "@opentelemetry/resources": "^1.25.1",
+ "@opentelemetry/sdk-metrics": "^1.25.1",
+ "@opentelemetry/sdk-trace-base": "^1.25.1",
+ "@opentelemetry/sdk-trace-web": "^1.25.1",
+ "@opentelemetry/semantic-conventions": "^1.25.1",
"@pdftron/pdfjs-express": "^8.0.1",
"@sentry/angular": "7.73.0",
"@sentry/capacitor": "^0.14.0",
@@ -7736,6 +7743,232 @@
"read-package-json-fast": "^2.0.1"
}
},
+ "node_modules/@opentelemetry/api": {
+ "version": "1.9.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/api/-/api-1.9.0.tgz",
+ "integrity": "sha512-3giAOQvZiH5F9bMlMiv8+GSPMeqg0dbaeo58/0SlA9sxSqZhnUtxzX9/2FzyhS9sWQf5S0GJE0AKBrFqjpeYcg==",
+ "engines": {
+ "node": ">=8.0.0"
+ }
+ },
+ "node_modules/@opentelemetry/api-logs": {
+ "version": "0.52.1",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/api-logs/-/api-logs-0.52.1.tgz",
+ "integrity": "sha512-qnSqB2DQ9TPP96dl8cDubDvrUyWc0/sK81xHTK8eSUspzDM3bsewX903qclQFvVhgStjRWdC5bLb3kQqMkfV5A==",
+ "dependencies": {
+ "@opentelemetry/api": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=14"
+ }
+ },
+ "node_modules/@opentelemetry/core": {
+ "version": "1.25.1",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-1.25.1.tgz",
+ "integrity": "sha512-GeT/l6rBYWVQ4XArluLVB6WWQ8flHbdb6r2FCHC3smtdOAbrJBIv35tpV/yp9bmYUJf+xmZpu9DRTIeJVhFbEQ==",
+ "dependencies": {
+ "@opentelemetry/semantic-conventions": "1.25.1"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": ">=1.0.0 <1.10.0"
+ }
+ },
+ "node_modules/@opentelemetry/exporter-metrics-otlp-http": {
+ "version": "0.52.1",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-metrics-otlp-http/-/exporter-metrics-otlp-http-0.52.1.tgz",
+ "integrity": "sha512-oAHPOy1sZi58bwqXaucd19F/v7+qE2EuVslQOEeLQT94CDuZJJ4tbWzx8DpYBTrOSzKqqrMtx9+PMxkrcbxOyQ==",
+ "dependencies": {
+ "@opentelemetry/core": "1.25.1",
+ "@opentelemetry/otlp-exporter-base": "0.52.1",
+ "@opentelemetry/otlp-transformer": "0.52.1",
+ "@opentelemetry/resources": "1.25.1",
+ "@opentelemetry/sdk-metrics": "1.25.1"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": "^1.3.0"
+ }
+ },
+ "node_modules/@opentelemetry/exporter-zipkin": {
+ "version": "1.25.1",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-zipkin/-/exporter-zipkin-1.25.1.tgz",
+ "integrity": "sha512-RmOwSvkimg7ETwJbUOPTMhJm9A9bG1U8s7Zo3ajDh4zM7eYcycQ0dM7FbLD6NXWbI2yj7UY4q8BKinKYBQksyw==",
+ "dependencies": {
+ "@opentelemetry/core": "1.25.1",
+ "@opentelemetry/resources": "1.25.1",
+ "@opentelemetry/sdk-trace-base": "1.25.1",
+ "@opentelemetry/semantic-conventions": "1.25.1"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": "^1.0.0"
+ }
+ },
+ "node_modules/@opentelemetry/otlp-exporter-base": {
+ "version": "0.52.1",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/otlp-exporter-base/-/otlp-exporter-base-0.52.1.tgz",
+ "integrity": "sha512-z175NXOtX5ihdlshtYBe5RpGeBoTXVCKPPLiQlD6FHvpM4Ch+p2B0yWKYSrBfLH24H9zjJiBdTrtD+hLlfnXEQ==",
+ "dependencies": {
+ "@opentelemetry/core": "1.25.1",
+ "@opentelemetry/otlp-transformer": "0.52.1"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": "^1.0.0"
+ }
+ },
+ "node_modules/@opentelemetry/otlp-transformer": {
+ "version": "0.52.1",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/otlp-transformer/-/otlp-transformer-0.52.1.tgz",
+ "integrity": "sha512-I88uCZSZZtVa0XniRqQWKbjAUm73I8tpEy/uJYPPYw5d7BRdVk0RfTBQw8kSUl01oVWEuqxLDa802222MYyWHg==",
+ "dependencies": {
+ "@opentelemetry/api-logs": "0.52.1",
+ "@opentelemetry/core": "1.25.1",
+ "@opentelemetry/resources": "1.25.1",
+ "@opentelemetry/sdk-logs": "0.52.1",
+ "@opentelemetry/sdk-metrics": "1.25.1",
+ "@opentelemetry/sdk-trace-base": "1.25.1",
+ "protobufjs": "^7.3.0"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": ">=1.3.0 <1.10.0"
+ }
+ },
+ "node_modules/@opentelemetry/otlp-transformer/node_modules/@types/node": {
+ "version": "20.14.10",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-20.14.10.tgz",
+ "integrity": "sha512-MdiXf+nDuMvY0gJKxyfZ7/6UFsETO7mGKF54MVD/ekJS6HdFtpZFBgrh6Pseu64XTb2MLyFPlbW6hj8HYRQNOQ==",
+ "dependencies": {
+ "undici-types": "~5.26.4"
+ }
+ },
+ "node_modules/@opentelemetry/otlp-transformer/node_modules/long": {
+ "version": "5.2.3",
+ "resolved": "https://registry.npmjs.org/long/-/long-5.2.3.tgz",
+ "integrity": "sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q=="
+ },
+ "node_modules/@opentelemetry/otlp-transformer/node_modules/protobufjs": {
+ "version": "7.3.2",
+ "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.3.2.tgz",
+ "integrity": "sha512-RXyHaACeqXeqAKGLDl68rQKbmObRsTIn4TYVUUug1KfS47YWCo5MacGITEryugIgZqORCvJWEk4l449POg5Txg==",
+ "hasInstallScript": true,
+ "dependencies": {
+ "@protobufjs/aspromise": "^1.1.2",
+ "@protobufjs/base64": "^1.1.2",
+ "@protobufjs/codegen": "^2.0.4",
+ "@protobufjs/eventemitter": "^1.1.0",
+ "@protobufjs/fetch": "^1.1.0",
+ "@protobufjs/float": "^1.0.2",
+ "@protobufjs/inquire": "^1.1.0",
+ "@protobufjs/path": "^1.1.2",
+ "@protobufjs/pool": "^1.1.0",
+ "@protobufjs/utf8": "^1.1.0",
+ "@types/node": ">=13.7.0",
+ "long": "^5.0.0"
+ },
+ "engines": {
+ "node": ">=12.0.0"
+ }
+ },
+ "node_modules/@opentelemetry/resources": {
+ "version": "1.25.1",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-1.25.1.tgz",
+ "integrity": "sha512-pkZT+iFYIZsVn6+GzM0kSX+u3MSLCY9md+lIJOoKl/P+gJFfxJte/60Usdp8Ce4rOs8GduUpSPNe1ddGyDT1sQ==",
+ "dependencies": {
+ "@opentelemetry/core": "1.25.1",
+ "@opentelemetry/semantic-conventions": "1.25.1"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": ">=1.0.0 <1.10.0"
+ }
+ },
+ "node_modules/@opentelemetry/sdk-logs": {
+ "version": "0.52.1",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-logs/-/sdk-logs-0.52.1.tgz",
+ "integrity": "sha512-MBYh+WcPPsN8YpRHRmK1Hsca9pVlyyKd4BxOC4SsgHACnl/bPp4Cri9hWhVm5+2tiQ9Zf4qSc1Jshw9tOLGWQA==",
+ "dependencies": {
+ "@opentelemetry/api-logs": "0.52.1",
+ "@opentelemetry/core": "1.25.1",
+ "@opentelemetry/resources": "1.25.1"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": ">=1.4.0 <1.10.0"
+ }
+ },
+ "node_modules/@opentelemetry/sdk-metrics": {
+ "version": "1.25.1",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-metrics/-/sdk-metrics-1.25.1.tgz",
+ "integrity": "sha512-9Mb7q5ioFL4E4dDrc4wC/A3NTHDat44v4I3p2pLPSxRvqUbDIQyMVr9uK+EU69+HWhlET1VaSrRzwdckWqY15Q==",
+ "dependencies": {
+ "@opentelemetry/core": "1.25.1",
+ "@opentelemetry/resources": "1.25.1",
+ "lodash.merge": "^4.6.2"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": ">=1.3.0 <1.10.0"
+ }
+ },
+ "node_modules/@opentelemetry/sdk-trace-base": {
+ "version": "1.25.1",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-trace-base/-/sdk-trace-base-1.25.1.tgz",
+ "integrity": "sha512-C8k4hnEbc5FamuZQ92nTOp8X/diCY56XUTnMiv9UTuJitCzaNNHAVsdm5+HLCdI8SLQsLWIrG38tddMxLVoftw==",
+ "dependencies": {
+ "@opentelemetry/core": "1.25.1",
+ "@opentelemetry/resources": "1.25.1",
+ "@opentelemetry/semantic-conventions": "1.25.1"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": ">=1.0.0 <1.10.0"
+ }
+ },
+ "node_modules/@opentelemetry/sdk-trace-web": {
+ "version": "1.25.1",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-trace-web/-/sdk-trace-web-1.25.1.tgz",
+ "integrity": "sha512-SS6JaSkHngcBCNdWGthzcvaKGRnDw2AeP57HyTEileLToJ7WLMeV+064iRlVyoT4+e77MRp2T2dDSrmaUyxoNg==",
+ "dependencies": {
+ "@opentelemetry/core": "1.25.1",
+ "@opentelemetry/sdk-trace-base": "1.25.1",
+ "@opentelemetry/semantic-conventions": "1.25.1"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": ">=1.0.0 <1.10.0"
+ }
+ },
+ "node_modules/@opentelemetry/semantic-conventions": {
+ "version": "1.25.1",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.25.1.tgz",
+ "integrity": "sha512-ZDjMJJQRlyk8A1KZFCc+bCbsyrn1wTwdNt56F7twdfUfnHUZUq77/WfONCj8p72NZOyP7pNTdUWSTYC3GTbuuQ==",
+ "engines": {
+ "node": ">=14"
+ }
+ },
"node_modules/@pdftron/pdfjs-express": {
"version": "8.1.0",
"resolved": "https://registry.npmjs.org/@pdftron/pdfjs-express/-/pdfjs-express-8.1.0.tgz",
@@ -26106,6 +26339,11 @@
"resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz",
"integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag=="
},
+ "node_modules/lodash.merge": {
+ "version": "4.6.2",
+ "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz",
+ "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ=="
+ },
"node_modules/lodash.once": {
"version": "4.1.1",
"resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz",
@@ -41629,6 +41867,11 @@
"resolved": "https://registry.npmjs.org/underscore/-/underscore-1.13.1.tgz",
"integrity": "sha512-hzSoAVtJF+3ZtiFX0VgfFPHEDRm7Y/QPjGyNo4TVdnDTdft3tr8hEkD25a1jC+TjTuE7tkHGKkhwCgs9dgBB2g=="
},
+ "node_modules/undici-types": {
+ "version": "5.26.5",
+ "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz",
+ "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA=="
+ },
"node_modules/unicode-canonical-property-names-ecmascript": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz",
@@ -49544,6 +49787,161 @@
"read-package-json-fast": "^2.0.1"
}
},
+ "@opentelemetry/api": {
+ "version": "1.9.0",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/api/-/api-1.9.0.tgz",
+ "integrity": "sha512-3giAOQvZiH5F9bMlMiv8+GSPMeqg0dbaeo58/0SlA9sxSqZhnUtxzX9/2FzyhS9sWQf5S0GJE0AKBrFqjpeYcg=="
+ },
+ "@opentelemetry/api-logs": {
+ "version": "0.52.1",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/api-logs/-/api-logs-0.52.1.tgz",
+ "integrity": "sha512-qnSqB2DQ9TPP96dl8cDubDvrUyWc0/sK81xHTK8eSUspzDM3bsewX903qclQFvVhgStjRWdC5bLb3kQqMkfV5A==",
+ "requires": {
+ "@opentelemetry/api": "^1.0.0"
+ }
+ },
+ "@opentelemetry/core": {
+ "version": "1.25.1",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-1.25.1.tgz",
+ "integrity": "sha512-GeT/l6rBYWVQ4XArluLVB6WWQ8flHbdb6r2FCHC3smtdOAbrJBIv35tpV/yp9bmYUJf+xmZpu9DRTIeJVhFbEQ==",
+ "requires": {
+ "@opentelemetry/semantic-conventions": "1.25.1"
+ }
+ },
+ "@opentelemetry/exporter-metrics-otlp-http": {
+ "version": "0.52.1",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-metrics-otlp-http/-/exporter-metrics-otlp-http-0.52.1.tgz",
+ "integrity": "sha512-oAHPOy1sZi58bwqXaucd19F/v7+qE2EuVslQOEeLQT94CDuZJJ4tbWzx8DpYBTrOSzKqqrMtx9+PMxkrcbxOyQ==",
+ "requires": {
+ "@opentelemetry/core": "1.25.1",
+ "@opentelemetry/otlp-exporter-base": "0.52.1",
+ "@opentelemetry/otlp-transformer": "0.52.1",
+ "@opentelemetry/resources": "1.25.1",
+ "@opentelemetry/sdk-metrics": "1.25.1"
+ }
+ },
+ "@opentelemetry/exporter-zipkin": {
+ "version": "1.25.1",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-zipkin/-/exporter-zipkin-1.25.1.tgz",
+ "integrity": "sha512-RmOwSvkimg7ETwJbUOPTMhJm9A9bG1U8s7Zo3ajDh4zM7eYcycQ0dM7FbLD6NXWbI2yj7UY4q8BKinKYBQksyw==",
+ "requires": {
+ "@opentelemetry/core": "1.25.1",
+ "@opentelemetry/resources": "1.25.1",
+ "@opentelemetry/sdk-trace-base": "1.25.1",
+ "@opentelemetry/semantic-conventions": "1.25.1"
+ }
+ },
+ "@opentelemetry/otlp-exporter-base": {
+ "version": "0.52.1",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/otlp-exporter-base/-/otlp-exporter-base-0.52.1.tgz",
+ "integrity": "sha512-z175NXOtX5ihdlshtYBe5RpGeBoTXVCKPPLiQlD6FHvpM4Ch+p2B0yWKYSrBfLH24H9zjJiBdTrtD+hLlfnXEQ==",
+ "requires": {
+ "@opentelemetry/core": "1.25.1",
+ "@opentelemetry/otlp-transformer": "0.52.1"
+ }
+ },
+ "@opentelemetry/otlp-transformer": {
+ "version": "0.52.1",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/otlp-transformer/-/otlp-transformer-0.52.1.tgz",
+ "integrity": "sha512-I88uCZSZZtVa0XniRqQWKbjAUm73I8tpEy/uJYPPYw5d7BRdVk0RfTBQw8kSUl01oVWEuqxLDa802222MYyWHg==",
+ "requires": {
+ "@opentelemetry/api-logs": "0.52.1",
+ "@opentelemetry/core": "1.25.1",
+ "@opentelemetry/resources": "1.25.1",
+ "@opentelemetry/sdk-logs": "0.52.1",
+ "@opentelemetry/sdk-metrics": "1.25.1",
+ "@opentelemetry/sdk-trace-base": "1.25.1",
+ "protobufjs": "^7.3.0"
+ },
+ "dependencies": {
+ "@types/node": {
+ "version": "20.14.10",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-20.14.10.tgz",
+ "integrity": "sha512-MdiXf+nDuMvY0gJKxyfZ7/6UFsETO7mGKF54MVD/ekJS6HdFtpZFBgrh6Pseu64XTb2MLyFPlbW6hj8HYRQNOQ==",
+ "requires": {
+ "undici-types": "~5.26.4"
+ }
+ },
+ "long": {
+ "version": "5.2.3",
+ "resolved": "https://registry.npmjs.org/long/-/long-5.2.3.tgz",
+ "integrity": "sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q=="
+ },
+ "protobufjs": {
+ "version": "7.3.2",
+ "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.3.2.tgz",
+ "integrity": "sha512-RXyHaACeqXeqAKGLDl68rQKbmObRsTIn4TYVUUug1KfS47YWCo5MacGITEryugIgZqORCvJWEk4l449POg5Txg==",
+ "requires": {
+ "@protobufjs/aspromise": "^1.1.2",
+ "@protobufjs/base64": "^1.1.2",
+ "@protobufjs/codegen": "^2.0.4",
+ "@protobufjs/eventemitter": "^1.1.0",
+ "@protobufjs/fetch": "^1.1.0",
+ "@protobufjs/float": "^1.0.2",
+ "@protobufjs/inquire": "^1.1.0",
+ "@protobufjs/path": "^1.1.2",
+ "@protobufjs/pool": "^1.1.0",
+ "@protobufjs/utf8": "^1.1.0",
+ "@types/node": ">=13.7.0",
+ "long": "^5.0.0"
+ }
+ }
+ }
+ },
+ "@opentelemetry/resources": {
+ "version": "1.25.1",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-1.25.1.tgz",
+ "integrity": "sha512-pkZT+iFYIZsVn6+GzM0kSX+u3MSLCY9md+lIJOoKl/P+gJFfxJte/60Usdp8Ce4rOs8GduUpSPNe1ddGyDT1sQ==",
+ "requires": {
+ "@opentelemetry/core": "1.25.1",
+ "@opentelemetry/semantic-conventions": "1.25.1"
+ }
+ },
+ "@opentelemetry/sdk-logs": {
+ "version": "0.52.1",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-logs/-/sdk-logs-0.52.1.tgz",
+ "integrity": "sha512-MBYh+WcPPsN8YpRHRmK1Hsca9pVlyyKd4BxOC4SsgHACnl/bPp4Cri9hWhVm5+2tiQ9Zf4qSc1Jshw9tOLGWQA==",
+ "requires": {
+ "@opentelemetry/api-logs": "0.52.1",
+ "@opentelemetry/core": "1.25.1",
+ "@opentelemetry/resources": "1.25.1"
+ }
+ },
+ "@opentelemetry/sdk-metrics": {
+ "version": "1.25.1",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-metrics/-/sdk-metrics-1.25.1.tgz",
+ "integrity": "sha512-9Mb7q5ioFL4E4dDrc4wC/A3NTHDat44v4I3p2pLPSxRvqUbDIQyMVr9uK+EU69+HWhlET1VaSrRzwdckWqY15Q==",
+ "requires": {
+ "@opentelemetry/core": "1.25.1",
+ "@opentelemetry/resources": "1.25.1",
+ "lodash.merge": "^4.6.2"
+ }
+ },
+ "@opentelemetry/sdk-trace-base": {
+ "version": "1.25.1",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-trace-base/-/sdk-trace-base-1.25.1.tgz",
+ "integrity": "sha512-C8k4hnEbc5FamuZQ92nTOp8X/diCY56XUTnMiv9UTuJitCzaNNHAVsdm5+HLCdI8SLQsLWIrG38tddMxLVoftw==",
+ "requires": {
+ "@opentelemetry/core": "1.25.1",
+ "@opentelemetry/resources": "1.25.1",
+ "@opentelemetry/semantic-conventions": "1.25.1"
+ }
+ },
+ "@opentelemetry/sdk-trace-web": {
+ "version": "1.25.1",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-trace-web/-/sdk-trace-web-1.25.1.tgz",
+ "integrity": "sha512-SS6JaSkHngcBCNdWGthzcvaKGRnDw2AeP57HyTEileLToJ7WLMeV+064iRlVyoT4+e77MRp2T2dDSrmaUyxoNg==",
+ "requires": {
+ "@opentelemetry/core": "1.25.1",
+ "@opentelemetry/sdk-trace-base": "1.25.1",
+ "@opentelemetry/semantic-conventions": "1.25.1"
+ }
+ },
+ "@opentelemetry/semantic-conventions": {
+ "version": "1.25.1",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.25.1.tgz",
+ "integrity": "sha512-ZDjMJJQRlyk8A1KZFCc+bCbsyrn1wTwdNt56F7twdfUfnHUZUq77/WfONCj8p72NZOyP7pNTdUWSTYC3GTbuuQ=="
+ },
"@pdftron/pdfjs-express": {
"version": "8.1.0",
"resolved": "https://registry.npmjs.org/@pdftron/pdfjs-express/-/pdfjs-express-8.1.0.tgz",
@@ -63854,6 +64252,11 @@
"resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz",
"integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag=="
},
+ "lodash.merge": {
+ "version": "4.6.2",
+ "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz",
+ "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ=="
+ },
"lodash.once": {
"version": "4.1.1",
"resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz",
@@ -75808,6 +76211,11 @@
"resolved": "https://registry.npmjs.org/underscore/-/underscore-1.13.1.tgz",
"integrity": "sha512-hzSoAVtJF+3ZtiFX0VgfFPHEDRm7Y/QPjGyNo4TVdnDTdft3tr8hEkD25a1jC+TjTuE7tkHGKkhwCgs9dgBB2g=="
},
+ "undici-types": {
+ "version": "5.26.5",
+ "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz",
+ "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA=="
+ },
"unicode-canonical-property-names-ecmascript": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz",
diff --git a/package.json b/package.json
index 03a9003ff..a832dfdce 100644
--- a/package.json
+++ b/package.json
@@ -113,6 +113,13 @@
"@ngrx/store": "^10.1.2",
"@ngx-translate/core": "^13.0.0",
"@ngxs/store": "^3.8.2",
+ "@opentelemetry/exporter-metrics-otlp-http": "^0.52.1",
+ "@opentelemetry/exporter-zipkin": "^1.25.1",
+ "@opentelemetry/resources": "^1.25.1",
+ "@opentelemetry/sdk-metrics": "^1.25.1",
+ "@opentelemetry/sdk-trace-base": "^1.25.1",
+ "@opentelemetry/sdk-trace-web": "^1.25.1",
+ "@opentelemetry/semantic-conventions": "^1.25.1",
"@pdftron/pdfjs-express": "^8.0.1",
"@sentry/angular": "7.73.0",
"@sentry/capacitor": "^0.14.0",
diff --git a/src/app/module/chat/data/async/socket/message-async.service.ts b/src/app/module/chat/data/async/socket/message-async.service.ts
index 5bab6494d..0a9974929 100644
--- a/src/app/module/chat/data/async/socket/message-async.service.ts
+++ b/src/app/module/chat/data/async/socket/message-async.service.ts
@@ -29,19 +29,20 @@ export class MessageAsyncService {
const id = message.id
delete message.id;
- // const result = await this.messageLocalDataSourceService.createMessage({
- // messageId: id,
- // sending: false,
- // ...message
- // })
+ const result = await this.messageLocalDataSourceService.createMessage({
+ messageId: id,
+ sending: false,
+ ...message
+ })
- // if(result.isOk()) {
+ if(result.isOk()) {
- // console.log(result.value)
+ console.log(result.value)
+ console.log("nice send receive")
- // } else {
- // console.log(result.error)
- // }
+ } else {
+ console.log(result.error)
+ }
})
diff --git a/src/app/module/chat/data/data-source/message/message-local-data-source.service.ts b/src/app/module/chat/data/data-source/message/message-local-data-source.service.ts
index dd47a24ca..3ae74a9ec 100644
--- a/src/app/module/chat/data/data-source/message/message-local-data-source.service.ts
+++ b/src/app/module/chat/data/data-source/message/message-local-data-source.service.ts
@@ -70,6 +70,12 @@ export class MessageLocalDataSourceService {
}
+ incomingSocketMessage() {
+
+ }
+
+
+ // @ValidateSchema(tableSchema)
async createMessage(data: MessageInputDTO) {
try {
diff --git a/src/app/services/monitoring/capture-log/capture-log.service.ts b/src/app/services/monitoring/capture-log/capture-log.service.ts
new file mode 100644
index 000000000..afd4a1080
--- /dev/null
+++ b/src/app/services/monitoring/capture-log/capture-log.service.ts
@@ -0,0 +1,133 @@
+import { Injectable } from '@angular/core';
+import { Device } from '@capacitor/device';
+// import { SocketLog } from './worker.worker';
+import { FCM } from '@capacitor-community/fcm';
+import { ActionPerformed, PushNotificationSchema, PushNotifications, Token, } from '@capacitor/push-notifications';
+import { AlertController, Platform } from '@ionic/angular';
+import { AngularFireMessaging } from '@angular/fire/messaging';
+
+@Injectable({
+ providedIn: 'root'
+})
+export class CaptureLogService {
+
+ deviceName = ''
+
+ constructor(
+ // public socket: SocketLog,
+ private platform: Platform,
+ private afMessaging: AngularFireMessaging,
+ ) {
+
+ // this.interceptLogs()
+
+ Device.getInfo().then(e => {
+ this.deviceName = e.name
+ });
+
+ // Create a new
+ const worker = new Worker(new URL('./worker.worker', import.meta.url));
+ worker.onmessage = ({ data }) => {
+ console.log(`page got message: ${data}`);
+ };
+ worker.postMessage('hello');
+
+ }
+
+ setToken() {
+
+ }
+
+ interceptLogs() {
+ (() => {
+ const originalConsoleLog = console.log;
+ const originalConsoleError = console.error;
+ const originalConsoleWarn = console.warn;
+ const originalConsoleInfo = console.info;
+
+ console.log = function(...args) {
+ //sendLogToServer(args.join(' '));
+ this.socket.sendMessage({
+ type:'sendLog',
+ payload: {
+ logType: 'log',
+ args
+ }
+ })
+ originalConsoleLog.apply(console, args);
+ };
+
+ console.error = function(...args) {
+ // sendLogToServer('ERROR: ' + args.join(' '));
+
+ this.socket.sendMessage({
+ type:'sendLog',
+ payload: {
+ logType: 'error',
+ args
+ }
+ })
+ originalConsoleError.apply(console, args);
+ };
+
+ console.warn = function(...args) {
+ this.socket.sendMessage({
+ type:'sendLog',
+ payload: {
+ logType: 'warn',
+ args
+ }
+ })
+ originalConsoleWarn.apply(console, args);
+ };
+
+ console.info = function(...args) {
+ this.socket.sendMessage({
+ type:'sendLog',
+ payload: {
+ logType: 'info',
+ args
+ }
+ })
+ originalConsoleInfo.apply(console, args);
+ };
+ })();
+ }
+
+
+ async getDeviceToken() {
+
+ return new Promise((resolve, reject) => {
+
+ if (this.platform.is('mobile')) {
+ if (this.platform.is('ios')) {
+ FCM.getToken()
+ .then(r => {
+ resolve(r.token)
+ })
+ .catch(err => console.log(err));
+ } else {
+
+ PushNotifications.addListener('registration',
+ (token: Token) => {
+ resolve(token.value)
+ }
+ );
+ }
+
+ } else {
+ this.afMessaging.requestToken.subscribe(
+ (token) => {
+ resolve(token)
+ },
+ (error) => {
+ console.error('Permission denied:', error);
+ }
+ );
+ }
+ })
+
+
+ }
+
+}
diff --git a/src/app/services/monitoring/capture-log/worker.worker.ts b/src/app/services/monitoring/capture-log/worker.worker.ts
new file mode 100644
index 000000000..f587c10ab
--- /dev/null
+++ b/src/app/services/monitoring/capture-log/worker.worker.ts
@@ -0,0 +1,142 @@
+///
+import { Observable, Subject, BehaviorSubject } from 'rxjs';
+import { webSocket, WebSocketSubject } from 'rxjs/webSocket';
+import { catchError, retryWhen, tap, delay } from 'rxjs/operators';
+
+interface WebSocketMessage {
+ type: string;
+ payload: any;
+}
+
+class SocketLog {
+ private socket$: WebSocketSubject;
+ private messageSubject$: Subject;
+ private connectionStatus$: BehaviorSubject;
+ private reconnectAttempts = 0;
+ private readonly maxReconnectAttempts = 5;
+
+ constructor() {
+ this.messageSubject$ = new Subject();
+ this.connectionStatus$ = new BehaviorSubject(false);
+ this.setupVisibilityChangeHandler();
+ // this.connect('https://5-180-182-151.cloud-xip.com:85/ws/')
+ //console.log('connect1')
+ }
+
+ public connect(url: string) {
+ this.socket$ = webSocket(url);
+
+ this.socket$.pipe(
+ tap({
+ error: () => {
+ this.connectionStatus$.next(false);
+ }
+ }),
+ retryWhen(errors => errors.pipe(
+ tap(() => {
+ this.reconnectAttempts++;
+ if (this.reconnectAttempts >= this.maxReconnectAttempts) {
+ throw new Error('Max reconnect attempts reached');
+ }
+ }),
+ delay(1000)
+ ))
+ ).subscribe(
+ (message) => {
+ this.messageSubject$.next(message);
+ this.connectionStatus$.next(true);
+ this.reconnectAttempts = 0;
+
+ // console.log({message})
+ },
+ (err) => {
+ // console.error('WebSocket connection error:', err);
+ },
+ () => {
+ // console.log('WebSocket connection closed');
+ this.connectionStatus$.next(false);
+ }
+ );
+ }
+
+ public sendMessage(message: WebSocketMessage): Observable {
+ return new Observable(observer => {
+ this.socket$.next(message);
+ observer.next();
+ observer.complete();
+ }).pipe(
+ catchError(err => {
+ console.error('Send message error:', err);
+ return new Observable(observer => {
+ observer.error({ type: 'SEND_ERROR', error: err });
+ });
+ })
+ );
+ }
+
+ public get messages$(): Observable {
+ return this.messageSubject$.asObservable();
+ }
+
+ public get connectionStatus(): Observable {
+ return this.connectionStatus$.asObservable();
+ }
+
+ private setupVisibilityChangeHandler() {
+ if (typeof document !== 'undefined' && typeof document.addEventListener === 'function') {
+ document.addEventListener('visibilitychange', () => {
+ if (document.visibilityState === 'visible') {
+ this.reconnect();
+ }
+ });
+ }
+ }
+
+ private reconnect() {
+ if (this.socket$) {
+ const url = (this.socket$ as any)._config.url;
+ this.establishNewConnection(url);
+ }
+ }
+
+ private establishNewConnection(url: string) {
+ const newSocket$ = webSocket(url);
+
+ newSocket$.pipe(
+ tap({
+ error: () => {
+ console.error('New WebSocket connection error');
+ }
+ }),
+ retryWhen(errors => errors.pipe(
+ tap(() => {
+ this.reconnectAttempts++;
+ if (this.reconnectAttempts >= this.maxReconnectAttempts) {
+ throw new Error('Max reconnect attempts reached');
+ }
+ }),
+ delay(1000)
+ ))
+ ).subscribe(
+ (message) => {
+ this.messageSubject$.next(message);
+ this.connectionStatus$.next(true);
+ this.reconnectAttempts = 0;
+
+ // Close the old socket and replace it with the new one
+ this.socket$.complete();
+ this.socket$ = newSocket$;
+ },
+ (err) => {
+ console.error('New WebSocket connection error:', err);
+ },
+ () => {
+ console.log('New WebSocket connection closed');
+ this.connectionStatus$.next(false);
+ }
+ );
+ }
+}
+
+
+let _ = new SocketLog()
diff --git a/src/app/services/monitoring/opentelemetry/matrix.ts b/src/app/services/monitoring/opentelemetry/matrix.ts
new file mode 100644
index 000000000..ad038fd5f
--- /dev/null
+++ b/src/app/services/monitoring/opentelemetry/matrix.ts
@@ -0,0 +1,30 @@
+import { metrics } from '@opentelemetry/api';
+import { OTLPMetricExporter } from '@opentelemetry/exporter-metrics-otlp-http';
+import { MeterProvider, PeriodicExportingMetricReader } from '@opentelemetry/sdk-metrics';
+import { environment } from 'src/environments/environment';
+
+// Initialize OpenTelemetry metrics
+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: 'http://5-180-182-151.cloud-xip.com:4318/v1/metrics',
+ // headers: {
+ // 'Authorization': 'Basic ' + btoa('tabteste@006:tabteste@006'),
+ // }
+ }),
+ exportIntervalMillis: 3000,
+ });
+
+ meterProvider.addMetricReader(metricReader);
+}
+export const meter = meterProvider.getMeter('example-exporter-collector');
+export const RequestCounter = meter.createCounter('post_requests', {
+ description: 'Example of a Counter',
+});
+
+export const UseCaseCounter = meter.createCounter('use_case', {
+ description: 'use case counter',
+});
diff --git a/src/app/services/monitoring/opentelemetry/opentelemetry.ts b/src/app/services/monitoring/opentelemetry/opentelemetry.ts
new file mode 100644
index 000000000..fb70ace5a
--- /dev/null
+++ b/src/app/services/monitoring/opentelemetry/opentelemetry.ts
@@ -0,0 +1,39 @@
+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';
+
+function createProvider(serviceName) {
+ const provider = new WebTracerProvider({
+ resource: new Resource({
+ [SemanticResourceAttributes.SERVICE_NAME]: serviceName,
+ }),
+ });
+
+ // provider.addSpanProcessor(new SimpleSpanProcessor(new ConsoleSpanExporter()));
+ provider.addSpanProcessor(new SimpleSpanProcessor(new ZipkinExporter({
+ url: 'https://5-180-182-151.cloud-xip.com:85/zipkin-endpoint/api/v2/spans',
+ serviceName: serviceName,
+ getExportRequestHeaders: () => {
+ return {
+ 'Authorization': 'Basic ' + btoa('tabteste@006:tabteste@006'),
+ };
+ }
+ })));
+
+ provider.register();
+ return provider;
+}
+
+// Example usage:
+export const OpentelemetryChatProvider = createProvider('FO-chat-service');
+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');
+
+
+
+
+
diff --git a/src/app/services/monitoring/opentelemetry/tracer.ts b/src/app/services/monitoring/opentelemetry/tracer.ts
new file mode 100644
index 000000000..bcab1cd38
--- /dev/null
+++ b/src/app/services/monitoring/opentelemetry/tracer.ts
@@ -0,0 +1,212 @@
+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 { Device, DeviceInfo } from '@capacitor/device';
+import { SessionStore } from 'src/app/store/session.service';
+import { environment } from 'src/environments/environment';
+import { UseCaseCounter } from './matrix';
+// import { context, propagation } from '@opentelemetry/api';
+
+const tracerInstance = OpentelemetryAgendaProvider.getTracer('example-tracer-hole', '111', {})
+const tracerNotificationInstance = OpentelemetryNotificationProvider.getTracer('example-tracer-hole', '111', {})
+// const logger: ILoggerAdapter = new ColoredLoggerService()
+
+let device: DeviceInfo;
+
+Device.getInfo().then(e => {
+ device = e
+});
+
+
+const createTracingInstance = ({bugPrint, name, module, autoFinish}): TracingType => {
+ const requestId = uuidv4()
+
+ let _tracerInstance:Tracer
+
+ if(module == 'notification') {
+ _tracerInstance = tracerNotificationInstance
+ } else {
+ _tracerInstance = tracerInstance
+ }
+
+ const span = _tracerInstance.startSpan(name);
+ let hasBug:Boolean
+
+ const data = {
+ event: {},
+ tags: {}
+ }
+
+ return {
+ span: span as any,
+ tracer: tracerInstance,
+ tracerId: requestId,
+ attributes: SemanticAttributes,
+ setStatus: (status: any) => {
+ span.setStatus(status);
+ },
+ addEvent: (context: string, message?: any, obj?: any) => {
+
+ data.event[context] = message;
+
+ const value = [JSON.stringify(message)] as any
+ span.addEvent(context, value);
+ },
+ LocalLogEvent:(context: string, message: any, obj: any) => {
+ data.tags[context] = message;
+ },
+ setAttribute: (key: string, value: string) => {
+ data.tags[key] = value;
+ span.setAttribute(key, value);
+ },
+ getAttribute: (key: string) => {
+ return data.tags[key]
+ },
+ finish: () => {
+ if(environment.apiURL != 'https://gdqas-api.oapr.gov.ao/api/') {
+ span.end();
+ UseCaseCounter.add(1, {user: SessionStore?.user?.FullName, outcome:data.tags['outcome'], usecase: name})
+ }
+
+ if(bugPrint && data.tags['outcome'] == 'failed') {
+ console.error(name, data)
+ }
+ },
+ bugFlag:() => {
+ hasBug = true
+ },
+ createSpan: (name, parent?: any) => {
+ return tracerInstance.startSpan(name, { root: false }, parent) as Span;
+ }
+ }
+}
+
+export function XTracerAsync({ name, bugPrint, module = null, autoFinish = true, daley =0 }) {
+ return (
+ target: unknown,
+ propertyKey: string,
+ descriptor: PropertyDescriptor,
+ ) => {
+ const originalMethod = descriptor.value;
+ descriptor.value = async function (...args: unknown[]) {
+
+
+ const tracing = createTracingInstance({bugPrint, name, module, autoFinish})
+
+ tracing.setAttribute('User', SessionStore?.user?.FullName);
+ tracing.setAttribute('current.page', window.location.pathname);
+ tracing.setAttribute('device.name', device?.name || device?.model)
+ tracing.setAttribute('commit.date', environment.version.lastCommitTime)
+ tracing.setAttribute('commit.branch', environment.version.branch)
+
+
+ args.push(tracing)
+
+ try {
+ const result = await originalMethod.apply(this, args);
+
+ if(autoFinish ) {
+ setTimeout(tracing.finish , daley)
+ }
+
+ return result
+ } catch (e) {
+ tracing.setAttribute('catch', 'true')
+
+ if(autoFinish) {
+ setTimeout(tracing.finish , daley)
+ }
+ console.error(e);
+ return false
+ }
+ };
+ };
+}
+
+
+export function XTracer({ name, bugPrint, module, autoFinish = true, daley =0 }) {
+ return (
+ target: unknown,
+ propertyKey: string,
+ descriptor: PropertyDescriptor,
+ ) => {
+ const originalMethod = descriptor.value;
+ descriptor.value = function (...args: unknown[]) {
+
+ const tracing = createTracingInstance({bugPrint, name, module, autoFinish})
+
+ tracing.setAttribute('User', SessionStore?.user?.FullName);
+ tracing.setAttribute('current.page', window.location.pathname);
+ tracing.setAttribute('device.name', device?.name || device?.model)
+ tracing.setAttribute('commit.date', environment.version.lastCommitTime)
+ tracing.setAttribute('commit.branch', environment.version.branch)
+
+ args.push(tracing)
+
+ try {
+ const result = originalMethod.apply(this, args);
+
+
+ if(autoFinish) {
+ setTimeout(tracing.finish , daley)
+ }
+ return result
+ } catch (e) {
+
+ tracing.setAttribute('catch', 'true')
+
+ if(autoFinish) {
+ setTimeout(tracing.finish , daley)
+ }
+ console.error(e);
+ return false
+ }
+ };
+ };
+}
+
+export type TracingType = {
+ span: Span;
+ tracer: Tracer;
+ tracerId: string;
+ attributes: typeof SemanticAttributes;
+ // axios: (config?: AxiosRequestConfig) => AxiosInstance;
+ setStatus: (status: any) => void;
+ //logEvent: (name: string, attributesOrStartTime?: AttributeValue | TimeInput) => void;
+ addEvent: (context: string, message?: any, obj?: any) => void;
+ setAttribute: (key: string, value: string) => void;
+ getAttribute: (key: string) => string;
+ LocalLogEvent: (name: string, attributesOrStartTime: any, obj?:any) => void;
+ finish: () => void;
+ bugFlag:() => void;
+ createSpan:(name, parent?: any) => Span;
+};
+
+export interface UserInteraction {
+ readonly params: any;
+ readonly tracing: TracingType;
+ readonly user: Pick;
+ readonly headers: Headers & { authorization: string };
+}
+
+export type InteractionTrancingInput = Pick;
+
+export const getPathWithoutUUID = (path: string) =>
+ path.replace(
+ /[0-9a-fA-F]{8}\b-[0-9a-fA-F]{4}\b-[0-9a-fA-F]{4}\b-[0-9a-fA-F]{4}\b-[0-9a-fA-F]{12}$/,
+ 'uuid',
+ );
+
+
+
+
+
+
+
+
+
+
+
+
+