import { i18n } from '@kbn/i18n' ; import cytoscape from 'cytoscape' ; import { Coordinate } from '../typings/timeseries' ; import { ServiceAnomalyStats } from './anomaly_detection' ; export interface ServiceConnectionNode extends cytoscape . NodeDataDefinition { 'service.name' : string ; 'service.environment' : string | null ; 'agent.name' : string ; serviceAnomalyStats ? : ServiceAnomalyStats ; label ? : string ; } export interface ExternalConnectionNode extends cytoscape . NodeDataDefinition { 'span.destination.service.resource' : string ; 'span.type' : string ; 'span.subtype' : string ; label ? : string ; } export type ConnectionNode = ServiceConnectionNode | ExternalConnectionNode ; export interface ConnectionEdge { id : string ; source : ConnectionNode [ 'id' ] ; target : ConnectionNode [ 'id' ] ; label ? : string ; bidirectional ? : boolean ; isInverseEdge ? : boolean ; } export interface ConnectionElement { data : ConnectionNode | ConnectionEdge ; } export interface Connection { source : ConnectionNode ; destination : ConnectionNode ; } export interface NodeStats { transactionStats ? : { latency ? : { value : number | null ; timeseries ? : Coordinate [ ] ; } ; throughput ? : { value : number | null ; timeseries ? : Coordinate [ ] ; } ; } ; failedTransactionsRate ? : { value : number | null ; timeseries ? : Coordinate [ ] ; } ; cpuUsage ? : { value ? : number | null ; timeseries ? : Coordinate [ ] ; } ; memoryUsage ? : { value ? : number | null ; timeseries ? : Coordinate [ ] ; } ; } export const invalidLicenseMessage = i18n . translate ( 'xpack.apm.serviceMap.invalidLicenseMessage' , { defaultMessage : "In order to access Service Maps, you must be subscribed to an Elastic Platinum license. With it, you'll have the ability to visualize your entire application stack along with your APM data." , } ) ; const NONGROUPED_SPANS = { aws : [ 'servicename' ] , cache : [ 'all' ] , db : [ 'all' ] , external : [ 'graphql' , 'grpc' , 'websocket' ] , messaging : [ 'all' ] , template : [ 'handlebars' ] , } ; export function isSpanGroupingSupported ( type ? , subtype ? ) { if ( ! type || ! ( type in NONGROUPED_SPANS ) ) { return true ; } return ! NONGROUPED_SPANS [ type ] . some ( ( nongroupedSubType ) => nongroupedSubType === 'all' || nongroupedSubType === subtype ) ; } export const SERVICE_MAP_TIMEOUT_ERROR = 'ServiceMapTimeoutError' ;