{"version":3,"file":"jaegerPlugin.3f61070f7389bacb6ab3.js","mappings":"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","sources":["webpack://grafana/./public/app/core/utils/tracing.ts","webpack://grafana/./public/app/plugins/datasource/jaeger/util.ts","webpack://grafana/./public/app/plugins/datasource/jaeger/components/AdvancedOptions.tsx","webpack://grafana/./public/app/plugins/datasource/jaeger/components/SearchForm.tsx","webpack://grafana/./public/app/plugins/datasource/jaeger/graphTransform.ts","webpack://grafana/./public/app/plugins/datasource/jaeger/datasource.ts","webpack://grafana/./public/app/plugins/datasource/jaeger/module.ts","webpack://grafana/./public/app/plugins/datasource/jaeger/components/ConfigEditor.tsx","webpack://grafana/./public/app/plugins/datasource/jaeger/components/QueryEditor.tsx","webpack://grafana/./public/app/plugins/datasource/jaeger/responseTransform.ts","webpack://grafana/../../opt/drone/yarncache/logfmt-npm-1.3.2-37fabee436-639d327c1e.zip/node_modules/logfmt/lib/body_parser.js","webpack://grafana/../../opt/drone/yarncache/logfmt-npm-1.3.2-37fabee436-639d327c1e.zip/node_modules/logfmt/lib/body_parser_stream.js","webpack://grafana/../../opt/drone/yarncache/logfmt-npm-1.3.2-37fabee436-639d327c1e.zip/node_modules/logfmt/lib/logfmt_parser.js","webpack://grafana/../../opt/drone/yarncache/logfmt-npm-1.3.2-37fabee436-639d327c1e.zip/node_modules/logfmt/lib/logger.js","webpack://grafana/../../opt/drone/yarncache/logfmt-npm-1.3.2-37fabee436-639d327c1e.zip/node_modules/logfmt/lib/request_logger.js","webpack://grafana/../../opt/drone/yarncache/logfmt-npm-1.3.2-37fabee436-639d327c1e.zip/node_modules/logfmt/lib/streaming.js","webpack://grafana/../../opt/drone/yarncache/logfmt-npm-1.3.2-37fabee436-639d327c1e.zip/node_modules/logfmt/lib/stringify.js","webpack://grafana/../../opt/drone/yarncache/logfmt-npm-1.3.2-37fabee436-639d327c1e.zip/node_modules/logfmt/logfmt.js","webpack://grafana/../../opt/drone/yarncache/split-npm-0.2.10-a950dc8c82-9eb1195608.zip/node_modules/split/index.js","webpack://grafana/../../opt/drone/yarncache/through-npm-2.3.8-df5f72a16e-a38c3e0598.zip/node_modules/through/index.js"],"sourcesContent":["/**\n * Get non overlapping duration of the ranges as they can overlap or have gaps.\n */\nimport { FieldType, MutableDataFrame, NodeGraphDataFrameFieldNames as Fields } from '@grafana/data';\n\nexport function getNonOverlappingDuration(ranges: Array<[number, number]>): number {\n ranges.sort((a, b) => a[0] - b[0]);\n const mergedRanges = ranges.reduce((acc, range) => {\n if (!acc.length) {\n return [range];\n }\n const tail = acc.slice(-1)[0];\n const [prevStart, prevEnd] = tail;\n const [start, end] = range;\n if (end < prevEnd) {\n // In this case the range is completely inside the prev range so we can just ignore it.\n return acc;\n }\n\n if (start > prevEnd) {\n // There is no overlap so we can just add it to stack\n return [...acc, range];\n }\n\n // We know there is overlap and current range ends later than previous so we can just extend the range\n return [...acc.slice(0, -1), [prevStart, end]] as Array<[number, number]>;\n }, [] as Array<[number, number]>);\n\n return mergedRanges.reduce((acc, range) => {\n return acc + (range[1] - range[0]);\n }, 0);\n}\n\n/**\n * Returns a map of the spans with children array for easier processing. It will also contain empty spans in case\n * span is missing but other spans are it's children. This is more generic because it needs to allow iterating over\n * both arrays and dataframe views.\n */\nexport function makeSpanMap(getSpan: (index: number) => { span: T; id: string; parentIds: string[] } | undefined): {\n [id: string]: { span: T; children: string[] };\n} {\n const spanMap: { [id: string]: { span?: T; children: string[] } } = {};\n\n let span;\n for (let index = 0; (span = getSpan(index)), !!span; index++) {\n if (!spanMap[span.id]) {\n spanMap[span.id] = {\n span: span.span,\n children: [],\n };\n } else {\n spanMap[span.id].span = span.span;\n }\n\n for (const parentId of span.parentIds) {\n if (parentId) {\n if (!spanMap[parentId]) {\n spanMap[parentId] = {\n span: undefined,\n children: [span.id],\n };\n } else {\n spanMap[parentId].children.push(span.id);\n }\n }\n }\n }\n return spanMap as { [id: string]: { span: T; children: string[] } };\n}\n\nexport function getStats(duration: number, traceDuration: number, selfDuration: number) {\n return {\n main: `${toFixedNoTrailingZeros(duration)}ms (${toFixedNoTrailingZeros((duration / traceDuration) * 100)}%)`,\n secondary: `${toFixedNoTrailingZeros(selfDuration)}ms (${toFixedNoTrailingZeros(\n (selfDuration / duration) * 100\n )}%)`,\n };\n}\n\nfunction toFixedNoTrailingZeros(n: number) {\n return parseFloat(n.toFixed(2));\n}\n\n/**\n * Create default frames used when returning data for node graph.\n */\nexport function makeFrames() {\n const nodesFrame = new MutableDataFrame({\n fields: [\n { name: Fields.id, type: FieldType.string },\n { name: Fields.title, type: FieldType.string },\n { name: Fields.subTitle, type: FieldType.string },\n { name: Fields.mainStat, type: FieldType.string, config: { displayName: 'Total time (% of trace)' } },\n { name: Fields.secondaryStat, type: FieldType.string, config: { displayName: 'Self time (% of total)' } },\n {\n name: Fields.color,\n type: FieldType.number,\n config: { color: { mode: 'continuous-GrYlRd' }, displayName: 'Self time / Trace duration' },\n },\n ],\n meta: {\n preferredVisualisationType: 'nodeGraph',\n },\n });\n\n const edgesFrame = new MutableDataFrame({\n fields: [\n { name: Fields.id, type: FieldType.string },\n { name: Fields.target, type: FieldType.string },\n { name: Fields.source, type: FieldType.string },\n ],\n meta: {\n preferredVisualisationType: 'nodeGraph',\n },\n });\n\n return [nodesFrame, edgesFrame];\n}\n","import logfmt from 'logfmt';\n\nexport function convertTagsLogfmt(tags: string | undefined) {\n if (!tags) {\n return '';\n }\n const data: any = logfmt.parse(tags);\n Object.keys(data).forEach((key) => {\n const value = data[key];\n if (typeof value !== 'string') {\n data[key] = String(value);\n }\n });\n return JSON.stringify(data);\n}\n\nexport function transformToLogfmt(tags: string | undefined) {\n if (!tags) {\n return '';\n }\n try {\n return logfmt.stringify(JSON.parse(tags));\n } catch {\n return tags;\n }\n}\n","import { css } from '@emotion/css';\nimport React, { useState } from 'react';\nimport { CSSTransition } from 'react-transition-group';\n\nimport { GrafanaTheme } from '@grafana/data';\nimport { Icon, InlineField, InlineFieldRow, InlineLabel, Input, useStyles } from '@grafana/ui';\n\nimport { JaegerQuery } from '../types';\n\nconst durationPlaceholder = 'e.g. 1.2s, 100ms, 500us';\n\ntype Props = {\n query: JaegerQuery;\n onChange: (value: JaegerQuery) => void;\n};\n\nexport function AdvancedOptions({ query, onChange }: Props) {\n const [showAdvancedOptions, setShowAdvancedOptions] = useState(false);\n const styles = useStyles(getStyles);\n\n return (\n
\n \n
setShowAdvancedOptions(!showAdvancedOptions)}>\n \n Advanced options{' '}\n \n \n
\n
\n \n
\n \n \n \n onChange({\n ...query,\n minDuration: v.currentTarget.value,\n })\n }\n />\n \n \n \n \n \n onChange({\n ...query,\n maxDuration: v.currentTarget.value,\n })\n }\n />\n \n \n \n \n \n onChange({\n ...query,\n limit: v.currentTarget.value ? parseInt(v.currentTarget.value, 10) : undefined,\n })\n }\n />\n \n \n
\n \n
\n );\n}\n\nfunction getStyles(theme: GrafanaTheme) {\n return {\n advancedOptionsContainer: css`\n margin: 0 ${theme.spacing.xs} ${theme.spacing.xs} 0;\n width: 100%;\n cursor: pointer;\n `,\n enter: css`\n label: enter;\n height: 0;\n opacity: 0;\n `,\n enterActive: css`\n label: enterActive;\n height: 108px;\n opacity: 1;\n transition: height 300ms ease, opacity 300ms ease;\n `,\n exit: css`\n label: exit;\n height: 108px;\n opacity: 1;\n `,\n exitActive: css`\n label: exitActive;\n height: 0;\n opacity: 0;\n transition: height 300ms ease, opacity 300ms ease;\n `,\n angleUp: css`\n transform: rotate(-180deg);\n transition: transform 300ms;\n `,\n angleDown: css`\n transform: rotate(0deg);\n transition: transform 300ms;\n `,\n };\n}\n","import { css } from '@emotion/css';\nimport React, { useCallback, useEffect, useState } from 'react';\n\nimport { SelectableValue } from '@grafana/data';\nimport { fuzzyMatch, InlineField, InlineFieldRow, Input, Select } from '@grafana/ui';\nimport { notifyApp } from 'app/core/actions';\nimport { createErrorNotification } from 'app/core/copy/appNotification';\nimport { dispatch } from 'app/store/store';\n\nimport { JaegerDatasource } from '../datasource';\nimport { JaegerQuery } from '../types';\nimport { transformToLogfmt } from '../util';\n\nimport { AdvancedOptions } from './AdvancedOptions';\n\ntype Props = {\n datasource: JaegerDatasource;\n query: JaegerQuery;\n onChange: (value: JaegerQuery) => void;\n};\n\nexport const ALL_OPERATIONS_KEY = 'All';\nconst allOperationsOption: SelectableValue = {\n label: ALL_OPERATIONS_KEY,\n value: undefined,\n};\n\nexport function SearchForm({ datasource, query, onChange }: Props) {\n const [serviceOptions, setServiceOptions] = useState>>();\n const [operationOptions, setOperationOptions] = useState>>();\n const [isLoading, setIsLoading] = useState<{\n services: boolean;\n operations: boolean;\n }>({\n services: false,\n operations: false,\n });\n\n const loadOptions = useCallback(\n async (url: string, loaderOfType: string, query = ''): Promise>> => {\n setIsLoading((prevValue) => ({ ...prevValue, [loaderOfType]: true }));\n\n try {\n const values: string[] | null = await datasource.metadataRequest(url);\n if (!values) {\n return [{ label: `No ${loaderOfType} found`, value: `No ${loaderOfType} found` }];\n }\n\n const options: SelectableValue[] = values.sort().map((option) => ({\n label: option,\n value: option,\n }));\n\n const filteredOptions = options.filter((item) => (item.value ? fuzzyMatch(item.value, query).found : false));\n return filteredOptions;\n } catch (error) {\n dispatch(notifyApp(createErrorNotification('Error', error)));\n return [];\n } finally {\n setIsLoading((prevValue) => ({ ...prevValue, [loaderOfType]: false }));\n }\n },\n [datasource]\n );\n\n useEffect(() => {\n const getServices = async () => {\n const services = await loadOptions('/api/services', 'services');\n setServiceOptions(services);\n };\n getServices();\n }, [datasource, loadOptions]);\n\n useEffect(() => {\n const getOperations = async () => {\n const operations = await loadOptions(\n `/api/services/${encodeURIComponent(query.service!)}/operations`,\n 'operations'\n );\n setOperationOptions([allOperationsOption, ...operations]);\n };\n if (query.service) {\n getOperations();\n }\n }, [datasource, query.service, loadOptions]);\n\n return (\n
\n \n \n loadOptions('/api/services', 'services')}\n isLoading={isLoading.services}\n value={serviceOptions?.find((v) => v?.value === query.service) || undefined}\n onChange={(v) =>\n onChange({\n ...query,\n service: v?.value!,\n operation: query.service !== v?.value ? undefined : query.operation,\n })\n }\n menuPlacement=\"bottom\"\n isClearable\n aria-label={'select-service-name'}\n />\n \n \n \n \n \n loadOptions(`/api/services/${encodeURIComponent(query.service!)}/operations`, 'operations')\n }\n isLoading={isLoading.operations}\n value={operationOptions?.find((v) => v.value === query.operation) || null}\n onChange={(v) =>\n onChange({\n ...query,\n operation: v?.value! || undefined,\n })\n }\n menuPlacement=\"bottom\"\n isClearable\n aria-label={'select-operation-name'}\n />\n \n \n \n \n \n onChange({\n ...query,\n tags: v.currentTarget.value,\n })\n }\n />\n \n \n \n
\n );\n}\n\nexport default SearchForm;\n","import { DataFrame, NodeGraphDataFrameFieldNames as Fields } from '@grafana/data';\n\nimport { getNonOverlappingDuration, getStats, makeFrames, makeSpanMap } from '../../../core/utils/tracing';\n\nimport { Span, TraceResponse } from './types';\n\ninterface Node {\n [Fields.id]: string;\n [Fields.title]: string;\n [Fields.subTitle]: string;\n [Fields.mainStat]: string;\n [Fields.secondaryStat]: string;\n [Fields.color]: number;\n}\n\ninterface Edge {\n [Fields.id]: string;\n [Fields.target]: string;\n [Fields.source]: string;\n}\n\nexport function createGraphFrames(data: TraceResponse): DataFrame[] {\n const { nodes, edges } = convertTraceToGraph(data);\n const [nodesFrame, edgesFrame] = makeFrames();\n\n for (const node of nodes) {\n nodesFrame.add(node);\n }\n\n for (const edge of edges) {\n edgesFrame.add(edge);\n }\n\n return [nodesFrame, edgesFrame];\n}\n\nfunction convertTraceToGraph(data: TraceResponse): { nodes: Node[]; edges: Edge[] } {\n const nodes: Node[] = [];\n const edges: Edge[] = [];\n\n const traceDuration = findTraceDuration(data.spans);\n\n const spanMap = makeSpanMap((index) => {\n if (index >= data.spans.length) {\n return undefined;\n }\n const span = data.spans[index];\n return {\n span,\n id: span.spanID,\n parentIds: span.references?.filter((r) => r.refType === 'CHILD_OF').map((r) => r.spanID) || [],\n };\n });\n\n for (const span of data.spans) {\n const process = data.processes[span.processID];\n\n const ranges: Array<[number, number]> = spanMap[span.spanID].children.map((c) => {\n const span = spanMap[c].span;\n return [span.startTime, span.startTime + span.duration];\n });\n const childrenDuration = getNonOverlappingDuration(ranges);\n const selfDuration = span.duration - childrenDuration;\n const stats = getStats(span.duration / 1000, traceDuration / 1000, selfDuration / 1000);\n\n nodes.push({\n [Fields.id]: span.spanID,\n [Fields.title]: process?.serviceName ?? '',\n [Fields.subTitle]: span.operationName,\n [Fields.mainStat]: stats.main,\n [Fields.secondaryStat]: stats.secondary,\n [Fields.color]: selfDuration / traceDuration,\n });\n\n const parentSpanID = span.references?.find((r) => r.refType === 'CHILD_OF')?.spanID;\n // Sometimes some span can be missing. Don't add edges for those.\n if (parentSpanID && spanMap[parentSpanID].span) {\n edges.push({\n [Fields.id]: parentSpanID + '--' + span.spanID,\n [Fields.target]: span.spanID,\n [Fields.source]: parentSpanID,\n });\n }\n }\n\n return { nodes, edges };\n}\n\n/**\n * Get the duration of the whole trace as it isn't a part of the response data.\n * Note: Seems like this should be the same as just longest span, but this is probably safer.\n */\nfunction findTraceDuration(spans: Span[]): number {\n let traceEndTime = 0;\n let traceStartTime = Infinity;\n\n for (const span of spans) {\n if (span.startTime < traceStartTime) {\n traceStartTime = span.startTime;\n }\n\n if (span.startTime + span.duration > traceEndTime) {\n traceEndTime = span.startTime + span.duration;\n }\n }\n\n return traceEndTime - traceStartTime;\n}\n","import { identity, omit, pick, pickBy } from 'lodash';\nimport { lastValueFrom, Observable, of } from 'rxjs';\nimport { catchError, map } from 'rxjs/operators';\n\nimport {\n DataQueryRequest,\n DataQueryResponse,\n DataSourceApi,\n DataSourceInstanceSettings,\n DataSourceJsonData,\n dateMath,\n DateTime,\n FieldType,\n MutableDataFrame,\n} from '@grafana/data';\nimport { BackendSrvRequest, getBackendSrv, getTemplateSrv } from '@grafana/runtime';\nimport { NodeGraphOptions } from 'app/core/components/NodeGraphSettings';\nimport { serializeParams } from 'app/core/utils/fetch';\nimport { getTimeSrv, TimeSrv } from 'app/features/dashboard/services/TimeSrv';\n\nimport { ALL_OPERATIONS_KEY } from './components/SearchForm';\nimport { createGraphFrames } from './graphTransform';\nimport { createTableFrame, createTraceFrame } from './responseTransform';\nimport { JaegerQuery } from './types';\nimport { convertTagsLogfmt } from './util';\n\nexport interface JaegerJsonData extends DataSourceJsonData {\n nodeGraph?: NodeGraphOptions;\n}\n\nexport class JaegerDatasource extends DataSourceApi {\n uploadedJson: string | ArrayBuffer | null = null;\n nodeGraph?: NodeGraphOptions;\n constructor(\n private instanceSettings: DataSourceInstanceSettings,\n private readonly timeSrv: TimeSrv = getTimeSrv()\n ) {\n super(instanceSettings);\n this.nodeGraph = instanceSettings.jsonData.nodeGraph;\n }\n\n async metadataRequest(url: string, params?: Record): Promise {\n const res = await lastValueFrom(this._request(url, params, { hideFromInspector: true }));\n return res.data.data;\n }\n\n query(options: DataQueryRequest): Observable {\n // At this moment we expect only one target. In case we somehow change the UI to be able to show multiple\n // traces at one we need to change this.\n const target: JaegerQuery = options.targets[0];\n if (!target) {\n return of({ data: [emptyTraceDataFrame] });\n }\n\n if (target.queryType !== 'search' && target.query) {\n return this._request(\n `/api/traces/${encodeURIComponent(getTemplateSrv().replace(target.query, options.scopedVars))}`\n ).pipe(\n map((response) => {\n const traceData = response?.data?.data?.[0];\n if (!traceData) {\n return { data: [emptyTraceDataFrame] };\n }\n let data = [createTraceFrame(traceData)];\n if (this.nodeGraph?.enabled) {\n data.push(...createGraphFrames(traceData));\n }\n return {\n data,\n };\n })\n );\n }\n\n if (target.queryType === 'upload') {\n if (!this.uploadedJson) {\n return of({ data: [] });\n }\n\n try {\n const traceData = JSON.parse(this.uploadedJson as string).data[0];\n let data = [createTraceFrame(traceData)];\n if (this.nodeGraph?.enabled) {\n data.push(...createGraphFrames(traceData));\n }\n return of({ data });\n } catch (error) {\n return of({ error: { message: 'JSON is not valid Jaeger format' }, data: [] });\n }\n }\n\n let jaegerQuery = pick(target, ['operation', 'service', 'tags', 'minDuration', 'maxDuration', 'limit']);\n // remove empty properties\n jaegerQuery = pickBy(jaegerQuery, identity);\n if (jaegerQuery.tags) {\n jaegerQuery = {\n ...jaegerQuery,\n tags: convertTagsLogfmt(getTemplateSrv().replace(jaegerQuery.tags, options.scopedVars)),\n };\n }\n\n if (jaegerQuery.operation === ALL_OPERATIONS_KEY) {\n jaegerQuery = omit(jaegerQuery, 'operation');\n }\n\n // TODO: this api is internal, used in jaeger ui. Officially they have gRPC api that should be used.\n return this._request(`/api/traces`, {\n ...jaegerQuery,\n ...this.getTimeRange(),\n lookback: 'custom',\n }).pipe(\n map((response) => {\n return {\n data: [createTableFrame(response.data.data, this.instanceSettings)],\n };\n })\n );\n }\n\n async testDatasource(): Promise {\n return lastValueFrom(\n this._request('/api/services').pipe(\n map((res) => {\n const values: any[] = res?.data?.data || [];\n const testResult =\n values.length > 0\n ? { status: 'success', message: 'Data source connected and services found.' }\n : {\n status: 'error',\n message:\n 'Data source connected, but no services received. Verify that Jaeger is configured properly.',\n };\n return testResult;\n }),\n catchError((err: any) => {\n let message = 'Jaeger: ';\n if (err.statusText) {\n message += err.statusText;\n } else {\n message += 'Cannot connect to Jaeger';\n }\n\n if (err.status) {\n message += `. ${err.status}`;\n }\n\n if (err.data && err.data.message) {\n message += `. ${err.data.message}`;\n } else if (err.data) {\n message += `. ${JSON.stringify(err.data)}`;\n }\n return of({ status: 'error', message: message });\n })\n )\n );\n }\n\n getTimeRange(): { start: number; end: number } {\n const range = this.timeSrv.timeRange();\n return {\n start: getTime(range.from, false),\n end: getTime(range.to, true),\n };\n }\n\n getQueryDisplayText(query: JaegerQuery) {\n return query.query || '';\n }\n\n private _request(apiUrl: string, data?: any, options?: Partial): Observable> {\n const params = data ? serializeParams(data) : '';\n const url = `${this.instanceSettings.url}${apiUrl}${params.length ? `?${params}` : ''}`;\n const req = {\n ...options,\n url,\n };\n\n return getBackendSrv().fetch(req);\n }\n}\n\nfunction getTime(date: string | DateTime, roundUp: boolean) {\n if (typeof date === 'string') {\n date = dateMath.parse(date, roundUp)!;\n }\n return date.valueOf() * 1000;\n}\n\nconst emptyTraceDataFrame = new MutableDataFrame({\n fields: [\n {\n name: 'trace',\n type: FieldType.trace,\n values: [],\n },\n ],\n meta: {\n preferredVisualisationType: 'trace',\n custom: {\n traceFormat: 'jaeger',\n },\n },\n});\n","import { DataSourcePlugin } from '@grafana/data';\n\nimport { ConfigEditor } from './components/ConfigEditor';\nimport { QueryEditor } from './components/QueryEditor';\nimport { JaegerDatasource } from './datasource';\n\nexport const plugin = new DataSourcePlugin(JaegerDatasource).setConfigEditor(ConfigEditor).setQueryEditor(QueryEditor);\n","import React from 'react';\n\nimport { DataSourcePluginOptionsEditorProps } from '@grafana/data';\nimport { config } from '@grafana/runtime';\nimport { DataSourceHttpSettings } from '@grafana/ui';\nimport { NodeGraphSettings } from 'app/core/components/NodeGraphSettings';\nimport { TraceToLogsSettings } from 'app/core/components/TraceToLogs/TraceToLogsSettings';\nimport { TraceToMetricsSettings } from 'app/core/components/TraceToMetrics/TraceToMetricsSettings';\n\nexport type Props = DataSourcePluginOptionsEditorProps;\n\nexport const ConfigEditor: React.FC = ({ options, onOptionsChange }) => {\n return (\n <>\n \n\n
\n \n
\n\n {config.featureToggles.traceToMetrics ? (\n
\n \n
\n ) : null}\n\n
\n \n
\n \n );\n};\n","import { css } from '@emotion/css';\nimport React from 'react';\n\nimport { QueryEditorProps } from '@grafana/data';\nimport { FileDropzone, InlineField, InlineFieldRow, QueryField, RadioButtonGroup, useTheme2 } from '@grafana/ui';\n\nimport { JaegerDatasource } from '../datasource';\nimport { JaegerQuery, JaegerQueryType } from '../types';\n\nimport { SearchForm } from './SearchForm';\n\ntype Props = QueryEditorProps;\n\nexport function QueryEditor({ datasource, query, onChange, onRunQuery }: Props) {\n const theme = useTheme2();\n\n const onChangeQuery = (value: string) => {\n const nextQuery: JaegerQuery = { ...query, query: value };\n onChange(nextQuery);\n };\n\n const renderEditorBody = () => {\n switch (query.queryType) {\n case 'search':\n return ;\n case 'upload':\n return (\n
\n {\n datasource.uploadedJson = result;\n onRunQuery();\n }}\n />\n
\n );\n default:\n return (\n \n \n {}}\n placeholder={'Enter a Trace ID (run with Shift+Enter)'}\n portalOrigin=\"jaeger\"\n />\n \n \n );\n }\n };\n\n return (\n <>\n
\n \n \n \n options={[\n { value: 'search', label: 'Search' },\n { value: undefined, label: 'TraceID' },\n { value: 'upload', label: 'JSON file' },\n ]}\n value={query.queryType}\n onChange={(v) =>\n onChange({\n ...query,\n queryType: v,\n })\n }\n size=\"md\"\n />\n \n \n {renderEditorBody()}\n
\n \n );\n}\n","import {\n DataFrame,\n DataSourceInstanceSettings,\n FieldType,\n MutableDataFrame,\n TraceLog,\n TraceSpanRow,\n} from '@grafana/data';\nimport { transformTraceData } from '@jaegertracing/jaeger-ui-components';\n\nimport { JaegerResponse, Span, TraceProcess, TraceResponse } from './types';\n\nexport function createTraceFrame(data: TraceResponse): DataFrame {\n const spans = data.spans.map((s) => toSpanRow(s, data.processes));\n\n const frame = new MutableDataFrame({\n fields: [\n { name: 'traceID', type: FieldType.string },\n { name: 'spanID', type: FieldType.string },\n { name: 'parentSpanID', type: FieldType.string },\n { name: 'operationName', type: FieldType.string },\n { name: 'serviceName', type: FieldType.string },\n { name: 'serviceTags', type: FieldType.other },\n { name: 'startTime', type: FieldType.number },\n { name: 'duration', type: FieldType.number },\n { name: 'logs', type: FieldType.other },\n { name: 'tags', type: FieldType.other },\n { name: 'warnings', type: FieldType.other },\n { name: 'stackTraces', type: FieldType.other },\n ],\n meta: {\n preferredVisualisationType: 'trace',\n custom: {\n traceFormat: 'jaeger',\n },\n },\n });\n\n for (const span of spans) {\n frame.add(span);\n }\n\n return frame;\n}\n\nfunction toSpanRow(span: Span, processes: Record): TraceSpanRow {\n return {\n spanID: span.spanID,\n traceID: span.traceID,\n parentSpanID: span.references?.find((r) => r.refType === 'CHILD_OF')?.spanID,\n operationName: span.operationName,\n // from micro to millis\n startTime: span.startTime / 1000,\n duration: span.duration / 1000,\n logs: span.logs.map((l) => ({\n ...l,\n timestamp: l.timestamp / 1000,\n })),\n tags: span.tags,\n warnings: span.warnings ?? undefined,\n stackTraces: span.stackTraces,\n serviceName: processes[span.processID].serviceName,\n serviceTags: processes[span.processID].tags,\n };\n}\n\nexport function createTableFrame(data: TraceResponse[], instanceSettings: DataSourceInstanceSettings): DataFrame {\n const frame = new MutableDataFrame({\n fields: [\n {\n name: 'traceID',\n type: FieldType.string,\n config: {\n unit: 'string',\n displayNameFromDS: 'Trace ID',\n links: [\n {\n title: 'Trace: ${__value.raw}',\n url: '',\n internal: {\n datasourceUid: instanceSettings.uid,\n datasourceName: instanceSettings.name,\n query: {\n query: '${__value.raw}',\n },\n },\n },\n ],\n },\n },\n { name: 'traceName', type: FieldType.string, config: { displayNameFromDS: 'Trace name' } },\n { name: 'startTime', type: FieldType.time, config: { displayNameFromDS: 'Start time' } },\n { name: 'duration', type: FieldType.number, config: { displayNameFromDS: 'Duration', unit: 'µs' } },\n ],\n meta: {\n preferredVisualisationType: 'table',\n },\n });\n // Show the most recent traces\n const traceData = data.map(transformToTraceData).sort((a, b) => b?.startTime! - a?.startTime!);\n\n for (const trace of traceData) {\n frame.add(trace);\n }\n\n return frame;\n}\n\nfunction transformToTraceData(data: TraceResponse) {\n const traceData = transformTraceData(data);\n if (!traceData) {\n return;\n }\n\n return {\n traceID: traceData.traceID,\n startTime: traceData.startTime / 1000,\n duration: traceData.duration,\n traceName: traceData.traceName,\n };\n}\n\nexport function transformToJaeger(data: MutableDataFrame): JaegerResponse {\n let traceResponse: TraceResponse = {\n traceID: '',\n spans: [],\n processes: {},\n warnings: null,\n };\n let processes: string[] = [];\n\n for (let i = 0; i < data.length; i++) {\n const span = data.get(i);\n\n // Set traceID\n if (!traceResponse.traceID) {\n traceResponse.traceID = span.traceID;\n }\n\n // Create process if doesn't exist\n if (!processes.find((p) => p === span.serviceName)) {\n processes.push(span.serviceName);\n traceResponse.processes[`p${processes.length}`] = {\n serviceName: span.serviceName,\n tags: span.serviceTags,\n };\n }\n\n // Create span\n traceResponse.spans.push({\n traceID: span.traceID,\n spanID: span.spanID,\n duration: span.duration * 1000,\n references: span.parentSpanID\n ? [\n {\n refType: 'CHILD_OF',\n spanID: span.parentSpanID,\n traceID: span.traceID,\n },\n ]\n : [],\n flags: 0,\n logs: span.logs.map((l: TraceLog) => ({\n ...l,\n timestamp: l.timestamp * 1000,\n })),\n operationName: span.operationName,\n processID:\n Object.keys(traceResponse.processes).find(\n (key) => traceResponse.processes[key].serviceName === span.serviceName\n ) || '',\n startTime: span.startTime * 1000,\n tags: span.tags,\n warnings: span.warnings ? span.warnings : null,\n });\n }\n\n return { data: [traceResponse], total: 0, limit: 0, offset: 0, errors: null };\n}\n","\n/*\nModule dependencies.\n*/\n\n/*\nJSON:\n\nParse logplex request bodies, providing the\nparsed object as `req.body`.\n\nOptions: none\n\n@param content_type {String} use when Content-Type matches this string\n@param parser {Function} parsing function takes String body and returns new body\n@return {Function}\n@api public\n*/\n\nexports = module.exports = function(options) {\n var limit;\n if (options == null) options = {};\n\n return function(req, res, next) {\n if (req._body) return next();\n var is_mime = req.header('content-type') === options.contentType;\n if (!is_mime) return next();\n req._body = true;\n req.body = req.body || {};\n var buf;\n buf = \"\";\n req.setEncoding(\"utf8\");\n req.on(\"data\", function(chunk) {\n return buf += chunk;\n });\n req.on(\"end\", function() {\n try {\n var lines = []\n buf.trim().split(\"\\n\").forEach(function(line){\n lines.push(options.parser(line))\n })\n req.body = lines;\n } catch (err) {\n err.body = buf;\n err.status = 400;\n return next(err);\n }\n return next();\n });\n };\n};\n","var split = require('split');\nvar through = require('through');\nvar Readable = require('stream').Readable;\nvar PassThrough = require('stream').PassThrough;\nvar logfmt = require('../logfmt');\n\nexports = module.exports = function(options){\n if(options == null) options = {};\n var mime = options.contentType || \"application/logplex-1\";\n\n return function(req, res, next) {\n\n //honor already parsed bodies\n if (req._body) return next();\n\n //mime-type check\n var is_mime = req.header('content-type') === mime;\n if (!is_mime) return next();\n req._body = true;\n req.body = new PassThrough({objectMode: true});\n req.pipe(logfmt.streamParser()).pipe(req.body);\n\n return next();\n }\n}\n\n","exports.debug = false;\n\nexports.parse = function(line) {\n var key = '';\n var value = '';\n var is_number = true;\n var in_key = false;\n var in_value = false;\n var in_quote = false;\n var had_quote = false;\n var object = {};\n var debug = exports.debug;\n\n if(line[line.length - 1] == '\\n'){\n line = line.slice(0,line.length - 1)\n }\n\n for(var i=0; i <= line.length; i++){\n\n if((line[i] == ' ' && !in_quote) || i == line.length){\n if(in_key && key.length > 0){\n object[key] = true;\n }else if(in_value){\n if(value == 'true') value = true;\n else if(value == 'false') value = false;\n else if(value === '' && !had_quote) value = null;\n object[key] = value;\n value = '';\n }\n\n if(i == line.length) break;\n else {\n in_key = false;\n in_value = false;\n in_quote = false;\n had_quote = false;\n }\n }\n\n if(line[i] == '=' && !in_quote){\n if(debug) console.log('split')\n //split\n in_key = false;\n in_value = true;\n }\n else if(line[i] == '\\\\'){\n i ++ ;\n value += line[i];\n if(debug) console.log('escape: ' + line[i])\n }\n else if(line[i] == '\"'){\n had_quote = true;\n in_quote = !in_quote;\n if(debug) console.log('in quote: ' + in_quote)\n }\n else if(line[i] != ' ' && !in_value && !in_key){\n if(debug) console.log('start key with: ' + line[i])\n in_key = true;\n key = line[i];\n }\n else if(in_key){\n if(debug) console.log('add to key: ' + line[i])\n key += line[i]\n }\n else if(in_value){\n if(debug) console.log('add to value: ' + line[i])\n value += line[i];\n }\n }\n\n return object;\n}\n","exports.log = function(data, stream) {\n this.stream = this.stream || process.stdout;\n if(stream == undefined) stream = this.stream;\n\n var logData = Object.assign({}, this.defaultData, data);\n\n if(this.timers){\n for(var key in this.timers){\n var now = (new Date()).getTime()\n logData[key] = (now - this.timers[key]).toString() + 'ms' ;\n }\n }\n\n stream.write(this.stringify(logData) + \"\\n\");\n}\n\nexports.time = function(label) {\n var logfmt = require('../logfmt');\n var startTime = (new Date()).getTime();\n var label = label || 'elapsed';\n var timer = new logfmt();\n timer.stream = this.stream;\n timer.defaultData = this.defaultData;\n timer.timers = Object.assign({}, this.timers)\n timer.timers[label] = startTime;\n return timer;\n}\n\nexports.namespace = function(object) {\n var logfmt = require('../logfmt');\n var namespaced = new logfmt()\n var namespace = Object.assign({}, this.defaultData, object);\n namespaced.stream = this.stream;\n namespaced.defaultData = namespace\n namespaced.timers = this.timers;\n return namespaced;\n}\n\nexports.error = function(err, id) {\n this.maxErrorLines = this.maxErrorLines || 10;\n if (id === undefined) {\n id = Math.random().toString().slice(2, 12);\n }\n var errorLogger = this.namespace({\n error: true,\n id:id,\n now: (new Date()).toISOString()\n })\n errorLogger.log({ message:err.message });\n if (err.stack) {\n var stack = err.stack.split('\\n');\n for (var line in stack) {\n if (line >= this.maxErrorLines) break;\n errorLogger.log({ line:line, trace:stack[line] });\n }\n }\n}\n","var commonFormatter = function(req, res){\n if((typeof req.path) == 'function'){\n //in restify path is a function\n var path = req.path();\n }\n else{\n //in express it is an attribute\n var path = req.originalUrl || req.path || req.url;\n }\n\n var httpHeader = req.header && req.header('x-forwarded-for')\n var requestID = req.header && req.header('x-request-id')\n\n var ip = req.ip || httpHeader\n || req.connection.remoteAddress;\n\n var requestData = {\n ip: ip,\n time: (new Date()).toISOString(),\n method: req.method,\n path: path,\n \"status\": res.statusCode,\n }\n\n if (requestID) {\n requestData.request_id = requestID;\n }\n\n if(res.get){\n requestData.content_length = res.get('content-length');\n requestData.content_type = res.get('content-type');\n }\n return requestData;\n}\n\nvar immediateLogger = function(logger, options, formatter){\n return function(req, res, next){\n var data = formatter(req, res);\n logger.log(data);\n next();\n }\n}\n\nvar timingLogger = function(logger, options, formatter){\n return function(req, res, next){\n var elapsed = options.elapsed || 'elapsed';\n var timer = logger.time(elapsed);\n var end = res.end;\n res.end = function(chunk, encoding) {\n var data = formatter(req, res);\n res.end = end;\n res.end(chunk, encoding);\n timer.log(data);\n };\n next();\n }\n}\n\nexports.init = function(logger, options, formatter) {\n this.logger = logger;\n\n if(!formatter && !options){\n formatter = commonFormatter;\n options = {};\n }\n else if(!formatter){\n if(typeof options == 'function'){\n formatter = options;\n options = {};\n }else{\n formatter = commonFormatter;\n }\n }\n options = options || {};\n\n if(options.immediate){\n return immediateLogger(logger, options, formatter);\n }else{\n return timingLogger(logger, options, formatter);\n }\n}\n\nexports.commonFormatter = commonFormatter;\n","var split = require('split')\nvar through = require('through');\nvar PassThrough = require('stream').PassThrough;\n\n//returns a stream that splits and parses logfmt into objects\nexports.streamParser = function(options){\n var options = options || {};\n\n var streamParser = new PassThrough();\n var self = this;\n\n var logfmtStream = through(function(line){\n if(line !== '') this.queue(self.parse(line))\n })\n\n // When a source stream is piped to us, undo that pipe, and save\n // off the source stream piped into our internally managed streams.\n streamParser.on('pipe', function(source) {\n if(source.unpipe) source.unpipe(this);\n this.transformStream = source.pipe(split()).pipe(logfmtStream);\n });\n\n // When we're piped to another stream, instead pipe our internal\n // transform stream to that destination.\n streamParser.pipe = function(destination, options) {\n return this.transformStream.pipe(destination, options);\n };\n\n return streamParser;\n}\n\n// returns a stream that stringifies objects\nexports.streamStringify = function(options){\n var self = this;\n var options = options || {};\n if(options.hasOwnProperty('delimiter')){\n var delim = options.delimiter;\n }else{\n var delim = \"\\n\";\n }\n\n return through(function(data){\n this.queue(self.stringify(data) + delim)\n }, function(){\n this.queue(null)\n })\n}\n","exports.stringify = function(data){\n var line = '';\n\n for(var key in data) {\n var value = data[key];\n var is_null = false;\n if(value == null) {\n is_null = true;\n value = '';\n }\n else value = value.toString();\n\n var needs_quoting = value.indexOf(' ') > -1 || value.indexOf('=') > -1;\n var needs_escaping = value.indexOf('\"') > -1 || value.indexOf(\"\\\\\") > -1;\n\n if(needs_escaping) value = value.replace(/[\"\\\\]/g, '\\\\$&');\n if(needs_quoting) value = '\"' + value + '\"';\n if(value === '' && !is_null) value = '\"\"';\n\n line += key + '=' + value + ' ';\n }\n\n //trim traling space\n return line.substring(0,line.length-1);\n}\n\n","//constructor\nfunction logfmt() {\n}\nmodule.exports = logfmt;\n\nvar streaming = require('./lib/streaming');\nvar bodyParser = require('./lib/body_parser');\nvar bodyParserStream = require('./lib/body_parser_stream');\nvar logfmtParser = require('./lib/logfmt_parser');\nvar logger = require('./lib/logger');\nvar requestLogger = require('./lib/request_logger');\nvar serializer = require('./lib/stringify');\n\n//Build up logfmt prototype\nObject.assign(logfmt.prototype, logger);\nObject.assign(logfmt.prototype, streaming);\n\nlogfmt.prototype.stringify = serializer.stringify;\nlogfmt.prototype.parse = logfmtParser.parse;\n\n// Synchronous body parser\nlogfmt.prototype.bodyParser = function(options) {\n options || (options = {});\n var mime = options.contentType || \"application/logplex-1\";\n return bodyParser({ contentType: mime, parser: this.parse });\n};\n\n// Stream parser\nlogfmt.prototype.bodyParserStream = function(options) {\n options || (options = {});\n var mime = options.contentType || \"application/logplex-1\";\n return bodyParserStream({ contentType: mime });\n};\n\nlogfmt.prototype.requestLogger = function(options, formatter) {\n return requestLogger.init(this, options, formatter);\n};\n\nlogfmt.prototype.requestLogger.commonFormatter = requestLogger.commonFormatter;\n\nObject.assign(logfmt, logfmt.prototype);\n","//filter will reemit the data if cb(err,pass) pass is truthy\n\n// reduce is more tricky\n// maybe we want to group the reductions or emit progress updates occasionally\n// the most basic reduce just emits one 'data' event after it has recieved 'end'\n\n\nvar through = require('through')\nvar Decoder = require('string_decoder').StringDecoder\n\nmodule.exports = split\n\n//TODO pass in a function to map across the lines.\n\nfunction split (matcher, mapper) {\n var decoder = new Decoder()\n var soFar = ''\n if('function' === typeof matcher)\n mapper = matcher, matcher = null\n if (!matcher)\n matcher = /\\r?\\n/\n\n function emit(stream, piece) {\n if(mapper) {\n try {\n piece = mapper(piece)\n }\n catch (err) {\n return stream.emit('error', err)\n }\n if('undefined' !== typeof piece)\n stream.queue(piece)\n }\n else\n stream.queue(piece)\n }\n\n function next (stream, buffer) { \n var pieces = (soFar + buffer).split(matcher)\n soFar = pieces.pop()\n\n for (var i = 0; i < pieces.length; i++) {\n var piece = pieces[i]\n emit(stream, piece)\n }\n }\n\n return through(function (b) {\n next(this, decoder.write(b))\n },\n function () {\n if(decoder.end) \n next(this, decoder.end())\n if(soFar != null)\n emit(this, soFar)\n this.queue(null)\n })\n}\n\n","var Stream = require('stream')\n\n// through\n//\n// a stream that does nothing but re-emit the input.\n// useful for aggregating a series of changing but not ending streams into one stream)\n\nexports = module.exports = through\nthrough.through = through\n\n//create a readable writable stream.\n\nfunction through (write, end, opts) {\n write = write || function (data) { this.queue(data) }\n end = end || function () { this.queue(null) }\n\n var ended = false, destroyed = false, buffer = [], _ended = false\n var stream = new Stream()\n stream.readable = stream.writable = true\n stream.paused = false\n\n// stream.autoPause = !(opts && opts.autoPause === false)\n stream.autoDestroy = !(opts && opts.autoDestroy === false)\n\n stream.write = function (data) {\n write.call(this, data)\n return !stream.paused\n }\n\n function drain() {\n while(buffer.length && !stream.paused) {\n var data = buffer.shift()\n if(null === data)\n return stream.emit('end')\n else\n stream.emit('data', data)\n }\n }\n\n stream.queue = stream.push = function (data) {\n// console.error(ended)\n if(_ended) return stream\n if(data === null) _ended = true\n buffer.push(data)\n drain()\n return stream\n }\n\n //this will be registered as the first 'end' listener\n //must call destroy next tick, to make sure we're after any\n //stream piped from here.\n //this is only a problem if end is not emitted synchronously.\n //a nicer way to do this is to make sure this is the last listener for 'end'\n\n stream.on('end', function () {\n stream.readable = false\n if(!stream.writable && stream.autoDestroy)\n process.nextTick(function () {\n stream.destroy()\n })\n })\n\n function _end () {\n stream.writable = false\n end.call(stream)\n if(!stream.readable && stream.autoDestroy)\n stream.destroy()\n }\n\n stream.end = function (data) {\n if(ended) return\n ended = true\n if(arguments.length) stream.write(data)\n _end() // will emit or queue\n return stream\n }\n\n stream.destroy = function () {\n if(destroyed) return\n destroyed = true\n ended = true\n buffer.length = 0\n stream.writable = stream.readable = false\n stream.emit('close')\n return stream\n }\n\n stream.pause = function () {\n if(stream.paused) return\n stream.paused = true\n return stream\n }\n\n stream.resume = function () {\n if(stream.paused) {\n stream.paused = false\n stream.emit('resume')\n }\n drain()\n //may have become paused again,\n //as drain emits 'data'.\n if(!stream.paused)\n stream.emit('drain')\n return stream\n }\n return stream\n}\n\n"],"names":["getNonOverlappingDuration","ranges","sort","a","b","reduce","acc","range","length","tail","slice","prevStart","prevEnd","start","end","makeSpanMap","getSpan","spanMap","span","index","id","children","parentId","parentIds","push","undefined","getStats","duration","traceDuration","selfDuration","main","toFixedNoTrailingZeros","secondary","n","parseFloat","toFixed","makeFrames","MutableDataFrame","fields","name","Fields","type","FieldType","config","displayName","color","mode","meta","preferredVisualisationType","convertTagsLogfmt","tags","data","logfmt","Object","keys","forEach","key","value","String","JSON","stringify","transformToLogfmt","parse","durationPlaceholder","AdvancedOptions","query","onChange","showAdvancedOptions","setShowAdvancedOptions","useState","styles","useStyles","getStyles","InlineFieldRow","className","advancedOptionsContainer","onClick","InlineLabel","as","Icon","angleUp","angleDown","CSSTransition","in","mountOnEnter","unmountOnExit","timeout","classNames","InlineField","label","labelWidth","grow","Input","minDuration","placeholder","v","currentTarget","maxDuration","tooltip","limit","parseInt","theme","css","spacing","xs","enter","enterActive","exit","exitActive","allOperationsOption","SearchForm","datasource","serviceOptions","setServiceOptions","operationOptions","setOperationOptions","isLoading","setIsLoading","services","operations","loadOptions","useCallback","async","url","loaderOfType","prevValue","values","metadataRequest","options","map","option","filter","item","fuzzyMatch","found","error","dispatch","notifyApp","createErrorNotification","useEffect","getServices","service","encodeURIComponent","getOperations","maxWidth","Select","inputId","onOpenMenu","find","operation","menuPlacement","isClearable","disabled","createGraphFrames","nodes","edges","spans","traceEndTime","traceStartTime","Infinity","startTime","findTraceDuration","spanID","references","r","refType","process","processes","processID","c","childrenDuration","stats","serviceName","operationName","parentSpanID","convertTraceToGraph","nodesFrame","edgesFrame","node","add","edge","JaegerDatasource","DataSourceApi","constructor","instanceSettings","timeSrv","getTimeSrv","super","this","nodeGraph","jsonData","params","lastValueFrom","_request","hideFromInspector","target","targets","of","emptyTraceDataFrame","queryType","getTemplateSrv","replace","scopedVars","pipe","response","traceData","createTraceFrame","enabled","uploadedJson","message","jaegerQuery","pick","pickBy","identity","omit","getTimeRange","lookback","createTableFrame","res","status","catchError","err","statusText","timeRange","getTime","from","to","getQueryDisplayText","apiUrl","serializeParams","req","getBackendSrv","fetch","date","roundUp","dateMath","valueOf","custom","traceFormat","plugin","DataSourcePlugin","setConfigEditor","onOptionsChange","DataSourceHttpSettings","defaultUrl","dataSourceConfig","showAccessOptions","TraceToLogsSettings","TraceToMetricsSettings","NodeGraphSettings","setQueryEditor","onRunQuery","useTheme2","onChangeQuery","nextQuery","width","RadioButtonGroup","size","padding","FileDropzone","multiple","onLoad","result","QueryField","onBlur","portalOrigin","renderEditorBody","s","toSpanRow","traceID","logs","l","timestamp","warnings","stackTraces","serviceTags","frame","unit","displayNameFromDS","links","title","internal","datasourceUid","uid","datasourceName","transformToTraceData","trace","transformTraceData","traceName","transformToJaeger","traceResponse","i","get","p","flags","total","offset","errors","module","exports","next","_body","header","contentType","body","buf","setEncoding","on","chunk","lines","trim","split","line","parser","PassThrough","mime","objectMode","streamParser","debug","in_key","in_value","in_quote","had_quote","object","console","log","stream","stdout","logData","assign","defaultData","timers","now","Date","toString","write","time","timer","namespace","namespaced","maxErrorLines","Math","random","errorLogger","toISOString","stack","commonFormatter","path","originalUrl","httpHeader","requestID","requestData","ip","connection","remoteAddress","method","statusCode","request_id","content_length","content_type","init","logger","formatter","immediate","immediateLogger","elapsed","encoding","timingLogger","through","self","logfmtStream","queue","source","unpipe","transformStream","destination","streamStringify","hasOwnProperty","delim","delimiter","is_null","needs_quoting","indexOf","substring","streaming","bodyParser","bodyParserStream","logfmtParser","requestLogger","serializer","prototype","Decoder","matcher","mapper","decoder","soFar","emit","piece","buffer","pieces","pop","Stream","opts","ended","destroyed","_ended","drain","paused","shift","_end","writable","call","readable","autoDestroy","destroy","nextTick","arguments","pause","resume"],"sourceRoot":""}