From 565cafd1399937777870f40faf78c47a678c845f Mon Sep 17 00:00:00 2001 From: YANGDB Date: Wed, 3 May 2023 11:57:18 -0700 Subject: [PATCH] Update collection feeds (#1500) * Add queries & query templates for serviceMap integration add jaeger data provider to the existing data-prepper update integration.schema to reflect mapping fields for specific templates Signed-off-by: YANGDB * update the integration.schema with the 'feed' concept that would encapsulate the different catalog categories - the collection item now would contain [category name,components list, feeds array] Signed-off-by: YANGDB * add event.source to the log.mapping default mapping schema Signed-off-by: YANGDB * add rest API images & diagram for assets dependencies Signed-off-by: YANGDB * add descriptive information for each log component Signed-off-by: YANGDB * add fields.json to represent the integration's fields Signed-off-by: YANGDB --------- Signed-off-by: YANGDB --- docs/API/API.png | Bin 0 -> 169536 bytes docs/API/README.md | 3 + docs/API/swagger.yaml | 48 +- docs/Integration-API.md | 58 +- docs/Integration-plugin-tasks.md | 21 +- docs/Integration-structure.md | 51 +- docs/schema/observability/logs/README.md | 60 +- docs/schema/observability/logs/cloud.md | 47 ++ .../observability/logs/communication.md | 56 ++ docs/schema/observability/logs/container.md | 53 ++ docs/schema/observability/logs/http.md | 61 ++ docs/schema/observability/logs/logs.md | 33 + docs/schema/system/samples/integration.json | 76 +- integrations/README.md | 82 +- integrations/nginx/assets/README.md | 47 ++ integrations/nginx/assets/channels/slack.json | 11 + .../nginx/assets/monitor/ErrorPerMinute.json | 130 +++ .../assets/monitor/RequestsPerMinute.json | 120 +++ integrations/nginx/config.json | 21 +- integrations/nginx/schema/fields.json | 345 ++++++++ integrations/service-map/assets/README.md | 47 ++ .../assets/mapping/jaeger-services.mapping | 38 + .../assets/mapping/jaeger-traces.mapping | 239 ++++++ .../getTraceGroupPercentilesQuery.json | 137 ++++ .../assets/scripts/getPayloadQuery.json | 25 + .../scripts/getServiceBreakdownQuery.json | 53 ++ .../assets/scripts/getSpanDetailQuery.json | 49 ++ .../assets/scripts/getSpanFlyoutQuery.json | 25 + .../assets/scripts/getSpansQuery.json | 23 + .../assets/scripts/getTracesQuery.json | 68 ++ .../assets/scripts/getValidTraceIdsQuery.json | 33 + integrations/service-map/config.json | 95 ++- .../{ => providers/data-prepper}/README.md | 11 +- .../data-prepper}/dataPrepper.svg | 0 .../info/providers/jaeger/README.md | 121 +++ .../info/providers/jaeger/jaeger-logo.png | Bin 0 -> 46281 bytes .../service-map/samples/preloaded/README.md | 16 +- ...ces.json => data_prepper_bulk_traces.json} | 0 .../samples/preloaded/jaeger_bulk_traces.json | 758 ++++++++++++++++++ .../schema/observability/logs/logs.mapping | 8 + .../schema/observability/logs/logs.schema | 3 + .../schema/system/integration.schema | 35 +- 42 files changed, 2889 insertions(+), 218 deletions(-) create mode 100644 docs/API/API.png create mode 100644 docs/schema/observability/logs/cloud.md create mode 100644 docs/schema/observability/logs/communication.md create mode 100644 docs/schema/observability/logs/container.md create mode 100644 docs/schema/observability/logs/http.md create mode 100644 docs/schema/observability/logs/logs.md create mode 100644 integrations/nginx/assets/README.md create mode 100644 integrations/nginx/assets/channels/slack.json create mode 100644 integrations/nginx/assets/monitor/ErrorPerMinute.json create mode 100644 integrations/nginx/assets/monitor/RequestsPerMinute.json create mode 100644 integrations/nginx/schema/fields.json create mode 100644 integrations/service-map/assets/README.md create mode 100644 integrations/service-map/assets/mapping/jaeger-services.mapping create mode 100644 integrations/service-map/assets/mapping/jaeger-traces.mapping create mode 100644 integrations/service-map/assets/queries/getTraceGroupPercentilesQuery.json create mode 100644 integrations/service-map/assets/scripts/getPayloadQuery.json create mode 100644 integrations/service-map/assets/scripts/getServiceBreakdownQuery.json create mode 100644 integrations/service-map/assets/scripts/getSpanDetailQuery.json create mode 100644 integrations/service-map/assets/scripts/getSpanFlyoutQuery.json create mode 100644 integrations/service-map/assets/scripts/getSpansQuery.json create mode 100644 integrations/service-map/assets/scripts/getTracesQuery.json create mode 100644 integrations/service-map/assets/scripts/getValidTraceIdsQuery.json rename integrations/service-map/info/{ => providers/data-prepper}/README.md (95%) rename integrations/service-map/info/{ => providers/data-prepper}/dataPrepper.svg (100%) create mode 100644 integrations/service-map/info/providers/jaeger/README.md create mode 100644 integrations/service-map/info/providers/jaeger/jaeger-logo.png rename integrations/service-map/samples/preloaded/{bulk_traces.json => data_prepper_bulk_traces.json} (100%) create mode 100644 integrations/service-map/samples/preloaded/jaeger_bulk_traces.json diff --git a/docs/API/API.png b/docs/API/API.png new file mode 100644 index 0000000000000000000000000000000000000000..f3f340fd298ad83ce11da2ac0fdb4941b8b34b18 GIT binary patch literal 169536 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 literal 0 HcmV?d00001 diff --git a/docs/API/README.md b/docs/API/README.md index cf0e4017a..f1fdb5c5d 100644 --- a/docs/API/README.md +++ b/docs/API/README.md @@ -1,6 +1,9 @@ # API Mock Tests The [Swagger](swagger.yaml) describes the API used by the Integration repository to support the `catalog`, `registry` and `store` functionalities. +Its possible to visualize the REST API using any on the numerous [online editors](https://editor.swagger.io/) +![](API.png) + ### Setup mock server In order to test the API, we can utilize a swagger based mock library which allows ['contract based testing'](https://github.com/stoplightio/prism). diff --git a/docs/API/swagger.yaml b/docs/API/swagger.yaml index 34d5f4c01..a4d09b2fa 100644 --- a/docs/API/swagger.yaml +++ b/docs/API/swagger.yaml @@ -44,14 +44,14 @@ paths: schema: type: array items: - $ref: '../../schema/system/catalog.schema' + $ref: '../../src/main/resources/schema/system/catalog.schema' example: observability: application/json: schema: type: array items: - $ref: '../../schema/system/catalog.schema' + $ref: '../../src/main/resources/schema/system/catalog.schema' examples: catalog: observability version: '1.0' @@ -110,14 +110,14 @@ paths: content: application/json: schema: - $ref: '../../schema/system/catalog.schema' + $ref: '../../src/main/resources/schema/system/catalog.schema' example: observability: application/json: schema: type: array items: - $ref: '../../schema/system/catalog.schema' + $ref: '../../src/main/resources/schema/system/catalog.schema' examples: catalog: observability version: '1.0' @@ -190,14 +190,14 @@ paths: content: application/json: schema: - $ref: '../../schema/system/catalog.schema' + $ref: '../../src/main/resources/schema/system/catalog.schema' example: observability: application/json: schema: type: array items: - $ref: '../../schema/system/catalog.schema' + $ref: '../../src/main/resources/schema/system/catalog.schema' examples: catalog: observability version: '1.0' @@ -275,7 +275,7 @@ paths: schema: type: array items: - $ref: '../../schema/system/integrations-template-list.schema' + $ref: '../../src/main/resources/schema/system/integrations-template-list.schema' example: - template-name: nginx version: 1.0.0 @@ -313,7 +313,7 @@ paths: content: application/zip: schema: - $ref: '../../schema/system/integration.schema' + $ref: '../../src/main/resources/schema/system/integration.schema' example: - BLOB including all images, json files, dashboards and documentations responses: @@ -344,7 +344,7 @@ paths: content: application/json: schema: - $ref: '../../schema/system/integration.schema' + $ref: '../../src/main/resources/schema/system/integration.schema' example: template-name: nginx version: @@ -354,11 +354,12 @@ paths: description: Nginx HTTP server collector identification: instrumentationScope.attributes.identification catalog: observability - components: - - web - - http collection: - - logs: + - category: logs + components: + - communication + - http + feeds: - info: access logs input_type: logfile dataset: nginx.access @@ -371,7 +372,9 @@ paths: - nginx - error dataset: nginx.error - - metrics: + - category: metrics + components: [ ] + feeds: - info: status metrics input_type: metrics dataset: nginx.status @@ -380,7 +383,6 @@ paths: - status repository: url: https://github.com/opensearch-project/observability/tree/main/integrarions/nginx - '400': description: bad input parameter /repository/{id}/fields: @@ -404,7 +406,7 @@ paths: content: application/json: schema: - $ref: '../../schema/system/integration-fields-list.schema' + $ref: '../../src/main/resources/schema/system/integration-fields-list.schema' example: template-name: nginx version: 1.0.0 @@ -818,7 +820,7 @@ paths: schema: type: array items: - $ref: '../../schema/system/integration-instance.schema' + $ref: '../../src/main/resources/schema/system/integration-instance.schema' example: template-name: nginx dataset: prod @@ -849,7 +851,7 @@ paths: content: application/json: schema: - $ref: '../../schema/system/integration-instance.schema' + $ref: '../../src/main/resources/schema/system/integration-instance.schema' example: template-name: nginx dataset: prod @@ -893,7 +895,7 @@ paths: content: application/json: schema: - $ref: '../../schema/system/integration-instance.schema' + $ref: '../../src/main/resources/schema/system/integration-instance.schema' example: template-name: nginx dataset: prod @@ -932,7 +934,7 @@ paths: content: application/json: schema: - $ref: '../../schema/system/integration-instance.schema' + $ref: '../../src/main/resources/schema/system/integration-instance.schema' example: template-name: nginx dataset: prod @@ -965,7 +967,7 @@ paths: content: application/json: schema: - $ref: '../../schema/system/integration-instance.schema' + $ref: '../../src/main/resources/schema/system/integration-instance.schema' example: template-name: nginx dataset: prod @@ -994,7 +996,7 @@ paths: content: application/json: schema: - $ref: '../../schema/system/integration-instance.schema' + $ref: '../../src/main/resources/schema/system/integration-instance.schema' example: template-name: nginx dataset: prod @@ -1034,7 +1036,7 @@ paths: content: application/json: schema: - $ref: '../../schema/system/integration-instance.schema' + $ref: '../../src/main/resources/schema/system/integration-instance.schema' example: template-name: nginx dataset: prod diff --git a/docs/Integration-API.md b/docs/Integration-API.md index 89bedf85d..1d28601ae 100644 --- a/docs/Integration-API.md +++ b/docs/Integration-API.md @@ -23,11 +23,11 @@ Query: GET _integration/repository?filter=category:logs&component:web ``` **Response**: -```jsoon +```json { - "name": "nginx", + "template-name": "nginx", "version": { - "integ": "0.1.0", + "integration": "0.1.0", "schema": "1.0.0", "resource": "^1.23.0" }, @@ -35,37 +35,37 @@ GET _integration/repository?filter=category:logs&component:web "Information":"file:///.../schema/logs/info.html", "identification": "instrumentationScope.attributes.identification", "catalog": "observability", - "components": [ - "web","http" - ], "collection":[ { - "logs": [{ + "category": "logs", + "components": [ + "communication","http" + ], + "feeds": [{ "info": "access logs", "input_type":"logfile", "dataset":"nginx.access", - "labels" :["nginx","access"], - "schema": "file:///.../schema/logs/access.json" + "labels" :["nginx","access"] }, { "info": "error logs", "input_type":"logfile", "labels" :["nginx","error"], - "dataset":"nginx.error", - "schema": "file:///.../schema/logs/error.json" + "dataset":"nginx.error" }] }, { - "metrics": [{ + "category": "metrics", + "components": [], + "feeds": [{ "info": "status metrics", "input_type":"metrics", "dataset":"nginx.status", - "labels" :["nginx","status"], - "schema": "file:///.../schema/logs/status.json" + "labels" :["nginx","status"] }] } ], - "repo": { + "repository": { "github": "https://github.com/opensearch-project/observability/tree/main/integrarions/nginx" } } @@ -139,11 +139,11 @@ POST _integration/store/$instance_name The $instance_name represents the specific name the integration was instanced with - for example, Nginx Integration can be a template for multiple Nginx instances each representing different domain / aspect such as geographic. -```jsoon +```json { "template-name": "nginx", "version": { - "integ": "0.1.0", + "integration": "0.1.0", "schema": "1.0.0", "resource": "^1.23.0" }, @@ -151,37 +151,37 @@ each representing different domain / aspect such as geographic. "Information":"file:///.../schema/logs/info.html", "identification": "instrumentationScope.attributes.identification", "catalog": "observability", - "components": [ - "web","http" - ], "collection":[ { - "logs": [{ + "category": "logs", + "components": [ + "communication","http" + ], + "feeds": [{ "info": "access logs", "input_type":"logfile", "dataset":"nginx.access", - "labels" :["nginx","access"], - "schema": "file:///.../schema/logs/access.json" + "labels" :["nginx","access"] }, { "info": "error logs", "input_type":"logfile", "labels" :["nginx","error"], - "dataset":"nginx.error", - "schema": "file:///.../schema/logs/error.json" + "dataset":"nginx.error" }] }, { - "metrics": [{ + "category": "metrics", + "components": [], + "feeds": [{ "info": "status metrics", "input_type":"metrics", "dataset":"nginx.status", - "labels" :["nginx","status"], - "schema": "file:///.../schema/logs/status.json" + "labels" :["nginx","status"] }] } ], - "repo": { + "repository": { "github": "https://github.com/opensearch-project/observability/tree/main/integrarions/nginx" } } diff --git a/docs/Integration-plugin-tasks.md b/docs/Integration-plugin-tasks.md index 7130272c7..977a7f241 100644 --- a/docs/Integration-plugin-tasks.md +++ b/docs/Integration-plugin-tasks.md @@ -93,14 +93,23 @@ _For example the next observability integration:_ ... "collection":[ { - "logs": [{ + "category": "logs", + "components": [ + "communication","http" + ], + "feeds": [{ "info": "access logs", - "input_type":"logfile", - "dataset":"nginx.access", <<- subject to user changes - "namespace": "prod",<<- subject to user changes - "labels" :["nginx","access"], - "schema": "file:///.../schema/logs/access.json" + "input_type":"logfile", + "dataset":"nginx.access", + "labels" :["nginx","access"] }, + { + "info": "error logs", + "input_type":"logfile", + "labels" :["nginx","error"], + "dataset":"nginx.error" + }] + }, ... ``` ### Loading Step diff --git a/docs/Integration-structure.md b/docs/Integration-structure.md index 949eeb043..a2aab05ba 100644 --- a/docs/Integration-structure.md +++ b/docs/Integration-structure.md @@ -115,41 +115,44 @@ nginX { "template_name": "nginx", "version": { - "integ": "0.1.0", + "integration": "0.1.0", "schema": "1.0.0", "resource": "^1.23.0", } "description": "Nginx HTTP server collector", "identification": "instrumentationScope.attributes.identification", "catalog": "observability", - "components": [ - "web","http" - ], "collection":[ { - "logs": [{ - "info": "access logs", - "input_type":"logfile", - "dataset":"nginx.access", - "labels" :["nginx","access"] - }, - { - "info": "error logs", - "input_type":"logfile", - "labels" :["nginx","error"], - "dataset":"nginx.error" - }] + "category": "logs", + "components": [ + "communication","http" + ], + "feeds": [{ + "info": "access logs", + "input_type":"logfile", + "dataset":"nginx.access", + "labels" :["nginx","access"] + }, + { + "info": "error logs", + "input_type":"logfile", + "labels" :["nginx","error"], + "dataset":"nginx.error" + }] }, { - "metrics": [{ - "info": "`status metrics`", - "input_type":"`metrics`", - "dataset":"nginx.status", - "labels" :["nginx","status"] - }] + "category": "metrics", + "components": [], + "feeds": [{ + "info": "status metrics", + "input_type":"metrics", + "dataset":"nginx.status", + "labels" :["nginx","status"] + }] } ], - "repo": { + "repository": { "github": "https://github.com/opensearch-project/observability/tree/main/integrations/nginx" } } @@ -159,7 +162,7 @@ nginX ``` "version": { - "integ": "0.1.0", + "integration": "0.1.0", "schema": "1.0.0", "resource": "^1.23.0", } diff --git a/docs/schema/observability/logs/README.md b/docs/schema/observability/logs/README.md index 57f33f583..e05c8fcf7 100644 --- a/docs/schema/observability/logs/README.md +++ b/docs/schema/observability/logs/README.md @@ -137,37 +137,15 @@ For Example - in the sample [nginx_access-log.json](sample/nginx_access-log.json This field is expected to appear in any future integration or Observability resources into OpenSearch. -### Logs Classifications +### Logs Components -#### HTTP +### HTTP _Inspired by [ECS - http](https://www.elastic.co/guide/en/ecs/current/ecs-http.html), [OTEL - http](https://github.com/open-telemetry/opentelemetry-specification/blob/main/specification/trace/semantic_conventions/http.md)_ + - [Http component ](http.md) -- `method` - HTTP request method. `GET; POST; HEAD` (OTEL driven) Correspond with `request.method` (ECS driven) -- `status_code` - [Http response code](https://tools.ietf.org/html/rfc7231#section-6) (OTEL driven) Correspond with `response.status_code` (ECS driven) -- `flavor` - Kind of HTTP protocol used. (OTEL driven) Correspond with `version` (ECS driven) -- `user_agent` - Value of the HTTP User-Agent header sent by the client. (OTEL driven) -- `request.id` - A unique identifier for each HTTP request to correlate logs between clients and servers in transactions. (ECS driven) -- `request_content_length` - The size of the request payload body in bytes. (OTEL driven) Correspond with `request.bytes` (ECS driven) -- `request.body.content` - The full HTTP request body. (ECS driven) -- `request.referrer` - Referrer for this HTTP request. (ECS driven) -- `request.header` - HTTP request headers key/value object (OTEL driven) -- `request.mime_type` - Mime type of the body of the response. (ECS driven) - -- `response_content_length` - The size of the response payload body in bytes. (OTEL driven) Correspond with `response.bytes` (ECS driven) -- `response.body.content` - The full HTTP response body. (ECS driven) -- `response.header` - HTTP response headers key/value object (OTEL driven) - -- `url` - Full HTTP request URL in the form scheme://host[:port]/path?query[#fragment] (OTEL driven) -- `resend_count` - The ordinal number of request resending attempt (OTEL driven) - -- `scheme` - The URI scheme identifying the used protocol. (OTEL driven) -- `target` - The full request target as passed in a HTTP request line or equivalent. (OTEL driven) -- `route` - The matched route (path template in the format used by the respective server framework) (OTEL driven) -- `client_ip` - The IP address of the original client behind all proxies (OTEL driven) `client.ip` - IP address of the client (IPv4 or IPv6). (ECS driven) - -#### Communication +### Communication Includes client / server part of the communication **_Inspired by_** : @@ -177,28 +155,26 @@ Includes client / server part of the communication - [ECS - Destination](https://www.elastic.co/guide/en/ecs/8.6/ecs-destination.html) - [OTEL - network](https://github.com/open-telemetry/opentelemetry-specification/blob/main/specification/trace/semantic_conventions/http.md) +- [Communication component ](communication.md) + +### Cloud +Includes cloud field set describing a standardized structured representation of cloud infrastructure metadata - - `sock.family` - Protocol address family which is used for communication. (OTEL driven) +**_Inspired by_** : +- [ECS - cloud](https://www.elastic.co/guide/en/ecs/8.6/ecs-cloud.html) - - `client.domain` - The domain name of the client system. (ECS driven) Correspond with `source.domain`, (ECS driven) - - `client.bytes` - Bytes sent from the client to the server. (ECS driven) Correspond with `source.bytes` (ECS driven) - - `client.ip` - IP address of the client (IPv4 or IPv6). (ECS driven) Correspond with `source.ip` (ECS driven) - - `client.mac` - MAC address of the client. (IPv4 or IPv6). (ECS driven) Correspond with `source.mac` (ECS driven) - - `client.packets` - Packets sent from the client to the server. (ECS driven) Correspond with `source.packets` (ECS driven) +- [Cloud component ](cloud.md) - - `sock.host.addr` - Local socket address. (OTEL driven) Correspond with `client.address`,`source.address` (ECS driven) - - `sock.host.port` - Local socket port number. (OTEL driven) Corresponds with `client.port`,`source.port` (ECS driven) + +### Container +Includes container field set describing a structured and comprehensive representation of container-related data - - `server.domain` - The domain name of the server system. (ECS driven) Correspond with `destination.domain` (ECS driven) - - `server.bytes` - Bytes sent from the server to the client. (ECS driven) Correspond with `destination.bytes` (ECS driven) - - `server.ip` - IP address of the server (IPv4 or IPv6). (ECS driven) Correspond with `destination.ip` (ECS driven) - - `server.mac` - MAC address of the server. (IPv4 or IPv6). (ECS driven) Correspond with `destination.mac` (ECS driven) - - `server.packets` - Packets sent from the server to the client.. (ECS driven) Correspond with `destination.packets` (ECS driven) +**_Inspired by_** : +- [ECS - container](https://www.elastic.co/guide/en/ecs/8.6/ecs-container.html) - - `sock.peer.addr` - Remote socket peer address: IPv4 or IPv6 (OTEL driven) Correspond with `server.address`, `destination.address` (ECS driven) - - `sock.peer.name` - Remote socket peer name. (OTEL driven) Correspond with `destination.domain` (ECS driven) - - `sock.peer.port` - Remote socket peer port. (OTEL driven) (OTEL driven) Corresponds with `server.port`,`destination.port` (ECS driven) +- [Container component ](container.md) + --- ```text diff --git a/docs/schema/observability/logs/cloud.md b/docs/schema/observability/logs/cloud.md new file mode 100644 index 000000000..a1198d564 --- /dev/null +++ b/docs/schema/observability/logs/cloud.md @@ -0,0 +1,47 @@ +# Observability Category: Cloud Log Fields + +Observability cloud field set describes a standardized structured representation of cloud infrastructure metadata, enabling efficient monitoring, analysis, and management of cloud resources and services across different cloud providers and regions. + +## Field Names and Types + +| Field Name | Type | +|------------------------------|---------| +| cloud.provider | keyword | +| cloud.availability_zone | keyword | +| cloud.region | keyword | +| cloud.machine.type | keyword | +| cloud.account.id | keyword | +| cloud.account.name | keyword | +| cloud.service.name | keyword | +| cloud.project.id | keyword | +| cloud.project.name | keyword | +| cloud.instance.id | keyword | +| cloud.instance.name | keyword | + +## Field Explanations + +- **cloud.provider**: The cloud service provider (e.g., AWS, GCP, Azure). +- **cloud.availability_zone**: The availability zone of the cloud resource within the provider's infrastructure. +- **cloud.region**: The region of the cloud resource within the provider's infrastructure. +- **cloud.machine.type**: The type of virtual machine or compute resource used (e.g., t2.micro, n1-standard-1). +- **cloud.account.id**: The unique identifier of the cloud account. +- **cloud.account.name**: The name of the cloud account. +- **cloud.service.name**: The name of the cloud service (e.g., EC2, S3, Compute Engine). +- **cloud.project.id**: The unique identifier of the cloud project. +- **cloud.project.name**: The name of the cloud project. +- **cloud.instance.id**: The unique identifier of the cloud instance or virtual machine. +- **cloud.instance.name**: The name of the cloud instance or virtual machine. + +## Fields for KPI Monitoring and Alerts +The following fields are suitable for creating KPIs to monitor and alert when exhibiting abnormal behavior: + +-- **cloud.provider**: Monitoring the distribution of resources across different cloud providers can help optimize costs and performance. +-- **cloud.region**: Tracking resource usage across different regions can help identify potential latency issues or opportunities for cost optimization. +-- **cloud.machine.type**: Monitoring the machine types used can help identify underutilized or overutilized instances, enabling better resource allocation and cost management. +-- **cloud.service.name**: Keeping track of the services used can help identify potential performance bottlenecks or opportunities for cost optimization. + + +By using these fields, users can efficiently monitor, analyze, and manage cloud resources and services across different cloud providers and regions. + +- [Cloud.mapping](../../../../src/main/resources/schema/observability/logs/cloud.mapping) +- [Cloud.schema](../../../../src/main/resources/schema/observability/logs/cloud.schema) \ No newline at end of file diff --git a/docs/schema/observability/logs/communication.md b/docs/schema/observability/logs/communication.md new file mode 100644 index 000000000..22b14a240 --- /dev/null +++ b/docs/schema/observability/logs/communication.md @@ -0,0 +1,56 @@ +# Observability Category: Communication Log Fields + +The communication fields provide users with a comprehensive overview of network communication events, enabling efficient monitoring, analysis, and management of data flow between sources and destinations across various systems and environments. + +## Field Names and Types + +| Field Name | Type | +|------------------------------|---------| +| communication.sock.family | keyword | +| communication.source.address | text | +| communication.source.domain | text | +| communication.source.bytes | long | +| communication.source.ip | ip | +| communication.source.port | long | +| communication.source.mac | keyword | +| communication.source.packets | long | +| communication.destination.address | text | +| communication.destination.domain | text | +| communication.destination.bytes | long | +| communication.destination.ip | ip | +| communication.destination.port | long | +| communication.destination.mac | keyword | +| communication.destination.packets | long | + +## Field Explanations + +- **communication.sock.family**: The socket family of the communication event (e.g., AF_INET, AF_INET6). +- **communication.source.address**: The source address of the communication event. +- **communication.source.domain**: The source domain of the communication event. +- **communication.source.bytes**: The number of bytes sent by the source during the communication event. +- **communication.source.ip**: The source IP address of the communication event. +- **communication.source.port**: The source port of the communication event. +- **communication.source.mac**: The source MAC address of the communication event. +- **communication.source.packets**: The number of packets sent by the source during the communication event. +- **communication.destination.address**: The destination address of the communication event. +- **communication.destination.domain**: The destination domain of the communication event. +- **communication.destination.bytes**: The number of bytes received by the destination during the communication event. +- **communication.destination.ip**: The destination IP address of the communication event. +- **communication.destination.port**: The destination port of the communication event. +- **communication.destination.mac**: The destination MAC address of the communication event. +- **communication.destination.packets**: The number of packets received by the destination during the communication event. + +## Fields for KPI Monitoring and Alerts + +The following fields are suitable for creating KPIs to monitor and alert when exhibiting abnormal behavior: + +- **communication.source.bytes**: Monitoring the number of bytes sent by the source can help identify potential data leaks, excessive bandwidth usage, or other network-related issues. +- **communication.destination.bytes**: Monitoring the number of bytes received by the destination can help identify potential data leaks, excessive bandwidth usage, or other network-related issues. +- **communication.destination.ip**: Monitoring the destination ip can be used to detect outgoing requests crossing the DMZ or the secured network boundaries +- **communication.source.ip**: Monitoring the source ip can be used to detect incoming requests coming outside the DMZ or the secured network boundaries + +By using these fields, users can efficiently monitor, analyze, and manage network communication events across various systems and environments. + + +- [Communication.mapping](../../../../src/main/resources/schema/observability/logs/communication.mapping) +- [Communication.schema](../../../../src/main/resources/schema/observability/logs/communication.schema) \ No newline at end of file diff --git a/docs/schema/observability/logs/container.md b/docs/schema/observability/logs/container.md new file mode 100644 index 000000000..52b22ba04 --- /dev/null +++ b/docs/schema/observability/logs/container.md @@ -0,0 +1,53 @@ +# Observability Category: Container Log Fields + +This field set described a structured and comprehensive representation of container-related data, enabling efficient monitoring, analysis, and management of container resources and performance across various container platforms and environments. + +## Field Names and Types + +| Field Name | Type | +|---------------------------|---------| +| container.image.name | keyword | +| container.image.tag | keyword | +| container.image.hash | keyword | +| container.id | keyword | +| container.name | keyword | +| container.labels | keyword | +| container.runtime | keyword | +| container.memory.usage | float | +| container.network.ingress.bytes | long | +| container.network.egress.bytes | long | +| container.cpu.usage | float | +| container.disk.read.bytes | long | +| container.disk.write.bytes| long | + +## Field Explanations + +- **container.image.name**: The name of the container image. +- **container.image.tag**: The tag of the container image. +- **container.image.hash**: The hash of the container image. +- **container.id**: The unique identifier of the container. +- **container.name**: The name of the container. +- **container.labels**: The labels assigned to the container. +- **container.runtime**: The container runtime used (e.g., Docker, containerd). +- **container.memory.usage**: The memory usage of the container in bytes. +- **container.network.ingress.bytes**: The number of bytes received by the container over the network. +- **container.network.egress.bytes**: The number of bytes sent by the container over the network. +- **container.cpu.usage**: The CPU usage of the container as a percentage. +- **container.disk.read.bytes**: The number of bytes read by the container from the disk. +- **container.disk.write.bytes**: The number of bytes written by the container to the disk. + + +## Fields for KPI Monitoring and Alerts + +The following fields are suitable for creating KPIs to monitor and alert when exhibiting abnormal behavior: + +-- **container.memory.usage**: Monitoring container memory usage can help identify memory leaks, misconfigurations, or performance issues. +-- **container.network.ingress.bytes**: Tracking the ingress network traffic can help identify spikes in network usage, potential DDoS attacks, or other network-related issues. +-- **container.network.egress.bytes**: Monitoring the egress network traffic can help identify unexpected data transfers or network-related issues. +-- **container.cpu.usage**: Tracking the CPU usage of containers can help identify performance bottlenecks, resource contention, or misconfigurations. + +By using these fields, users can efficiently monitor, analyze, and manage container resources and performance across different container platforms and environments. + + +- [Http.mapping](../../../../src/main/resources/schema/observability/logs/container.mapping) +- [Http.schema](../../../../src/main/resources/schema/observability/logs/container.schema) \ No newline at end of file diff --git a/docs/schema/observability/logs/http.md b/docs/schema/observability/logs/http.md new file mode 100644 index 000000000..0297b2bd6 --- /dev/null +++ b/docs/schema/observability/logs/http.md @@ -0,0 +1,61 @@ +# Observability Category: HTTP Log Fields + +The HTTP-based field set described here provide a comprehensive and structured representation of HTTP request and response data, enabling efficient monitoring, analysis, and alerting for performance and security aspects of web applications and APIs. + +## Field Names and Types + +| Field Name | Type | +|------------------------|---------| +| http.flavor | keyword | +| http.user_agent | keyword | +| http.url | keyword | +| http.schema | keyword | +| http.target | keyword | +| http.route | keyword | +| http.client.ip | ip | +| http.resent_count | integer | +| http.request.id | text | +| http.request.body.content | text | +| http.request.bytes | long | +| http.request.method | keyword | +| http.request.referrer | keyword | +| http.request.mime_type | keyword | +| http.response.id | text | +| http.response.body.content | text | +| http.response.bytes | long | +| http.response.status_code | integer | + +## Field Explanations + +- **http.flavor**: The HTTP version (e.g., HTTP/1.1 or HTTP/2.0). +- **http.user_agent**: The user agent string from the HTTP request header. +- **http.url**: The URL of the HTTP request. +- **http.schema**: The URL schema (e.g., http or https). +- **http.target**: The target of the HTTP request (e.g., a specific API endpoint). +- **http.route**: The route associated with the HTTP request. +- **http.client.ip**: The IP address of the client making the HTTP request. +- **http.resent_count**: The number of times the HTTP request was resent. +- **http.request.id**: The unique identifier of the HTTP request. +- **http.request.body.content**: The content of the HTTP request body. +- **http.request.bytes**: The number of bytes in the HTTP request. +- **http.request.method**: The HTTP request method (e.g., GET, POST, PUT, DELETE). +- **http.request.referrer**: The referrer URL for the HTTP request. +- **http.request.mime_type**: The MIME type of the HTTP request. +- **http.response.id**: The unique identifier of the HTTP response. +- **http.response.body.content**: The content of the HTTP response body. +- **http.response.bytes**: The number of bytes in the HTTP response. +- **http.response.status_code**: The HTTP response status code (e.g., 200, 404, 500). + + +## Fields for KPI Monitoring and Alerts + +The following fields are suitable for creating KPIs to monitor and alert when exhibiting abnormal behavior: + +- **http.request.bytes**: Monitoring the number of bytes in the HTTP request can help identify performance issues or potential attacks. +- **http.request.method**: Tracking the distribution of HTTP request methods can provide insights into the usage patterns of your API and help identify potential security risks. +- **http.response.status_code**: Monitoring HTTP response status codes can help identify issues with your application or API, such as a high number of client errors (4xx) or server errors (5xx). +- **http.resent_count**: Tracking the number of times an HTTP request was resent can help identify potential performance issues or misconfigurations. +- **http.response.bytes**: Monitoring the number of bytes in the HTTP response can help identify performance issues or potential attacks. + +- [Http.mapping](../../../../src/main/resources/schema/observability/logs/http.mapping) +- [Http.schema](../../../../src/main/resources/schema/observability/logs/http.schema) \ No newline at end of file diff --git a/docs/schema/observability/logs/logs.md b/docs/schema/observability/logs/logs.md new file mode 100644 index 000000000..b834c1dd1 --- /dev/null +++ b/docs/schema/observability/logs/logs.md @@ -0,0 +1,33 @@ +# Log Field Set + +This document provides a summary of the log field set in the Observability catalog. It covers field names, types, and descriptions, as well as fields suitable for KPI monitoring and alerts. + +## Fields and Types + +| Field Name | Type | Description | +| ------------------------------- | ------- | ----------- | +| `severity.number` | long | Severity number associated with the log entry. | +| `severity.text` | keyword | Severity text associated with the log entry. | +| `attributes.data_stream.*` | keyword | Data stream attributes for the log entry. | +| `body` | text | Log message content. | +| `@timestamp` | date | Log entry timestamp. | +| `observedTimestamp` | date | Observed timestamp of the log entry. | +| `observerTime` | alias | Alias for `observedTimestamp`. | +| `traceId` | keyword | Trace ID associated with the log entry. | +| `spanId` | keyword | Span ID associated with the log entry. | +| `schemaUrl` | keyword | URL of the schema used for the log entry. | +| `instrumentationScope.*` | keyword | Instrumentation scope information for the log entry. | +| `event.*` | keyword | Event information associated with the log entry. | + +## Fields for KPI Monitoring and Alerts + +The following fields are suitable for monitoring KPIs and setting up alerts when exhibiting abnormal behavior: + +- `severity.number`: Monitor logs with high severity levels. +- `event.result`: Track logs with specific results, such as errors or successes. +- `event.exception.message`: Monitor logs with specific exception messages. +- `attributes.data_stream.dataset`: Track logs from specific data stream datasets. + + +- [Logs.mapping](../../../../src/main/resources/schema/observability/logs/logs.mapping) +- [Logs.schema](../../../../src/main/resources/schema/observability/logs/logs.schema) \ No newline at end of file diff --git a/docs/schema/system/samples/integration.json b/docs/schema/system/samples/integration.json index bfae1f5e8..e7e45f6e5 100644 --- a/docs/schema/system/samples/integration.json +++ b/docs/schema/system/samples/integration.json @@ -8,35 +8,63 @@ "description": "Nginx HTTP server collector", "identification": "instrumentationScope.attributes.identification", "catalog": "observability", - "components": [ - "web","http" - ], - "collection":[ + "collection": [ { - "logs": [{ - "info": "access logs", - "input_type":"logfile", - "dataset":"nginx.access", - "labels" :["nginx","access"], - "fields-mapping" : [ - {"alias":"http.url","field":"request_url"} , - {"alias":"http.request.body.content","field":"request_body"} - ] - }, + "category": "logs", + "components": [ + "web", + "http" + ], + "feeds": [ + { + "info": "access logs", + "input_type": "logfile", + "dataset": "nginx.access", + "labels": [ + "nginx", + "access" + ], + "fields-mapping": [ + { + "template": "my-custom-http_logs", + "fields": [ + { + "alias": "http.url", + "field": "request_url" + }, + { + "alias": "http.request.body.content", + "field": "request_body" + } + ] + } + ] + }, { "info": "error logs", - "input_type":"logfile", - "labels" :["nginx","error"], - "dataset":"nginx.error" - }] + "input_type": "logfile", + "labels": [ + "nginx", + "error" + ], + "dataset": "nginx.error" + } + ] }, { - "metrics": [{ - "info": "status metrics", - "input_type":"metrics", - "dataset":"nginx.status", - "labels" :["nginx","status"] - }] + "category": "metrics", + "components": [], + "feeds": [ + { + "info": "status metrics", + "input_type": "metrics", + "dataset": "nginx.status", + "labels": [ + "nginx", + "status" + ] + } + ] } ], "repository": { diff --git a/integrations/README.md b/integrations/README.md index 5aabb1e2c..03332ab83 100644 --- a/integrations/README.md +++ b/integrations/README.md @@ -1,5 +1,15 @@ + + # Integration Definitions +An integration is a bundle of pre-canned assets which are bundled togather in a meaningful manner. Mostly the integration is associated with a particular context which is +contained within a certain data domain. For an example we can consider the Observability domain as the generic context and as a specific subject we can define the next integrations which +are collected according to a subject: + - nginx web server integration includes dashboards, queries and index mapping + - aws vpc flow logs integration includes dashboards, queries and index mapping + +Each integration has a bundle of assets which are associated with the domain context and are mostly coupled with specific schema category (logs, traces, metrics). + ## Bundle An OpenSearch Integration Bundle may contain the following: @@ -46,8 +56,24 @@ A typical Observability Integration consists of the following parts: * Notebooks * Operations Panels * Saved PPL/SQL/DQL Queries + * Saved PPL/SQL/DQL Scripts * Alerts +***Data Structure Components*** + + * Datasource + * Mappings + * Indices + * Tables + * Views + +***Notification Components*** + + * Channels + * Alerts + * Monitors + + Since the structured data has an enormous contribution to the understanding of the system behaviour - each resource will define a well-structured mapping it conforms with. Once input content has form and shape - it can and will be used to calculate and correlate different pieces of data. @@ -85,12 +111,21 @@ integration-template-name **Definitions** - `config.json` defines the general configuration for the entire integration component. -- `display` this is the folder in which the actual visualization components are stored -- `queries` this is the folder in which the actual PPL queries are stored -- `schemas` this is the folder in which the schemas are stored - schema for mapping translations or index mapping. -- `samples` this folder contains sample logs and translated logs are present -- `metadata` this folder contains additional metadata definitions such as security and policies -- `info` this folder contains documentations, licences and external references +- `display` this is the folder in which the actual visualization components are stored +- `queries` this is the folder in which the actual PPL/SQL/DQL queries are stored +- `scripts` this is the folder in which the actual PPL/SQL/DQL scripts are stored +- `templates` this is the folder in which the index mappings stored +- `indices` this is the folder in which the index definition are stored +- `tables` this is the folder in which the external table definition are stored +- `views` this is the folder in which the external table definition are stored +- `datasource` this is the folder in which the datasource definition are stored +- `monitors` this is the folder in which the monitors & alerts are stored +- `channels` this is the folder in which the alters channels are defined. + +- `schemas` this is the folder in which the schemas are stored - schema for mapping translations or index mapping. +- `samples` this folder contains sample logs and translated logs are present +- `metadata` this folder contains additional metadata definitions such as security and policies +- `info` this folder contains documentations, licences and external references --- @@ -111,3 +146,38 @@ The visual display component will need to be validated to the schema that it is Queries contains specific PPL queries that precisely demonstrates some common and useful use-case . +## Flow of the assets creation process +Different assets that are bundled within an integration may be depended on one another, the next diagram details the order which describes the dependencies within the Integration. + +***Visual Components*** +```mermaid + graph LR; + datasource-->index; + mapping-->index; + + index_pattern-->dashboard + index-->dashboard + +``` + +***Data Structure Components*** + +```mermaid + graph LR; + datasource-->index; + mapping-->index; + + index-->table; + table-->view; + index-->queries/scripts + +``` +***Notification Components*** + +```mermaid + graph LR; + index-->monitor; + channel-->monitor; + monitor-->alert; + +``` \ No newline at end of file diff --git a/integrations/nginx/assets/README.md b/integrations/nginx/assets/README.md new file mode 100644 index 000000000..b0c08857a --- /dev/null +++ b/integrations/nginx/assets/README.md @@ -0,0 +1,47 @@ +# Nginx Integration Assets + +### Channels +Creating a slack channel for notifications + +API : http://osd:5601/api/notifications/create_config + +[Slack Channel](channels/slack.json) +```json5 +{ + "config": { + "name": "Alerts", + "description": "Alerting Observability ", + "config_type": "slack", + "is_enabled": true, + "slack": { + "url": "https://yourteam.slack.com/messages/C69S1L3SS" + } + } +} +``` + +### Monitoring +API: http://osd:5601/api/alerting/monitors + +Creating a monitor for RequestPerMinute max Alert & ErrorsPerMinute max Alert + +- [RequestsPerMinute](monitor/RequestsPerMinute.json) +- [ErrorsPerMinute](monitor/ErrorPerMinute.json) + + +### Display + +API: http://osd:5601/api/saved_objects/_import?overwrite=true + + - [Dashboard](display/sso-logs-dashboard-new.ndjson) + + +### Fields +The next table details the different fields usage across the different assets + +| Field | Mapping Source | Usage | +|----------|:--------------:|-------------------------------------------------------------------------------------------------------------------------------:| +| `@timestamp` | logs.mapping | | +| `http.response.bytes` | http.mapping | [sso-logs-dashboard-new.ndjson](display%2Fsso-logs-dashboard-new.ndjson) | +| `observerTime` | http.mapping | | +| `http.response.status_code` | http.mapping | [sso-logs-dashboard-new.ndjson](display%2Fsso-logs-dashboard-new.ndjson), [ErrorPerMinute.json](monitor%2FErrorPerMinute.json) | \ No newline at end of file diff --git a/integrations/nginx/assets/channels/slack.json b/integrations/nginx/assets/channels/slack.json new file mode 100644 index 000000000..f52588e44 --- /dev/null +++ b/integrations/nginx/assets/channels/slack.json @@ -0,0 +1,11 @@ +{ + "config": { + "name": "Alerts", + "description": "Alerting Observability ", + "config_type": "slack", + "is_enabled": true, + "slack": { + "url": "https://yourteam.slack.com/messages/C69S1L3SS" + } + } +} \ No newline at end of file diff --git a/integrations/nginx/assets/monitor/ErrorPerMinute.json b/integrations/nginx/assets/monitor/ErrorPerMinute.json new file mode 100644 index 000000000..7e379326e --- /dev/null +++ b/integrations/nginx/assets/monitor/ErrorPerMinute.json @@ -0,0 +1,130 @@ +{ + "name": "ErrorsPerMinute", + "type": "monitor", + "monitor_type": "query_level_monitor", + "enabled": true, + "schedule": { + "period": { + "interval": 1, + "unit": "HOURS" + } + }, + "inputs": [ + { + "search": { + "indices": [ + "sso_logs-nginx-demo" + ], + "query": { + "size": 0, + "aggregations": {}, + "query": { + "bool": { + "filter": [ + { + "range": { + "@timestamp": { + "gte": "{{period_end}}||-1h", + "lte": "{{period_end}}", + "format": "epoch_millis" + } + } + }, + { + "match_phrase": { + "http.response.status_code": "500" + } + } + ] + } + } + } + } + } + ], + "triggers": [ + { + "name": "ErrorsPerMinute", + "severity": "1", + "condition": { + "script": { + "lang": "painless", + "source": "ctx.results[0].hits.total.value > 500" + } + }, + "actions": [ + { + "name": "ErrorsPerMinute", + "destination_id": "16o1uocBQ1JjmiDtw4dd", + "subject_template": { + "lang": "mustache", + "source": "ErrorsPerMinute" + }, + "message_template": { + "lang": "mustache", + "source": "Monitor {{ctx.monitor.name}} just entered alert status. Please investigate the issue.\n - Trigger: {{ctx.trigger.name}}\n - Severity: {{ctx.trigger.severity}}\n - Period start: {{ctx.periodStart}}\n - Period end: {{ctx.periodEnd}}" + }, + "throttle_enabled": true, + "throttle": { + "value": 10, + "unit": "MINUTES" + } + } + ], + "min_time_between_executions": null, + "rolling_window_size": null + } + ], + "ui_metadata": { + "schedule": { + "timezone": null, + "frequency": "interval", + "period": { + "interval": 1, + "unit": "HOURS" + }, + "daily": 0, + "weekly": { + "mon": false, + "tue": false, + "wed": false, + "thur": false, + "fri": false, + "sat": false, + "sun": false + }, + "monthly": { + "type": "day", + "day": 1 + }, + "cronExpression": "0 */1 * * *" + }, + "monitor_type": "query_level_monitor", + "search": { + "searchType": "graph", + "timeField": "@timestamp", + "aggregations": [], + "groupBy": [], + "bucketValue": 1, + "bucketUnitOfTime": "h", + "where": { + "fieldName": [ + { + "label": "http.response.status_code", + "type": "text" + } + ], + "operator": "is", + "fieldValue": "500", + "fieldRangeStart": 0, + "fieldRangeEnd": 0 + } + }, + "triggers": { + "ErrorsPerMinute": { + "value": 500, + "enum": "ABOVE" + } + } + } +} \ No newline at end of file diff --git a/integrations/nginx/assets/monitor/RequestsPerMinute.json b/integrations/nginx/assets/monitor/RequestsPerMinute.json new file mode 100644 index 000000000..feeb56df7 --- /dev/null +++ b/integrations/nginx/assets/monitor/RequestsPerMinute.json @@ -0,0 +1,120 @@ +{ + "name": "RequestPerMinute", + "type": "monitor", + "monitor_type": "query_level_monitor", + "enabled": true, + "schedule": { + "period": { + "interval": 1, + "unit": "HOURS" + } + }, + "inputs": [ + { + "search": { + "indices": [ + "sso_logs-nginx-demo" + ], + "query": { + "size": 0, + "aggregations": {}, + "query": { + "bool": { + "filter": [ + { + "range": { + "@timestamp": { + "gte": "{{period_end}}||-1m", + "lte": "{{period_end}}", + "format": "epoch_millis" + } + } + } + ] + } + } + } + } + } + ], + "triggers": [ + { + "name": "RequestPerMinute", + "severity": "3", + "condition": { + "script": { + "lang": "painless", + "source": "ctx.results[0].hits.total.value > 1000" + } + }, + "actions": [ + { + "name": "RequestPerMinuteAbove1000", + "destination_id": "16o1uocBQ1JjmiDtw4dd", + "subject_template": { + "lang": "mustache", + "source": "HTTP.Request" + }, + "message_template": { + "lang": "mustache", + "source": "Monitor {{ctx.monitor.name}} just entered alert status. Please investigate the issue.\n - Trigger: {{ctx.trigger.name}}\n - Severity: {{ctx.trigger.severity}}\n - Period start: {{ctx.periodStart}}\n - Period end: {{ctx.periodEnd}}" + }, + "throttle_enabled": true, + "throttle": { + "value": 10, + "unit": "MINUTES" + } + } + ], + "min_time_between_executions": null, + "rolling_window_size": null + } + ], + "ui_metadata": { + "schedule": { + "timezone": null, + "frequency": "interval", + "period": { + "interval": 1, + "unit": "HOURS" + }, + "daily": 0, + "weekly": { + "mon": false, + "tue": false, + "wed": false, + "thur": false, + "fri": false, + "sat": false, + "sun": false + }, + "monthly": { + "type": "day", + "day": 1 + }, + "cronExpression": "0 */1 * * *" + }, + "monitor_type": "query_level_monitor", + "search": { + "searchType": "graph", + "timeField": "@timestamp", + "aggregations": [], + "groupBy": [], + "bucketValue": 1, + "bucketUnitOfTime": "m", + "where": { + "fieldName": [], + "operator": "is", + "fieldValue": "", + "fieldRangeStart": 0, + "fieldRangeEnd": 0 + } + }, + "triggers": { + "RequestPerMinute": { + "value": 1000, + "enum": "ABOVE" + } + } + } +} \ No newline at end of file diff --git a/integrations/nginx/config.json b/integrations/nginx/config.json index fe3e7cc8c..fcc5a7a9f 100644 --- a/integrations/nginx/config.json +++ b/integrations/nginx/config.json @@ -1,19 +1,20 @@ { - "name": "nginx", + "template-name": "nginx", "version": { - "integ": "0.1.0", + "integration": "0.1.0", "schema": "1.0.0", "resource": "^1.23.0" }, "description": "Nginx HTTP server collector", "identification": "instrumentationScope.attributes.identification", "catalog": "observability", - "components": [ - "communication","http" - ], "collection":[ { - "logs": [{ + "category": "logs", + "components": [ + "communication","http" + ], + "feeds": [{ "info": "access logs", "input_type":"logfile", "dataset":"nginx.access", @@ -27,7 +28,9 @@ }] }, { - "metrics": [{ + "category": "metrics", + "components": [], + "feeds": [{ "info": "status metrics", "input_type":"metrics", "dataset":"nginx.status", @@ -35,8 +38,8 @@ }] } ], - "repo": { - "github": "https://github.com/opensearch-project/observability/tree/main/integrarions/nginx" + "repository": { + "url": "https://github.com/opensearch-project/observability/tree/main/integrarions/nginx" } } diff --git a/integrations/nginx/schema/fields.json b/integrations/nginx/schema/fields.json new file mode 100644 index 000000000..1a3de9b3e --- /dev/null +++ b/integrations/nginx/schema/fields.json @@ -0,0 +1,345 @@ +{ + "template-name": "nginx", + "version": "1.0.0", + "description": "Nginx HTTP server collector", + "catalog": "observability", + "collections": [ + { + "category": "logs", + "components": [ + { + "source": "logs.mapping", + "container": true, + "fields": { + "severity": { + "properties": { + "number": { + "type": "long" + }, + "text": { + "type": "text", + "fields": { + "keyword": { + "type": "keyword", + "ignore_above": 256 + } + } + } + } + }, + "attributes": { + "type": "object", + "properties": { + "data_stream": { + "properties": { + "dataset": { + "ignore_above": 128, + "type": "keyword" + }, + "namespace": { + "ignore_above": 128, + "type": "keyword" + }, + "type": { + "ignore_above": 56, + "type": "keyword" + } + } + } + } + }, + "body": { + "type": "text" + }, + "@timestamp": { + "type": "date" + }, + "observedTimestamp": { + "type": "date" + }, + "traceId": { + "ignore_above": 256, + "type": "keyword" + }, + "spanId": { + "ignore_above": 256, + "type": "keyword" + }, + "schemaUrl": { + "type": "text", + "fields": { + "keyword": { + "type": "keyword", + "ignore_above": 256 + } + } + }, + "instrumentationScope": { + "properties": { + "name": { + "type": "text", + "fields": { + "keyword": { + "type": "keyword", + "ignore_above": 128 + } + } + }, + "version": { + "type": "text", + "fields": { + "keyword": { + "type": "keyword", + "ignore_above": 256 + } + } + }, + "dropped_attributes_count": { + "type": "integer" + }, + "schemaUrl": { + "type": "text", + "fields": { + "keyword": { + "type": "keyword", + "ignore_above": 256 + } + } + } + } + }, + "event": { + "properties": { + "domain": { + "ignore_above": 256, + "type": "keyword" + }, + "name": { + "ignore_above": 256, + "type": "keyword" + }, + "category": { + "ignore_above": 256, + "type": "keyword" + }, + "type": { + "ignore_above": 256, + "type": "keyword" + }, + "kind": { + "ignore_above": 256, + "type": "keyword" + }, + "result": { + "ignore_above": 256, + "type": "keyword" + }, + "exception": { + "properties": { + "message": { + "ignore_above": 1024, + "type": "keyword" + }, + "type": { + "ignore_above": 256, + "type": "keyword" + }, + "stacktrace": { + "type": "text" + } + } + } + } + } + } + }, + { + "source": "http.mapping", + "container": false, + "fields": { + "http": { + "properties": { + "flavor": { + "type": "keyword", + "ignore_above": 256 + }, + "user_agent": { + "type": "keyword", + "ignore_above": 2048 + }, + "url": { + "type": "keyword", + "ignore_above": 2048 + }, + "schema": { + "type": "keyword", + "ignore_above": 1024 + }, + "target": { + "type": "keyword", + "ignore_above": 1024 + }, + "route": { + "type": "keyword", + "ignore_above": 1024 + }, + "client.ip": { + "type": "ip" + }, + "resent_count": { + "type": "integer" + }, + "request": { + "type": "object", + "properties": { + "id": { + "type": "text", + "fields": { + "keyword": { + "type": "keyword", + "ignore_above": 256 + } + } + }, + "body.content": { + "type": "text" + }, + "bytes": { + "type": "long" + }, + "method": { + "type": "keyword", + "ignore_above": 256 + }, + "referrer": { + "type": "keyword", + "ignore_above": 1024 + }, + "mime_type": { + "type": "keyword", + "ignore_above": 1024 + } + } + }, + "response": { + "type": "object", + "properties": { + "id": { + "type": "text", + "fields": { + "keyword": { + "type": "keyword", + "ignore_above": 256 + } + } + }, + "body.content": { + "type": "text" + }, + "bytes": { + "type": "long" + }, + "status_code": { + "type": "integer" + } + } + } + } + } + } + }, + { + "source": "communication.mapping", + "fields": { + "communication": { + "properties": { + "sock.family": { + "type": "keyword", + "ignore_above": 256 + }, + "source": { + "type": "object", + "properties": { + "address": { + "type": "text", + "fields": { + "keyword": { + "type": "keyword", + "ignore_above": 1024 + } + } + }, + "domain": { + "type": "text", + "fields": { + "keyword": { + "type": "keyword", + "ignore_above": 1024 + } + } + }, + "bytes": { + "type": "long" + }, + "ip": { + "type": "ip" + }, + "port": { + "type": "long" + }, + "mac": { + "type": "keyword", + "ignore_above": 1024 + }, + "packets": { + "type": "long" + } + } + }, + "destination": { + "type": "object", + "properties": { + "address": { + "type": "text", + "fields": { + "keyword": { + "type": "keyword", + "ignore_above": 1024 + } + } + }, + "domain": { + "type": "text", + "fields": { + "keyword": { + "type": "keyword", + "ignore_above": 1024 + } + } + }, + "bytes": { + "type": "long" + }, + "ip": { + "type": "ip" + }, + "port": { + "type": "long" + }, + "mac": { + "type": "keyword", + "ignore_above": 1024 + }, + "packets": { + "type": "long" + } + } + } + } + } + } + } + ] + } + ] +} \ No newline at end of file diff --git a/integrations/service-map/assets/README.md b/integrations/service-map/assets/README.md new file mode 100644 index 000000000..d2b620bcf --- /dev/null +++ b/integrations/service-map/assets/README.md @@ -0,0 +1,47 @@ +# Services Integration Assets + +### Channels +Creating a slack channel for notifications + +API : http://osd:5601/api/notifications/create_config + +[Slack Channel](channels/slack.json) +```json5 +{ + "config": { + "name": "Alerts", + "description": "Alerting Observability ", + "config_type": "slack", + "is_enabled": true, + "slack": { + "url": "https://yourteam.slack.com/messages/C69S1L3SS" + } + } +} +``` + +### Monitoring +API: http://osd:5601/api/alerting/monitors + +Creating a monitor for RequestPerMinute max Alert & ErrorsPerMinute max Alert + +- [RequestsPerMinute](monitor/RequestsPerMinute.json) +- [ErrorsPerMinute](monitor/ErrorPerMinute.json) + + +### Display + +API: http://osd:5601/api/saved_objects/_import?overwrite=true + + - [Dashboard](display/sso-logs-dashboard-new.ndjson) + + +### Fields +The next table details the different fields usage across the different assets + +| Field | Mapping Source | Usage | +|----------|:--------------:|-------------------------------------------------------------------------------------------------------------------------------:| +| `@timestamp` | logs.mapping | | +| `http.response.bytes` | http.mapping | [sso-logs-dashboard-new.ndjson](display%2Fsso-logs-dashboard-new.ndjson) | +| `observerTime` | http.mapping | | +| `http.response.status_code` | http.mapping | [sso-logs-dashboard-new.ndjson](display%2Fsso-logs-dashboard-new.ndjson), [ErrorPerMinute.json](monitor%2FErrorPerMinute.json) | \ No newline at end of file diff --git a/integrations/service-map/assets/mapping/jaeger-services.mapping b/integrations/service-map/assets/mapping/jaeger-services.mapping new file mode 100644 index 000000000..652c48c05 --- /dev/null +++ b/integrations/service-map/assets/mapping/jaeger-services.mapping @@ -0,0 +1,38 @@ +{ + "index_patterns": [ + "jaeger-service-v1*" + ], + "mappings": { + "properties": { + "operationName": { + "type": "keyword", + "ignore_above": 256 + }, + "serviceName": { + "type": "keyword", + "ignore_above": 256 + } + }, + "dynamic_templates": [ + { + "span_tags_map": { + "path_match": "tag.*", + "mapping": { + "ignore_above": 256, + "type": "keyword" + } + } + }, + { + "process_tags_map": { + "path_match": "process.tag.*", + "mapping": { + "ignore_above": 256, + "type": "keyword" + } + } + } + ] + }, + "version": 1 +} \ No newline at end of file diff --git a/integrations/service-map/assets/mapping/jaeger-traces.mapping b/integrations/service-map/assets/mapping/jaeger-traces.mapping new file mode 100644 index 000000000..2ebaf25fa --- /dev/null +++ b/integrations/service-map/assets/mapping/jaeger-traces.mapping @@ -0,0 +1,239 @@ +{ + "index_patterns": [ + "jaeger-span-v1*" + ], + "data_stream": {}, + "template": { + "mappings": { + "properties": { + "duration": { + "type": "long" + }, + "flags": { + "type": "integer" + }, + "logs": { + "type": "nested", + "dynamic": "false", + "properties": { + "fields": { + "type": "nested", + "dynamic": "false", + "properties": { + "key": { + "type": "keyword", + "ignore_above": 256 + }, + "tagType": { + "type": "keyword", + "ignore_above": 256 + }, + "value": { + "type": "keyword", + "ignore_above": 256 + } + } + }, + "timestamp": { + "type": "long" + } + } + }, + "operationName": { + "type": "keyword", + "ignore_above": 256 + }, + "parentSpanID": { + "type": "keyword", + "ignore_above": 256 + }, + "process": { + "properties": { + "serviceName": { + "type": "keyword", + "ignore_above": 256 + }, + "tag": { + "properties": { + "client-uuid": { + "type": "keyword", + "ignore_above": 256 + }, + "hostname": { + "type": "keyword", + "ignore_above": 256 + }, + "ip": { + "type": "keyword", + "ignore_above": 256 + }, + "jaeger@version": { + "type": "keyword", + "ignore_above": 256 + } + } + }, + "tags": { + "type": "nested", + "dynamic": "false", + "properties": { + "key": { + "type": "keyword", + "ignore_above": 256 + }, + "tagType": { + "type": "keyword", + "ignore_above": 256 + }, + "value": { + "type": "keyword", + "ignore_above": 256 + } + } + } + } + }, + "references": { + "type": "nested", + "dynamic": "false", + "properties": { + "refType": { + "type": "keyword", + "ignore_above": 256 + }, + "spanID": { + "type": "keyword", + "ignore_above": 256 + }, + "traceID": { + "type": "keyword", + "ignore_above": 256 + } + } + }, + "spanID": { + "type": "keyword", + "ignore_above": 256 + }, + "startTime": { + "type": "long" + }, + "startTimeMillis": { + "type": "date", + "format": "epoch_millis" + }, + "tag": { + "properties": { + "component": { + "type": "keyword", + "ignore_above": 256 + }, + "error": { + "type": "keyword", + "ignore_above": 256 + }, + "http@method": { + "type": "keyword", + "ignore_above": 256 + }, + "http@status_code": { + "type": "keyword", + "ignore_above": 256 + }, + "http@url": { + "type": "keyword", + "ignore_above": 256 + }, + "internal@span@format": { + "type": "keyword", + "ignore_above": 256 + }, + "net/http@reused": { + "type": "keyword", + "ignore_above": 256 + }, + "net/http@was_idle": { + "type": "keyword", + "ignore_above": 256 + }, + "param@driverID": { + "type": "keyword", + "ignore_above": 256 + }, + "param@location": { + "type": "keyword", + "ignore_above": 256 + }, + "peer@service": { + "type": "keyword", + "ignore_above": 256 + }, + "request": { + "type": "keyword", + "ignore_above": 256 + }, + "sampler@param": { + "type": "keyword", + "ignore_above": 256 + }, + "sampler@type": { + "type": "keyword", + "ignore_above": 256 + }, + "span@kind": { + "type": "keyword", + "ignore_above": 256 + }, + "sql@query": { + "type": "keyword", + "ignore_above": 256 + } + } + }, + "tags": { + "type": "nested", + "dynamic": "false", + "properties": { + "key": { + "type": "keyword", + "ignore_above": 256 + }, + "tagType": { + "type": "keyword", + "ignore_above": 256 + }, + "value": { + "type": "keyword", + "ignore_above": 256 + } + } + }, + "traceID": { + "type": "keyword", + "ignore_above": 256 + } + }, + "dynamic_templates": [ + { + "span_tags_map": { + "path_match": "tag.*", + "mapping": { + "ignore_above": 256, + "type": "keyword" + } + } + }, + { + "process_tags_map": { + "path_match": "process.tag.*", + "mapping": { + "ignore_above": 256, + "type": "keyword" + } + } + } + ] + } + }, + "version": 1 +} diff --git a/integrations/service-map/assets/queries/getTraceGroupPercentilesQuery.json b/integrations/service-map/assets/queries/getTraceGroupPercentilesQuery.json new file mode 100644 index 000000000..a41a09509 --- /dev/null +++ b/integrations/service-map/assets/queries/getTraceGroupPercentilesQuery.json @@ -0,0 +1,137 @@ +{ + "size": 0, + "query": { + "bool": { + "must": [ + { + "term": { + "parentSpanId": { + "value": "" + } + } + } + ], + "filter": [], + "should": [], + "must_not": [] + } + }, + "aggs": { + "trace_group_name": { + "terms": { + "field": "name", + "size": 10000 + }, + "aggs": { + "percentiles": { + "percentiles": { + "field": "durationInNanos", + "percents": [ + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 14, + 15, + 16, + 17, + 18, + 19, + 20, + 21, + 22, + 23, + 24, + 25, + 26, + 27, + 28, + 29, + 30, + 31, + 32, + 33, + 34, + 35, + 36, + 37, + 38, + 39, + 40, + 41, + 42, + 43, + 44, + 45, + 46, + 47, + 48, + 49, + 50, + 51, + 52, + 53, + 54, + 55, + 56, + 57, + 58, + 59, + 60, + 61, + 62, + 63, + 64, + 65, + 66, + 67, + 68, + 69, + 70, + 71, + 72, + 73, + 74, + 75, + 76, + 77, + 78, + 79, + 80, + 81, + 82, + 83, + 84, + 85, + 86, + 87, + 88, + 89, + 90, + 91, + 92, + 93, + 94, + 95, + 96, + 97, + 98, + 99, + 100 + ] + } + } + } + } + } +} diff --git a/integrations/service-map/assets/scripts/getPayloadQuery.json b/integrations/service-map/assets/scripts/getPayloadQuery.json new file mode 100644 index 000000000..bfdb5db73 --- /dev/null +++ b/integrations/service-map/assets/scripts/getPayloadQuery.json @@ -0,0 +1,25 @@ +{ + "script": { + "lang": "mustache", + "source": { + "size": 1000, + "query": { + "bool": { + "must": [ + { + "term": { + "traceId": "{{traceId}}" + } + } + ], + "filter": [], + "should": [], + "must_not": [] + } + } + }, + "params": { + "traceId": "traceId" + } + } +} diff --git a/integrations/service-map/assets/scripts/getServiceBreakdownQuery.json b/integrations/service-map/assets/scripts/getServiceBreakdownQuery.json new file mode 100644 index 000000000..4b14d43e3 --- /dev/null +++ b/integrations/service-map/assets/scripts/getServiceBreakdownQuery.json @@ -0,0 +1,53 @@ +{ + "script": { + "lang": "mustache", + "source": { + "size": 0, + "query": { + "bool": { + "must": [ + { + "term": { + "traceId": "{{traceId}}" + } + } + ], + "filter": [], + "should": [], + "must_not": [] + } + }, + "aggs": { + "service_type": { + "terms": { + "field": "attributes.serviceName", + "order": [ + { + "total_latency_nanos": "desc" + } + ] + }, + "aggs": { + "total_latency_nanos": { + "sum": { + "field": "durationInNanos" + } + }, + "total_latency": { + "bucket_script": { + "buckets_path": { + "count": "_count", + "latency": "total_latency_nanos.value" + }, + "script": "Math.round(params.latency / 10000) / 100.0" + } + } + } + } + } + }, + "params": { + "traceId": "traceId" + } + } +} diff --git a/integrations/service-map/assets/scripts/getSpanDetailQuery.json b/integrations/service-map/assets/scripts/getSpanDetailQuery.json new file mode 100644 index 000000000..83affa87e --- /dev/null +++ b/integrations/service-map/assets/scripts/getSpanDetailQuery.json @@ -0,0 +1,49 @@ +{ + "script": { + "lang": "mustache", + "source": { + "size": 3000, + "query": { + "bool": { + "must": [ + { + "term": { + "traceId": "{{traceId}}" + } + }, + { + "exists": { + "field": "attributes.serviceName" + } + } + ], + "filter": [], + "should": [], + "must_not": [] + } + }, + "sort": [ + { + "startTime": { + "order": "desc" + } + } + ], + "_source": { + "includes": [ + "attributes.serviceName", + "name", + "startTime", + "endTime", + "spanId", + "status.code", + "durationInNanos" + ] + } + }, + "params": { + "traceId": "traceId" + } + } +} + diff --git a/integrations/service-map/assets/scripts/getSpanFlyoutQuery.json b/integrations/service-map/assets/scripts/getSpanFlyoutQuery.json new file mode 100644 index 000000000..100370f39 --- /dev/null +++ b/integrations/service-map/assets/scripts/getSpanFlyoutQuery.json @@ -0,0 +1,25 @@ +{ + "script": { + "lang": "mustache", + "source": { + "size": 1000, + "query": { + "bool": { + "must": [ + { + "term": { + "spanID": "{{spanId}}" + } + } + ], + "filter": [], + "should": [], + "must_not": [] + } + } + }, + "params": { + "traceId": "spanId" + } + } +} \ No newline at end of file diff --git a/integrations/service-map/assets/scripts/getSpansQuery.json b/integrations/service-map/assets/scripts/getSpansQuery.json new file mode 100644 index 000000000..4404f3651 --- /dev/null +++ b/integrations/service-map/assets/scripts/getSpansQuery.json @@ -0,0 +1,23 @@ +{ + "script": { + "lang": "mustache", + "source": { + "size": "{{size}}", + "from": "{{from}}", + "query": { + "bool": { + "must": [], + "filter": [], + "should": [], + "must_not": [] + } + }, + "sort": "{{sortingColumns}}" + }, + "params": { + "size": "100", + "from": "0", + "sort": "asc" + } + } +} \ No newline at end of file diff --git a/integrations/service-map/assets/scripts/getTracesQuery.json b/integrations/service-map/assets/scripts/getTracesQuery.json new file mode 100644 index 000000000..8f5b20ca5 --- /dev/null +++ b/integrations/service-map/assets/scripts/getTracesQuery.json @@ -0,0 +1,68 @@ +{ + "script": { + "lang": "mustache", + "source": { + "size": 0, + "query": { + "bool": { + "must": [ + { + "term": { + "traceId": "{{traceId}}" + } + } + ], + "filter": [], + "should": [], + "must_not": [] + } + }, + "aggs": { + "traces": { + "terms": { + "field": "traceId", + "size": 100, + "order": { + "_key": "{{direction}}" + } + }, + "aggs": { + "latency": { + "max": { + "script": { + "source": "\n if (doc.containsKey('duration') && !doc['duration'].empty) {\n return Math.round(doc['duration'].value) / 1000.0\n }\n\n return 0\n ", + "lang": "painless" + } + } + }, + "trace_group": { + "terms": { + "field": "traceGroup", + "size": 1 + } + }, + "error_count": { + "filter": { + "term": { + "tag.error": true + } + } + }, + "last_updated": { + "max": { + "script": { + "source": "\n if (doc.containsKey('startTime') && !doc['startTime'].empty && doc.containsKey('duration') && !doc['duration'].empty) {\n return (Math.round(doc['duration'].value) + Math.round(doc['startTime'].value)) / 1000.0\n }\n\n return 0\n ", + "lang": "painless" + } + } + } + } + } + } + }, + "params": { + "traceId": "traceId", + "direction": "asc" + } + } +} diff --git a/integrations/service-map/assets/scripts/getValidTraceIdsQuery.json b/integrations/service-map/assets/scripts/getValidTraceIdsQuery.json new file mode 100644 index 000000000..24f189566 --- /dev/null +++ b/integrations/service-map/assets/scripts/getValidTraceIdsQuery.json @@ -0,0 +1,33 @@ +{ + "script": { + "lang": "mustache", + "source": { + "size": 0, + "query": { + "bool": { + "must": [], + "filter": [ + { + "term": { "traceGroupName.keyword": "{{traceGroupName}}"} + }, + { + "term": { "serviceName": "{{serviceName}}" } + } + ] + } + }, + "aggs": { + "traces": { + "terms": { + "field": "traceId", + "size": 10000 + } + } + } + }, + "params": { + "traceGroup": "traceGroupName", + "serviceName": "serviceName" + } + } +} diff --git a/integrations/service-map/config.json b/integrations/service-map/config.json index d082b0027..3739c6c29 100644 --- a/integrations/service-map/config.json +++ b/integrations/service-map/config.json @@ -1,47 +1,86 @@ { - "name": "data-prepper", + "template-name": "service-map", "version": { - "integ": "0.1.0", + "integration": "0.1.0", "schema": "1.0.0", "resource": "^2.6.0" }, - "description": "Data-Prepper Service Map and Tracing correlations Integration", + "description": "Service Map and Tracing correlations Integration", "catalog": "observability", - "components": [ - "traces,traceGroups,metrics" - ], - "collection":[ + "collection": [ { - "traces": [{ - "info": "traces signals", - "input_type":"traces", - "dataset":"spans", - "labels" :["traceGroups","traces"], - "fields-mapping" : [ - {"alias":"attributes.serviceName","field":"serviceName"} , - {"alias":"events.@timestamp","field":"events.time"} - ] - }] + "category": "traces", + "components": ["traceGroups"], + "feeds": [ + { + "info": "traces signals", + "input_type": "traces", + "dataset": "spans", + "labels": [ + "traceGroups", + "traces" + ], + "fields-mapping": [ + { + "template": "data-prepper-traces", + "fields": [ + { + "alias": "attributes.serviceName", + "field": "serviceName" + }, + { + "alias": "events.@timestamp", + "field": "events.time" + } + ] + }, + { + "template": "jaeger-traces", + "fields": [ + { + "alias": "attributes.serviceName", + "field": "serviceName" + }, + { + "alias": "events.@timestamp", + "field": "events.time" + } + ] + } + ] + } + ] }, { - "services": [{ + "category": "services", + "components": [], + "feeds": [ + { "info": "service map", "input_type": "services", "dataset": "service", - "labels": ["services"] - }] + "labels": [ + "services" + ] + } + ] }, { - "metrics": [{ - "info": "status metrics", - "input_type":"metrics", - "dataset":"metrics", - "labels" :["metrics"] - }] + "metrics": [ + { + "components": [], + "info": "status metrics", + "input_type": "metrics", + "dataset": "metrics", + "labels": [ + "metrics" + ] + } + ] } ], - "repo": { - "github": "https://github.com/opensearch-project/observability/tree/main/integrarions/service-map" + "repository": { + "url": "https://github.com/opensearch-project/observability/tree/main/integrarions/service-map" } } diff --git a/integrations/service-map/info/README.md b/integrations/service-map/info/providers/data-prepper/README.md similarity index 95% rename from integrations/service-map/info/README.md rename to integrations/service-map/info/providers/data-prepper/README.md index 5ce6e454a..c28dbeca7 100644 --- a/integrations/service-map/info/README.md +++ b/integrations/service-map/info/providers/data-prepper/README.md @@ -58,10 +58,15 @@ To compensate for the minor differences in fields naming between the [Data-Prepp We will define the next mapping alias that will be part of the [config.json](../config.json) for this integration ```json5 - ... + ... "fields-mapping" : [ - {"alias":"attributes.serviceName","field":"serviceName"} , - {"alias":"events.@timestamp","field":"events.time"} + { + "template": "data-prepper-traces", + "fields": [ + {"alias":"attributes.serviceName","field":"serviceName"} , + {"alias":"events.@timestamp","field":"events.time"} + ] + } ] ... ``` diff --git a/integrations/service-map/info/dataPrepper.svg b/integrations/service-map/info/providers/data-prepper/dataPrepper.svg similarity index 100% rename from integrations/service-map/info/dataPrepper.svg rename to integrations/service-map/info/providers/data-prepper/dataPrepper.svg diff --git a/integrations/service-map/info/providers/jaeger/README.md b/integrations/service-map/info/providers/jaeger/README.md new file mode 100644 index 000000000..926736ab1 --- /dev/null +++ b/integrations/service-map/info/providers/jaeger/README.md @@ -0,0 +1,121 @@ +![jaeger](jaeger-logo.png) + +# What is Jaeger + +[Jaeger](https://github.com/jaegertracing/jaeger) Jaeger, inspired by Dapper and OpenZipkin, is a distributed tracing platform created by Uber Technologies and donated to Cloud Native Computing Foundation. It can be used for monitoring microservices-based distributed systems: + +- Distributed context propagation +- Distributed transaction monitoring +- Root cause analysis +- Service dependency analysis +- Performance / latency optimization + + +# What is Jaeger Integration + +Jaeger integration is concerned with the following aspects + + - Allow simple and automatic generation of all schematic structured + - traces ( including specific fields mapping to map to SS4O schema) + - services ( adding support for specific service mapping category) + - metrics (using the standard SS4O schema) + + - Add Dashboard Assets for correlation between traces-services-metrics + + - Add correlation queries to investigate traces based metrics + +# Jaeger Trace Fields +Jaeger uses the following [Traces](../schema/jaeger-traces.mapping) mapping file + +The next fields are used: +```text + +- traceId - A unique identifier for a trace. All spans from the same trace share the same traceId. +- spanId - A unique identifier for a span within a trace, assigned when the span is created. +- traceState - Conveys information about request position in multiple distributed tracing graphs. +- parentSpanId - The spanId of this span's parent span. If this is a root span, then this field must be empty. +- name - A description of the span's operation. +- kind - The type of span. See OpenTelemetry - SpanKind. +- startTime - The start time of the span. +- endTime - The end time of the span. +- durationInNanos - Difference in nanoseconds between startTime and endTime. +- serviceName - Currently derived from the opentelemetry.proto.resource.v1.Resource associated with the span, the resource from the span originates. +- events - A list of events. See OpenTelemetry - Events. +- links - A list of linked spans. See OpenTelemetry - Links. +- droppedAttributesCount - The number of attributes that were discarded. +- droppedEventsCount - The number of events that were discarded. +- droppedLinksCount - The number of links that were dropped. +- span.attributes.* - All span attributes are split into a list of keywords. +- resource.attributes.* - All resource attributes are split into a list of keywords. +- status.code - The status of the span. See OpenTelemetry - Status. + +``` +These fields have a high overlap with the [`sso_traces`](../../../schema/observability/traces/README.md) fields from the observability catalog + +There are some additional `trace.group` related fields which are not part of the [OTEL spec](https://github.com/open-telemetry/opentelemetry-specification/blob/main/specification/trace/api.md) for traces +```text +- traceGroup - A derived field, the name of the trace's root span. +- traceGroupFields.endTime - A derived field, the endTime of the trace's root span. +- traceGroupFields.statusCode - A derived field, the status.code of the trace's root span. +- traceGroupFields.durationInNanos - A derived field, the durationInNanos of the trace's root span. + +``` + +# Jaeger Trace Fields Mapping to SSO Trace Schema +To compensate for the minor differences in fields naming between the [Jaeger -Trace mapping](../schema/jaeger-traces.mapping) and [SSO Traces mapping](../../../schema/observability/traces/traces.mapping) +We will define the next mapping alias that will be part of the [config.json](../config.json) for this integration + +```json5 + ... + "fields-mapping" : [ + { + "template": "jaeger-services.mapping", + "fields": [ + {"alias":"attributes.serviceName","field":"serviceName"} , + {"alias":"events.@timestamp","field":"events.time"} + ] + } + ] + ... +``` + + + +To address this difference, the `trace` signal can be augmented with additional trace-component - in this case it will be the [traceGroup](../../../schema/observability/traces/traceGroup). + +## Service dashboard +Service will have a dashboard comprised of the following visualizations: + - Latency per service with traces / metrics links + - Latency per trace-group with traces / metrics links + - Error rate per service with traces / metrics links + - Error rate per trace-group with traces / metrics links + - Throughput rate per service with traces / metrics links + - Throughput rate per trace-group with traces / metrics links + + - Services view including error rate, latency, throughput, connected-services, traces, metrics + +```text ++--------------------------------+--------------------------------+ +| | | +| Latency per service | Latency per trace-group | +| with traces/metrics links | with traces/metrics links | +| | | ++--------------------------------+--------------------------------+ +| | | +| Error rate per service | Error rate per trace-group | +| with traces/metrics links | with traces/metrics links | +| | | ++--------------------------------+--------------------------------+ +| | | +| Throughput rate per service | Throughput rate per trace-group| +| with traces/metrics links | with traces/metrics links | +| | | ++--------------------------------+--------------------------------+ +| | +| Services view with error rate, latency, | +| throughput, connected-services, traces, | +| and metrics | +| | ++--------------------------------------------------------+ + +``` \ No newline at end of file diff --git a/integrations/service-map/info/providers/jaeger/jaeger-logo.png b/integrations/service-map/info/providers/jaeger/jaeger-logo.png new file mode 100644 index 0000000000000000000000000000000000000000..1e4753d05e80d56ed306fab98bb3d695527d7592 GIT binary patch literal 46281 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