{"version":3,"file":"zipkinPlugin.70f0f24b6d0b6e673ccb.js","mappings":"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","sources":["webpack://grafana/./packages/grafana-o11y-ds-frontend/src/NodeGraph/NodeGraphSettings.tsx","webpack://grafana/./packages/grafana-o11y-ds-frontend/src/TraceToMetrics/TraceToMetricsSettings.tsx","webpack://grafana/./public/app/plugins/datasource/zipkin/ConfigEditor.tsx","webpack://grafana/./public/app/plugins/datasource/zipkin/constants.ts","webpack://grafana/./public/app/plugins/datasource/zipkin/QueryField.tsx","webpack://grafana/./public/app/plugins/datasource/zipkin/utils/graphTransform.ts","webpack://grafana/./public/app/plugins/datasource/zipkin/datasource.ts","webpack://grafana/./public/app/plugins/datasource/zipkin/module.ts","webpack://grafana/./node_modules/react-use/esm/useMount.js"],"sourcesContent":["import { css } from '@emotion/css';\nimport React from 'react';\n\nimport {\n DataSourceJsonData,\n DataSourcePluginOptionsEditorProps,\n GrafanaTheme2,\n updateDatasourcePluginJsonDataOption,\n} from '@grafana/data';\nimport { ConfigDescriptionLink, ConfigSubSection } from '@grafana/experimental';\nimport { InlineField, InlineFieldRow, InlineSwitch, useStyles2 } from '@grafana/ui';\n\nexport interface NodeGraphOptions {\n enabled?: boolean;\n}\n\nexport interface NodeGraphData extends DataSourceJsonData {\n nodeGraph?: NodeGraphOptions;\n}\n\ninterface Props extends DataSourcePluginOptionsEditorProps {}\n\nexport function NodeGraphSettings({ options, onOptionsChange }: Props) {\n const styles = useStyles2(getStyles);\n\n return (\n
\n \n \n ) =>\n updateDatasourcePluginJsonDataOption({ onOptionsChange, options }, 'nodeGraph', {\n ...options.jsonData.nodeGraph,\n enabled: event.currentTarget.checked,\n })\n }\n />\n \n \n
\n );\n}\n\nexport const NodeGraphSection = ({ options, onOptionsChange }: DataSourcePluginOptionsEditorProps) => {\n let suffix = options.type;\n suffix += options.type === 'tempo' ? '/configure-tempo-data-source/#node-graph' : '/#node-graph';\n\n return (\n \n }\n >\n \n \n );\n};\n\nconst getStyles = (theme: GrafanaTheme2) => ({\n infoText: css({\n label: 'infoText',\n paddingBottom: theme.spacing(2),\n color: theme.colors.text.secondary,\n }),\n container: css({\n label: 'container',\n width: '100%',\n }),\n row: css({\n label: 'row',\n alignItems: 'baseline',\n }),\n});\n","import { css } from '@emotion/css';\nimport React from 'react';\n\nimport {\n DataSourceInstanceSettings,\n DataSourceJsonData,\n DataSourcePluginOptionsEditorProps,\n GrafanaTheme2,\n updateDatasourcePluginJsonDataOption,\n} from '@grafana/data';\nimport { ConfigDescriptionLink, ConfigSection } from '@grafana/experimental';\nimport { DataSourcePicker } from '@grafana/runtime';\nimport { Button, InlineField, InlineFieldRow, Input, useStyles2 } from '@grafana/ui';\n\nimport { IntervalInput } from '../IntervalInput/IntervalInput';\nimport { TagMappingInput } from '../TraceToLogs/TagMappingInput';\nimport { getTimeShiftLabel, getTimeShiftTooltip, invalidTimeShiftError } from '../TraceToLogs/TraceToLogsSettings';\n\nexport interface TraceToMetricsOptions {\n datasourceUid?: string;\n tags?: Array<{ key: string; value: string }>;\n queries: TraceToMetricQuery[];\n spanStartTimeShift?: string;\n spanEndTimeShift?: string;\n}\n\nexport interface TraceToMetricQuery {\n name?: string;\n query?: string;\n}\n\nexport interface TraceToMetricsData extends DataSourceJsonData {\n tracesToMetrics?: TraceToMetricsOptions;\n}\n\ninterface Props extends DataSourcePluginOptionsEditorProps {}\n\nexport function TraceToMetricsSettings({ options, onOptionsChange }: Props) {\n const styles = useStyles2(getStyles);\n\n return (\n
\n \n \n \n updateDatasourcePluginJsonDataOption({ onOptionsChange, options }, 'tracesToMetrics', {\n ...options.jsonData.tracesToMetrics,\n datasourceUid: ds.uid,\n })\n }\n />\n \n {options.jsonData.tracesToMetrics?.datasourceUid ? (\n {\n updateDatasourcePluginJsonDataOption({ onOptionsChange, options }, 'tracesToMetrics', {\n ...options.jsonData.tracesToMetrics,\n datasourceUid: undefined,\n });\n }}\n >\n Clear\n \n ) : null}\n \n\n \n {\n updateDatasourcePluginJsonDataOption({ onOptionsChange, options }, 'tracesToMetrics', {\n ...options.jsonData.tracesToMetrics,\n spanStartTimeShift: val,\n });\n }}\n placeholder={'-2m'}\n isInvalidError={invalidTimeShiftError}\n />\n \n\n \n {\n updateDatasourcePluginJsonDataOption({ onOptionsChange, options }, 'tracesToMetrics', {\n ...options.jsonData.tracesToMetrics,\n spanEndTimeShift: val,\n });\n }}\n placeholder={'2m'}\n isInvalidError={invalidTimeShiftError}\n />\n \n\n \n \n \n updateDatasourcePluginJsonDataOption({ onOptionsChange, options }, 'tracesToMetrics', {\n ...options.jsonData.tracesToMetrics,\n tags: v,\n })\n }\n />\n \n \n\n {options.jsonData.tracesToMetrics?.queries?.map((query, i) => (\n
\n \n {\n const newQueries = (options.jsonData.tracesToMetrics?.queries ?? []).map(\n (traceToMetricQuery, index) => {\n return index === i ? { ...traceToMetricQuery, name: e.currentTarget.value } : traceToMetricQuery;\n }\n );\n updateDatasourcePluginJsonDataOption({ onOptionsChange, options }, 'tracesToMetrics', {\n ...options.jsonData.tracesToMetrics,\n queries: newQueries,\n });\n }}\n />\n \n \n {\n const updatedQueries = (options.jsonData.tracesToMetrics?.queries ?? []).map(\n (traceToMetricQuery, index) => {\n return index === i ? { ...traceToMetricQuery, query: e.currentTarget.value } : traceToMetricQuery;\n }\n );\n updateDatasourcePluginJsonDataOption({ onOptionsChange, options }, 'tracesToMetrics', {\n ...options.jsonData.tracesToMetrics,\n queries: updatedQueries,\n });\n }}\n />\n \n\n {\n const newQueries = options.jsonData.tracesToMetrics?.queries.filter((_, index) => index !== i);\n updateDatasourcePluginJsonDataOption({ onOptionsChange, options }, 'tracesToMetrics', {\n ...options.jsonData.tracesToMetrics,\n queries: newQueries,\n });\n }}\n />\n
\n ))}\n\n {\n updateDatasourcePluginJsonDataOption({ onOptionsChange, options }, 'tracesToMetrics', {\n ...options.jsonData.tracesToMetrics,\n queries: [...(options.jsonData.tracesToMetrics?.queries ?? []), { query: '' }],\n });\n }}\n >\n Add query\n \n
\n );\n}\n\nexport const TraceToMetricsSection = ({ options, onOptionsChange }: DataSourcePluginOptionsEditorProps) => {\n let suffix = options.type;\n suffix += options.type === 'tempo' ? '/configure-tempo-data-source/#trace-to-metrics' : '/#trace-to-metrics';\n\n return (\n \n }\n isCollapsible={true}\n isInitiallyOpen={true}\n >\n \n \n );\n};\n\nconst getStyles = (theme: GrafanaTheme2) => ({\n infoText: {\n paddingBottom: theme.spacing(2),\n color: theme.colors.text.secondary,\n },\n row: css({\n label: 'row',\n alignItems: 'baseline',\n }),\n queryRow: css({\n label: 'queryRow',\n display: 'flex',\n flexFlow: 'wrap',\n }),\n});\n","import { css } from '@emotion/css';\nimport React from 'react';\n\nimport { DataSourcePluginOptionsEditorProps, GrafanaTheme2 } from '@grafana/data';\nimport { ConfigSection, DataSourceDescription } from '@grafana/experimental';\nimport { NodeGraphSection, SpanBarSection, TraceToLogsSection, TraceToMetricsSection } from '@grafana/o11y-ds-frontend';\nimport { config } from '@grafana/runtime';\nimport { DataSourceHttpSettings, useStyles2, Divider, Stack } from '@grafana/ui';\n\nexport type Props = DataSourcePluginOptionsEditorProps;\n\nexport const ConfigEditor = ({ options, onOptionsChange }: Props) => {\n const styles = useStyles2(getStyles);\n\n return (\n
\n \n\n \n\n \n\n \n\n \n\n {config.featureToggles.traceToMetrics ? (\n <>\n \n \n \n ) : null}\n\n \n \n \n \n \n \n
\n );\n};\n\nconst getStyles = (theme: GrafanaTheme2) => ({\n container: css`\n label: container;\n margin-bottom: ${theme.spacing(2)};\n max-width: 900px;\n `,\n});\n","export const apiPrefix = '/api/v2';\n","import { css } from '@emotion/css';\nimport { fromPairs } from 'lodash';\nimport React, { useCallback, useEffect, useMemo, useState } from 'react';\nimport { useAsyncFn, useMount, useMountedState } from 'react-use';\nimport { AsyncState } from 'react-use/lib/useAsyncFn';\n\nimport { GrafanaTheme2, QueryEditorProps } from '@grafana/data';\nimport {\n ButtonCascader,\n CascaderOption,\n FileDropzone,\n InlineField,\n InlineFieldRow,\n RadioButtonGroup,\n useTheme2,\n QueryField,\n useStyles2,\n Modal,\n HorizontalGroup,\n Button,\n} from '@grafana/ui';\nimport { notifyApp } from 'app/core/actions';\nimport { createErrorNotification } from 'app/core/copy/appNotification';\nimport { dispatch } from 'app/store/store';\n\nimport { apiPrefix } from './constants';\nimport { ZipkinDatasource } from './datasource';\nimport { ZipkinQuery, ZipkinQueryType, ZipkinSpan } from './types';\n\ntype Props = QueryEditorProps;\n\nconst getStyles = (theme: GrafanaTheme2) => {\n return {\n tracesCascader: css({\n label: 'tracesCascader',\n marginRight: theme.spacing(1),\n }),\n };\n};\n\nexport const ZipkinQueryField = ({ query, onChange, onRunQuery, datasource }: Props) => {\n const [uploadModalOpen, setUploadModalOpen] = useState(false);\n const serviceOptions = useServices(datasource);\n const theme = useTheme2();\n const styles = useStyles2(getStyles);\n const { onLoadOptions, allOptions } = useLoadOptions(datasource);\n\n const onSelectTrace = useCallback(\n (values: string[], selectedOptions: CascaderOption[]) => {\n if (selectedOptions.length === 3) {\n const traceID = selectedOptions[2].value;\n onChange({ ...query, query: traceID });\n onRunQuery();\n }\n },\n [onChange, onRunQuery, query]\n );\n\n useEffect(() => {\n if (!query.queryType) {\n onChange({\n ...query,\n queryType: 'traceID',\n });\n }\n }, [query, onChange]);\n\n const onChangeQuery = (value: string) => {\n const nextQuery = { ...query, query: value };\n onChange(nextQuery);\n };\n\n let cascaderOptions = useMapToCascaderOptions(serviceOptions, allOptions);\n\n return (\n <>\n setUploadModalOpen(false)}>\n
\n {\n datasource.uploadedJson = result;\n onChange({\n ...query,\n queryType: 'upload',\n });\n setUploadModalOpen(false);\n onRunQuery();\n }}\n />\n
\n
\n \n \n \n \n options={[{ value: 'traceID', label: 'TraceID' }]}\n value={query.queryType || 'traceID'}\n onChange={(v) =>\n onChange({\n ...query,\n queryType: v,\n })\n }\n size=\"md\"\n />\n {\n setUploadModalOpen(true);\n }}\n >\n Import trace\n \n \n \n \n {query.queryType === 'traceID' && (\n \n \n Traces\n \n
\n \n
\n
\n )}\n \n );\n};\n\n// Exported for tests\nexport function useServices(datasource: ZipkinDatasource): AsyncState {\n const url = `${apiPrefix}/services`;\n\n const [servicesOptions, fetch] = useAsyncFn(async (): Promise => {\n try {\n const services: string[] | null = await datasource.metadataRequest(url);\n if (services) {\n return services.sort().map((service) => ({\n label: service,\n value: service,\n isLeaf: false,\n }));\n }\n return [];\n } catch (error) {\n const errorToShow = error instanceof Error ? error : 'An unknown error occurred';\n dispatch(notifyApp(createErrorNotification('Failed to load services from Zipkin', errorToShow)));\n throw error;\n }\n }, [datasource]);\n\n useMount(() => {\n // We should probably call this periodically to get new services after mount.\n fetch();\n });\n\n return servicesOptions;\n}\n\ntype OptionsState = {\n [serviceName: string]: {\n [spanName: string]: {\n [traceId: string]: string;\n };\n };\n};\n\n// Exported for tests\nexport function useLoadOptions(datasource: ZipkinDatasource) {\n const isMounted = useMountedState();\n const [allOptions, setAllOptions] = useState({});\n\n const [, fetchSpans] = useAsyncFn(\n async function findSpans(service: string): Promise {\n const url = `${apiPrefix}/spans`;\n try {\n // The response of this should have been full ZipkinSpan objects based on API docs but is just list\n // of span names.\n // TODO: check if this is some issue of version used or something else\n const response: string[] = await datasource.metadataRequest(url, { serviceName: service });\n if (isMounted()) {\n setAllOptions((state) => {\n const spanOptions = fromPairs(response.map((span: string) => [span, undefined]));\n return {\n ...state,\n [service]: spanOptions as any,\n };\n });\n }\n } catch (error) {\n const errorToShow = error instanceof Error ? error : 'An unknown error occurred';\n dispatch(notifyApp(createErrorNotification('Failed to load spans from Zipkin', errorToShow)));\n throw error;\n }\n },\n [datasource, allOptions]\n );\n\n const [, fetchTraces] = useAsyncFn(\n async function findTraces(serviceName: string, spanName: string): Promise {\n const url = `${apiPrefix}/traces`;\n const search = {\n serviceName,\n spanName,\n // See other params and default here https://zipkin.io/zipkin-api/#/default/get_traces\n };\n try {\n // This should return just root traces as there isn't any nesting\n const traces: ZipkinSpan[][] = await datasource.metadataRequest(url, search);\n if (isMounted()) {\n const newTraces = traces.length\n ? fromPairs(\n traces.map((trace) => {\n const rootSpan = trace.find((span) => !span.parentId)!;\n\n return [`${rootSpan.name} [${Math.floor(rootSpan.duration / 1000)} ms]`, rootSpan.traceId];\n })\n )\n : noTracesOptions;\n\n setAllOptions((state) => {\n const spans = state[serviceName];\n return {\n ...state,\n [serviceName]: {\n ...spans,\n [spanName]: newTraces,\n },\n };\n });\n }\n } catch (error) {\n const errorToShow = error instanceof Error ? error : 'An unknown error occurred';\n dispatch(notifyApp(createErrorNotification('Failed to load spans from Zipkin', errorToShow)));\n throw error;\n }\n },\n [datasource]\n );\n\n const onLoadOptions = useCallback(\n (selectedOptions: CascaderOption[]) => {\n const service = selectedOptions[0].value;\n if (selectedOptions.length === 1) {\n fetchSpans(service);\n } else if (selectedOptions.length === 2) {\n const spanName = selectedOptions[1].value;\n fetchTraces(service, spanName);\n }\n },\n [fetchSpans, fetchTraces]\n );\n\n return {\n onLoadOptions,\n allOptions,\n };\n}\n\nfunction useMapToCascaderOptions(services: AsyncState, allOptions: OptionsState) {\n return useMemo(() => {\n let cascaderOptions: CascaderOption[] = [];\n\n if (services.value && services.value.length) {\n cascaderOptions = services.value.map((services) => {\n return {\n ...services,\n children:\n allOptions[services.value] &&\n Object.keys(allOptions[services.value]).map((spanName) => {\n return {\n label: spanName,\n value: spanName,\n isLeaf: false,\n children:\n allOptions[services.value][spanName] &&\n Object.keys(allOptions[services.value][spanName]).map((traceName) => {\n return {\n label: traceName,\n value: allOptions[services.value][spanName][traceName],\n };\n }),\n };\n }),\n };\n });\n } else if (services.value && !services.value.length) {\n cascaderOptions = noTracesFoundOptions;\n }\n\n return cascaderOptions;\n }, [services, allOptions]);\n}\n\nconst NO_TRACES_KEY = '__NO_TRACES__';\nconst noTracesFoundOptions = [\n {\n label: 'No traces found',\n value: 'no_traces',\n isLeaf: true,\n\n // Cannot be disabled because then cascader shows 'loading' for some reason.\n // disabled: true,\n },\n];\n\nconst noTracesOptions = {\n '[No traces in time range]': NO_TRACES_KEY,\n};\n","import { DataFrame, NodeGraphDataFrameFieldNames as Fields } from '@grafana/data';\nimport { getNonOverlappingDuration, getStats, makeFrames, makeSpanMap } from '@grafana/o11y-ds-frontend';\n\nimport { ZipkinSpan } 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: ZipkinSpan[]): 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(spans: ZipkinSpan[]): { nodes: Node[]; edges: Edge[] } {\n const nodes: Node[] = [];\n const edges: Edge[] = [];\n\n const traceDuration = findTraceDuration(spans);\n const spanMap = makeSpanMap((index) => {\n if (index >= spans.length) {\n return undefined;\n }\n return {\n span: spans[index],\n id: spans[index].id,\n parentIds: spans[index].parentId ? [spans[index].parentId!] : [],\n };\n });\n\n for (const span of spans) {\n const ranges: Array<[number, number]> = spanMap[span.id].children.map((c) => {\n const span = spanMap[c].span;\n return [span.timestamp, span.timestamp + 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.id,\n [Fields.title]: span.localEndpoint?.serviceName || span.remoteEndpoint?.serviceName || 'unknown',\n [Fields.subTitle]: span.name,\n [Fields.mainStat]: stats.main,\n [Fields.secondaryStat]: stats.secondary,\n [Fields.color]: selfDuration / traceDuration,\n });\n\n if (span.parentId && spanMap[span.parentId].span) {\n edges.push({\n [Fields.id]: span.parentId + '--' + span.id,\n [Fields.target]: span.id,\n [Fields.source]: span.parentId,\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: ZipkinSpan[]): number {\n let traceEndTime = 0;\n let traceStartTime = Infinity;\n\n for (const span of spans) {\n if (span.timestamp < traceStartTime) {\n traceStartTime = span.timestamp;\n }\n\n if (span.timestamp + span.duration > traceEndTime) {\n traceEndTime = span.timestamp + span.duration;\n }\n }\n return traceEndTime - traceStartTime;\n}\n","import { lastValueFrom, Observable, of } from 'rxjs';\nimport { map } from 'rxjs/operators';\n\nimport {\n DataQueryRequest,\n DataQueryResponse,\n DataSourceApi,\n DataSourceInstanceSettings,\n DataSourceJsonData,\n FieldType,\n createDataFrame,\n ScopedVars,\n urlUtil,\n} from '@grafana/data';\nimport { NodeGraphOptions, SpanBarOptions } from '@grafana/o11y-ds-frontend';\nimport { BackendSrvRequest, FetchResponse, getBackendSrv, getTemplateSrv, TemplateSrv } from '@grafana/runtime';\n\nimport { apiPrefix } from './constants';\nimport { ZipkinQuery, ZipkinSpan } from './types';\nimport { createGraphFrames } from './utils/graphTransform';\nimport { transformResponse } from './utils/transforms';\n\nexport interface ZipkinJsonData extends DataSourceJsonData {\n nodeGraph?: NodeGraphOptions;\n}\n\nexport class ZipkinDatasource extends DataSourceApi {\n uploadedJson: string | ArrayBuffer | null = null;\n nodeGraph?: NodeGraphOptions;\n spanBar?: SpanBarOptions;\n constructor(\n private instanceSettings: DataSourceInstanceSettings,\n private readonly templateSrv: TemplateSrv = getTemplateSrv()\n ) {\n super(instanceSettings);\n this.nodeGraph = instanceSettings.jsonData.nodeGraph;\n }\n\n query(options: DataQueryRequest): Observable {\n const target = options.targets[0];\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);\n return of(responseToDataQueryResponse({ data: traceData }, this.nodeGraph?.enabled));\n } catch (error) {\n return of({ error: { message: 'JSON is not valid Zipkin format' }, data: [] });\n }\n }\n\n if (target.query) {\n const query = this.applyVariables(target, options.scopedVars);\n return this.request(`${apiPrefix}/trace/${encodeURIComponent(query.query)}`).pipe(\n map((res) => responseToDataQueryResponse(res, this.nodeGraph?.enabled))\n );\n }\n return of(emptyDataQueryResponse);\n }\n\n async metadataRequest(url: string, params?: Record) {\n const res = await lastValueFrom(this.request(url, params, { hideFromInspector: true }));\n return res.data;\n }\n\n async testDatasource(): Promise<{ status: string; message: string }> {\n await this.metadataRequest(`${apiPrefix}/services`);\n return { status: 'success', message: 'Data source is working' };\n }\n\n getQueryDisplayText(query: ZipkinQuery): string {\n return query.query;\n }\n\n interpolateVariablesInQueries(queries: ZipkinQuery[], scopedVars: ScopedVars): ZipkinQuery[] {\n if (!queries || queries.length === 0) {\n return [];\n }\n\n return queries.map((query) => {\n return {\n ...query,\n datasource: this.getRef(),\n ...this.applyVariables(query, scopedVars),\n };\n });\n }\n\n applyVariables(query: ZipkinQuery, scopedVars: ScopedVars) {\n const expandedQuery = { ...query };\n\n return {\n ...expandedQuery,\n query: this.templateSrv.replace(query.query ?? '', scopedVars),\n };\n }\n\n private request(\n apiUrl: string,\n data?: unknown,\n options?: Partial\n ): Observable> {\n const params = data ? urlUtil.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 responseToDataQueryResponse(response: { data: ZipkinSpan[] }, nodeGraph = false): DataQueryResponse {\n let data = response?.data ? [transformResponse(response?.data)] : [];\n if (nodeGraph) {\n data.push(...createGraphFrames(response?.data));\n }\n return {\n data,\n };\n}\n\nconst emptyDataQueryResponse = {\n data: [\n createDataFrame({\n fields: [\n {\n name: 'trace',\n type: FieldType.trace,\n values: [],\n },\n ],\n meta: {\n preferredVisualisationType: 'trace',\n custom: {\n traceFormat: 'zipkin',\n },\n },\n }),\n ],\n};\n","import { DataSourcePlugin } from '@grafana/data';\n\nimport { ConfigEditor } from './ConfigEditor';\nimport { ZipkinQueryField } from './QueryField';\nimport { ZipkinDatasource } from './datasource';\n\nexport const plugin = new DataSourcePlugin(ZipkinDatasource)\n .setQueryEditor(ZipkinQueryField)\n .setConfigEditor(ConfigEditor);\n","import useEffectOnce from './useEffectOnce';\nvar useMount = function (fn) {\n useEffectOnce(function () {\n fn();\n });\n};\nexport default useMount;\n"],"names":["NodeGraphSettings","options","onOptionsChange","styles","getStyles","event","NodeGraphSection","suffix","theme","TraceToMetricsSettings","ds","val","query","i","e","newQueries","traceToMetricQuery","index","updatedQueries","_","TraceToMetricsSection","ConfigEditor","DataSourceDescription","Divider","DataSourceHttpSettings","config","ConfigSection","Stack","apiPrefix","ZipkinQueryField","onChange","onRunQuery","datasource","uploadModalOpen","setUploadModalOpen","serviceOptions","useServices","onLoadOptions","allOptions","useLoadOptions","onSelectTrace","values","selectedOptions","traceID","onChangeQuery","value","nextQuery","cascaderOptions","useMapToCascaderOptions","Modal","FileDropzone","result","InlineFieldRow","InlineField","RadioButtonGroup","v","Button","ButtonCascader","QueryField","url","servicesOptions","fetch","useAsyncFn","services","service","error","errorToShow","useMount","isMounted","useMountedState","setAllOptions","fetchSpans","response","state","spanOptions","span","fetchTraces","serviceName","spanName","search","traces","newTraces","trace","rootSpan","noTracesOptions","spans","traceName","noTracesFoundOptions","NO_TRACES_KEY","createGraphFrames","data","nodes","edges","convertTraceToGraph","nodesFrame","edgesFrame","node","edge","traceDuration","findTraceDuration","spanMap","ranges","c","childrenDuration","selfDuration","stats","traceEndTime","traceStartTime","ZipkinDatasource","instanceSettings","templateSrv","target","of","traceData","responseToDataQueryResponse","map","res","emptyDataQueryResponse","params","lastValueFrom","queries","scopedVars","apiUrl","req","nodeGraph","fn"],"sourceRoot":""}