diff --git a/docs/entities/synthesis.md b/docs/entities/synthesis.md index adaedf354..38723475d 100644 --- a/docs/entities/synthesis.md +++ b/docs/entities/synthesis.md @@ -181,6 +181,18 @@ synthesis: You can also change the name of the tag to another value, rather than using the name in the attribute. In general, we suggest not to use this configuration unless you are trying to use more standard namings, since sometimes it's difficult for the user to see the difference between entity tags and telemetry attributes, and changing the names could cause even more confusion. +This is the relevant syntax: +```yaml +synthesis: + rules: + - identifier: someIdAttribute + name: someNameAttribute + tags: + originalAttributeName: + entityTagNames: [desiredTagName1, desiredTagName2] +``` +The above example will result in an entity having two tags, `desiredTagName1` and `desiredTagName2`, with the value present in the `originalAttributeName` attribute from the processed data point. + A good use case for this feature is `CONTAINER`: A container has different sources (docker, kubernetes, etc.), and we rename the tags to use a standard naming and a "per source" name. ```yaml diff --git a/entity-types/apm-application/golden_metrics.yml b/entity-types/apm-application/golden_metrics.yml index 60f1dd4e8..28d1fb7e1 100644 --- a/entity-types/apm-application/golden_metrics.yml +++ b/entity-types/apm-application/golden_metrics.yml @@ -1,5 +1,5 @@ responseTimeMs: - title: Response time (ms) + title: Response time unit: MS query: select: average(apm.service.transaction.duration) * 1000 AS 'Response time (ms)' diff --git a/entity-types/autoflows-workflow/dashboard.json b/entity-types/autoflows-workflow/dashboard.json new file mode 100644 index 000000000..497c77ecf --- /dev/null +++ b/entity-types/autoflows-workflow/dashboard.json @@ -0,0 +1,144 @@ +{ + "name": "Autoflow Overview", + "description": null, + "pages": [ + { + "name": "Autoflow Overview", + "description": null, + "widgets": [ + { + "title": "Workflows Started", + "layout": { + "column": 1, + "row": 1, + "width": 6, + "height": 4 + }, + "visualization": { + "id": "viz.line" + }, + "rawConfiguration": { + "facet": { + "showOtherSeries": false + }, + "legend": { + "enabled": true + }, + "nrqlQueries": [ + { + "accountId": 0, + "query": "SELECT COUNT(*) FROM Log where autoflow.runId IS NOT NULL \nFACET autoflow.name\nWHERE message like '[INFO] - Workflow: % has started'\nSINCE 1 hour ago limit max TIMESERIES auto" + } + ], + "platformOptions": { + "ignoreTimeRange": false + }, + "thresholds": [ + { + "isLabelVisible": true + } + ], + "yAxisLeft": { + "zero": true + }, + "yAxisRight": { + "zero": true + } + } + }, + { + "title": "Steps Started", + "layout": { + "column": 7, + "row": 1, + "width": 6, + "height": 4 + }, + "visualization": { + "id": "viz.line" + }, + "rawConfiguration": { + "facet": { + "showOtherSeries": false + }, + "legend": { + "enabled": true + }, + "nrqlQueries": [ + { + "accountId": 0, + "query": "SELECT COUNT(*) as 'Steps' \nFROM Log where autoflow.runId IS NOT NULL \nWHERE message LIKE '[INFO] - Workflow: % Step % has started'\nSINCE 1 hour AGO LIMIT MAX TIMESERIES AUTO" + } + ], + "platformOptions": { + "ignoreTimeRange": false + }, + "thresholds": [ + { + "isLabelVisible": true + } + ], + "yAxisLeft": { + "zero": true + }, + "yAxisRight": { + "zero": true + } + } + }, + { + "title": "Recent Autoflow Run", + "layout": { + "column": 1, + "row": 5, + "width": 6, + "height": 4 + }, + "visualization": { + "id": "viz.table" + }, + "rawConfiguration": { + "facet": { + "showOtherSeries": false + }, + "nrqlQueries": [ + { + "accountId": 0, + "query": "SELECT *\nFROM Log\nWHERE autoflow.runId IS NOT null\nSINCE 10 minutes AGO" + } + ], + "platformOptions": { + "ignoreTimeRange": false + } + } + }, + { + "title": "Audit Events", + "layout": { + "column": 7, + "row": 5, + "width": 6, + "height": 4 + }, + "visualization": { + "id": "viz.table" + }, + "rawConfiguration": { + "facet": { + "showOtherSeries": false + }, + "nrqlQueries": [ + { + "accountId": 0, + "query": "FROM NrAuditEvent SELECT * SINCE 1 hour ago" + } + ], + "platformOptions": { + "ignoreTimeRange": false + } + } + } + ] + } + ] +} \ No newline at end of file diff --git a/entity-types/autoflows-workflow/definition.yml b/entity-types/autoflows-workflow/definition.yml index 2a7b078fc..f82d731ee 100644 --- a/entity-types/autoflows-workflow/definition.yml +++ b/entity-types/autoflows-workflow/definition.yml @@ -1,6 +1,8 @@ domain: AUTOFLOWS type: WORKFLOW - +dashboardTemplates: + newRelic: + template: dashboard.json configuration: entityExpirationTime: MANUAL alertable: true \ No newline at end of file diff --git a/entity-types/ext-fluentbit_host/dashboard.json b/entity-types/ext-fluentbit_host/dashboard.json new file mode 100644 index 000000000..6d8ec8e64 --- /dev/null +++ b/entity-types/ext-fluentbit_host/dashboard.json @@ -0,0 +1,959 @@ +{ + "name": "On-host Fluent Bit monitoring", + "description": null, + "pages": [ + { + "name": "Overview", + "description": null, + "widgets": [ + { + "title": "", + "layout": { + "column": 1, + "row": 1, + "width": 6, + "height": 6 + }, + + "visualization": { + "id": "viz.markdown" + }, + "rawConfiguration": { + "text": "# README\n\n## About this page\nThis page represents most of [Fluent Bit's internal metrics](https://docs.fluentbit.io/manual/administration/monitoring#for-v2-metrics). The metric representations are grouped by categories and faceted by each plugin instance where appropriate.\n\n## How to filter\n1. Select the Kubernetes cluster you want to troubleshoot in the \"Cluster Name\" variable above.\n2. [OPTIONAL] You can use any of the values in the `Node name` and `Pod name` columns on the \"Fluent Bit version\" table to further filter the metrics displayed in the graphs below. To do so, you need to enable [facet filtering](https://docs.newrelic.com/docs/query-your-data/explore-query-data/dashboards/filter-new-relic-one-dashboards-facets/) on that table by clicking on the \"Edit\" submenu and select \"Filter the current dashboard\" under \"Facet Linking\". \n\n## Legend\n### Metric dimensions\n- **name**: the name of the Fluent Bit plugin. Version 1.21.0 of our Helm chart names them according to the plugin names described in the following section.\n- **pod_name**: the `newrelic-logging` pod (Fluent Bit instance) that emitted this metric.\n- **node_name**: physical Kubernetes node where the `newrelic-logging` pod is running.\n\n### Plugin names\n- **pod-logs-tailer**: `tail` *INPUT* plugin normally reading from `/var/log/containers/*.log`\n- **kubernetes-enricher**: `kubernetes` *FILTER* plugin that queries the Kubernetes API to enrich the logs with pod/container metadata.\n- **node-attributes-enricher**: `record_modifier` *FILTER* plugin that enriches logs with `cluster_name`.\n- **kubernetes-attribute-lifter** (only when in low data mode): `nest` *FILTER* plugin that lifts all the keys under `kubernetes`. This plugin is transparent to the final shape of the log.\n- **node-attributes-enricher-filter** (only when in low data mode): same as node-attributes-enricher`, but it also removes attributes that are not strictly necessary for correct platform functioning.\n- **newrelic-logs-forwarder**: `newrelic` *OUTPUT* plugin that sends logs to the New Relic Logs API" + } + }, + { + "title": "Fluent Bit version", + "layout": { + "column": 7, + "row": 1, + "width": 6, + "height": 3 + }, + + "visualization": { + "id": "viz.table" + }, + "rawConfiguration": { + "facet": { + "showOtherSeries": false + }, + "nrqlQueries": [ + { + "accountId": 0, + "query": "SELECT latest(os) as 'OS', latest(version) as 'FB version', latest(cluster_name) FROM Metric where metricName = 'fluentbit_build_info' since 1 hour ago limit max" + } + ], + "platformOptions": { + "ignoreTimeRange": false + } + } + }, + { + "title": "Fluent Bit uptime", + "layout": { + "column": 7, + "row": 4, + "width": 6, + "height": 3 + }, + + "visualization": { + "id": "viz.line" + }, + "rawConfiguration": { + "facet": { + "showOtherSeries": false + }, + "legend": { + "enabled": true + }, + "nrqlQueries": [ + { + "accountId": 0, + "query": "SELECT latest(fluentbit_uptime) FROM Metric timeseries" + } + ], + "platformOptions": { + "ignoreTimeRange": false + }, + "thresholds": [], + "yAxisLeft": { + "zero": true + }, + "yAxisRight": { + "zero": true + } + } + }, + { + "title": "", + "layout": { + "column": 1, + "row": 7, + "width": 12, + "height": 1 + }, + + "visualization": { + "id": "viz.markdown" + }, + "rawConfiguration": { + "text": "# INPUTS" + } + }, + { + "title": "Input byte rate (bytes/minute)", + "layout": { + "column": 1, + "row": 8, + "width": 4, + "height": 3 + }, + + "visualization": { + "id": "viz.line" + }, + "rawConfiguration": { + "facet": { + "showOtherSeries": false + }, + "legend": { + "enabled": true + }, + "nrqlQueries": [ + { + "accountId": 0, + "query": "SELECT rate(sum(fluentbit_input_bytes_total), 1 minute) as 'bytes/minute' FROM Metric where name != 'fb-metrics-collector' timeseries max" + } + ], + "platformOptions": { + "ignoreTimeRange": false + }, + "thresholds": [], + "yAxisLeft": { + "zero": true + }, + "yAxisRight": { + "zero": true + } + } + }, + { + "title": "Input log rate (records/minute)", + "layout": { + "column": 5, + "row": 8, + "width": 4, + "height": 3 + }, + + "visualization": { + "id": "viz.line" + }, + "rawConfiguration": { + "facet": { + "showOtherSeries": false + }, + "legend": { + "enabled": true + }, + "nrqlQueries": [ + { + "accountId": 0, + "query": "SELECT rate(sum(fluentbit_input_records_total), 1 minute) as 'logs/minute' FROM Metric where name != 'fb-metrics-collector' timeseries max" + } + ], + "platformOptions": { + "ignoreTimeRange": false + }, + "thresholds": [], + "yAxisLeft": { + "zero": true + }, + "yAxisRight": { + "zero": true + } + } + }, + { + "title": "Average incoming record size (bytes)", + "layout": { + "column": 9, + "row": 8, + "width": 4, + "height": 3 + }, + + "visualization": { + "id": "viz.line" + }, + "rawConfiguration": { + "facet": { + "showOtherSeries": false + }, + "legend": { + "enabled": true + }, + "nrqlQueries": [ + { + "accountId": 0, + "query": "SELECT sum(fluentbit_input_bytes_total)/sum(fluentbit_input_records_total) as 'Average incoming record size (bytes)' FROM Metric where name != 'fb-metrics-collector' timeseries max" + } + ], + "platformOptions": { + "ignoreTimeRange": false + }, + "thresholds": [], + "units": { + "unit": "BYTES" + }, + "yAxisLeft": { + "zero": true + }, + "yAxisRight": { + "zero": true + } + } + }, + { + "title": "", + "layout": { + "column": 1, + "row": 11, + "width": 12, + "height": 1 + }, + + "visualization": { + "id": "viz.markdown" + }, + "rawConfiguration": { + "text": "# FILTERS" + } + }, + { + "title": "Filter byte rate (bytes/minute)", + "layout": { + "column": 1, + "row": 12, + "width": 4, + "height": 3 + }, + + "visualization": { + "id": "viz.line" + }, + "rawConfiguration": { + "facet": { + "showOtherSeries": false + }, + "legend": { + "enabled": true + }, + "nrqlQueries": [ + { + "accountId": 0, + "query": "SELECT rate(sum(fluentbit_filter_bytes_total), 1 minute) FROM Metric timeseries max" + } + ], + "platformOptions": { + "ignoreTimeRange": false + }, + "thresholds": [], + "yAxisLeft": { + "zero": true + }, + "yAxisRight": { + "zero": true + } + } + }, + { + "title": "Filter log rate (records/minute)", + "layout": { + "column": 5, + "row": 12, + "width": 4, + "height": 3 + }, + + "visualization": { + "id": "viz.line" + }, + "rawConfiguration": { + "facet": { + "showOtherSeries": false + }, + "legend": { + "enabled": true + }, + "nrqlQueries": [ + { + "accountId": 0, + "query": "SELECT rate(sum(fluentbit_filter_records_total), 1 minute) FROM Metric timeseries max" + } + ], + "platformOptions": { + "ignoreTimeRange": false + }, + "thresholds": [], + "yAxisLeft": { + "zero": true + }, + "yAxisRight": { + "zero": true + } + } + }, + { + "title": "Average filtered record size (bytes)", + "layout": { + "column": 9, + "row": 12, + "width": 4, + "height": 3 + }, + + "visualization": { + "id": "viz.line" + }, + "rawConfiguration": { + "facet": { + "showOtherSeries": false + }, + "legend": { + "enabled": true + }, + "nrqlQueries": [ + { + "accountId": 0, + "query": "SELECT sum(fluentbit_filter_bytes_total)/sum(fluentbit_filter_records_total) AS 'Average filtered record size (bytes)' FROM Metric timeseries max" + } + ], + "platformOptions": { + "ignoreTimeRange": false + }, + "thresholds": [], + "units": { + "unit": "BYTES" + }, + "yAxisLeft": { + "zero": true + }, + "yAxisRight": { + "zero": true + } + } + }, + { + "title": "Record add/drop rate per FILTER plugin", + "layout": { + "column": 1, + "row": 15, + "width": 4, + "height": 3 + }, + + "visualization": { + "id": "viz.line" + }, + "rawConfiguration": { + "facet": { + "showOtherSeries": false + }, + "legend": { + "enabled": true + }, + "nrqlQueries": [ + { + "accountId": 0, + "query": "SELECT rate(sum(fluentbit_filter_add_records_total), 1 minute) as 'Added back to pipeline', rate(sum(fluentbit_filter_drop_records_total), 1 minute) as 'Removed from pipeline' FROM Metric timeseries MAX" + } + ], + "platformOptions": { + "ignoreTimeRange": false + }, + "thresholds": [], + "units": { + "unit": "REQUESTS_PER_MINUTE" + }, + "yAxisLeft": { + "zero": true + }, + "yAxisRight": { + "zero": true + } + } + }, + { + "title": "", + "layout": { + "column": 1, + "row": 18, + "width": 12, + "height": 1 + }, + + "visualization": { + "id": "viz.markdown" + }, + "rawConfiguration": { + "text": "# OUTPUTS" + } + }, + { + "title": "Output byte rate (bytes/minute)", + "layout": { + "column": 1, + "row": 19, + "width": 4, + "height": 3 + }, + + "visualization": { + "id": "viz.line" + }, + "rawConfiguration": { + "facet": { + "showOtherSeries": false + }, + "legend": { + "enabled": true + }, + "nrqlQueries": [ + { + "accountId": 0, + "query": "SELECT rate(sum(fluentbit_output_proc_bytes_total), 1 minute) as 'bytes/minute' FROM Metric where name != 'fb-metrics-forwarder' timeseries max" + } + ], + "platformOptions": { + "ignoreTimeRange": false + }, + "thresholds": [], + "yAxisLeft": { + "zero": true + }, + "yAxisRight": { + "zero": true + } + } + }, + { + "title": "Output log rate (records/minute)", + "layout": { + "column": 5, + "row": 19, + "width": 4, + "height": 3 + }, + + "visualization": { + "id": "viz.line" + }, + "rawConfiguration": { + "facet": { + "showOtherSeries": false + }, + "legend": { + "enabled": true + }, + "nrqlQueries": [ + { + "accountId": 0, + "query": "SELECT rate(sum(fluentbit_output_proc_records_total), 1 minute) as 'records/minute' FROM Metric where name != 'fb-metrics-forwarder' timeseries MAX " + } + ], + "platformOptions": { + "ignoreTimeRange": false + }, + "thresholds": [], + "yAxisLeft": { + "zero": true + }, + "yAxisRight": { + "zero": true + } + } + }, + { + "title": "Average outgoing record size (bytes)", + "layout": { + "column": 9, + "row": 19, + "width": 4, + "height": 3 + }, + + "visualization": { + "id": "viz.line" + }, + "rawConfiguration": { + "facet": { + "showOtherSeries": false + }, + "legend": { + "enabled": true + }, + "nrqlQueries": [ + { + "accountId": 0, + "query": "SELECT sum(fluentbit_output_proc_bytes_total)/sum(fluentbit_output_proc_records_total) as 'bytes' FROM Metric where name != 'fb-metrics-forwarder' timeseries MAX" + } + ], + "platformOptions": { + "ignoreTimeRange": false + }, + "thresholds": [], + "units": { + "unit": "BYTES" + }, + "yAxisLeft": { + "zero": true + }, + "yAxisRight": { + "zero": true + } + } + }, + { + "title": "newrelic plugin statistics (records/minute)", + "layout": { + "column": 1, + "row": 22, + "width": 4, + "height": 3 + }, + + "visualization": { + "id": "viz.line" + }, + "rawConfiguration": { + "facet": { + "showOtherSeries": false + }, + "legend": { + "enabled": true + }, + "nrqlQueries": [ + { + "accountId": 0, + "query": "SELECT rate(sum(fluentbit_output_proc_records_total), 1 minute) as 'Processed', rate(sum(fluentbit_output_dropped_records_total), 1 minute) as 'Dropped', rate(sum(fluentbit_output_retried_records_total), 1 minute) as 'Retried' FROM Metric where name = 'newrelic-logs-forwarder' timeseries max" + } + ], + "platformOptions": { + "ignoreTimeRange": false + }, + "thresholds": [], + "yAxisLeft": { + "zero": true + }, + "yAxisRight": { + "zero": true + } + } + }, + { + "title": "Other OUTPUT plugin statistics (records/minute)", + "layout": { + "column": 5, + "row": 22, + "width": 4, + "height": 3 + }, + + "visualization": { + "id": "viz.line" + }, + "rawConfiguration": { + "facet": { + "showOtherSeries": false + }, + "legend": { + "enabled": true + }, + "nrqlQueries": [ + { + "accountId": 0, + "query": "SELECT rate(sum(fluentbit_output_proc_records_total), 1 minute) as 'Processed', rate(sum(fluentbit_output_dropped_records_total), 1 minute) as 'Dropped', rate(sum(fluentbit_output_retried_records_total), 1 minute) as 'Retried' FROM Metric where name != 'newrelic-logs-forwarder' and name != 'fb-metrics-forwarder' timeseries max" + } + ], + "platformOptions": { + "ignoreTimeRange": false + }, + "thresholds": [], + "yAxisLeft": { + "zero": true + }, + "yAxisRight": { + "zero": true + } + } + }, + { + "title": "Connections per OUTPUT plugin", + "layout": { + "column": 9, + "row": 22, + "width": 4, + "height": 3 + }, + + "visualization": { + "id": "viz.line" + }, + "rawConfiguration": { + "facet": { + "showOtherSeries": false + }, + "legend": { + "enabled": true + }, + "nrqlQueries": [ + { + "accountId": 0, + "query": "SELECT max(fluentbit_output_upstream_total_connections) as 'Total', max(fluentbit_output_upstream_busy_connections) as 'Busy' FROM Metric where name != 'fb-metrics-forwarder' timeseries MAX" + } + ], + "platformOptions": { + "ignoreTimeRange": false + }, + "thresholds": [], + "yAxisLeft": { + "zero": true + }, + "yAxisRight": { + "zero": true + } + } + }, + { + "title": "newrelic plugin errors (errors/minute)", + "layout": { + "column": 1, + "row": 25, + "width": 4, + "height": 3 + }, + + "visualization": { + "id": "viz.line" + }, + "rawConfiguration": { + "facet": { + "showOtherSeries": false + }, + "legend": { + "enabled": true + }, + "nrqlQueries": [ + { + "accountId": 0, + "query": "SELECT rate(sum(fluentbit_output_errors_total), 1 minute) AS 'Errors/minute' FROM Metric where name = 'newrelic-logs-forwarder' timeseries MAX " + } + ], + "platformOptions": { + "ignoreTimeRange": false + }, + "thresholds": [], + "yAxisLeft": { + "zero": true + }, + "yAxisRight": { + "zero": true + } + } + }, + { + "title": "newrelic plugin chunk retry statistics (retries/minute)", + "layout": { + "column": 5, + "row": 25, + "width": 4, + "height": 3 + }, + + "visualization": { + "id": "viz.line" + }, + "rawConfiguration": { + "facet": { + "showOtherSeries": false + }, + "legend": { + "enabled": true + }, + "nrqlQueries": [ + { + "accountId": 0, + "query": "SELECT rate(sum(fluentbit_output_retries_total), 1 minute) as 'Retries', rate(sum(fluentbit_output_retries_failed_total), 1 minute) as 'Expirations' FROM Metric where name = 'newrelic-logs-forwarder' timeseries max" + } + ], + "platformOptions": { + "ignoreTimeRange": false + }, + "thresholds": [], + "yAxisLeft": { + "zero": true + }, + "yAxisRight": { + "zero": true + } + } + }, + { + "title": "", + "layout": { + "column": 1, + "row": 28, + "width": 12, + "height": 1 + }, + + "visualization": { + "id": "viz.markdown" + }, + "rawConfiguration": { + "text": "# MEMORY USAGE" + } + }, + { + "title": "Input plugin memory usage", + "layout": { + "column": 1, + "row": 29, + "width": 4, + "height": 3 + }, + + "visualization": { + "id": "viz.line" + }, + "rawConfiguration": { + "facet": { + "showOtherSeries": false + }, + "legend": { + "enabled": true + }, + "nrqlQueries": [ + { + "accountId": 0, + "query": "SELECT max(fluentbit_input_storage_memory_bytes) as 'Max' FROM Metric where name != 'fb-metrics-collector' timeseries max" + } + ], + "platformOptions": { + "ignoreTimeRange": false + }, + "thresholds": [], + "units": { + "unit": "BYTES" + }, + "yAxisLeft": { + "zero": true + }, + "yAxisRight": { + "zero": true + } + } + }, + { + "title": "INPUT memory buffer over limit", + "layout": { + "column": 5, + "row": 29, + "width": 4, + "height": 3 + }, + + "visualization": { + "id": "viz.line" + }, + "rawConfiguration": { + "colors": { + "seriesOverrides": [ + { + "color": "#013ef4", + "seriesName": "pod-logs-tailer" + } + ] + }, + "facet": { + "showOtherSeries": false + }, + "legend": { + "enabled": true + }, + "nrqlQueries": [ + { + "accountId": 0, + "query": "SELECT max(fluentbit_input_storage_overlimit) FROM Metric where name != 'fb-metrics-collector' timeseries max" + } + ], + "platformOptions": { + "ignoreTimeRange": false + }, + "thresholds": [], + "yAxisLeft": { + "zero": true + }, + "yAxisRight": { + "zero": true + } + } + }, + { + "title": "Chunk statistics per INPUT plugin", + "layout": { + "column": 9, + "row": 29, + "width": 4, + "height": 3 + }, + + "visualization": { + "id": "viz.line" + }, + "rawConfiguration": { + "facet": { + "showOtherSeries": false + }, + "legend": { + "enabled": true + }, + "nrqlQueries": [ + { + "accountId": 0, + "query": "SELECT average(fluentbit_input_storage_chunks_up) AS 'Up (in memory)', average(fluentbit_input_storage_chunks_down) AS 'Down (in fs)', average(fluentbit_input_storage_chunks_busy) AS 'Busy', average(fluentbit_input_storage_chunks) as 'Total' FROM Metric where name != 'fb-metrics-collector' since 1 hour ago timeseries MAX" + } + ], + "platformOptions": { + "ignoreTimeRange": false + }, + "thresholds": [], + "yAxisLeft": { + "zero": true + }, + "yAxisRight": { + "zero": true + } + } + }, + { + "title": "Buffered chunks", + "layout": { + "column": 1, + "row": 32, + "width": 4, + "height": 3 + }, + + "visualization": { + "id": "viz.line" + }, + "rawConfiguration": { + "facet": { + "showOtherSeries": false + }, + "legend": { + "enabled": true + }, + "nrqlQueries": [ + { + "accountId": 0, + "query": "SELECT max(fluentbit_input_storage_chunks) AS 'Total', max(fluentbit_storage_mem_chunks) AS 'Memory', max(fluentbit_storage_fs_chunks) AS 'Filesystem' FROM Metric timeseries MAX " + } + ], + "platformOptions": { + "ignoreTimeRange": false + }, + "thresholds": [], + "yAxisLeft": { + "zero": true + }, + "yAxisRight": { + "zero": true + } + } + }, + { + "title": "Busy chunks' size", + "layout": { + "column": 5, + "row": 32, + "width": 4, + "height": 3 + }, + + "visualization": { + "id": "viz.line" + }, + "rawConfiguration": { + "facet": { + "showOtherSeries": false + }, + "legend": { + "enabled": true + }, + "nrqlQueries": [ + { + "accountId": 0, + "query": "SELECT max(fluentbit_input_storage_chunks_busy_bytes) FROM Metric where name != 'fb-metrics-collector' timeseries MAX since 1 hour ago" + } + ], + "platformOptions": { + "ignoreTimeRange": false + }, + "thresholds": [], + "units": { + "unit": "BYTES" + }, + "yAxisLeft": { + "zero": true + }, + "yAxisRight": { + "zero": true + } + } + }, + { + "title": "Filesystem chunks state", + "layout": { + "column": 9, + "row": 32, + "width": 4, + "height": 3 + }, + + "visualization": { + "id": "viz.line" + }, + "rawConfiguration": { + "facet": { + "showOtherSeries": false + }, + "legend": { + "enabled": true + }, + "nrqlQueries": [ + { + "accountId": 0, + "query": "SELECT average(fluentbit_storage_fs_chunks_up) AS 'Up (in memory)', average(fluentbit_storage_fs_chunks_down) AS 'Down (fs only)' FROM Metric timeseries MAX " + } + ], + "platformOptions": { + "ignoreTimeRange": false + }, + "thresholds": [], + "yAxisLeft": { + "zero": true + }, + "yAxisRight": { + "zero": true + } + } + } + ] + } + ] +} \ No newline at end of file diff --git a/entity-types/ext-fluentbit_host/definition.yml b/entity-types/ext-fluentbit_host/definition.yml new file mode 100644 index 000000000..3e1d21a42 --- /dev/null +++ b/entity-types/ext-fluentbit_host/definition.yml @@ -0,0 +1,24 @@ +domain: EXT +type: FLUENTBIT_HOST +synthesis: + rules: + - identifier: hostname + name: hostname + encodeIdentifierInGUID: true + conditions: + - attribute: eventType + value: Metric + - attribute: metricName + prefix: fluentbit_ + - attribute: source + value: host + tags: + version: + entityTagNames: [fluentbit.version] + hostname: + entityTagNames: [host.name] + os: + entityTagNames: [host.os] +dashboardTemplates: + newRelic: + template: dashboard.json diff --git a/entity-types/ext-fluentbit_kubernetes/dashboard.json b/entity-types/ext-fluentbit_kubernetes/dashboard.json new file mode 100644 index 000000000..1c5a3f7d5 --- /dev/null +++ b/entity-types/ext-fluentbit_kubernetes/dashboard.json @@ -0,0 +1,959 @@ +{ + "name": "Kubernetes Fluent Bit monitoring", + "description": null, + "pages": [ + { + "name": "Overview", + "description": null, + "widgets": [ + { + "title": "", + "layout": { + "column": 1, + "row": 1, + "width": 6, + "height": 6 + }, + + "visualization": { + "id": "viz.markdown" + }, + "rawConfiguration": { + "text": "# README\n\n## About this page\nThis page represents most of [Fluent Bit's internal metrics](https://docs.fluentbit.io/manual/administration/monitoring#for-v2-metrics). The metric representations are grouped by categories and faceted by each plugin instance where appropriate.\n\n## How to filter\n1. Select the Kubernetes cluster you want to troubleshoot in the \"Cluster Name\" variable above.\n2. [OPTIONAL] You can use any of the values in the `Node name` and `Pod name` columns on the \"Fluent Bit version\" table to further filter the metrics displayed in the graphs below. To do so, you need to enable [facet filtering](https://docs.newrelic.com/docs/query-your-data/explore-query-data/dashboards/filter-new-relic-one-dashboards-facets/) on that table by clicking on the \"Edit\" submenu and select \"Filter the current dashboard\" under \"Facet Linking\". \n\n## Legend\n### Metric dimensions\n- **name**: the name of the Fluent Bit plugin. Version 1.21.0 of our Helm chart names them according to the plugin names described in the following section.\n- **pod_name**: the `newrelic-logging` pod (Fluent Bit instance) that emitted this metric.\n- **node_name**: physical Kubernetes node where the `newrelic-logging` pod is running.\n\n### Plugin names\n- **pod-logs-tailer**: `tail` *INPUT* plugin normally reading from `/var/log/containers/*.log`\n- **kubernetes-enricher**: `kubernetes` *FILTER* plugin that queries the Kubernetes API to enrich the logs with pod/container metadata.\n- **node-attributes-enricher**: `record_modifier` *FILTER* plugin that enriches logs with `cluster_name`.\n- **kubernetes-attribute-lifter** (only when in low data mode): `nest` *FILTER* plugin that lifts all the keys under `kubernetes`. This plugin is transparent to the final shape of the log.\n- **node-attributes-enricher-filter** (only when in low data mode): same as node-attributes-enricher`, but it also removes attributes that are not strictly necessary for correct platform functioning.\n- **newrelic-logs-forwarder**: `newrelic` *OUTPUT* plugin that sends logs to the New Relic Logs API" + } + }, + { + "title": "Fluent Bit version", + "layout": { + "column": 7, + "row": 1, + "width": 6, + "height": 3 + }, + + "visualization": { + "id": "viz.table" + }, + "rawConfiguration": { + "facet": { + "showOtherSeries": false + }, + "nrqlQueries": [ + { + "accountId": 0, + "query": "SELECT latest(os) as 'OS', latest(version) as 'FB version', latest(cluster_name) FROM Metric where metricName = 'fluentbit_build_info' since 1 hour ago facet pod_name, node_name limit max" + } + ], + "platformOptions": { + "ignoreTimeRange": false + } + } + }, + { + "title": "Fluent Bit uptime", + "layout": { + "column": 7, + "row": 4, + "width": 6, + "height": 3 + }, + + "visualization": { + "id": "viz.line" + }, + "rawConfiguration": { + "facet": { + "showOtherSeries": false + }, + "legend": { + "enabled": true + }, + "nrqlQueries": [ + { + "accountId": 0, + "query": "SELECT latest(fluentbit_uptime) FROM Metric facet pod_name timeseries" + } + ], + "platformOptions": { + "ignoreTimeRange": false + }, + "thresholds": [], + "yAxisLeft": { + "zero": true + }, + "yAxisRight": { + "zero": true + } + } + }, + { + "title": "", + "layout": { + "column": 1, + "row": 7, + "width": 12, + "height": 1 + }, + + "visualization": { + "id": "viz.markdown" + }, + "rawConfiguration": { + "text": "# INPUTS" + } + }, + { + "title": "Input byte rate (bytes/minute)", + "layout": { + "column": 1, + "row": 8, + "width": 4, + "height": 3 + }, + + "visualization": { + "id": "viz.line" + }, + "rawConfiguration": { + "facet": { + "showOtherSeries": false + }, + "legend": { + "enabled": true + }, + "nrqlQueries": [ + { + "accountId": 0, + "query": "SELECT rate(sum(fluentbit_input_bytes_total), 1 minute) as 'bytes/minute' FROM Metric where name != 'fb-metrics-collector' timeseries max facet name, pod_name" + } + ], + "platformOptions": { + "ignoreTimeRange": false + }, + "thresholds": [], + "yAxisLeft": { + "zero": true + }, + "yAxisRight": { + "zero": true + } + } + }, + { + "title": "Input log rate (records/minute)", + "layout": { + "column": 5, + "row": 8, + "width": 4, + "height": 3 + }, + + "visualization": { + "id": "viz.line" + }, + "rawConfiguration": { + "facet": { + "showOtherSeries": false + }, + "legend": { + "enabled": true + }, + "nrqlQueries": [ + { + "accountId": 0, + "query": "SELECT rate(sum(fluentbit_input_records_total), 1 minute) as 'logs/minute' FROM Metric where name != 'fb-metrics-collector' facet name, pod_name timeseries max" + } + ], + "platformOptions": { + "ignoreTimeRange": false + }, + "thresholds": [], + "yAxisLeft": { + "zero": true + }, + "yAxisRight": { + "zero": true + } + } + }, + { + "title": "Average incoming record size (bytes)", + "layout": { + "column": 9, + "row": 8, + "width": 4, + "height": 3 + }, + + "visualization": { + "id": "viz.line" + }, + "rawConfiguration": { + "facet": { + "showOtherSeries": false + }, + "legend": { + "enabled": true + }, + "nrqlQueries": [ + { + "accountId": 0, + "query": "SELECT sum(fluentbit_input_bytes_total)/sum(fluentbit_input_records_total) as 'Average incoming record size (bytes)' FROM Metric where name != 'fb-metrics-collector' facet name, pod_name timeseries max" + } + ], + "platformOptions": { + "ignoreTimeRange": false + }, + "thresholds": [], + "units": { + "unit": "BYTES" + }, + "yAxisLeft": { + "zero": true + }, + "yAxisRight": { + "zero": true + } + } + }, + { + "title": "", + "layout": { + "column": 1, + "row": 11, + "width": 12, + "height": 1 + }, + + "visualization": { + "id": "viz.markdown" + }, + "rawConfiguration": { + "text": "# FILTERS" + } + }, + { + "title": "Filter byte rate (bytes/minute)", + "layout": { + "column": 1, + "row": 12, + "width": 4, + "height": 3 + }, + + "visualization": { + "id": "viz.line" + }, + "rawConfiguration": { + "facet": { + "showOtherSeries": false + }, + "legend": { + "enabled": true + }, + "nrqlQueries": [ + { + "accountId": 0, + "query": "SELECT rate(sum(fluentbit_filter_bytes_total), 1 minute) FROM Metric facet name, pod_name timeseries max" + } + ], + "platformOptions": { + "ignoreTimeRange": false + }, + "thresholds": [], + "yAxisLeft": { + "zero": true + }, + "yAxisRight": { + "zero": true + } + } + }, + { + "title": "Filter log rate (records/minute)", + "layout": { + "column": 5, + "row": 12, + "width": 4, + "height": 3 + }, + + "visualization": { + "id": "viz.line" + }, + "rawConfiguration": { + "facet": { + "showOtherSeries": false + }, + "legend": { + "enabled": true + }, + "nrqlQueries": [ + { + "accountId": 0, + "query": "SELECT rate(sum(fluentbit_filter_records_total), 1 minute) FROM Metric facet name, pod_name timeseries max" + } + ], + "platformOptions": { + "ignoreTimeRange": false + }, + "thresholds": [], + "yAxisLeft": { + "zero": true + }, + "yAxisRight": { + "zero": true + } + } + }, + { + "title": "Average filtered record size (bytes)", + "layout": { + "column": 9, + "row": 12, + "width": 4, + "height": 3 + }, + + "visualization": { + "id": "viz.line" + }, + "rawConfiguration": { + "facet": { + "showOtherSeries": false + }, + "legend": { + "enabled": true + }, + "nrqlQueries": [ + { + "accountId": 0, + "query": "SELECT sum(fluentbit_filter_bytes_total)/sum(fluentbit_filter_records_total) AS 'Average filtered record size (bytes)' FROM Metric facet name, pod_name timeseries max" + } + ], + "platformOptions": { + "ignoreTimeRange": false + }, + "thresholds": [], + "units": { + "unit": "BYTES" + }, + "yAxisLeft": { + "zero": true + }, + "yAxisRight": { + "zero": true + } + } + }, + { + "title": "Record add/drop rate per FILTER plugin", + "layout": { + "column": 1, + "row": 15, + "width": 4, + "height": 3 + }, + + "visualization": { + "id": "viz.line" + }, + "rawConfiguration": { + "facet": { + "showOtherSeries": false + }, + "legend": { + "enabled": true + }, + "nrqlQueries": [ + { + "accountId": 0, + "query": "SELECT rate(sum(fluentbit_filter_add_records_total), 1 minute) as 'Added back to pipeline', rate(sum(fluentbit_filter_drop_records_total), 1 minute) as 'Removed from pipeline' FROM Metric facet name, pod_name timeseries MAX" + } + ], + "platformOptions": { + "ignoreTimeRange": false + }, + "thresholds": [], + "units": { + "unit": "REQUESTS_PER_MINUTE" + }, + "yAxisLeft": { + "zero": true + }, + "yAxisRight": { + "zero": true + } + } + }, + { + "title": "", + "layout": { + "column": 1, + "row": 18, + "width": 12, + "height": 1 + }, + + "visualization": { + "id": "viz.markdown" + }, + "rawConfiguration": { + "text": "# OUTPUTS" + } + }, + { + "title": "Output byte rate (bytes/minute)", + "layout": { + "column": 1, + "row": 19, + "width": 4, + "height": 3 + }, + + "visualization": { + "id": "viz.line" + }, + "rawConfiguration": { + "facet": { + "showOtherSeries": false + }, + "legend": { + "enabled": true + }, + "nrqlQueries": [ + { + "accountId": 0, + "query": "SELECT rate(sum(fluentbit_output_proc_bytes_total), 1 minute) as 'bytes/minute' FROM Metric where name != 'fb-metrics-forwarder' facet name, pod_name timeseries max" + } + ], + "platformOptions": { + "ignoreTimeRange": false + }, + "thresholds": [], + "yAxisLeft": { + "zero": true + }, + "yAxisRight": { + "zero": true + } + } + }, + { + "title": "Output log rate (records/minute)", + "layout": { + "column": 5, + "row": 19, + "width": 4, + "height": 3 + }, + + "visualization": { + "id": "viz.line" + }, + "rawConfiguration": { + "facet": { + "showOtherSeries": false + }, + "legend": { + "enabled": true + }, + "nrqlQueries": [ + { + "accountId": 0, + "query": "SELECT rate(sum(fluentbit_output_proc_records_total), 1 minute) as 'records/minute' FROM Metric where name != 'fb-metrics-forwarder' facet name, pod_name timeseries MAX " + } + ], + "platformOptions": { + "ignoreTimeRange": false + }, + "thresholds": [], + "yAxisLeft": { + "zero": true + }, + "yAxisRight": { + "zero": true + } + } + }, + { + "title": "Average outgoing record size (bytes)", + "layout": { + "column": 9, + "row": 19, + "width": 4, + "height": 3 + }, + + "visualization": { + "id": "viz.line" + }, + "rawConfiguration": { + "facet": { + "showOtherSeries": false + }, + "legend": { + "enabled": true + }, + "nrqlQueries": [ + { + "accountId": 0, + "query": "SELECT sum(fluentbit_output_proc_bytes_total)/sum(fluentbit_output_proc_records_total) as 'bytes' FROM Metric where name != 'fb-metrics-forwarder' facet name, pod_name timeseries MAX" + } + ], + "platformOptions": { + "ignoreTimeRange": false + }, + "thresholds": [], + "units": { + "unit": "BYTES" + }, + "yAxisLeft": { + "zero": true + }, + "yAxisRight": { + "zero": true + } + } + }, + { + "title": "newrelic plugin statistics (records/minute)", + "layout": { + "column": 1, + "row": 22, + "width": 4, + "height": 3 + }, + + "visualization": { + "id": "viz.line" + }, + "rawConfiguration": { + "facet": { + "showOtherSeries": false + }, + "legend": { + "enabled": true + }, + "nrqlQueries": [ + { + "accountId": 0, + "query": "SELECT rate(sum(fluentbit_output_proc_records_total), 1 minute) as 'Processed', rate(sum(fluentbit_output_dropped_records_total), 1 minute) as 'Dropped', rate(sum(fluentbit_output_retried_records_total), 1 minute) as 'Retried' FROM Metric where name = 'newrelic-logs-forwarder' facet pod_name timeseries max" + } + ], + "platformOptions": { + "ignoreTimeRange": false + }, + "thresholds": [], + "yAxisLeft": { + "zero": true + }, + "yAxisRight": { + "zero": true + } + } + }, + { + "title": "Other OUTPUT plugin statistics (records/minute)", + "layout": { + "column": 5, + "row": 22, + "width": 4, + "height": 3 + }, + + "visualization": { + "id": "viz.line" + }, + "rawConfiguration": { + "facet": { + "showOtherSeries": false + }, + "legend": { + "enabled": true + }, + "nrqlQueries": [ + { + "accountId": 0, + "query": "SELECT rate(sum(fluentbit_output_proc_records_total), 1 minute) as 'Processed', rate(sum(fluentbit_output_dropped_records_total), 1 minute) as 'Dropped', rate(sum(fluentbit_output_retried_records_total), 1 minute) as 'Retried' FROM Metric where name != 'newrelic-logs-forwarder' and name != 'fb-metrics-forwarder' facet name, pod_name timeseries max" + } + ], + "platformOptions": { + "ignoreTimeRange": false + }, + "thresholds": [], + "yAxisLeft": { + "zero": true + }, + "yAxisRight": { + "zero": true + } + } + }, + { + "title": "Connections per OUTPUT plugin", + "layout": { + "column": 9, + "row": 22, + "width": 4, + "height": 3 + }, + + "visualization": { + "id": "viz.line" + }, + "rawConfiguration": { + "facet": { + "showOtherSeries": false + }, + "legend": { + "enabled": true + }, + "nrqlQueries": [ + { + "accountId": 0, + "query": "SELECT max(fluentbit_output_upstream_total_connections) as 'Total', max(fluentbit_output_upstream_busy_connections) as 'Busy' FROM Metric where name != 'fb-metrics-forwarder' facet name, pod_name timeseries MAX" + } + ], + "platformOptions": { + "ignoreTimeRange": false + }, + "thresholds": [], + "yAxisLeft": { + "zero": true + }, + "yAxisRight": { + "zero": true + } + } + }, + { + "title": "newrelic plugin errors (errors/minute)", + "layout": { + "column": 1, + "row": 25, + "width": 4, + "height": 3 + }, + + "visualization": { + "id": "viz.line" + }, + "rawConfiguration": { + "facet": { + "showOtherSeries": false + }, + "legend": { + "enabled": true + }, + "nrqlQueries": [ + { + "accountId": 0, + "query": "SELECT rate(sum(fluentbit_output_errors_total), 1 minute) AS 'Errors/minute' FROM Metric where name = 'newrelic-logs-forwarder' facet pod_name timeseries MAX " + } + ], + "platformOptions": { + "ignoreTimeRange": false + }, + "thresholds": [], + "yAxisLeft": { + "zero": true + }, + "yAxisRight": { + "zero": true + } + } + }, + { + "title": "newrelic plugin chunk retry statistics (retries/minute)", + "layout": { + "column": 5, + "row": 25, + "width": 4, + "height": 3 + }, + + "visualization": { + "id": "viz.line" + }, + "rawConfiguration": { + "facet": { + "showOtherSeries": false + }, + "legend": { + "enabled": true + }, + "nrqlQueries": [ + { + "accountId": 0, + "query": "SELECT rate(sum(fluentbit_output_retries_total), 1 minute) as 'Retries', rate(sum(fluentbit_output_retries_failed_total), 1 minute) as 'Expirations' FROM Metric where name = 'newrelic-logs-forwarder' facet pod_name timeseries max" + } + ], + "platformOptions": { + "ignoreTimeRange": false + }, + "thresholds": [], + "yAxisLeft": { + "zero": true + }, + "yAxisRight": { + "zero": true + } + } + }, + { + "title": "", + "layout": { + "column": 1, + "row": 28, + "width": 12, + "height": 1 + }, + + "visualization": { + "id": "viz.markdown" + }, + "rawConfiguration": { + "text": "# MEMORY USAGE" + } + }, + { + "title": "Input plugin memory usage", + "layout": { + "column": 1, + "row": 29, + "width": 4, + "height": 3 + }, + + "visualization": { + "id": "viz.line" + }, + "rawConfiguration": { + "facet": { + "showOtherSeries": false + }, + "legend": { + "enabled": true + }, + "nrqlQueries": [ + { + "accountId": 0, + "query": "SELECT max(fluentbit_input_storage_memory_bytes) as 'Max' FROM Metric where name != 'fb-metrics-collector' timeseries max facet name, pod_name " + } + ], + "platformOptions": { + "ignoreTimeRange": false + }, + "thresholds": [], + "units": { + "unit": "BYTES" + }, + "yAxisLeft": { + "zero": true + }, + "yAxisRight": { + "zero": true + } + } + }, + { + "title": "INPUT memory buffer over limit", + "layout": { + "column": 5, + "row": 29, + "width": 4, + "height": 3 + }, + + "visualization": { + "id": "viz.line" + }, + "rawConfiguration": { + "colors": { + "seriesOverrides": [ + { + "color": "#013ef4", + "seriesName": "pod-logs-tailer" + } + ] + }, + "facet": { + "showOtherSeries": false + }, + "legend": { + "enabled": true + }, + "nrqlQueries": [ + { + "accountId": 0, + "query": "SELECT max(fluentbit_input_storage_overlimit) FROM Metric where name != 'fb-metrics-collector' timeseries max facet name, pod_name" + } + ], + "platformOptions": { + "ignoreTimeRange": false + }, + "thresholds": [], + "yAxisLeft": { + "zero": true + }, + "yAxisRight": { + "zero": true + } + } + }, + { + "title": "Chunk statistics per INPUT plugin", + "layout": { + "column": 9, + "row": 29, + "width": 4, + "height": 3 + }, + + "visualization": { + "id": "viz.line" + }, + "rawConfiguration": { + "facet": { + "showOtherSeries": false + }, + "legend": { + "enabled": true + }, + "nrqlQueries": [ + { + "accountId": 0, + "query": "SELECT average(fluentbit_input_storage_chunks_up) AS 'Up (in memory)', average(fluentbit_input_storage_chunks_down) AS 'Down (in fs)', average(fluentbit_input_storage_chunks_busy) AS 'Busy', average(fluentbit_input_storage_chunks) as 'Total' FROM Metric where name != 'fb-metrics-collector' since 1 hour ago timeseries MAX facet name, pod_name " + } + ], + "platformOptions": { + "ignoreTimeRange": false + }, + "thresholds": [], + "yAxisLeft": { + "zero": true + }, + "yAxisRight": { + "zero": true + } + } + }, + { + "title": "Buffered chunks", + "layout": { + "column": 1, + "row": 32, + "width": 4, + "height": 3 + }, + + "visualization": { + "id": "viz.line" + }, + "rawConfiguration": { + "facet": { + "showOtherSeries": false + }, + "legend": { + "enabled": true + }, + "nrqlQueries": [ + { + "accountId": 0, + "query": "SELECT max(fluentbit_input_storage_chunks) AS 'Total', max(fluentbit_storage_mem_chunks) AS 'Memory', max(fluentbit_storage_fs_chunks) AS 'Filesystem' FROM Metric facet pod_name timeseries MAX " + } + ], + "platformOptions": { + "ignoreTimeRange": false + }, + "thresholds": [], + "yAxisLeft": { + "zero": true + }, + "yAxisRight": { + "zero": true + } + } + }, + { + "title": "Busy chunks' size", + "layout": { + "column": 5, + "row": 32, + "width": 4, + "height": 3 + }, + + "visualization": { + "id": "viz.line" + }, + "rawConfiguration": { + "facet": { + "showOtherSeries": false + }, + "legend": { + "enabled": true + }, + "nrqlQueries": [ + { + "accountId": 0, + "query": "SELECT max(fluentbit_input_storage_chunks_busy_bytes) FROM Metric where name != 'fb-metrics-collector' facet name, pod_name timeseries MAX since 1 hour ago" + } + ], + "platformOptions": { + "ignoreTimeRange": false + }, + "thresholds": [], + "units": { + "unit": "BYTES" + }, + "yAxisLeft": { + "zero": true + }, + "yAxisRight": { + "zero": true + } + } + }, + { + "title": "Filesystem chunks state", + "layout": { + "column": 9, + "row": 32, + "width": 4, + "height": 3 + }, + + "visualization": { + "id": "viz.line" + }, + "rawConfiguration": { + "facet": { + "showOtherSeries": false + }, + "legend": { + "enabled": true + }, + "nrqlQueries": [ + { + "accountId": 0, + "query": "SELECT average(fluentbit_storage_fs_chunks_up) AS 'Up (in memory)', average(fluentbit_storage_fs_chunks_down) AS 'Down (fs only)' FROM Metric timeseries MAX " + } + ], + "platformOptions": { + "ignoreTimeRange": false + }, + "thresholds": [], + "yAxisLeft": { + "zero": true + }, + "yAxisRight": { + "zero": true + } + } + } + ] + } + ] +} \ No newline at end of file diff --git a/entity-types/ext-fluentbit_kubernetes/definition.yml b/entity-types/ext-fluentbit_kubernetes/definition.yml new file mode 100644 index 000000000..5ff82c402 --- /dev/null +++ b/entity-types/ext-fluentbit_kubernetes/definition.yml @@ -0,0 +1,31 @@ +domain: EXT +type: FLUENTBIT_KUBERNETES +synthesis: + rules: + - compositeIdentifier: + separator: ":" + attributes: + - cluster_name + - namespace + - daemonset_name + name: daemonset_name + encodeIdentifierInGUID: true + conditions: + - attribute: eventType + value: Metric + - attribute: metricName + prefix: fluentbit_ + - attribute: source + value: kubernetes + tags: + daemonset_name: + entityTagNames: [k8s.daemonsetName] + namespace: + entityTagNames: [k8s.namespaceName] + cluster_name: + entityTagNames: [k8s.clusterName] + version: + entityTagNames: [fluentbit.version] +dashboardTemplates: + newRelic: + template: dashboard.json \ No newline at end of file diff --git a/entity-types/ext-nvidia_jetson/definition.yml b/entity-types/ext-nvidia_jetson/definition.yml index ad6753591..77ceef9b0 100644 --- a/entity-types/ext-nvidia_jetson/definition.yml +++ b/entity-types/ext-nvidia_jetson/definition.yml @@ -8,8 +8,6 @@ synthesis: conditions: - attribute: eventType value: jetsonTegrastats - - attribute: metricName - value: "ram_used" tags: agentVersion: entityTagName: newrelic.agentVersion diff --git a/entity-types/ext-service/golden_metrics.yml b/entity-types/ext-service/golden_metrics.yml index 369346436..b325c65e9 100644 --- a/entity-types/ext-service/golden_metrics.yml +++ b/entity-types/ext-service/golden_metrics.yml @@ -1,5 +1,5 @@ throughput: - title: Throughput (rpm) + title: Throughput unit: REQUESTS_PER_MINUTE queries: opentelemetry: @@ -19,7 +19,7 @@ throughput: select: rate(count(http.server.duration), 1 minute) from: Metric errorRate: - title: Error rate (%) + title: Error rate unit: PERCENTAGE queries: opentelemetry: @@ -39,7 +39,7 @@ errorRate: select: (filter(count(http.server.duration), where numeric(http.status_code) >= 400 AND numeric(http.status_code) != 404) * 100) / count(http.server.duration) from: Metric responseTimeMs: - title: Response time (ms) + title: Response time unit: MS queries: opentelemetry: diff --git a/entity-types/infra-awsalb/definition.yml b/entity-types/infra-awsalb/definition.yml index f08a6bbd8..8c784cbfd 100644 --- a/entity-types/infra-awsalb/definition.yml +++ b/entity-types/infra-awsalb/definition.yml @@ -17,3 +17,40 @@ goldenTags: configuration: entityExpirationTime: DAILY alertable: true + +synthesis: + rules: + # Legacy API Polling entities not using the ARN to compute the entity.guid, but directly providing the entityId + - identifier: entityId + name: aws.alb.loadBalancer + encodeIdentifierInGUID: false + legacyFeatures: + overrideGuidType: true + conditions: + - attribute: eventType + prefix: Log + - attribute: aws.Arn + present: true + - attribute: aws.alb.loadBalancer + present: true + - attribute: entityId + present: true + tags: + aws.Arn: + # Metrics Streams and API Polling entities using the ARN to compute the entity.guid + - identifier: aws.Arn + name: aws.alb.loadBalancer + encodeIdentifierInGUID: true + legacyFeatures: + overrideGuidType: true + conditions: + - attribute: eventType + prefix: Log + - attribute: aws.Arn + present: true + - attribute: aws.alb.loadBalancer + present: true + - attribute: entityId + present: false + tags: + aws.Arn: \ No newline at end of file diff --git a/entity-types/infra-awscloudfrontdistribution/definition.yml b/entity-types/infra-awscloudfrontdistribution/definition.yml index a28434188..fbeb86bfb 100644 --- a/entity-types/infra-awscloudfrontdistribution/definition.yml +++ b/entity-types/infra-awscloudfrontdistribution/definition.yml @@ -8,3 +8,42 @@ goldenTags: configuration: entityExpirationTime: DAILY alertable: true + +synthesis: + rules: + # Legacy API Polling entities not using the ARN to compute the entity.guid, but directly providing the entityId + - identifier: entityId + name: aws.cloudfront.DistributionId + encodeIdentifierInGUID: false + legacyFeatures: + overrideGuidType: true + conditions: + - attribute: eventType + prefix: Log + - attribute: aws.Arn + present: true + - attribute: aws.cloudfront.DistributionId + present: true + - attribute: entityId + present: true + tags: + aws.Arn: + aws.cloudfront.DistributionId: + # Metrics Streams and API Polling entities using the ARN to compute the entity.guid + - identifier: aws.Arn + name: aws.cloudfront.DistributionId + encodeIdentifierInGUID: true + legacyFeatures: + overrideGuidType: true + conditions: + - attribute: eventType + prefix: Log + - attribute: aws.Arn + present: true + - attribute: aws.cloudfront.DistributionId + present: true + - attribute: entityId + present: false + tags: + aws.Arn: + aws.cloudfront.DistributionId: \ No newline at end of file diff --git a/entity-types/infra-awsec2subnet/definition.yml b/entity-types/infra-awsec2subnet/definition.yml new file mode 100644 index 000000000..890b04981 --- /dev/null +++ b/entity-types/infra-awsec2subnet/definition.yml @@ -0,0 +1,8 @@ +domain: INFRA +type: AWSEC2SUBNET +goldenTags: +- aws.accountId +- aws.region +configuration: + entityExpirationTime: DAILY + alertable: false \ No newline at end of file diff --git a/entity-types/infra-awsec2vpc/definition.yml b/entity-types/infra-awsec2vpc/definition.yml new file mode 100644 index 000000000..54897ac17 --- /dev/null +++ b/entity-types/infra-awsec2vpc/definition.yml @@ -0,0 +1,8 @@ +domain: INFRA +type: AWSEC2VPC +goldenTags: +- aws.accountId +- aws.region +configuration: + entityExpirationTime: DAILY + alertable: false \ No newline at end of file diff --git a/entity-types/infra-awselb/definition.yml b/entity-types/infra-awselb/definition.yml index fb056adba..5ecc0895a 100644 --- a/entity-types/infra-awselb/definition.yml +++ b/entity-types/infra-awselb/definition.yml @@ -9,3 +9,44 @@ goldenTags: configuration: entityExpirationTime: DAILY alertable: true + +synthesis: + rules: + # Legacy API Polling entities not using the ARN to compute the entity.guid, but directly providing the entityId + - identifier: entityId + name: aws.elb.loadBalancer + encodeIdentifierInGUID: false + legacyFeatures: + overrideGuidType: true + conditions: + - attribute: eventType + prefix: Log + - attribute: aws.Arn + present: true + - attribute: aws.elb.loadBalancer + present: true + - attribute: entityId + present: true + tags: + aws.Arn: + aws.elb.loadBalancer: + entityTagNames: [ aws.elb.LoadBalancerName ] + # Metrics Streams and API Polling entities using the ARN to compute the entity.guid + - identifier: aws.Arn + name: aws.elb.loadBalancer + encodeIdentifierInGUID: true + legacyFeatures: + overrideGuidType: true + conditions: + - attribute: eventType + prefix: Log + - attribute: aws.Arn + present: true + - attribute: aws.elb.loadBalancer + present: true + - attribute: entityId + present: false + tags: + aws.Arn: + aws.elb.loadBalancer: + entityTagNames: [ aws.elb.LoadBalancerName ] \ No newline at end of file diff --git a/entity-types/infra-awslambdafunction/definition.yml b/entity-types/infra-awslambdafunction/definition.yml index c57670f11..97a62dc09 100644 --- a/entity-types/infra-awslambdafunction/definition.yml +++ b/entity-types/infra-awslambdafunction/definition.yml @@ -14,5 +14,46 @@ goldenTags: - label.env - label.environment configuration: - entityExpirationTime: DAILY + entityExpirationTime: QUARTERLY alertable: true + +synthesis: + rules: + # Legacy API Polling entities not using the ARN to compute the entity.guid, but directly providing the entityId + - identifier: entityId + name: aws.lambda.FunctionName + encodeIdentifierInGUID: false + legacyFeatures: + overrideGuidType: true + conditions: + - attribute: eventType + prefix: Log + - attribute: aws.Arn + present: true + - attribute: aws.lambda.FunctionName + present: true + - attribute: entityId + present: true + tags: + aws.Arn: + # Used in AWSLAMBDAFUNCTION.yml for entity relationship candidates + aws.lambda.FunctionName: + # Metrics Streams and API Polling entities using the ARN to compute the entity.guid + - identifier: aws.Arn + name: aws.lambda.FunctionName + encodeIdentifierInGUID: true + legacyFeatures: + overrideGuidType: true + conditions: + - attribute: eventType + prefix: Log + - attribute: aws.Arn + present: true + - attribute: aws.lambda.FunctionName + present: true + - attribute: entityId + present: false + tags: + aws.Arn: + # Used in AWSLAMBDAFUNCTION.yml for entity relationship candidates + aws.lambda.FunctionName: diff --git a/entity-types/infra-awsmemorydbcluster/golden_metrics.yml b/entity-types/infra-awsmemorydbcluster/golden_metrics.yml index 88cb54c62..9f9bea43e 100644 --- a/entity-types/infra-awsmemorydbcluster/golden_metrics.yml +++ b/entity-types/infra-awsmemorydbcluster/golden_metrics.yml @@ -3,7 +3,7 @@ bytesUsedForMemoryDb: unit: BYTES queries: aws: - select: latest(aws.memorydb.BytesUsedForMemoryDB) + select: average(aws.memorydb.BytesUsedForMemoryDB) from: Metric eventId: entity.guid eventName: entity.name @@ -12,7 +12,7 @@ networkPacketsPerSecondAllowanceExceeded: unit: COUNT queries: aws: - select: latest(aws.memorydb.NetworkPacketsPerSecondAllowanceExceeded) + select: average(aws.memorydb.NetworkPacketsPerSecondAllowanceExceeded) from: Metric eventId: entity.guid eventName: entity.name @@ -21,7 +21,7 @@ networkBandwidthOutAllowanceExceeded: unit: COUNT queries: aws: - select: latest(aws.memorydb.NetworkBandwidthOutAllowanceExceeded) + select: average(aws.memorydb.NetworkBandwidthOutAllowanceExceeded) from: Metric eventId: entity.guid eventName: entity.name @@ -30,7 +30,7 @@ engineCpuUtilization: unit: PERCENTAGE queries: aws: - select: latest(aws.memorydb.EngineCPUUtilization) + select: average(aws.memorydb.EngineCPUUtilization) from: Metric eventId: entity.guid eventName: entity.name @@ -39,7 +39,7 @@ replicationBytes: unit: BYTES queries: aws: - select: latest(aws.memorydb.ReplicationBytes) + select: average(aws.memorydb.ReplicationBytes) from: Metric eventId: entity.guid eventName: entity.name @@ -48,7 +48,7 @@ networkConntrackAllowanceExceeded: unit: COUNT queries: aws: - select: latest(aws.memorydb.NetworkConntrackAllowanceExceeded) + select: average(aws.memorydb.NetworkConntrackAllowanceExceeded) from: Metric eventId: entity.guid eventName: entity.name @@ -57,7 +57,7 @@ replicationLag: unit: SECONDS queries: aws: - select: latest(aws.memorydb.ReplicationLag) + select: average(aws.memorydb.ReplicationLag) from: Metric eventId: entity.guid eventName: entity.name @@ -66,7 +66,7 @@ networkBytesIn: unit: BYTES queries: aws: - select: latest(aws.memorydb.NetworkBytesIn) + select: average(aws.memorydb.NetworkBytesIn) from: Metric eventId: entity.guid eventName: entity.name @@ -75,7 +75,7 @@ replicationDelayedWriteCommands: unit: COUNT queries: aws: - select: latest(aws.memorydb.ReplicationDelayedWriteCommands) + select: average(aws.memorydb.ReplicationDelayedWriteCommands) from: Metric eventId: entity.guid eventName: entity.name @@ -84,7 +84,7 @@ databaseMemoryUsagePercentage: unit: PERCENTAGE queries: aws: - select: latest(aws.memorydb.DatabaseMemoryUsagePercentage) + select: average(aws.memorydb.DatabaseMemoryUsagePercentage) from: Metric eventId: entity.guid eventName: entity.name diff --git a/entity-types/infra-awsnlb/definition.yml b/entity-types/infra-awsnlb/definition.yml index a380dbf30..d3d5f960c 100644 --- a/entity-types/infra-awsnlb/definition.yml +++ b/entity-types/infra-awsnlb/definition.yml @@ -16,3 +16,40 @@ goldenTags: configuration: entityExpirationTime: DAILY alertable: true + +synthesis: + rules: + # Legacy API Polling entities not using the ARN to compute the entity.guid, but directly providing the entityId + - identifier: entityId + name: aws.nlb.loadBalancer + encodeIdentifierInGUID: false + legacyFeatures: + overrideGuidType: true + conditions: + - attribute: eventType + prefix: Log + - attribute: aws.Arn + present: true + - attribute: aws.nlb.loadBalancer + present: true + - attribute: entityId + present: true + tags: + aws.Arn: + # Metrics Streams and API Polling entities using the ARN to compute the entity.guid + - identifier: aws.Arn + name: aws.nlb.loadBalancer + encodeIdentifierInGUID: true + legacyFeatures: + overrideGuidType: true + conditions: + - attribute: eventType + prefix: Log + - attribute: aws.Arn + present: true + - attribute: aws.nlb.loadBalancer + present: true + - attribute: entityId + present: false + tags: + aws.Arn: \ No newline at end of file diff --git a/entity-types/infra-awsrdsdbinstance/definition.yml b/entity-types/infra-awsrdsdbinstance/definition.yml index a40306796..64c24c668 100644 --- a/entity-types/infra-awsrdsdbinstance/definition.yml +++ b/entity-types/infra-awsrdsdbinstance/definition.yml @@ -6,3 +6,42 @@ goldenTags: configuration: entityExpirationTime: DAILY alertable: true + +synthesis: + rules: + # Legacy API Polling entities not using the ARN to compute the entity.guid, but directly providing the entityId + - identifier: entityId + name: aws.rds.DBInstanceIdentifier + encodeIdentifierInGUID: false + legacyFeatures: + overrideGuidType: true + conditions: + - attribute: eventType + prefix: Log + - attribute: aws.rds.DBInstanceIdentifier + present: true + - attribute: aws.Arn + present: true + - attribute: entityId + present: true + tags: + aws.Arn: + aws.rds.DBInstanceIdentifier: + # Metrics Streams and API Polling entities using the ARN to compute the entity.guid + - identifier: aws.Arn + name: aws.rds.DBInstanceIdentifier + encodeIdentifierInGUID: true + legacyFeatures: + overrideGuidType: true + conditions: + - attribute: eventType + prefix: Log + - attribute: aws.Arn + present: true + - attribute: aws.rds.DBInstanceIdentifier + present: true + - attribute: entityId + present: false + tags: + aws.Arn: + aws.rds.DBInstanceIdentifier: \ No newline at end of file diff --git a/entity-types/infra-awss3bucket/definition.yml b/entity-types/infra-awss3bucket/definition.yml index aaf936b79..a4fa2e666 100644 --- a/entity-types/infra-awss3bucket/definition.yml +++ b/entity-types/infra-awss3bucket/definition.yml @@ -13,3 +13,46 @@ dashboardTemplates: configuration: entityExpirationTime: DAILY alertable: true + +synthesis: + rules: + # Legacy API Polling entities not using the ARN to compute the entity.guid, but directly providing the entityId + - identifier: entityId + name: aws.s3.BucketName + encodeIdentifierInGUID: false + legacyFeatures: + overrideGuidType: true + conditions: + - attribute: eventType + prefix: Log + - attribute: aws.Arn + present: true + - attribute: aws.s3.BucketName + present: true + - attribute: entityId + present: true + tags: + # Used in AWSS3BUCKET.yml for entity relationship candidates + aws.Arn: + # Used in AWSS3BUCKET.yml for entity relationship candidates + aws.s3.BucketName: + # Metrics Streams and API Polling entities using the ARN to compute the entity.guid + - identifier: aws.Arn + name: aws.s3.BucketName + encodeIdentifierInGUID: true + legacyFeatures: + overrideGuidType: true + conditions: + - attribute: eventType + prefix: Log + - attribute: aws.Arn + present: true + - attribute: aws.s3.BucketName + present: true + - attribute: entityId + present: false + tags: + # Used in AWSS3BUCKET.yml for entity relationship candidates + aws.Arn: + # Used in AWSS3BUCKET.yml for entity relationship candidates + aws.s3.BucketName: \ No newline at end of file diff --git a/entity-types/infra-awssqsqueue/definition.yml b/entity-types/infra-awssqsqueue/definition.yml index 9ae7dc18d..1a36e906a 100644 --- a/entity-types/infra-awssqsqueue/definition.yml +++ b/entity-types/infra-awssqsqueue/definition.yml @@ -8,3 +8,62 @@ goldenTags: configuration: entityExpirationTime: DAILY alertable: true + +synthesis: + rules: + # Legacy API Polling entities not using the ARN to compute the entity.guid, but directly providing the entityId + - identifier: entityId + name: aws.sqs.QueueName + encodeIdentifierInGUID: false + legacyFeatures: + overrideGuidType: true + conditions: + - attribute: eventSource + value: sqs.amazonaws.com + - attribute: eventName + present: true + - attribute: aws.Arn + present: true + - attribute: aws.sqs.QueueName + present: true + - attribute: entityId + present: true + tags: + aws.Arn: + aws.sqs.queueUrl: + # Used in AWSSQSQUEUE.yml for entity relationship candidates + aws.sqs.QueueName: + # Used in AWSSQSQUEUE.yml for entity relationship candidates + recipientAccountId: + entityTagNames: [ aws.accountId ] + # Used in AWSSQSQUEUE.yml for entity relationship candidates + awsRegion: + entityTagNames: [ aws.region ] + # Metrics Streams and API Polling entities using the ARN to compute the entity.guid + - identifier: aws.Arn + name: aws.sqs.QueueName + encodeIdentifierInGUID: true + legacyFeatures: + overrideGuidType: true + conditions: + - attribute: eventSource + value: sqs.amazonaws.com + - attribute: eventName + present: true + - attribute: aws.Arn + present: true + - attribute: aws.sqs.QueueName + present: true + - attribute: entityId + present: false + tags: + aws.Arn: + aws.sqs.queueUrl: + # Used in AWSSQSQUEUE.yml for entity relationship candidates + aws.sqs.QueueName: + # Used in AWSSQSQUEUE.yml for entity relationship candidates + recipientAccountId: + entityTagNames: [ aws.accountId ] + # Used in AWSSQSQUEUE.yml for entity relationship candidates + awsRegion: + entityTagNames: [ aws.region ] \ No newline at end of file diff --git a/entity-types/infra-azurefunctionsapp/definition.yml b/entity-types/infra-azurefunctionsapp/definition.yml index d03964633..c9c58c91e 100644 --- a/entity-types/infra-azurefunctionsapp/definition.yml +++ b/entity-types/infra-azurefunctionsapp/definition.yml @@ -7,7 +7,7 @@ goldenTags: - azure.resourceGroupName - azure.state configuration: - entityExpirationTime: DAILY + entityExpirationTime: QUARTERLY alertable: true synthesis: tags: diff --git a/entity-types/infra-host/definition.yml b/entity-types/infra-host/definition.yml index 7876bd3cc..cc1ff8a03 100644 --- a/entity-types/infra-host/definition.yml +++ b/entity-types/infra-host/definition.yml @@ -22,12 +22,14 @@ goldenTags: synthesis: rules: # opentelemetry host data from k8s-otel-collector - - identifier: host.id - name: host.name + - identifier: k8s.node.name + name: k8s.node.name legacyFeatures: overrideGuidType: true encodeIdentifierInGUID: true conditions: + - attribute: k8s.node.name + present: true - attribute: eventType value: Metric - attribute: metricName @@ -47,8 +49,6 @@ synthesis: cloud.region: cloud.availability_zone: cloud.platform: - host.id: - host.name: host.type: host.arch: host.image.name: @@ -291,6 +291,24 @@ synthesis: nodename: entityTagNames: [hostname] instrumentation.provider: + # AWS EC2 host synthesized via ElasticBeanstalk logs + # Metrics Streams and API Polling entities use the instanceId to compute the entity.guid + - identifier: aws.ec2.InstanceId + name: aws.ec2.InstanceId + encodeIdentifierInGUID: true + legacyFeatures: + overrideGuidType: true + conditions: + - attribute: eventType + prefix: Log + - attribute: aws.Arn + present: true + - attribute: aws.ec2.InstanceId + present: true + tags: + aws.Arn: + # Used in AWSEC2.yml for entity relationship candidates + aws.ec2.InstanceId: configuration: entityExpirationTime: EIGHT_DAYS alertable: true diff --git a/entity-types/infra-host/tests/Metric.json b/entity-types/infra-host/tests/Metric.json index 56bbc9756..7fd16c582 100644 --- a/entity-types/infra-host/tests/Metric.json +++ b/entity-types/infra-host/tests/Metric.json @@ -42,5 +42,12 @@ "newrelic.source": "api.metrics.otlp", "container.id": "abc123def4567890abc123def4567890abc123def4567890abc123def4567890", "newrelic.entity.type": "host" + }, + { + "host.id": "nr-k8s-otel-collector-daemonset-wq4pn", + "host.name": "nr-k8s-otel-collector-daemonset-wq4pn", + "metricName": "system.cpu.utilization", + "newrelic.source": "api.metrics.otlp", + "k8s.node.name": "gke-cs-test-incident-default-pool-46b18d3c-4ftd" } ] diff --git a/entity-types/media_streaming-video/definition.yml b/entity-types/media_streaming-video/definition.yml new file mode 100644 index 000000000..124ef6ba4 --- /dev/null +++ b/entity-types/media_streaming-video/definition.yml @@ -0,0 +1,28 @@ +domain: MEDIA_STREAMING +type: VIDEO +synthesis: + rules: + # telemetry with Video* eventType + - identifier: appName + name: appName + encodeIdentifierInGUID: false + conditions: + - attribute: eventType + prefix: Video + tags: + playerName: + playerVersion: + deviceType: + deviceGroup: + deviceManufacturer: + deviceModel: +goldenTags: + - playerName + - playerVersion + - deviceType + - deviceGroup + - deviceManufacturer + - deviceModel +configuration: + alertable: true + entityExpirationTime: EIGHT_DAYS diff --git a/entity-types/media_streaming-video/golden_metrics.yml b/entity-types/media_streaming-video/golden_metrics.yml new file mode 100644 index 000000000..2b578626c --- /dev/null +++ b/entity-types/media_streaming-video/golden_metrics.yml @@ -0,0 +1,61 @@ +rebufferingRatio: + title: Video Rebuffering Ratio (%) + unit: PERCENTAGE + query: + select: (sum(timeSinceBufferBegin)*100) / (sum(timeSinceLastHeartbeat) - filter(sum(timeSincePaused), where actionName = 'CONTENT_RESUME') - filter(sum(timeSinceSeekBegin), where actionName = 'CONTENT_SEEK_END')) + from: VideoAction +adRebufferingRatio: + title: Ad Rebuffering Ratio (%) + unit: PERCENTAGE + query: + select: (sum(timeSinceAdBufferBegin)*100) / (sum(timeSinceLastAdHeartbeat) - filter(sum(timeSinceAdPaused), where actionName = 'AD_RESUME') - filter(sum(timeSinceAdSeekBegin), where actionName = 'AD_SEEK_END')) + from: VideoAdAction +averageBitrate: + title: Average Bitrate (B/s) + unit: BYTES_PER_SECOND + query: + select: average(contentBitrate / 16) + average(contentRenditionBitrate / 16) + from: VideoAction +adAverageBitrate: + title: Ad Average Bitrate (B/s) + unit: BYTES_PER_SECOND + query: + select: average(adBitrate / 16) + from: VideoAdAction +averageStartTimeS: + title: Average Start Time (s) + unit: SECONDS + query: + select: average(timeSinceRequested) + from: VideoAction + where: actionName = 'CONTENT_START' +adAverageStartTimeS: + title: Ad Average Start Time (s) + unit: SECONDS + query: + select: average(timeSinceAdRequested) + from: VideoAdAction +videoStartFailures: + title: Video Start Failures + unit: PERCENTAGE + query: + select: (filter(count(*), WHERE actionName = 'CONENT_ERROR' and contentPlayhead = 0) * 100) / (FROM VideoAction SELECT count(*) WHERE actionName = 'CONENT_START' and contentPlayhead=0) + from: VideoErrorAction +adStartFailures: + title: Ad Start Failures + unit: PERCENTAGE + query: + select: (filter(count(*), WHERE actionName = 'AD_ERROR' and adPlayhead = 0 ) * 100) / (FROM VideoAdAction SELECT count(*) WHERE actionName = 'AD_START' and adPlayhead = 0) + from: VideoErrorAction +videoPlaybackFailures: + title: Video Playback Failures + unit: PERCENTAGE + query: + select: count(*) * 100 / (FROM VideoAction SELECT count(*) WHERE actionName = 'CONENT_REQUEST') + from: VideoErrorAction WHERE actionName = 'CONTENT_ERROR' and contentPlayhead > 0 +adPlaybackFailures: + title: Ad Playback Failures + unit: PERCENTAGE + query: + select: count(*) * 100 / (FROM VideoAdAction SELECT count(*) WHERE actionName = 'AD_REQUEST') + from: VideoErrorAction WHERE actionName = 'AD_ERROR' and adPlayhead > 0 diff --git a/entity-types/media_streaming-video/summary_metrics.yml b/entity-types/media_streaming-video/summary_metrics.yml new file mode 100644 index 000000000..bc85a9ce9 --- /dev/null +++ b/entity-types/media_streaming-video/summary_metrics.yml @@ -0,0 +1,40 @@ +rebufferingRatio: + goldenMetric: rebufferingRatio + unit: PERCENTAGE + title: Video Rebuffering Ratio (%) +adRebufferingRation: + goldenMetric: adRebufferingRatio + unit: PERCENTAGE + title: Ad Rebuffering Ratio (%) +averageBitrate: + goldenMetric: averageBitrate + unit: BYTES_PER_SECOND + title: Average Bitrate (B/s) +adAverageBitrate: + goldenMetric: adAverageBitrate + unit: BYTES_PER_SECOND + title: Ad Average Bitrate (B/s) +averageStartTimeS: + goldenMetric: averageStartTimeS + unit: SECONDS + title: Average Start Time (s) +adAverageStartTimeS: + goldenMetric: adAverageStartTimeS + unit: SECONDS + title: Ad Average Start Time (s) +videoStartFailures: + goldenMetric: videoStartFailures + unit: PERCENTAGE + title: Video Start Failures +adStartFailures: + goldenMetric: adStartFailures + unit: PERCENTAGE + title: Ad Start Failures +videoPlaybackFailures: + goldenMetric: videoPlaybackFailures + unit: PERCENTAGE + title: Video Playback Failures +adPlaybackFailures: + goldenMetric: adPlaybackFailures + unit: PERCENTAGE + title: Ad Playback Failures diff --git a/entity-types/ngep-application_settings/definition.yml b/entity-types/ngep-application_settings/definition.yml new file mode 100644 index 000000000..0e04bd3b2 --- /dev/null +++ b/entity-types/ngep-application_settings/definition.yml @@ -0,0 +1,8 @@ +# APM Configuration Settings Entity Definition + +domain: NGEP +type: APPLICATION_SETTINGS + +configuration: + entityExpirationTime: MANUAL + alertable: true \ No newline at end of file diff --git a/entity-types/ngep-git_hub_integration/definition.yml b/entity-types/ngep-git_hub_integration/definition.yml new file mode 100644 index 000000000..dd92f7560 --- /dev/null +++ b/entity-types/ngep-git_hub_integration/definition.yml @@ -0,0 +1,6 @@ +domain: NGEP +type: GIT_HUB_INTEGRATION + +configuration: + entityExpirationTime: MANUAL + alertable: false \ No newline at end of file diff --git a/entity-types/ngep-pipeline_cloud_rule/definition.yml b/entity-types/ngep-pipeline_cloud_rule/definition.yml new file mode 100644 index 000000000..c270ffc61 --- /dev/null +++ b/entity-types/ngep-pipeline_cloud_rule/definition.yml @@ -0,0 +1,6 @@ +domain: NGEP +type: PIPELINE_CLOUD_RULE + +configuration: + entityExpirationTime: MANUAL + alertable: false diff --git a/entity-types/ngep-security_finding/definition.yml b/entity-types/ngep-security_finding/definition.yml new file mode 100644 index 000000000..fd56d6495 --- /dev/null +++ b/entity-types/ngep-security_finding/definition.yml @@ -0,0 +1,6 @@ +domain: NGEP +type: SECURITY_FINDING + +configuration: + entityExpirationTime: MANUAL + alertable: false diff --git a/entity-types/ngep-team/definition.yml b/entity-types/ngep-team/definition.yml index e83b18746..5b46cc73a 100644 --- a/entity-types/ngep-team/definition.yml +++ b/entity-types/ngep-team/definition.yml @@ -3,4 +3,4 @@ type: TEAM configuration: entityExpirationTime: MANUAL - alertable: true + alertable: false diff --git a/entity-types/ngep-teams_organization_settings/definition.yml b/entity-types/ngep-teams_organization_settings/definition.yml index 868c862be..6e84f9a22 100644 --- a/entity-types/ngep-teams_organization_settings/definition.yml +++ b/entity-types/ngep-teams_organization_settings/definition.yml @@ -3,4 +3,4 @@ type: TEAMS_ORGANIZATION_SETTINGS configuration: entityExpirationTime: MANUAL - alertable: true + alertable: false diff --git a/entity-types/uninstrumented-httpservice/definition.yml b/entity-types/uninstrumented-httpservice/definition.yml new file mode 100644 index 000000000..f6be602e1 --- /dev/null +++ b/entity-types/uninstrumented-httpservice/definition.yml @@ -0,0 +1,6 @@ +domain: UNINSTRUMENTED +type: HTTPSERVICE + +configuration: + entityExpirationTime: FOUR_HOURS + alertable: false diff --git a/relationships/candidates/AWSAPPSYNCAPI.yml b/relationships/candidates/AWSAPPSYNCAPI.yml new file mode 100644 index 000000000..c5fc5e170 --- /dev/null +++ b/relationships/candidates/AWSAPPSYNCAPI.yml @@ -0,0 +1,16 @@ +category: AWSAPPSYNCAPI +lookups: + - entityTypes: + - domain: INFRA + type: AWSAPPSYNCAPI + tags: + matchingMode: ALL + predicates: + - tagKeys: ["http.url"] + field: httpUrl + onMatch: + onMultipleMatches: RELATE_ALL + onMiss: + action: CREATE_UNINSTRUMENTED + uninstrumented: + type: AWSAPPSYNCAPI \ No newline at end of file diff --git a/relationships/candidates/AWSELASTICSEARCHCLUSTER.yml b/relationships/candidates/AWSELASTICSEARCHCLUSTER.yml index 47a4748fd..03aa55694 100644 --- a/relationships/candidates/AWSELASTICSEARCHCLUSTER.yml +++ b/relationships/candidates/AWSELASTICSEARCHCLUSTER.yml @@ -11,4 +11,6 @@ lookups: onMatch: onMultipleMatches: RELATE_ALL onMiss: - action: NO_OP \ No newline at end of file + action: CREATE_UNINSTRUMENTED + uninstrumented: + type: AWSELASTICSEARCHCLUSTER \ No newline at end of file diff --git a/relationships/candidates/AWSKINESISDELIVERYSTREAM.yml b/relationships/candidates/AWSKINESISDELIVERYSTREAM.yml new file mode 100644 index 000000000..e88d0fc34 --- /dev/null +++ b/relationships/candidates/AWSKINESISDELIVERYSTREAM.yml @@ -0,0 +1,16 @@ +category: AWSKINESISDELIVERYSTREAM +lookups: + - entityTypes: + - domain: INFRA + type: AWSKINESISDELIVERYSTREAM + tags: + matchingMode: ALL + predicates: + - tagKeys: ["aws.Arn", "aws.arn"] + field: cloudResourceId + onMatch: + onMultipleMatches: RELATE_ALL + onMiss: + action: CREATE_UNINSTRUMENTED + uninstrumented: + type: AWSKINESISDELIVERYSTREAM \ No newline at end of file diff --git a/relationships/candidates/AWSKINESISSTREAM.yml b/relationships/candidates/AWSKINESISSTREAM.yml new file mode 100644 index 000000000..dce5463c9 --- /dev/null +++ b/relationships/candidates/AWSKINESISSTREAM.yml @@ -0,0 +1,16 @@ +category: AWSKINESISSTREAM +lookups: + - entityTypes: + - domain: INFRA + type: AWSKINESISSTREAM + tags: + matchingMode: ALL + predicates: + - tagKeys: ["aws.Arn"] + field: cloudResourceId + onMatch: + onMultipleMatches: RELATE_ALL + onMiss: + action: CREATE_UNINSTRUMENTED + uninstrumented: + type: AWSKINESISSTREAM \ No newline at end of file diff --git a/relationships/candidates/AWSREDSHIFTCLUSTER.yml b/relationships/candidates/AWSREDSHIFTCLUSTER.yml new file mode 100644 index 000000000..465bb09a2 --- /dev/null +++ b/relationships/candidates/AWSREDSHIFTCLUSTER.yml @@ -0,0 +1,16 @@ +category: AWSREDSHIFTCLUSTER +lookups: + - entityTypes: + - domain: INFRA + type: AWSREDSHIFTCLUSTER + tags: + matchingMode: ALL + predicates: + - tagKeys: ["configuration.endpoint.address"] + field: cloudEndpointAddress + onMatch: + onMultipleMatches: RELATE_ALL + onMiss: + action: CREATE_UNINSTRUMENTED + uninstrumented: + type: AWSREDSHIFTCLUSTER \ No newline at end of file diff --git a/relationships/candidates/CONTAINER.yml b/relationships/candidates/CONTAINER.yml index b3ec1f6ea..b26192951 100644 --- a/relationships/candidates/CONTAINER.yml +++ b/relationships/candidates/CONTAINER.yml @@ -14,23 +14,3 @@ lookups: action: CREATE_UNINSTRUMENTED uninstrumented: type: CONTAINER - - entityTypes: - - domain: INFRA - type: CONTAINER - tags: - matchingMode: ALL - predicates: - - tagKeys: [ "k8s.clusterName" ] - field: k8sClusterName - - tagKeys: [ "k8s.namespaceName" ] - field: k8sNamespaceName - - tagKeys: [ "k8s.podName" ] - field: k8sPodName - - tagKeys: [ "k8s.containerName" ] - field: k8sContainerName - onMatch: - onMultipleMatches: RELATE_ALL - onMiss: - action: CREATE_UNINSTRUMENTED - uninstrumented: - type: CONTAINER diff --git a/relationships/candidates/DATABASE.yml b/relationships/candidates/DATABASE.yml index 84c558d2d..76b38b1a7 100644 --- a/relationships/candidates/DATABASE.yml +++ b/relationships/candidates/DATABASE.yml @@ -5,10 +5,44 @@ lookups: type: AWSRDSDBCLUSTER - domain: INFRA type: AWSRDSDBINSTANCE + - domain: INFRA + type: AZURESQLDATABASE + - domain: INFRA + type: AZURESQLSERVER + - domain: INFRA + type: AZUREPOSTGRESQLFLEXIBLESERVER + - domain: INFRA + type: AZURESQLELASTICPOOL + - domain: INFRA + type: AZUREPOSTGRESQLSERVER + - domain: INFRA + type: AZURESQLMANAGEDINSTANCE + - domain: INFRA + type: AZUREMYSQLFLEXIBLESERVER + - domain: INFRA + type: AZUREMYSQLSERVER + - domain: INFRA + type: AZUREMARIADBSERVER + - domain: INFRA + type: GCPCLOUDSQL + - domain: INFRA + type: GCPALLOYDBDATABASE + - domain: INFRA + type: GCPALLOYDBINSTANCE + - domain: INFRA + type: GCPALLOYDBCLUSTER + - domain: INFRA + type: MSSQLINSTANCE + - domain: INFRA + type: MYSQLNODE + - domain: INFRA + type: POSTGRESQLINSTANCE + - domain: INFRA + type: ORACLEDBINSTANCE tags: matchingMode: ANY predicates: - - tagKeys: ["aws.endpoint", "aws.readerEndpoint", "aws.customEndpoints", "aws.rds.endpoint", "aws.rds.readerEndpoint", "aws.rds.customEndpoints"] + - tagKeys: ["endpoint", "nr.endpoint", "aws.endpoint", "aws.readerEndpoint", "aws.customEndpoints", "aws.rds.endpoint", "aws.rds.readerEndpoint", "aws.rds.customEndpoints"] field: endpoint onMatch: onMultipleMatches: RELATE_ALL diff --git a/relationships/candidates/HTTPSERVICE.yml b/relationships/candidates/HTTPSERVICE.yml new file mode 100644 index 000000000..c82cb08ff --- /dev/null +++ b/relationships/candidates/HTTPSERVICE.yml @@ -0,0 +1,18 @@ +category: HTTPSERVICE +lookups: + - entityTypes: + - domain: APM + type: APPLICATION + - domain: EXT + type: SERVICE + tags: + matchingMode: ANY + predicates: + - tagKeys: ["nr.endpointHostname", "endpointHostname"] + field: hostname + onMatch: + onMultipleMatches: RELATE_ALL + onMiss: + action: CREATE_UNINSTRUMENTED + uninstrumented: + type: HTTPSERVICE diff --git a/relationships/synthesis/APM-APPLICATION-to-DATABASE.yml b/relationships/synthesis/APM-APPLICATION-to-DATABASE.yml index 3b1d5cae8..d61a15173 100644 --- a/relationships/synthesis/APM-APPLICATION-to-DATABASE.yml +++ b/relationships/synthesis/APM-APPLICATION-to-DATABASE.yml @@ -37,3 +37,22 @@ relationships: fields: - field: endpoint attribute: metricName__4 + - name: apmCallsGenericDatabase + version: "1" + origins: + - APM Metrics + conditions: + - attribute: metricName + regex: "^datastore/instance/(?:mysql|postgres|mssql|oracle|mariadb|jdbc)/[^/;]*/.*" + relationship: + expires: P75M + relationshipType: CALLS + source: + extractGuid: + attribute: entity.guid + target: + lookupGuid: + candidateCategory: DATABASE + fields: + - field: endpoint + attribute: metricName__4 diff --git a/relationships/synthesis/APM-APPLICATION-to-INFRA-AWSAPPSYNCAPI.yml b/relationships/synthesis/APM-APPLICATION-to-INFRA-AWSAPPSYNCAPI.yml new file mode 100644 index 000000000..393f62f4b --- /dev/null +++ b/relationships/synthesis/APM-APPLICATION-to-INFRA-AWSAPPSYNCAPI.yml @@ -0,0 +1,22 @@ +relationships: + - name: apmCallsInfraAppSyncApi + version: "1" + origins: + - Distributed Tracing + conditions: + - attribute: eventType + anyOf: [ "Span" ] + - attribute: peer.hostname + regex: '[a-z]+[a-z0-9]*\.appsync-api\.[a-z]{2}-[a-z]+-\d+\.amazonaws\.com' + relationship: + expires: P75M + relationshipType: CALLS + source: + extractGuid: + attribute: entity.guid + target: + lookupGuid: + candidateCategory: AWSAPPSYNCAPI + fields: + - field: httpUrl + attribute: http.url \ No newline at end of file diff --git a/relationships/synthesis/APM-APPLICATION-to-INFRA-AWSELASTICSEARCHCLUSTER.yml b/relationships/synthesis/APM-APPLICATION-to-INFRA-AWSELASTICSEARCHCLUSTER.yml index 4201e192a..b910777e9 100644 --- a/relationships/synthesis/APM-APPLICATION-to-INFRA-AWSELASTICSEARCHCLUSTER.yml +++ b/relationships/synthesis/APM-APPLICATION-to-INFRA-AWSELASTICSEARCHCLUSTER.yml @@ -6,8 +6,8 @@ relationships: conditions: - attribute: eventType anyOf: [ "Span" ] - - attribute: db.system - anyOf: [ "elasticsearch" ] + - attribute: server.address + regex: ^search-[a-zA-Z0-9-]+-[a-zA-Z0-9]+\.((aos\.[a-zA-Z0-9-]+\.on\.aws)|(([a-zA-Z0-9-]+)\.(es|aos)\.amazonaws\.com))$ relationship: expires: P75M relationshipType: CALLS @@ -19,4 +19,25 @@ relationships: candidateCategory: AWSELASTICSEARCHCLUSTER fields: - field: endpoint - attribute: http.url \ No newline at end of file + attribute: server.address + - name: apmServiceCallsThirdPartyLibraryElasticsearch + version: "1" + origins: + - APM Metrics + conditions: + - attribute: metricName + regex: "^Datastore/instance/Elasticsearch/search-[a-zA-Z0-9-]+-[a-zA-Z0-9]+\\.((aos\\.[a-zA-Z0-9-]+\\.on\\.aws)|(([a-zA-Z0-9-]+)\\.(es|aos)\\.amazonaws\\.com))/[0-9]+" + relationship: + expires: P75M + relationshipType: CALLS + source: + extractGuid: + attribute: entity.guid + target: + lookupGuid: + candidateCategory: AWSELASTICSEARCHCLUSTER + fields: + - field: endpoint + attribute: metricName__4 + - field: port + attribute: metricName__5 diff --git a/relationships/synthesis/APM-APPLICATION-to-INFRA-KINESISSTREAM.yml b/relationships/synthesis/APM-APPLICATION-to-INFRA-KINESISSTREAM.yml index 2f8da1490..09741c13d 100644 --- a/relationships/synthesis/APM-APPLICATION-to-INFRA-KINESISSTREAM.yml +++ b/relationships/synthesis/APM-APPLICATION-to-INFRA-KINESISSTREAM.yml @@ -1,5 +1,5 @@ relationships: - - name: AWSKINESISSTREAM + - name: apmServiceCallsInfraKinesisStream version: "1" origins: - Distributed Tracing @@ -9,7 +9,7 @@ relationships: - attribute: cloud.platform anyOf: [ "aws_kinesis_data_streams"] - attribute: cloud.resource_id - regex: "^arn:aws:kinesis:([^:]*):([^:]*):stream:([^:]*)" + regex: "^arn:aws:kinesis:([^:]*):([^:]*):stream/([^:]*)" relationship: expires: P75M relationshipType: CALLS @@ -21,4 +21,4 @@ relationships: candidateCategory: AWSKINESISSTREAM fields: - field: cloudResourceId - attribute: cloud.resource_id \ No newline at end of file + attribute: cloud.resource_id diff --git a/relationships/synthesis/APM-APPLICATION-to-INFRA-KINESSISDELIVERYSTREAM.yml b/relationships/synthesis/APM-APPLICATION-to-INFRA-KINESSISDELIVERYSTREAM.yml new file mode 100644 index 000000000..1a29fb03e --- /dev/null +++ b/relationships/synthesis/APM-APPLICATION-to-INFRA-KINESSISDELIVERYSTREAM.yml @@ -0,0 +1,24 @@ +relationships: + - name: apmCallsInfraKinesisDeliveryStream + version: "1" + origins: + - Distributed Tracing + conditions: + - attribute: eventType + anyOf: [ "Span" ] + - attribute: cloud.platform + anyOf: [ "aws_kinesis_delivery_streams" ] + - attribute: cloud.resource_id + regex: "^arn:aws:firehose:([^:]*):([^:]*):deliverystream/([^:]*)" + relationship: + expires: P75M + relationshipType: CALLS + source: + extractGuid: + attribute: entity.guid + target: + lookupGuid: + candidateCategory: AWSKINESISDELIVERYSTREAM + fields: + - field: cloudResourceId + attribute: cloud.resource_id \ No newline at end of file diff --git a/relationships/synthesis/APM-APPLICATION-to-INFRA-MQBROKER.yml b/relationships/synthesis/APM-APPLICATION-to-INFRA-MQBROKER.yml index 8158cfefe..a59b3c05c 100644 --- a/relationships/synthesis/APM-APPLICATION-to-INFRA-MQBROKER.yml +++ b/relationships/synthesis/APM-APPLICATION-to-INFRA-MQBROKER.yml @@ -21,7 +21,7 @@ relationships: - field: endpoint attribute: server.address - - name: apmConsumesAwsMqTopic + - name: apmConsumesAwsMqBroker version: "1" origins: - Distributed Tracing @@ -41,4 +41,26 @@ relationships: candidateCategory: AWSMQBROKER fields: - field: endpoint - attribute: server.address \ No newline at end of file + attribute: server.address + + - name: apmCallsAwsMqBroker + version: "1" + origins: + - Distributed Tracing + conditions: + - attribute: eventType + anyOf: [ "Span" ] + - attribute: name + regex: "OtherTransaction/Message/[^/]*/[^/]*" + relationship: + expires: P75M + relationshipType: CALLS + source: + extractGuid: + attribute: entity.guid + target: + lookupGuid: + candidateCategory: AWSMQBROKER + fields: + - field: endpoint + attribute: server.address \ No newline at end of file diff --git a/relationships/synthesis/EXT-SERVICE-to-INFRA-AWSAPPSYNCAPI.yml b/relationships/synthesis/EXT-SERVICE-to-INFRA-AWSAPPSYNCAPI.yml new file mode 100644 index 000000000..42b819d02 --- /dev/null +++ b/relationships/synthesis/EXT-SERVICE-to-INFRA-AWSAPPSYNCAPI.yml @@ -0,0 +1,24 @@ +relationships: + - name: extServiceCallsInfraAppSyncApi + version: "1" + origins: + - Distributed Tracing + conditions: + - attribute: eventType + anyOf: [ "Span" ] + - attribute: instrumentation.provider + anyOf: [ "opentelemetry" ] + - attribute: net.peer.name + regex: '[a-z]+[a-z0-9]*\.appsync-api\.[a-z]{2}-[a-z]+-\d+\.amazonaws\.com' + relationship: + expires: P75M + relationshipType: CALLS + source: + extractGuid: + attribute: entity.guid + target: + lookupGuid: + candidateCategory: AWSAPPSYNCAPI + fields: + - field: httpUrl + attribute: http.url \ No newline at end of file diff --git a/relationships/synthesis/EXT-SERVICE-to-INFRA-AWSELASTICSEARCHCLUSTER.yml b/relationships/synthesis/EXT-SERVICE-to-INFRA-AWSELASTICSEARCHCLUSTER.yml index 84c895eea..bf0ef7b87 100644 --- a/relationships/synthesis/EXT-SERVICE-to-INFRA-AWSELASTICSEARCHCLUSTER.yml +++ b/relationships/synthesis/EXT-SERVICE-to-INFRA-AWSELASTICSEARCHCLUSTER.yml @@ -19,4 +19,4 @@ relationships: candidateCategory: AWSELASTICSEARCHCLUSTER fields: - field: endpoint - attribute: url.full \ No newline at end of file + attribute: server.address diff --git a/relationships/synthesis/EXT-SERVICE-to-INFRA-KINESISDELIVERYSTREAM.yml b/relationships/synthesis/EXT-SERVICE-to-INFRA-KINESISDELIVERYSTREAM.yml new file mode 100644 index 000000000..8bbfae7c2 --- /dev/null +++ b/relationships/synthesis/EXT-SERVICE-to-INFRA-KINESISDELIVERYSTREAM.yml @@ -0,0 +1,24 @@ +relationships: + - name: extServiceCallsInfraKinesisDeliveryStream + version: "1" + origins: + - Distributed Tracing + conditions: + - attribute: eventType + anyOf: [ "Span" ] + - attribute: instrumentation.provider + anyOf: [ "opentelemetry" ] + - attribute: rpc.service + anyOf: [ "Firehose" ] + relationship: + expires: P75M + relationshipType: CALLS + source: + extractGuid: + attribute: entity.guid + target: + lookupGuid: + candidateCategory: AWSKINESISDELIVERYSTREAM + fields: + - field: cloudResourceId + attribute: cloud.resource_id \ No newline at end of file diff --git a/relationships/synthesis/EXT-SERVICE-to-INFRA-KINESISSTREAM.yml b/relationships/synthesis/EXT-SERVICE-to-INFRA-KINESISSTREAM.yml new file mode 100644 index 000000000..2cb74e9c2 --- /dev/null +++ b/relationships/synthesis/EXT-SERVICE-to-INFRA-KINESISSTREAM.yml @@ -0,0 +1,24 @@ +relationships: + - name: extServiceCallsInfraKinesisStream + version: "1" + origins: + - Distributed Tracing + conditions: + - attribute: eventType + anyOf: [ "Span" ] + - attribute: instrumentation.provider + anyOf: [ "opentelemetry" ] + - attribute: rpc.service + anyOf: [ "kinesis" ] + relationship: + expires: P75M + relationshipType: CALLS + source: + extractGuid: + attribute: entity.guid + target: + lookupGuid: + candidateCategory: AWSKINESISSTREAM + fields: + - field: cloudResourceId + attribute: cloud.resource_id \ No newline at end of file diff --git a/relationships/synthesis/EXT-SERVICE-to-INFRA-REDSHIFTCLUSTER.yml b/relationships/synthesis/EXT-SERVICE-to-INFRA-REDSHIFTCLUSTER.yml new file mode 100644 index 000000000..6af42cdd1 --- /dev/null +++ b/relationships/synthesis/EXT-SERVICE-to-INFRA-REDSHIFTCLUSTER.yml @@ -0,0 +1,24 @@ +relationships: + - name: extServiceCallsInfraRedshiftCluster + version: "1" + origins: + - Distributed Tracing + conditions: + - attribute: eventType + anyOf: [ "Span" ] + - attribute: instrumentation.provider + anyOf: [ "opentelemetry" ] + - attribute: rpc.service + anyOf: [ "Redshift" ] + relationship: + expires: P75M + relationshipType: CALLS + source: + extractGuid: + attribute: entity.guid + target: + lookupGuid: + candidateCategory: AWSREDSHIFTCLUSTER + fields: + - field: cloudEndpointAddress + attribute: configuration.endpoint.address \ No newline at end of file diff --git a/relationships/synthesis/EXT_INFRA-DOCKER_CONTAINER-to-EXT-SERVICE.yml b/relationships/synthesis/EXT_INFRA-DOCKER_CONTAINER-to-EXT-SERVICE.yml deleted file mode 100644 index e0336b4cd..000000000 --- a/relationships/synthesis/EXT_INFRA-DOCKER_CONTAINER-to-EXT-SERVICE.yml +++ /dev/null @@ -1,30 +0,0 @@ -relationships: - - name: extInfraDockerContainerEXTService - version: "1" - origins: - - OpenTelemetry - conditions: - - attribute: eventType - anyOf: [ "Metric" ] - - attribute: entity.type - anyOf: ["SERVICE"] - relationship: - expires: P75M - relationshipType: HOSTS - source: - buildGuid: - account: - attribute: accountId - domain: - value: INFRA - type: - value: CONTAINER - identifier: - fragments: - - attribute: container.id - hashAlgorithm: FARM_HASH - target: - extractGuid: - attribute: entity.guid - entityType: - attribute: entity.type diff --git a/relationships/synthesis/INFRA-HOST-to-EXT-FLUENTBIT_HOST.yml b/relationships/synthesis/INFRA-HOST-to-EXT-FLUENTBIT_HOST.yml new file mode 100644 index 000000000..83e8ec225 --- /dev/null +++ b/relationships/synthesis/INFRA-HOST-to-EXT-FLUENTBIT_HOST.yml @@ -0,0 +1,44 @@ +relationships: + - name: hostHostsFluentbit + version: "1" + origins: + - Metric API + conditions: + - attribute: eventType + anyOf: [ "Metric" ] + - attribute: metricName + startsWith: "fluentbit_" + - attribute: source + anyOf: [ "host" ] + relationship: + expires: P75M + relationshipType: HOSTS + source: + buildGuid: + account: + lookup: true + domain: + value: INFRA + type: + value: HOST + valueInGuid: NA + identifier: + fragments: + - attribute: host.id + hashAlgorithm: FARM_HASH + target: + buildGuid: + account: + lookup: true + domain: + value: EXT + type: + value: FLUENTBIT_HOST + identifier: + fragments: + - attribute: cluster_name + - value: ":" + - attribute: namespace + - value: ":" + - attribute: daemonset_name + hashAlgorithm: FARM_HASH \ No newline at end of file diff --git a/relationships/synthesis/INFRA-KUBERNETES_DAEMONSET-to-EXT-FLUENTBIT_KUBERNETES.yml b/relationships/synthesis/INFRA-KUBERNETES_DAEMONSET-to-EXT-FLUENTBIT_KUBERNETES.yml new file mode 100644 index 000000000..fdb1037b2 --- /dev/null +++ b/relationships/synthesis/INFRA-KUBERNETES_DAEMONSET-to-EXT-FLUENTBIT_KUBERNETES.yml @@ -0,0 +1,71 @@ +relationships: + - name: k8sDaemonSetManagesFluentbit + version: "1" + origins: + - Metric API + conditions: + - attribute: eventType + anyOf: [ "Metric" ] + - attribute: metricName + startsWith: "fluentbit_" + - attribute: "source" + anyOf: [ "kubernetes" ] + relationship: + expires: P75M + relationshipType: MANAGES + source: + extractGuid: + attribute: entityGuid + entityType: + value: KUBERNETES_DAEMONSET + target: + buildGuid: + account: + lookup: true + domain: + value: EXT + type: + value: FLUENTBIT_KUBERNETES + identifier: + fragments: + - attribute: cluster_name + - value: ":" + - attribute: namespace + - value: ":" + - attribute: daemonset_name + hashAlgorithm: FARM_HASH + - name: otelKsmK8sDaemonSetManagesFluentbit + version: "1" + origins: + - Metric API + conditions: + - attribute: eventType + anyOf: [ "Metric" ] + - attribute: metricName + startsWith: "fluentbit_" + - attribute: "source" + anyOf: [ "kubernetes" ] + relationship: + expires: P75M + relationshipType: MANAGES + source: + extractGuid: + attribute: entity.guid + entityType: + value: KUBERNETES_DAEMONSET + target: + buildGuid: + account: + lookup: true + domain: + value: EXT + type: + value: FLUENTBIT_KUBERNETES + identifier: + fragments: + - attribute: cluster_name + - value: ":" + - attribute: namespace + - value: ":" + - attribute: daemonset_name + hashAlgorithm: FARM_HASH \ No newline at end of file diff --git a/relationships/synthesis/INFRA_DOCKER_CONTAINER-to-EXT_SERVICE.yml b/relationships/synthesis/INFRA_DOCKER_CONTAINER-to-EXT_SERVICE.yml new file mode 100644 index 000000000..64c9a1741 --- /dev/null +++ b/relationships/synthesis/INFRA_DOCKER_CONTAINER-to-EXT_SERVICE.yml @@ -0,0 +1,59 @@ +relationships: + # infra metrics from oTel dockerstats receiver + - name: extInfraDockerContainerEXTService + version: "1" + origins: + - OpenTelemetry + conditions: + - attribute: eventType + anyOf: [ "Metric" ] + relationship: + expires: P75M + relationshipType: HOSTS + source: + buildGuid: + account: + attribute: accountId + domain: + value: INFRA + type: + value: CONTAINER + identifier: + fragments: + - attribute: container.id + hashAlgorithm: FARM_HASH + target: + extractGuid: + attribute: entity.guid + entityType: + value: "SERVICE" + # infra metrics from NR infra agent + - name: nrInfraDockerContainerEXTService + version: "1" + origins: + - OpenTelemetry + conditions: + - attribute: eventType + anyOf: [ "Metric" ] + relationship: + expires: P75M + relationshipType: HOSTS + source: + buildGuid: + account: + attribute: accountId + domain: + value: INFRA + type: + value: CONTAINER + valueInGuid: NA + identifier: + fragments: + - value: "docker:" + - attribute: container.id + hashAlgorithm: FARM_HASH + target: + extractGuid: + attribute: entity.guid + entityType: + value: "SERVICE" \ No newline at end of file