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', + ); + + + + + + + + + + + + +