OpenTelemetry icons and data telemetry (#78499)

Add OpenTelemetry agent names and and icon. OpenTelemetry services will have the same icon as the corresponding APM services.

Services that report "otlp" as their agent name use the OpenTelemetry icon.

The OpenTelemetry agents are now collected in the data telemetry along with the other agent names.

Change "ratio" in the telemetry to a float.
This commit is contained in:
Nathan L Smith 2020-09-29 14:33:29 -05:00 committed by GitHub
parent 70d5157d62
commit c2ef407d04
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
9 changed files with 875 additions and 34 deletions

View file

@ -524,6 +524,710 @@ exports[`APM telemetry helpers getApmTelemetry generates a JSON object with the
}
}
}
},
"otlp": {
"properties": {
"agent": {
"properties": {
"version": {
"type": "keyword",
"ignore_above": 1024
}
}
},
"service": {
"properties": {
"framework": {
"properties": {
"composite": {
"type": "keyword",
"ignore_above": 1024
},
"name": {
"type": "keyword",
"ignore_above": 1024
},
"version": {
"type": "keyword",
"ignore_above": 1024
}
}
},
"language": {
"properties": {
"composite": {
"type": "keyword",
"ignore_above": 1024
},
"name": {
"type": "keyword",
"ignore_above": 1024
},
"version": {
"type": "keyword",
"ignore_above": 1024
}
}
},
"runtime": {
"properties": {
"composite": {
"type": "keyword",
"ignore_above": 1024
},
"name": {
"type": "keyword",
"ignore_above": 1024
},
"version": {
"type": "keyword",
"ignore_above": 1024
}
}
}
}
}
}
},
"opentelemetry/cpp": {
"properties": {
"agent": {
"properties": {
"version": {
"type": "keyword",
"ignore_above": 1024
}
}
},
"service": {
"properties": {
"framework": {
"properties": {
"composite": {
"type": "keyword",
"ignore_above": 1024
},
"name": {
"type": "keyword",
"ignore_above": 1024
},
"version": {
"type": "keyword",
"ignore_above": 1024
}
}
},
"language": {
"properties": {
"composite": {
"type": "keyword",
"ignore_above": 1024
},
"name": {
"type": "keyword",
"ignore_above": 1024
},
"version": {
"type": "keyword",
"ignore_above": 1024
}
}
},
"runtime": {
"properties": {
"composite": {
"type": "keyword",
"ignore_above": 1024
},
"name": {
"type": "keyword",
"ignore_above": 1024
},
"version": {
"type": "keyword",
"ignore_above": 1024
}
}
}
}
}
}
},
"opentelemetry/dotnet": {
"properties": {
"agent": {
"properties": {
"version": {
"type": "keyword",
"ignore_above": 1024
}
}
},
"service": {
"properties": {
"framework": {
"properties": {
"composite": {
"type": "keyword",
"ignore_above": 1024
},
"name": {
"type": "keyword",
"ignore_above": 1024
},
"version": {
"type": "keyword",
"ignore_above": 1024
}
}
},
"language": {
"properties": {
"composite": {
"type": "keyword",
"ignore_above": 1024
},
"name": {
"type": "keyword",
"ignore_above": 1024
},
"version": {
"type": "keyword",
"ignore_above": 1024
}
}
},
"runtime": {
"properties": {
"composite": {
"type": "keyword",
"ignore_above": 1024
},
"name": {
"type": "keyword",
"ignore_above": 1024
},
"version": {
"type": "keyword",
"ignore_above": 1024
}
}
}
}
}
}
},
"opentelemetry/erlang": {
"properties": {
"agent": {
"properties": {
"version": {
"type": "keyword",
"ignore_above": 1024
}
}
},
"service": {
"properties": {
"framework": {
"properties": {
"composite": {
"type": "keyword",
"ignore_above": 1024
},
"name": {
"type": "keyword",
"ignore_above": 1024
},
"version": {
"type": "keyword",
"ignore_above": 1024
}
}
},
"language": {
"properties": {
"composite": {
"type": "keyword",
"ignore_above": 1024
},
"name": {
"type": "keyword",
"ignore_above": 1024
},
"version": {
"type": "keyword",
"ignore_above": 1024
}
}
},
"runtime": {
"properties": {
"composite": {
"type": "keyword",
"ignore_above": 1024
},
"name": {
"type": "keyword",
"ignore_above": 1024
},
"version": {
"type": "keyword",
"ignore_above": 1024
}
}
}
}
}
}
},
"opentelemetry/go": {
"properties": {
"agent": {
"properties": {
"version": {
"type": "keyword",
"ignore_above": 1024
}
}
},
"service": {
"properties": {
"framework": {
"properties": {
"composite": {
"type": "keyword",
"ignore_above": 1024
},
"name": {
"type": "keyword",
"ignore_above": 1024
},
"version": {
"type": "keyword",
"ignore_above": 1024
}
}
},
"language": {
"properties": {
"composite": {
"type": "keyword",
"ignore_above": 1024
},
"name": {
"type": "keyword",
"ignore_above": 1024
},
"version": {
"type": "keyword",
"ignore_above": 1024
}
}
},
"runtime": {
"properties": {
"composite": {
"type": "keyword",
"ignore_above": 1024
},
"name": {
"type": "keyword",
"ignore_above": 1024
},
"version": {
"type": "keyword",
"ignore_above": 1024
}
}
}
}
}
}
},
"opentelemetry/java": {
"properties": {
"agent": {
"properties": {
"version": {
"type": "keyword",
"ignore_above": 1024
}
}
},
"service": {
"properties": {
"framework": {
"properties": {
"composite": {
"type": "keyword",
"ignore_above": 1024
},
"name": {
"type": "keyword",
"ignore_above": 1024
},
"version": {
"type": "keyword",
"ignore_above": 1024
}
}
},
"language": {
"properties": {
"composite": {
"type": "keyword",
"ignore_above": 1024
},
"name": {
"type": "keyword",
"ignore_above": 1024
},
"version": {
"type": "keyword",
"ignore_above": 1024
}
}
},
"runtime": {
"properties": {
"composite": {
"type": "keyword",
"ignore_above": 1024
},
"name": {
"type": "keyword",
"ignore_above": 1024
},
"version": {
"type": "keyword",
"ignore_above": 1024
}
}
}
}
}
}
},
"opentelemetry/nodejs": {
"properties": {
"agent": {
"properties": {
"version": {
"type": "keyword",
"ignore_above": 1024
}
}
},
"service": {
"properties": {
"framework": {
"properties": {
"composite": {
"type": "keyword",
"ignore_above": 1024
},
"name": {
"type": "keyword",
"ignore_above": 1024
},
"version": {
"type": "keyword",
"ignore_above": 1024
}
}
},
"language": {
"properties": {
"composite": {
"type": "keyword",
"ignore_above": 1024
},
"name": {
"type": "keyword",
"ignore_above": 1024
},
"version": {
"type": "keyword",
"ignore_above": 1024
}
}
},
"runtime": {
"properties": {
"composite": {
"type": "keyword",
"ignore_above": 1024
},
"name": {
"type": "keyword",
"ignore_above": 1024
},
"version": {
"type": "keyword",
"ignore_above": 1024
}
}
}
}
}
}
},
"opentelemetry/php": {
"properties": {
"agent": {
"properties": {
"version": {
"type": "keyword",
"ignore_above": 1024
}
}
},
"service": {
"properties": {
"framework": {
"properties": {
"composite": {
"type": "keyword",
"ignore_above": 1024
},
"name": {
"type": "keyword",
"ignore_above": 1024
},
"version": {
"type": "keyword",
"ignore_above": 1024
}
}
},
"language": {
"properties": {
"composite": {
"type": "keyword",
"ignore_above": 1024
},
"name": {
"type": "keyword",
"ignore_above": 1024
},
"version": {
"type": "keyword",
"ignore_above": 1024
}
}
},
"runtime": {
"properties": {
"composite": {
"type": "keyword",
"ignore_above": 1024
},
"name": {
"type": "keyword",
"ignore_above": 1024
},
"version": {
"type": "keyword",
"ignore_above": 1024
}
}
}
}
}
}
},
"opentelemetry/python": {
"properties": {
"agent": {
"properties": {
"version": {
"type": "keyword",
"ignore_above": 1024
}
}
},
"service": {
"properties": {
"framework": {
"properties": {
"composite": {
"type": "keyword",
"ignore_above": 1024
},
"name": {
"type": "keyword",
"ignore_above": 1024
},
"version": {
"type": "keyword",
"ignore_above": 1024
}
}
},
"language": {
"properties": {
"composite": {
"type": "keyword",
"ignore_above": 1024
},
"name": {
"type": "keyword",
"ignore_above": 1024
},
"version": {
"type": "keyword",
"ignore_above": 1024
}
}
},
"runtime": {
"properties": {
"composite": {
"type": "keyword",
"ignore_above": 1024
},
"name": {
"type": "keyword",
"ignore_above": 1024
},
"version": {
"type": "keyword",
"ignore_above": 1024
}
}
}
}
}
}
},
"opentelemetry/ruby": {
"properties": {
"agent": {
"properties": {
"version": {
"type": "keyword",
"ignore_above": 1024
}
}
},
"service": {
"properties": {
"framework": {
"properties": {
"composite": {
"type": "keyword",
"ignore_above": 1024
},
"name": {
"type": "keyword",
"ignore_above": 1024
},
"version": {
"type": "keyword",
"ignore_above": 1024
}
}
},
"language": {
"properties": {
"composite": {
"type": "keyword",
"ignore_above": 1024
},
"name": {
"type": "keyword",
"ignore_above": 1024
},
"version": {
"type": "keyword",
"ignore_above": 1024
}
}
},
"runtime": {
"properties": {
"composite": {
"type": "keyword",
"ignore_above": 1024
},
"name": {
"type": "keyword",
"ignore_above": 1024
},
"version": {
"type": "keyword",
"ignore_above": 1024
}
}
}
}
}
}
},
"opentelemetry/webjs": {
"properties": {
"agent": {
"properties": {
"version": {
"type": "keyword",
"ignore_above": 1024
}
}
},
"service": {
"properties": {
"framework": {
"properties": {
"composite": {
"type": "keyword",
"ignore_above": 1024
},
"name": {
"type": "keyword",
"ignore_above": 1024
},
"version": {
"type": "keyword",
"ignore_above": 1024
}
}
},
"language": {
"properties": {
"composite": {
"type": "keyword",
"ignore_above": 1024
},
"name": {
"type": "keyword",
"ignore_above": 1024
},
"version": {
"type": "keyword",
"ignore_above": 1024
}
}
},
"runtime": {
"properties": {
"composite": {
"type": "keyword",
"ignore_above": 1024
},
"name": {
"type": "keyword",
"ignore_above": 1024
},
"version": {
"type": "keyword",
"ignore_above": 1024
}
}
}
}
}
}
}
}
},
@ -538,7 +1242,7 @@ exports[`APM telemetry helpers getApmTelemetry generates a JSON object with the
"type": "long"
},
"ratio": {
"type": "long"
"type": "float"
}
}
},
@ -551,7 +1255,7 @@ exports[`APM telemetry helpers getApmTelemetry generates a JSON object with the
"type": "long"
},
"ratio": {
"type": "long"
"type": "float"
}
}
},
@ -564,7 +1268,7 @@ exports[`APM telemetry helpers getApmTelemetry generates a JSON object with the
"type": "long"
},
"ratio": {
"type": "long"
"type": "float"
}
}
}
@ -885,6 +1589,50 @@ exports[`APM telemetry helpers getApmTelemetry generates a JSON object with the
"rum-js": {
"type": "long",
"null_value": 0
},
"otlp": {
"type": "long",
"null_value": 0
},
"opentelemetry/cpp": {
"type": "long",
"null_value": 0
},
"opentelemetry/dotnet": {
"type": "long",
"null_value": 0
},
"opentelemetry/erlang": {
"type": "long",
"null_value": 0
},
"opentelemetry/go": {
"type": "long",
"null_value": 0
},
"opentelemetry/java": {
"type": "long",
"null_value": 0
},
"opentelemetry/nodejs": {
"type": "long",
"null_value": 0
},
"opentelemetry/php": {
"type": "long",
"null_value": 0
},
"opentelemetry/python": {
"type": "long",
"null_value": 0
},
"opentelemetry/ruby": {
"type": "long",
"null_value": 0
},
"opentelemetry/webjs": {
"type": "long",
"null_value": 0
}
}
},

View file

@ -14,6 +14,20 @@ import { AgentName } from '../typings/es_schemas/ui/fields/agent';
* AGENT_NAMES array.
*/
export const OPEN_TELEMETRY_AGENT_NAMES: AgentName[] = [
'otlp',
'opentelemetry/cpp',
'opentelemetry/dotnet',
'opentelemetry/erlang',
'opentelemetry/go',
'opentelemetry/java',
'opentelemetry/nodejs',
'opentelemetry/php',
'opentelemetry/python',
'opentelemetry/ruby',
'opentelemetry/webjs',
];
export const AGENT_NAMES: AgentName[] = [
'dotnet',
'go',
@ -23,18 +37,19 @@ export const AGENT_NAMES: AgentName[] = [
'python',
'ruby',
'rum-js',
...OPEN_TELEMETRY_AGENT_NAMES,
];
export function isAgentName(agentName: string): agentName is AgentName {
return AGENT_NAMES.includes(agentName as AgentName);
}
export const RUM_AGENTS = ['js-base', 'rum-js'];
export const RUM_AGENT_NAMES: AgentName[] = [
'js-base',
'rum-js',
'opentelemetry/webjs',
];
export function isRumAgentName(
agentName?: string
): agentName is 'js-base' | 'rum-js' {
return RUM_AGENTS.includes(agentName!);
): agentName is 'js-base' | 'rum-js' | 'opentelemetry/webjs' {
return RUM_AGENT_NAMES.includes(agentName! as AgentName);
}
export function isJavaAgentName(
@ -42,16 +57,3 @@ export function isJavaAgentName(
): agentName is 'java' {
return agentName === 'java';
}
/**
* "Normalizes" and agent name by:
*
* * Converting to lowercase
* * Converting "rum-js" to "js-base"
*
* This helps dealing with some older agent versions
*/
export function getNormalizedAgentName(agentName?: string) {
const lowercased = agentName && agentName.toLowerCase();
return isRumAgentName(lowercased) ? 'js-base' : lowercased;
}

View file

@ -19,6 +19,10 @@ export function getApmTelemetryMapping() {
ignore_above: 1024,
};
const float = {
type: 'float',
};
const long = {
type: 'long',
};
@ -78,7 +82,7 @@ export function getApmTelemetryMapping() {
properties: {
expected_metric_document_count: long,
transaction_count: long,
ratio: long,
ratio: float,
},
};

View file

@ -16,7 +16,7 @@ import { Projection } from '../../../../common/projections';
import { RumDashboard } from './RumDashboard';
import { useUrlParams } from '../../../hooks/useUrlParams';
import { useFetcher } from '../../../hooks/useFetcher';
import { RUM_AGENTS } from '../../../../common/agent_name';
import { RUM_AGENT_NAMES } from '../../../../common/agent_name';
import { EnvironmentFilter } from '../../shared/EnvironmentFilter';
import { URLFilter } from './URLFilter';
import { LocalUIFilters } from '../../shared/LocalUIFilters';
@ -48,7 +48,7 @@ export function RumOverview() {
query: {
start,
end,
uiFilters: JSON.stringify({ agentName: RUM_AGENTS }),
uiFilters: JSON.stringify({ agentName: RUM_AGENT_NAMES }),
},
},
});

View file

@ -0,0 +1,42 @@
/*
* Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
* or more contributor license agreements. Licensed under the Elastic License;
* you may not use this file except in compliance with the Elastic License.
*/
import { getAgentIconKey } from './get_agent_icon';
const examples = {
DotNet: 'dotnet', // Test for case sensitivity
dotnet: 'dotnet',
go: 'go',
java: 'java',
'js-base': 'rum',
nodejs: 'nodejs',
'opentelemetry/cpp': 'opentelemetry',
'opentelemetry/dotnet': 'dotnet',
'opentelemetry/erlang': 'opentelemetry',
'opentelemetry/go': 'go',
'opentelemetry/java': 'java',
'opentelemetry/nodejs': 'nodejs',
'opentelemetry/php': 'php',
'opentelemetry/python': 'python',
'opentelemetry/ruby': 'ruby',
'opentelemetry/webjs': 'rum',
otlp: 'opentelemetry',
php: 'php',
python: 'python',
ruby: 'ruby',
'rum-js': 'rum',
'something else': undefined,
};
describe('getAgentIconKey', () => {
Object.entries(examples).forEach(([key, value]) => {
describe(`with ${key}`, () => {
it(`returns ${value}`, () => {
expect(getAgentIconKey(key)).toEqual(value);
});
});
});
});

View file

@ -4,11 +4,16 @@
* you may not use this file except in compliance with the Elastic License.
*/
import { getNormalizedAgentName } from '../../../../common/agent_name';
import {
OPEN_TELEMETRY_AGENT_NAMES,
RUM_AGENT_NAMES,
} from '../../../../common/agent_name';
import { AgentName } from '../../../../typings/es_schemas/ui/fields/agent';
import dotNetIcon from './icons/dot-net.svg';
import goIcon from './icons/go.svg';
import javaIcon from './icons/java.svg';
import nodeJsIcon from './icons/nodejs.svg';
import openTelemetryIcon from './icons/opentelemetry.svg';
import phpIcon from './icons/php.svg';
import pythonIcon from './icons/python.svg';
import rubyIcon from './icons/ruby.svg';
@ -18,14 +23,42 @@ const agentIcons: { [key: string]: string } = {
dotnet: dotNetIcon,
go: goIcon,
java: javaIcon,
'js-base': rumJsIcon,
nodejs: nodeJsIcon,
opentelemetry: openTelemetryIcon,
php: phpIcon,
python: pythonIcon,
ruby: rubyIcon,
rum: rumJsIcon,
};
export function getAgentIcon(agentName?: string) {
const normalizedAgentName = getNormalizedAgentName(agentName);
return normalizedAgentName && agentIcons[normalizedAgentName];
// This only needs to be exported for testing purposes, since we stub the SVG
// import values in test.
export function getAgentIconKey(agentName: string) {
// Ignore case
const lowercasedAgentName = agentName.toLowerCase();
// RUM agent names
if (RUM_AGENT_NAMES.includes(lowercasedAgentName as AgentName)) {
return 'rum';
}
// Remove "opentelemetry/" prefix
const agentNameWithoutPrefix = lowercasedAgentName.replace(
/^opentelemetry\//,
''
);
if (Object.keys(agentIcons).includes(agentNameWithoutPrefix)) {
return agentNameWithoutPrefix;
}
// OpenTelemetry-only agents
if (OPEN_TELEMETRY_AGENT_NAMES.includes(lowercasedAgentName as AgentName)) {
return 'opentelemetry';
}
}
export function getAgentIcon(agentName?: string) {
const key = agentName && getAgentIconKey(agentName);
return key && agentIcons[key];
}

View file

@ -0,0 +1 @@
<svg width="32" height="32" xmlns="http://www.w3.org/2000/svg" role="img" viewBox="0 0 1024.40 1024.40"><style>svg {enable-background:new 0 0 1000 1000}</style><path fill="#f5a800" d="M528.7 545.9c-42 42-42 110.1 0 152.1s110.1 42 152.1 0 42-110.1 0-152.1-110.1-42-152.1 0zm113.7 113.8c-20.8 20.8-54.5 20.8-75.3 0-20.8-20.8-20.8-54.5 0-75.3 20.8-20.8 54.5-20.8 75.3 0 20.8 20.7 20.8 54.5 0 75.3zm36.6-643l-65.9 65.9c-12.9 12.9-12.9 34.1 0 47l257.3 257.3c12.9 12.9 34.1 12.9 47 0l65.9-65.9c12.9-12.9 12.9-34.1 0-47L725.9 16.7c-12.9-12.9-34-12.9-46.9 0zM217.3 858.8c11.7-11.7 11.7-30.8 0-42.5l-33.5-33.5c-11.7-11.7-30.8-11.7-42.5 0L72.1 852l-.1.1-19-19c-10.5-10.5-27.6-10.5-38 0-10.5 10.5-10.5 27.6 0 38l114 114c10.5 10.5 27.6 10.5 38 0s10.5-27.6 0-38l-19-19 .1-.1 69.2-69.2z"/><path fill="#425cc7" d="M565.9 205.9L419.5 352.3c-13 13-13 34.4 0 47.4l90.4 90.4c63.9-46 153.5-40.3 211 17.2l73.2-73.2c13-13 13-34.4 0-47.4L613.3 205.9c-13-13.1-34.4-13.1-47.4 0zm-94 322.3l-53.4-53.4c-12.5-12.5-33-12.5-45.5 0L184.7 663.2c-12.5 12.5-12.5 33 0 45.5l106.7 106.7c12.5 12.5 33 12.5 45.5 0L458 694.1c-25.6-52.9-21-116.8 13.9-165.9z"/></svg>

After

Width:  |  Height:  |  Size: 1.1 KiB

View file

@ -8,7 +8,7 @@ import { flatten, merge, sortBy, sum, pickBy } from 'lodash';
import { AggregationOptionsByType } from '../../../../typings/elasticsearch/aggregations';
import { ProcessorEvent } from '../../../../common/processor_event';
import { TelemetryTask } from '.';
import { AGENT_NAMES, RUM_AGENTS } from '../../../../common/agent_name';
import { AGENT_NAMES, RUM_AGENT_NAMES } from '../../../../common/agent_name';
import {
AGENT_NAME,
AGENT_VERSION,
@ -1020,7 +1020,7 @@ export const tasks: TelemetryTask[] = [
timeout,
query: {
bool: {
filter: [range1d, { terms: { [AGENT_NAME]: RUM_AGENTS } }],
filter: [range1d, { terms: { [AGENT_NAME]: RUM_AGENT_NAMES } }],
},
},
aggs: {

View file

@ -16,7 +16,18 @@ export type AgentName =
| 'nodejs'
| 'python'
| 'dotnet'
| 'ruby';
| 'ruby'
| 'otlp'
| 'opentelemetry/cpp'
| 'opentelemetry/dotnet'
| 'opentelemetry/erlang'
| 'opentelemetry/go'
| 'opentelemetry/java'
| 'opentelemetry/nodejs'
| 'opentelemetry/php'
| 'opentelemetry/python'
| 'opentelemetry/ruby'
| 'opentelemetry/webjs';
export interface Agent {
ephemeral_id?: string;