{"version":3,"file":"datasource/module.js","mappings":"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","sources":["webpack://grafana-synthetic-monitoring-app/external amd \"app/core/core\"","webpack://grafana-synthetic-monitoring-app/external amd \"rxjs\"","webpack://grafana-synthetic-monitoring-app/external amd \"module\"","webpack://grafana-synthetic-monitoring-app/external amd \"@grafana/ui\"","webpack://grafana-synthetic-monitoring-app/external amd \"lodash\"","webpack://grafana-synthetic-monitoring-app/external amd \"react\"","webpack://grafana-synthetic-monitoring-app/external amd \"@emotion/css\"","webpack://grafana-synthetic-monitoring-app/external amd \"@grafana/data\"","webpack://grafana-synthetic-monitoring-app/external amd \"@grafana/runtime\"","webpack://grafana-synthetic-monitoring-app/webpack/bootstrap","webpack://grafana-synthetic-monitoring-app/webpack/runtime/compat get default export","webpack://grafana-synthetic-monitoring-app/webpack/runtime/define property getters","webpack://grafana-synthetic-monitoring-app/webpack/runtime/hasOwnProperty shorthand","webpack://grafana-synthetic-monitoring-app/webpack/runtime/make namespace object","webpack://grafana-synthetic-monitoring-app/webpack/runtime/publicPath","webpack://grafana-synthetic-monitoring-app/./node_modules/grafana-public-path.js","webpack://grafana-synthetic-monitoring-app/./datasource/ConfigEditor.tsx","webpack://grafana-synthetic-monitoring-app/./datasource/types.ts","webpack://grafana-synthetic-monitoring-app/./types.ts","webpack://grafana-synthetic-monitoring-app/./contexts/FeatureFlagContext.ts","webpack://grafana-synthetic-monitoring-app/./hooks/useCheckTypeOptions.ts","webpack://grafana-synthetic-monitoring-app/./utils.ts","webpack://grafana-synthetic-monitoring-app/./datasource/traceroute-utils.ts","webpack://grafana-synthetic-monitoring-app/./datasource/DataSource.ts","webpack://grafana-synthetic-monitoring-app/./datasource/QueryEditor.tsx"],"sourcesContent":["module.exports = __WEBPACK_EXTERNAL_MODULE__819__;","module.exports = __WEBPACK_EXTERNAL_MODULE__1269__;","module.exports = __WEBPACK_EXTERNAL_MODULE__1308__;","module.exports = __WEBPACK_EXTERNAL_MODULE__2007__;","module.exports = __WEBPACK_EXTERNAL_MODULE__3241__;","module.exports = __WEBPACK_EXTERNAL_MODULE__5959__;","module.exports = __WEBPACK_EXTERNAL_MODULE__6089__;","module.exports = __WEBPACK_EXTERNAL_MODULE__7781__;","module.exports = __WEBPACK_EXTERNAL_MODULE__8531__;","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId](module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = (module) => {\n\tvar getter = module && module.__esModule ?\n\t\t() => (module['default']) :\n\t\t() => (module);\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","__webpack_require__.p = \"public/plugins/grafana-synthetic-monitoring-app/\";","\nimport amdMetaModule from 'amd-module';\n\n__webpack_public_path__ =\n amdMetaModule && amdMetaModule.uri\n ? amdMetaModule.uri.slice(0, amdMetaModule.uri.lastIndexOf('/') + 1)\n : 'public/plugins/grafana-synthetic-monitoring-app/';\n","import React, { PureComponent } from 'react';\nimport { DataSourcePluginOptionsEditorProps } from '@grafana/data';\nimport { LegacyForms } from '@grafana/ui';\n\nimport { SecureJsonData, SMOptions } from './types';\nimport { InitializedJsonData } from 'types';\n\ntype ConfigEditorProps = DataSourcePluginOptionsEditorProps;\ntype Options = ConfigEditorProps['options'];\n\nexport class ConfigEditor extends PureComponent {\n render() {\n const { onOptionsChange, options } = this.props;\n\n return ;\n }\n}\n\nconst ConfigEditorContent = ({\n options,\n onOptionsChange,\n}: {\n options: Options;\n onOptionsChange: (options: Options) => void;\n}) => {\n const { secureJsonData } = options;\n\n return (\n <>\n
\n
\n
\n
\n {/* no need to change this until we have better design direction */}\n {/* eslint-disable-next-line deprecation/deprecation */}\n {\n onOptionsChange(resetAccessToken(options));\n }}\n onChange={(event) => {\n onOptionsChange({\n ...options,\n secureJsonData: {\n accessToken: event.target.value,\n },\n });\n }}\n />\n
\n
\n
\n \n );\n};\n\nfunction resetAccessToken(options: Options): Options {\n return {\n ...options,\n secureJsonFields: {\n ...options.secureJsonFields,\n accessToken: false,\n },\n secureJsonData: {\n ...options.secureJsonData,\n accessToken: '',\n },\n };\n}\n\nexport function isValid(settings?: InitializedJsonData): boolean {\n if (!settings) {\n return false;\n }\n\n const { apiHost, metrics, logs } = settings;\n if (!apiHost || !metrics || !metrics.grafanaName || !metrics.hostedId) {\n return false;\n }\n\n if (!logs || !logs.grafanaName || !logs.hostedId) {\n return false;\n }\n\n return true;\n}\n","import { DataSourceJsonData } from '@grafana/data';\nimport { DataQuery } from '@grafana/schema';\n\nexport enum QueryType {\n Probes = 'probes',\n Checks = 'checks',\n Traceroute = 'traceroute',\n}\n\nexport interface SMQuery extends DataQuery {\n queryType: QueryType;\n instance?: string;\n job?: string;\n probe?: string;\n query: string;\n}\n\nexport const defaultQuery: SMQuery = {\n queryType: QueryType.Probes,\n} as SMQuery;\n\nexport interface ProvisioningLinkedDatasourceInfo {\n grafanaName: string;\n hostedId: number;\n}\n\nexport interface LinkedDatasourceInfo extends ProvisioningLinkedDatasourceInfo {\n type: string;\n uid: string;\n}\n\nexport interface DashboardInfo {\n title: string;\n uid: string;\n json: string;\n version: number;\n latestVersion?: number;\n}\n\nexport interface FolderInfo {\n title: string;\n uid: string;\n id: number;\n}\n\n/**\n * These are options configured for each DataSource instance\n */\nexport interface SMOptions extends DataSourceJsonData {\n apiHost: string;\n metrics: LinkedDatasourceInfo;\n initialized?: boolean;\n logs: LinkedDatasourceInfo;\n}\n\n/**\n * Value that is used in the backend, but never sent over HTTP to the frontend\n */\nexport interface SecureJsonData {\n accessToken?: string;\n}\n\nexport interface LogStream {\n ElapsedTime: string;\n Hosts: string;\n Success: string;\n TTL: string;\n TracerouteID: string;\n LossPercent: string;\n Destination: string;\n check_name: string;\n instance: string;\n job: string;\n probe: string;\n probe_success: string;\n region: string;\n source: string;\n target: string;\n}\n\nexport interface ParsedLogStream extends Omit {\n TTL: number;\n Hosts: string[];\n}\n\nexport interface LogLine {\n stream: LogStream;\n values: string[];\n}\n\nexport interface LogQueryResponse {\n data: LogLine[];\n error?: string;\n}\n\nexport interface LogsAggregatedByTrace {\n [key: string]: ParsedLogStream[];\n}\n\nexport interface ParsedTraceHost {\n nextHosts?: Set;\n elapsedTimes: string[];\n isStart: boolean;\n isMostRecent: boolean;\n packetLossAverages: number[];\n TTL: number;\n}\n\nexport interface TracesByHost {\n [key: string]: ParsedTraceHost;\n}\n\nexport enum AccountingClassNames {\n browser = 'browser',\n browser_basic = 'browser_basic',\n dns = 'dns',\n dns_basic = 'dns_basic',\n grpc = 'grpc',\n grpc_basic = 'grpc_basic',\n grpc_ssl = 'grpc_ssl',\n grpc_ssl_basic = 'grpc_ssl_basic',\n http = 'http',\n http_basic = 'http_basic',\n http_ssl = 'http_ssl',\n http_ssl_basic = 'http_ssl_basic',\n multihttp = 'multihttp',\n multihttp_basic = 'multihttp_basic',\n ping = 'ping',\n ping_basic = 'ping_basic',\n scripted = 'scripted',\n scripted_basic = 'scripted_basic',\n tcp = 'tcp',\n tcp_basic = 'tcp_basic',\n tcp_ssl = 'tcp_ssl',\n tcp_ssl_basic = 'tcp_ssl_basic',\n traceroute = 'traceroute',\n traceroute_basic = 'traceroute_basic',\n}\n\ninterface AccountingClass {\n CheckClass: number;\n CheckType: number;\n Series: number;\n}\n\nexport type CheckAccountingClasses = {\n [key in AccountingClassNames]: AccountingClass;\n};\n\nexport interface CheckInfo {\n AccountingClasses: CheckAccountingClasses;\n}\n","import React from 'react';\nimport { FieldErrors, SubmitErrorHandler, SubmitHandler } from 'react-hook-form';\nimport { SelectableValue } from '@grafana/data';\nimport { EmbeddedScene, SceneRouteMatch } from '@grafana/scenes';\nimport { DataSourceRef } from '@grafana/schema';\nimport { ZodType } from 'zod';\n\nimport { LinkedDatasourceInfo, ProvisioningLinkedDatasourceInfo } from './datasource/types';\nimport { Assertion, MultiHttpEntry, MultiHttpVariable, RequestProps } from 'components/MultiHttp/MultiHttpTypes';\n\nexport interface ProvisioningJsonData {\n apiHost: string;\n stackId: number;\n metrics: ProvisioningLinkedDatasourceInfo;\n logs: ProvisioningLinkedDatasourceInfo;\n}\n\nexport interface InitializedJsonData {\n apiHost: string;\n stackId: number;\n metrics: LinkedDatasourceInfo;\n logs: LinkedDatasourceInfo;\n}\n\nexport enum IpVersion {\n Any = 'Any',\n V4 = 'V4',\n V6 = 'V6',\n}\n\nexport enum HttpMethod {\n DELETE = 'DELETE',\n GET = 'GET',\n HEAD = 'HEAD',\n OPTIONS = 'OPTIONS',\n PATCH = 'PATCH',\n POST = 'POST',\n PUT = 'PUT',\n}\n\nexport enum HttpVersion {\n HTTP1_0 = 'HTTP/1.0',\n HTTP1_1 = 'HTTP/1.1',\n HTTP2_0 = 'HTTP/2.0',\n}\n\nexport enum DnsRecordType {\n A = 'A',\n AAAA = 'AAAA',\n CNAME = 'CNAME',\n MX = 'MX',\n NS = 'NS',\n PTR = 'PTR',\n SOA = 'SOA',\n SRV = 'SRV',\n TXT = 'TXT',\n}\n\nexport enum DnsProtocol {\n TCP = 'TCP',\n UDP = 'UDP',\n}\n\nexport enum ProbeProvider {\n AWS = 'AWS',\n LINODE = 'Linode',\n DIGITAL_OCEAN = 'Digital Ocean',\n PRIVATE = '',\n}\n\nexport interface HeaderMatch {\n header: string;\n regexp: string;\n allowMissing: boolean;\n}\n\nexport interface TLSConfig {\n caCert?: string;\n clientCert?: string;\n clientKey?: string;\n insecureSkipVerify?: boolean;\n serverName?: string;\n}\n\nexport interface BasicAuth {\n username: string;\n password: string;\n}\n\nexport interface DNSRRValidator {\n failIfMatchesRegexp: string[];\n failIfNotMatchesRegexp: string[];\n}\n\nexport interface TCPQueryResponse {\n send: string;\n expect: string;\n startTLS: boolean;\n}\n\nexport interface ExistingObject {\n created?: number; // seconds\n id?: number;\n modified?: number; // seconds\n tenantId?: number;\n updated?: number; // seconds\n}\n\nexport interface Label {\n name: string;\n value: string;\n}\n\nexport interface Probe extends ExistingObject {\n name: string;\n public: boolean;\n latitude: number;\n longitude: number;\n region: string;\n online: boolean;\n onlineChange: number;\n labels: Label[];\n version: string;\n deprecated: boolean;\n capabilities: ProbeCapabilities;\n}\n\nexport type ProbeMetadata = {\n name: string;\n displayName: string;\n provider: ProbeProvider;\n country: string;\n countryCode: string;\n longRegion: string;\n region: string;\n};\n\nexport type ProbeWithMetadata = Probe &\n ProbeMetadata & {\n displayName: string;\n };\n\n// Used to extend the Probe object with additional properties (see Probes.tsx component)\nexport type ExtendedProbe = ProbeWithMetadata & { checks: number[] };\n\ninterface ProbeCapabilities {\n disableScriptedChecks: boolean;\n disableBrowserChecks: boolean;\n}\n\nexport enum ResponseMatchType {\n Authority = 'Authority',\n Answer = 'Answer',\n Additional = 'Additional',\n}\n\nexport interface DnsValidationFormValue {\n expression: string;\n inverted: boolean;\n responseMatch: ResponseMatchType;\n}\n\nexport interface DnsSettings {\n recordType: DnsRecordType;\n server: string;\n ipVersion: IpVersion;\n protocol: DnsProtocol;\n port: number;\n\n // validation\n validRCodes?: DnsResponseCodes[];\n validateAnswerRRS?: DNSRRValidator;\n validateAuthorityRRS?: DNSRRValidator;\n validateAdditionalRRS?: DNSRRValidator;\n}\n\nexport interface DnsSettingsFormValues\n extends Omit {\n validations: DnsValidationFormValue[];\n}\n\nexport interface ScriptedSettings {\n script: string;\n}\n\nexport interface BrowserSettings {\n script: string;\n}\n\nexport interface TcpSettings {\n ipVersion: IpVersion;\n tls?: boolean;\n tlsConfig?: TLSConfig;\n queryResponse?: TCPQueryResponse[];\n}\n\nexport interface TcpSettingsFormValues extends TcpSettings {}\n\nexport interface HttpSettings {\n method: HttpMethod;\n headers?: string[];\n body?: string;\n ipVersion: IpVersion;\n noFollowRedirects: boolean;\n tlsConfig?: TLSConfig;\n compression?: HTTPCompressionAlgo | undefined;\n proxyURL?: string;\n proxyConnectHeaders?: string[];\n\n // Authentication\n bearerToken?: string;\n basicAuth?: BasicAuth;\n\n // validations\n failIfSSL?: boolean;\n failIfNotSSL?: boolean;\n validStatusCodes?: number[];\n validHTTPVersions?: HttpVersion[];\n failIfBodyMatchesRegexp?: string[];\n failIfBodyNotMatchesRegexp?: string[];\n failIfHeaderMatchesRegexp?: HeaderMatch[];\n failIfHeaderNotMatchesRegexp?: HeaderMatch[];\n\n cacheBustingQueryParamName?: string;\n}\n\ninterface HttpHeaderFormValue {\n name: string;\n value: string;\n}\n\nexport interface HttpRegexBodyValidationFormValue {\n matchType: HttpRegexValidationType.Body;\n expression: string;\n inverted: boolean;\n}\n\nexport interface HttpRegexHeaderValidationFormValue {\n matchType: HttpRegexValidationType.Header;\n expression: string;\n inverted: boolean;\n header: string;\n allowMissing: boolean;\n}\n\nexport type HttpRegexValidationFormValue = HttpRegexBodyValidationFormValue | HttpRegexHeaderValidationFormValue;\n\nexport interface HttpSettingsFormValues\n extends Omit<\n HttpSettings,\n | 'headers'\n | 'proxyConnectHeaders'\n | 'failIfSSL'\n | 'failIfNotSSL'\n | 'failIfBodyMatchesRegexp'\n | 'failIfBodyNotMatchesRegexp'\n | 'failIfHeaderMatchesRegexp'\n | 'failIfHeaderNotMatchesRegexp'\n | 'noFollowRedirects'\n | 'compression'\n > {\n sslOptions: HttpSslOption;\n headers?: HttpHeaderFormValue[];\n proxyConnectHeaders?: HttpHeaderFormValue[];\n regexValidations: HttpRegexValidationFormValue[];\n followRedirects: boolean;\n compression: HTTPCompressionAlgo;\n proxyURL?: string;\n}\n\nexport interface MultiHttpSettings {\n entries: MultiHttpEntry[];\n}\n\nexport interface MultiHttpSettingsFormValues {\n entries: MultiHttpEntryFormValues[];\n}\n\nexport interface MultiHttpEntryFormValues extends Omit {\n request: RequestProps;\n variables?: MultiHttpVariable[];\n checks?: Assertion[];\n}\n\nexport interface TracerouteSettings {\n maxHops: number;\n maxUnknownHops: number;\n ptrLookup: boolean;\n hopTimeout: number;\n}\n\nexport interface TracerouteSettingsFormValues {\n maxHops: number;\n maxUnknownHops: number;\n ptrLookup: boolean;\n hopTimeout: number;\n}\n\nexport interface PingSettings {\n ipVersion: IpVersion;\n dontFragment: boolean;\n}\n\nexport interface PingSettingsFormValues extends PingSettings {}\n\nexport interface GRPCSettings {\n ipVersion: IpVersion;\n service?: string;\n tls?: boolean;\n tlsConfig?: TLSConfig;\n}\n\nexport interface GRPCSettingsFormValues extends GRPCSettings {}\n\nexport interface AlertFormValues {\n name: string;\n probePercentage: number;\n timeCount: number;\n timeUnit: SelectableValue;\n labels: Label[];\n annotations: Label[];\n sensitivity: SelectableValue;\n}\nexport interface CheckAlertFormValues {\n threshold?: number;\n period?: string;\n isSelected?: boolean;\n}\n\nexport type CheckAlertFormRecord = Partial>;\n\nexport type CheckFormValuesBase = Omit & {\n publishAdvancedMetrics: boolean;\n alerts?: CheckAlertFormRecord;\n};\n\nexport type CheckFormValuesHttp = CheckFormValuesBase & {\n checkType: CheckType.HTTP;\n settings: {\n http: HttpSettingsFormValues;\n };\n};\n\nexport type CheckFormValuesMultiHttp = CheckFormValuesBase & {\n checkType: CheckType.MULTI_HTTP;\n settings: {\n multihttp: MultiHttpSettingsFormValues;\n };\n};\n\nexport type CheckFormValuesPing = CheckFormValuesBase & {\n checkType: CheckType.PING;\n settings: {\n ping: PingSettingsFormValues;\n };\n};\n\nexport type CheckFormValuesDns = CheckFormValuesBase & {\n checkType: CheckType.DNS;\n settings: {\n dns: DnsSettingsFormValues;\n };\n};\n\nexport type CheckFormValuesGRPC = CheckFormValuesBase & {\n checkType: CheckType.GRPC;\n settings: {\n grpc: GRPCSettingsFormValues;\n };\n};\n\nexport type CheckFormValuesTcp = CheckFormValuesBase & {\n checkType: CheckType.TCP;\n settings: {\n tcp: TcpSettingsFormValues;\n };\n};\n\nexport type CheckFormValuesTraceroute = CheckFormValuesBase & {\n checkType: CheckType.Traceroute;\n settings: {\n traceroute: TracerouteSettingsFormValues;\n };\n};\n\nexport type CheckFormValuesScripted = CheckFormValuesBase & {\n checkType: CheckType.Scripted;\n settings: {\n scripted: ScriptedSettings;\n };\n};\n\nexport type CheckFormValuesBrowser = CheckFormValuesBase & {\n checkType: CheckType.Browser;\n settings: {\n browser: BrowserSettings;\n };\n};\n\nexport interface CheckBase {\n job: string;\n target: string;\n frequency: number;\n timeout: number;\n enabled: boolean;\n alertSensitivity: AlertSensitivity | string;\n basicMetricsOnly: boolean;\n labels: Label[]; // Currently list of [name:value]... can it be Labels?\n probes: number[];\n alerts?: CheckAlertFormRecord;\n}\n\nexport type Check =\n | BrowserCheck\n | DNSCheck\n | GRPCCheck\n | HTTPCheck\n | MultiHTTPCheck\n | PingCheck\n | ScriptedCheck\n | TCPCheck\n | TracerouteCheck;\n\nexport type CheckFormValues =\n | CheckFormValuesDns\n | CheckFormValuesGRPC\n | CheckFormValuesHttp\n | CheckFormValuesMultiHttp\n | CheckFormValuesPing\n | CheckFormValuesScripted\n | CheckFormValuesTcp\n | CheckFormValuesTraceroute\n | CheckFormValuesBrowser;\n\nexport interface FilteredCheck extends Omit {\n id: number;\n}\n\nexport type Settings =\n | BrowserCheck['settings']\n | DNSCheck['settings']\n | GRPCCheck['settings']\n | HTTPCheck['settings']\n | ScriptedCheck['settings']\n | MultiHTTPCheck['settings']\n | PingCheck['settings']\n | TCPCheck['settings']\n | TracerouteCheck['settings'];\n\nexport type DNSCheck = CheckBase &\n ExistingObject & {\n settings: {\n dns: DnsSettings;\n };\n };\n\nexport type GRPCCheck = CheckBase &\n ExistingObject & {\n settings: {\n grpc: GRPCSettings;\n };\n };\n\nexport type HTTPCheck = CheckBase &\n ExistingObject & {\n settings: {\n http: HttpSettings;\n };\n };\n\nexport type ScriptedCheck = CheckBase &\n ExistingObject & {\n settings: {\n scripted: ScriptedSettings;\n };\n };\n\nexport type BrowserCheck = CheckBase &\n ExistingObject & {\n settings: {\n browser: BrowserSettings;\n };\n };\n\nexport type MultiHTTPCheck = CheckBase &\n ExistingObject & {\n settings: {\n multihttp: MultiHttpSettings;\n };\n };\n\nexport type PingCheck = CheckBase &\n ExistingObject & {\n settings: {\n ping: PingSettings;\n };\n };\n\nexport type TCPCheck = CheckBase &\n ExistingObject & {\n settings: {\n tcp: TcpSettings;\n };\n };\n\nexport type TracerouteCheck = CheckBase &\n ExistingObject & {\n settings: {\n traceroute: TracerouteSettings;\n };\n };\n\nexport enum CheckType {\n Browser = 'browser',\n DNS = 'dns',\n GRPC = 'grpc',\n HTTP = 'http',\n MULTI_HTTP = 'multihttp',\n PING = 'ping',\n Scripted = 'scripted',\n TCP = 'tcp',\n Traceroute = 'traceroute',\n}\n\nexport enum CheckTypeGroup {\n ApiTest = `api-endpoint`,\n MultiStep = `multistep`,\n Scripted = `scripted`,\n Browser = `browser`,\n}\n\nexport enum DnsResponseCodes {\n NOERROR = 'NOERROR',\n BADALG = 'BADALG',\n BADCOOKIE = 'BADCOOKIE',\n BADKEY = 'BADKEY',\n BADMODE = 'BADMODE',\n BADNAME = 'BADNAME',\n BADSIG = 'BADSIG',\n BADTIME = 'BADTIME',\n BADTRUNC = 'BADTRUNC',\n BADVERS = 'BADVERS',\n FORMERR = 'FORMERR',\n NOTAUTH = 'NOTAUTH',\n NOTIMP = 'NOTIMP',\n NOTZONE = 'NOTZONE',\n NXDOMAIN = 'NXDOMAIN',\n NXRRSET = 'NXRRSET',\n REFUSED = 'REFUSED',\n SERVFAIL = 'SERVFAIL',\n YXDOMAIN = 'YXDOMAIN',\n YXRRSET = 'YXRRSET',\n}\n\nexport interface APIError {\n status: number;\n message: string;\n}\n\nexport interface OnUpdateSettingsArgs {\n settings: Settings;\n labels?: Label[];\n}\n\nexport enum HttpSslOption {\n Ignore,\n FailIfPresent,\n FailIfNotPresent,\n}\n\nexport enum HttpRegexValidationType {\n Header = 'Header',\n Body = 'Body',\n}\n\nexport enum AlertPercentiles {\n p50 = 'P50',\n p90 = 'P90',\n p95 = 'P95',\n p99 = 'P99',\n}\n\nexport interface SubmissionError {\n message?: string;\n msg?: string;\n err?: string;\n}\n\nexport interface SubmissionErrorWrapper {\n data: SubmissionError;\n status?: string;\n message?: string;\n}\n\nexport interface DashboardMeta {\n json: string;\n latestVersion: number;\n title: string;\n uid: string;\n version: number;\n}\n\nexport enum TimeUnits {\n Seconds = 's',\n Minutes = 'm',\n Hours = 'h',\n}\n\nexport enum AlertFamily {\n ProbeSuccess = 'probeSuccess',\n}\n\nexport enum AlertSeverity {\n Critical = 'critical',\n Error = 'error',\n Warn = 'warn',\n Info = 'info',\n}\n\nexport enum AlertSensitivity {\n None = 'none',\n Low = 'low',\n Medium = 'medium',\n High = 'high',\n}\n\nexport type AlertRecord = AlertRecordingRule | AlertRule;\n\nexport type AlertRecordingRule = {\n record: string;\n expr: string;\n};\n\nexport type AlertRule = {\n alert: string;\n expr: string;\n for?: string;\n labels?: {\n [key: string]: string;\n };\n annotations?: {\n [key: string]: string;\n };\n record?: string;\n};\n\nexport type AlertDescription = {\n metric: string;\n sensitivity: AlertSensitivity;\n operator: string;\n threshold: number;\n};\n\nexport type AlertFilter = (record: PrometheusAlertRecord) => boolean;\n\nexport enum CheckAlertType {\n ProbeFailedExecutionsTooHigh = 'ProbeFailedExecutionsTooHigh',\n TLSTargetCertificateCloseToExpiring = 'TLSTargetCertificateCloseToExpiring',\n}\n\nexport enum CheckAlertCategory {\n TLSCertificate = 'TLS Certificate',\n RequestDuration = 'Request Duration',\n FailedChecks = 'Failed Checks',\n}\n\nexport type CheckAlertDraft = {\n name: CheckAlertType;\n threshold: number;\n period?: string;\n};\n\nexport type CheckAlertPublished = CheckAlertDraft & {\n created: number;\n modified: number;\n};\n\nexport type ThresholdUnit = 'ms' | 's' | 'd' | '%' | 'no.';\n\nexport enum CheckSort {\n AToZ = 'atoz',\n ZToA = 'ztoa',\n ReachabilityDesc = 'reachabilityDesc',\n ReachabilityAsc = 'reachabilityAsc',\n ExecutionsDesc = 'executionsDesc',\n ExecutionsAsc = 'executionsAsc',\n}\n\nexport enum CheckEnabledStatus {\n All = 'all',\n Enabled = 'enabled',\n Disabled = 'disabled',\n}\n\nexport enum HTTPCompressionAlgo {\n none = '',\n identity = 'identity',\n br = 'br',\n gzip = 'gzip',\n deflate = 'deflate',\n}\n\nexport enum FeatureName {\n BrowserChecks = 'browser-checks',\n GRPCChecks = 'grpc-checks',\n ScriptedChecks = 'scripted-checks',\n UnifiedAlerting = 'ngalert',\n RBAC = 'synthetic-monitoring-rbac',\n AlertsPerCheck = 'sm-alerts-per-check',\n SecretsManagement = 'synthetic-monitoring-secrets-management',\n __TURNOFF = 'test-only-do-not-use',\n}\n\nexport interface UsageValues {\n checksPerMonth: number;\n activeSeries: number;\n logsGbPerMonth: number;\n dpm: number;\n}\n\ninterface Params extends Record {}\n\nexport interface CheckPageParams extends Params {\n id: string;\n checkType?: CheckType;\n}\n\nexport interface CheckFormPageParams extends Params {\n checkTypeGroup?: CheckTypeGroup;\n id?: string;\n}\n\nexport interface ProbePageParams extends Params {\n view?: string;\n id?: string;\n}\n\nexport interface DashboardSceneAppConfig {\n metrics: DataSourceRef;\n logs: DataSourceRef;\n sm: DataSourceRef;\n}\n\nexport enum MultiHttpVariableType {\n JSON_PATH = 0,\n REGEX = 1,\n CSS_SELECTOR = 2,\n}\n\nexport enum MultiHttpAssertionType {\n Text = 0,\n JSONPathValue = 1,\n JSONPath = 2,\n Regex = 3,\n}\n\nexport type SceneBuilder = (\n routeMatch: RouteMatch\n) => EmbeddedScene;\n\nexport type RouteMatch = SceneRouteMatch;\n\nexport interface ThresholdValues {\n upperLimit: number;\n lowerLimit: number;\n}\n\nexport interface ThresholdSettings {\n latency: ThresholdValues;\n reachability: ThresholdValues;\n uptime: ThresholdValues;\n}\n\nexport interface CalculateUsageValues {\n assertionCount: number;\n basicMetricsOnly: boolean;\n checkType: CheckType;\n frequencySeconds: number;\n isSSL: boolean;\n probeCount: number;\n}\n\nexport type PrometheusAlertsGroup = {\n evaulationTime: number;\n file: string;\n interval: number;\n lastEvaluation: string;\n name: string;\n rules: PrometheusAlertRecord[];\n totals: null;\n};\n\nexport type PrometheusAlertRecord = PrometheusAlertRecordingRule | PrometheusAlertingRule;\n\nexport type PrometheusAlertRecordingRule = {\n evaluationTime: number;\n health: `ok`; // fill in others\n lastEvaluation: string;\n name: string;\n query: string;\n type: `recording`;\n};\n\nexport type PrometheusAlertingRule = {\n annotations: {\n description: string;\n summary: string;\n };\n duration: number;\n evaluationTime: number;\n health: `ok`; // fill in others\n labels: {\n [key: string]: string;\n };\n lastEvaluation: string;\n name: string;\n query: string;\n state: 'inactive'; // fill in others\n type: `alerting`;\n};\n\nexport enum CheckStatus {\n EXPERIMENTAL = 'experimental',\n PRIVATE_PREVIEW = 'private-preview',\n PUBLIC_PREVIEW = 'public-preview',\n}\n\nexport interface CheckFormTypeLayoutProps {\n formActions: React.JSX.Element[];\n onSubmit: SubmitHandler;\n onSubmitError?: SubmitErrorHandler;\n errorMessage?: string;\n schema: ZodType;\n checkType?: CheckType;\n}\n\nexport type TLSCheckTypes = CheckType.HTTP | CheckType.TCP | CheckType.GRPC;\n\nexport interface TLSFormValues extends CheckFormValuesBase {\n checkType: TLSCheckTypes;\n settings: {\n [key in TLSCheckTypes]: {\n tls?: boolean;\n tlsConfig?: TLSConfig;\n };\n };\n}\n\nexport interface CheckFormInvalidSubmissionEvent {\n errs: FieldErrors;\n source: string;\n}\n\ntype PermissionBase = 'grafana-synthetic-monitoring-app';\nexport type PluginPermissions =\n | `${PermissionBase}:${'read' | 'write'}`\n | `${PermissionBase}.checks:${'read' | 'write' | 'delete'}`\n | `${PermissionBase}.probes:${'read' | 'write' | 'delete'}`\n | `${PermissionBase}.alerts:${'read' | 'write' | 'delete'}`\n | `${PermissionBase}.thresholds:${'read' | 'write' | 'delete'}`\n | `${PermissionBase}.access-tokens:${'write'}`\n | `${PermissionBase}.plugin:${'write'}`;\n\nexport type AlertingType = 'alerting' | 'sensitivity';\n","import { createContext } from 'react';\nimport { FeatureToggles, urlUtil } from '@grafana/data';\nimport { config } from '@grafana/runtime';\nimport { isArray } from 'lodash';\n\nimport { FeatureName } from 'types';\n\nexport interface FeatureFlagContextValue {\n featureToggles: FeatureToggles;\n isFeatureEnabled: (name: FeatureName) => boolean;\n}\n\nexport function isFeatureEnabled(name: FeatureName) {\n // Override traceroute feature flag until we're sure we don't need it anymore\n const featuresParam = urlUtil.getUrlSearchParams()['features'];\n let isEnabledThroughQueryParam = false;\n if (isArray(featuresParam)) {\n const stringParams = featuresParam as string[];\n isEnabledThroughQueryParam = stringParams.includes(name);\n }\n //@ts-ignore\n return Boolean(config.featureToggles[name]) || isEnabledThroughQueryParam;\n}\n\nexport function getFeatureContextValues() {\n return {\n featureToggles: config.featureToggles,\n isFeatureEnabled,\n };\n}\n\nexport const FeatureFlagContext = createContext(getFeatureContextValues());\n","import { CheckStatus, CheckType, CheckTypeGroup, FeatureName } from 'types';\n\nimport { useFeatureFlagContext } from './useFeatureFlagContext';\n\nexport const CHECK_TYPE_OPTIONS = [\n {\n label: 'HTTP',\n value: CheckType.HTTP,\n description: 'Measures a web endpoint for availability, response time, SSL certificate expiration and more.',\n group: CheckTypeGroup.ApiTest,\n },\n {\n label: 'Ping',\n value: CheckType.PING,\n description: 'Check a host for availability and response time.',\n group: CheckTypeGroup.ApiTest,\n },\n {\n label: 'gRPC',\n value: CheckType.GRPC,\n description: 'Use the gRPC Health Checking Protocol to ensure a gRPC service is healthy.',\n status: {\n value: CheckStatus.EXPERIMENTAL,\n description: `gRPC checks are experimental. We're actively working on improving the experience and adding more features.`,\n },\n featureToggle: FeatureName.GRPCChecks,\n group: CheckTypeGroup.ApiTest,\n },\n {\n label: 'DNS',\n value: CheckType.DNS,\n description: 'Ensures a domain resolves and measures the average time for the resolution to happen.',\n group: CheckTypeGroup.ApiTest,\n },\n {\n label: 'TCP',\n value: CheckType.TCP,\n description: 'Ensures a hostname and port accept a connection and measures performance.',\n group: CheckTypeGroup.ApiTest,\n },\n {\n label: 'Traceroute',\n value: CheckType.Traceroute,\n description: 'Trace the path of a request through the internet.',\n group: CheckTypeGroup.ApiTest,\n },\n {\n label: 'MultiHttp',\n value: CheckType.MULTI_HTTP,\n description: 'Check multiple web endpoints in sequence.',\n group: CheckTypeGroup.MultiStep,\n },\n {\n label: 'Scripted',\n value: CheckType.Scripted,\n description: 'Write a k6 script to run custom checks.',\n featureToggle: FeatureName.ScriptedChecks,\n group: CheckTypeGroup.Scripted,\n },\n {\n label: 'Browser',\n value: CheckType.Browser,\n description: 'Leverage k6 browser module to run checks in a browser.',\n status: {\n value: CheckStatus.PUBLIC_PREVIEW,\n description: `Browser checks are in public preview. During the preview they are free to use: test executions will not be billed.`,\n docsLink:\n 'https://grafana.com/docs/grafana-cloud/cost-management-and-billing/understand-your-invoice/synthetic-monitoring-invoice/',\n },\n featureToggle: FeatureName.BrowserChecks,\n group: CheckTypeGroup.Browser,\n },\n];\n\nexport function useCheckTypeOptions() {\n const { isFeatureEnabled } = useFeatureFlagContext();\n\n return CHECK_TYPE_OPTIONS.filter((option) => {\n if (option.featureToggle) {\n return isFeatureEnabled(option.featureToggle);\n }\n\n return true;\n });\n}\n","import {\n DataSourceInstanceSettings,\n GrafanaTheme2,\n intervalToAbbreviatedDurationString,\n NavModelItem,\n TimeRange,\n} from '@grafana/data';\nimport { config, getBackendSrv } from '@grafana/runtime';\n// todo: update this when we move to grafana 11.2\n// https://github.com/grafana/grafana/pull/89047\nimport { contextSrv } from 'grafana/app/core/core';\nimport { firstValueFrom } from 'rxjs';\n\nimport { LinkedDatasourceInfo, LogLine, LogQueryResponse, LogStream, SMOptions } from './datasource/types';\nimport {\n CalculateUsageValues,\n Check,\n CheckFormValues,\n CheckType,\n CheckTypeGroup,\n HttpMethod,\n Settings,\n SubmissionErrorWrapper,\n ThresholdValues,\n TLSConfig,\n} from 'types';\nimport {\n isHttpFormValuesSettings,\n isHttpSettings,\n isMultiHttpFormValuesSettings,\n isMultiHttpSettings,\n isTCPFormValuesSettings,\n isTCPSettings,\n} from 'utils.types';\nimport { CHECK_TYPE_OPTIONS } from 'hooks/useCheckTypeOptions';\n\n/**\n * Find all synthetic-monitoring datasources\n */\nexport function findSMDataSources(): Array> {\n return Object.values(config.datasources).filter((ds) => {\n return ds.type === 'synthetic-monitoring-datasource';\n }) as unknown as Array>;\n}\n\nexport function findLinkedDatasource(linkedDSInfo: LinkedDatasourceInfo): DataSourceInstanceSettings | undefined {\n if (linkedDSInfo.uid) {\n const linkedDS = Object.values(config.datasources).find((ds) => ds.uid === linkedDSInfo.uid);\n if (linkedDS) {\n return linkedDS;\n }\n }\n return config.datasources[linkedDSInfo.grafanaName];\n}\n\ninterface DatasourcePayload {\n accessToken: string;\n apiHost: string;\n metrics: LinkedDatasourceInfo;\n logs: LinkedDatasourceInfo;\n}\n\n// Used for stubbing out the datasource when plugin is not provisioned\n\nexport function createNewApiInstance(payload: DatasourcePayload) {\n return firstValueFrom(\n getBackendSrv().fetch({\n method: 'POST',\n url: 'api/datasources',\n data: {\n name: 'Synthetic Monitoring',\n type: 'synthetic-monitoring-datasource',\n access: 'proxy',\n isDefault: false,\n jsonData: {\n apiHost: payload.apiHost,\n initialized: true,\n metrics: payload.metrics,\n logs: payload.logs,\n },\n secureJsonData: {\n accessToken: payload.accessToken,\n },\n },\n })\n );\n}\n\nexport function initializeDatasource(datasourcePayload: DatasourcePayload) {\n const existingDatasource = findSMDataSources()?.[0];\n if (existingDatasource) {\n return firstValueFrom(\n getBackendSrv().fetch({\n method: 'PUT',\n url: `api/datasources/${existingDatasource.id}`,\n data: {\n ...existingDatasource,\n access: 'proxy',\n isDefault: false,\n secureJsonData: {\n accessToken: datasourcePayload.accessToken,\n },\n jsonData: {\n apiHost: datasourcePayload.apiHost,\n initialized: true,\n metrics: datasourcePayload.metrics,\n logs: datasourcePayload.logs,\n },\n },\n })\n );\n }\n\n return createNewApiInstance(datasourcePayload);\n}\n\nexport const parseUrl = (url: string) => {\n try {\n return new URL(url);\n } catch (e) {\n return;\n }\n};\n\n// Takes a TS enum with matching string/value pairs and transforms it into an array of strings\n// Under the hood TS enums duplicate key/value pairs so a value can match a key and vice-versa\nexport function enumToStringArray(enumObject: {}) {\n const set = new Set(Object.keys(enumObject) as string[]);\n return Array.from(set);\n}\n\n// Matches a string against multiple options\nexport const matchStrings = (string: string, comparisons: string[]): boolean => {\n const lowerCased = string.toLowerCase();\n return comparisons.some((comparison) => comparison.toLowerCase().match(lowerCased));\n};\n\nexport function getCheckType(settings: Settings): CheckType {\n let types = Object.keys(settings);\n if (types.length < 1) {\n return CheckType.HTTP;\n }\n\n if (types[0] === `k6`) {\n return CheckType.Scripted;\n }\n\n return types[0] as CheckType;\n}\n\nexport function getCheckTypeGroup(checkType: CheckType): CheckTypeGroup {\n const group = CHECK_TYPE_OPTIONS.find((option) => option.value === checkType)?.group;\n\n if (!group) {\n console.log(`Check type ${checkType} not found in check type options`);\n return CHECK_TYPE_OPTIONS[0].group;\n }\n\n return group;\n}\n\nexport interface MetricQueryOptions {\n start: number;\n end: number;\n step: string;\n}\n\nexport const queryLogsLegacy = async (\n url: string,\n query: string,\n start: number,\n end?: number // defaults to now\n): Promise => {\n const backendSrv = getBackendSrv();\n const params = {\n limit: 1000,\n query,\n start,\n end,\n };\n\n try {\n const response = await backendSrv.get<{ data: { result: LogLine[] } }>(`${url}/loki/api/v1/query_range`, params);\n return {\n data: response.data?.result ?? [],\n };\n } catch (e) {\n const err = e as SubmissionErrorWrapper;\n return { error: (err.message || err.data?.message) ?? 'Error fetching data', data: [] };\n }\n};\n\nexport async function queryLogs(dsUid: string, expr: string, range: TimeRange) {\n const resp = await getBackendSrv().post('/api/ds/query', {\n queries: [\n {\n refId: 'A',\n datasource: { type: 'loki', uid: dsUid },\n expr,\n queryType: 'range',\n maxLines: 1000,\n legendFormat: '',\n intervalMs: 2000,\n maxDataPoints: 1440,\n },\n ],\n range,\n from: range.from,\n to: range.to,\n });\n\n const logLines = resp.results['A'].frames[0].data.values[0] as LogStream[];\n return logLines;\n}\n\nexport const toBase64 = (value: string) => {\n try {\n return btoa(value);\n } catch {\n return value;\n }\n};\n\nexport const fromBase64 = (value: string) => {\n try {\n return atob(value);\n } catch {\n return value;\n }\n};\n\nexport const getSuccessRateThresholdColor = (thresholds: ThresholdValues, value: number) => {\n const { upperLimit, lowerLimit } = thresholds;\n const { success, error, warning } = config.theme2.colors;\n\n if (value > upperLimit) {\n return success.main;\n }\n\n if (value > lowerLimit && value < upperLimit) {\n return warning.main;\n }\n\n return error.shade;\n};\n\nexport const getLatencySuccessRateThresholdColor = (thresholds: ThresholdValues, value: number) => {\n const { lowerLimit, upperLimit } = thresholds;\n const { success, error, warning } = config.theme2.colors;\n\n if (value < lowerLimit) {\n return success.main;\n }\n\n if (value > lowerLimit && value < upperLimit) {\n return warning.main;\n }\n\n return error.shade;\n};\n\nexport function getRandomProbes(probes: number[], quantity: number): number[] {\n if (quantity >= probes.length) {\n return probes;\n }\n const randomProbes = new Set([] as number[]);\n while (randomProbes.size < quantity) {\n const index = Math.floor(Math.random() * probes.length);\n randomProbes.add(probes[index]);\n }\n return Array.from(randomProbes).sort((a, b) => a - b);\n}\n\nexport function formatDate(number: number) {\n return new Date(number).toLocaleString('en-US', {\n day: '2-digit',\n month: 'long',\n year: 'numeric',\n hour: '2-digit',\n minute: '2-digit',\n });\n}\n\nexport function secondsToDuration(seconds: number): string {\n const now = new Date();\n const duration = { start: new Date(now.getTime() - seconds * 1000), end: now };\n return intervalToAbbreviatedDurationString(duration);\n}\n\nexport function checkToUsageCalcValues(check: Check): CalculateUsageValues {\n const { basicMetricsOnly, settings, frequency, probes } = check;\n const cType = getCheckType(check.settings);\n\n return {\n assertionCount: getEntriesCount(settings),\n basicMetricsOnly,\n checkType: cType,\n frequencySeconds: frequency / 1000,\n isSSL: getSSL(settings),\n probeCount: probes?.length ?? 0,\n };\n}\n\nexport function checkFormValuesToUsageCalcValues(checkFormValues: CheckFormValues): CalculateUsageValues {\n const { checkType, publishAdvancedMetrics, settings, frequency, probes } = checkFormValues;\n\n return {\n assertionCount: getEntriesCountCheckFormValues(settings),\n basicMetricsOnly: !publishAdvancedMetrics,\n checkType,\n frequencySeconds: frequency,\n isSSL: getSSLCheckFormValues(settings),\n probeCount: probes?.length ?? 0,\n };\n}\n\nexport function getEntriesCount(settings: Check['settings']) {\n if (isMultiHttpSettings(settings)) {\n return settings.multihttp.entries.length;\n }\n\n return 1;\n}\n\nexport function getEntriesCountCheckFormValues(settings: CheckFormValues['settings']) {\n if (isMultiHttpFormValuesSettings(settings)) {\n return settings.multihttp.entries.length;\n }\n\n return 1;\n}\n\nexport function getSSL(settings: Check['settings']) {\n if (isHttpSettings(settings) && doesTLSConfigHaveValues(settings.http?.tlsConfig)) {\n return true;\n }\n\n if (isTCPSettings(settings) && doesTLSConfigHaveValues(settings.tcp.tlsConfig)) {\n return true;\n }\n\n // if (isGRPCSettings(settings) && doesTLSConfigHaveValues(settings.tcp.tlsConfig)) {\n // return true;\n // }\n\n return false;\n}\n\nexport function getSSLCheckFormValues(settings: CheckFormValues['settings']) {\n if (isHttpFormValuesSettings(settings) && doesTLSConfigHaveValues(settings.http?.tlsConfig)) {\n return true;\n }\n\n if (isTCPFormValuesSettings(settings) && doesTLSConfigHaveValues(settings.tcp.tlsConfig)) {\n return true;\n }\n\n // if (isGRPCFormValuesSettings(settings) && doesTLSConfigHaveValues(settings.tcp.tlsConfig)) {\n // return true;\n // }\n\n return false;\n}\n\nfunction doesTLSConfigHaveValues(tlsConfig?: TLSConfig) {\n if (!tlsConfig) {\n return false;\n }\n\n return Object.values(tlsConfig).some((value) => value);\n}\n\nexport function getMethodColor(theme: GrafanaTheme2, value: HttpMethod) {\n const colorMap = {\n [HttpMethod.DELETE]: theme.visualization.getColorByName('red'),\n [HttpMethod.GET]: theme.visualization.getColorByName('green'),\n [HttpMethod.HEAD]: theme.visualization.getColorByName('super-light-green'),\n [HttpMethod.OPTIONS]: theme.visualization.getColorByName('dark-purple'),\n [HttpMethod.PATCH]: theme.visualization.getColorByName('super-light-purple'),\n [HttpMethod.POST]: theme.visualization.getColorByName('yellow'),\n [HttpMethod.PUT]: theme.visualization.getColorByName('blue'),\n };\n\n return colorMap[value];\n}\n\nexport function hasGlobalPermission(action: string) {\n return contextSrv.hasPermission(action);\n}\n\nexport function createNavModel(base: NavModelItem, items: NavModelItem[]): NavModelItem {\n if (base.id === 'loading') {\n return base;\n }\n\n return items.reduce((acc, item) => {\n return {\n ...item,\n parentItem: acc,\n };\n }, base);\n}\n\nexport const pascalCaseToSentence = (value: string): string => {\n if (value === value.toUpperCase() || value === value.toLowerCase()) {\n return value;\n }\n\n return value.charAt(0).toUpperCase() + value.slice(1).replace(/(? {\n const nodeIdField: Field = {\n name: NodeGraphDataFrameFieldNames.id,\n type: FieldType.string,\n values: [] as string[],\n config: { displayName: 'ID' },\n };\n\n const nodeTitleField: Field = {\n name: NodeGraphDataFrameFieldNames.title,\n type: FieldType.string,\n values: [] as string[],\n config: { displayName: 'Host' },\n };\n\n const nodeMainStatField: Field = {\n name: NodeGraphDataFrameFieldNames.mainStat,\n type: FieldType.number,\n values: [] as number[],\n config: { unit: 'ms', displayName: 'Average Ms' },\n };\n\n const nodeStartField: Field = {\n name: NodeGraphDataFrameFieldNames.arc + 'start',\n type: FieldType.number,\n values: [] as number[],\n config: { color: { fixedColor: 'blue', mode: FieldColorModeId.Fixed }, displayName: 'Start nodes' },\n };\n\n const nodeSuccessField: Field = {\n name: NodeGraphDataFrameFieldNames.arc + 'success',\n type: FieldType.number,\n values: [] as number[],\n config: { color: { fixedColor: 'green', mode: FieldColorModeId.Fixed }, displayName: 'Successful packets' },\n };\n\n const nodeErrorField: Field = {\n name: NodeGraphDataFrameFieldNames.arc + 'error',\n type: FieldType.number,\n values: [] as number[],\n config: { color: { fixedColor: 'red', mode: FieldColorModeId.Fixed }, displayName: 'Packet loss' },\n };\n\n const nodeDestinationField: Field = {\n name: NodeGraphDataFrameFieldNames.arc + 'destination',\n type: FieldType.number,\n values: [] as number[],\n config: { color: { fixedColor: 'purple', mode: FieldColorModeId.Fixed }, displayName: 'Destination node' },\n };\n\n const nodeMostRecentDestinationField: Field = {\n name: NodeGraphDataFrameFieldNames.arc + 'most_recent_destination',\n type: FieldType.number,\n values: [] as number[],\n config: {\n color: { fixedColor: 'yellow', mode: FieldColorModeId.Fixed },\n displayName: 'Most recent destination node',\n },\n };\n\n return {\n nodeIdField,\n nodeTitleField,\n nodeStartField,\n nodeMainStatField,\n nodeDestinationField,\n nodeMostRecentDestinationField,\n nodeSuccessField,\n nodeErrorField,\n };\n};\n\nconst getNodeGraphEdgeFields = () => {\n const edgeIdField = {\n name: NodeGraphDataFrameFieldNames.id,\n type: FieldType.string,\n values: [] as string[],\n };\n const edgeSourceField = {\n name: NodeGraphDataFrameFieldNames.source,\n type: FieldType.string,\n values: [] as string[],\n };\n const edgeTargetField = {\n name: NodeGraphDataFrameFieldNames.target,\n type: FieldType.string,\n values: [] as string[],\n };\n\n return {\n edgeIdField,\n edgeSourceField,\n edgeTargetField,\n };\n};\n\nexport const parseTracerouteLogs = (queryResponse: LogStream[]): DataFrame[] => {\n const { edgeIdField, edgeSourceField, edgeTargetField } = getNodeGraphEdgeFields();\n\n let mostRecentTraceId: string;\n\n const destinations = new Set();\n const groupedByTraceID = queryResponse.reduce((acc, stream) => {\n const traceId = stream.TracerouteID;\n if (traceId && !mostRecentTraceId) {\n mostRecentTraceId = traceId;\n }\n if (!traceId) {\n return acc;\n }\n\n const hosts = stream.Hosts === '' ? [`??? TTL${stream.TTL + stream.probe}`] : stream.Hosts?.split(',');\n destinations.add(stream.Destination);\n const updatedStream = {\n ...stream,\n Hosts: hosts,\n TTL: parseInt(stream.TTL, 10),\n };\n\n if (acc[traceId]) {\n acc[traceId].push(updatedStream);\n } else {\n const probe = {\n ...updatedStream,\n LossPercent: '0',\n ElapsedTime: '0ms',\n Success: 'true',\n TTL: 0,\n Hosts: [stream.probe],\n };\n acc[traceId] = [probe, updatedStream];\n }\n return acc;\n }, {});\n\n type NextHost = {\n addresses: string[];\n TTL: number;\n };\n\n const findNextHosts = (currentTTL: number, streamArr: ParsedLogStream[]): NextHost | undefined => {\n const nextHostStreamIndex = streamArr.findIndex((stream) => stream.TTL > currentTTL && Boolean(stream.Hosts));\n if (nextHostStreamIndex > -1) {\n return { addresses: streamArr[nextHostStreamIndex]?.Hosts, TTL: streamArr[nextHostStreamIndex]?.TTL };\n }\n return;\n };\n\n const groupedByHost = Object.entries(groupedByTraceID).reduce((acc, [traceId, streamArray]) => {\n streamArray\n .sort((a, b) => a.TTL - b.TTL)\n .forEach((stream, index, arr) => {\n stream.Hosts?.forEach((host) => {\n const nextHosts = destinations.has(host) ? undefined : findNextHosts(stream.TTL, arr);\n const currentHost = acc[host];\n\n if (currentHost) {\n if (nextHosts) {\n nextHosts.addresses.forEach((nextHost) => {\n if (!currentHost.nextHosts?.has(nextHost)) {\n currentHost.nextHosts?.add(nextHost);\n }\n });\n }\n currentHost.elapsedTimes.push(stream.ElapsedTime);\n currentHost.packetLossAverages.push(parseInt(stream.LossPercent, 10));\n if (traceId === mostRecentTraceId) {\n currentHost.isMostRecent = true;\n }\n } else {\n acc[host] = {\n nextHosts: nextHosts?.addresses ? new Set(nextHosts.addresses) : new Set(),\n elapsedTimes: [stream.ElapsedTime],\n isStart: stream.TTL === 0,\n isMostRecent: traceId === mostRecentTraceId,\n packetLossAverages: [parseInt(stream.LossPercent, 10)],\n TTL: stream.TTL,\n };\n }\n });\n });\n return acc;\n }, {});\n\n const {\n nodeIdField,\n nodeTitleField,\n nodeMainStatField,\n nodeDestinationField,\n nodeStartField,\n nodeMostRecentDestinationField,\n nodeSuccessField,\n nodeErrorField,\n } = getNodeGraphFields();\n\n Object.entries(groupedByHost)\n // .sort((a, b) => {\n // a[1].TTL - b[1].TTL;\n // })\n .forEach(([host, hostData]) => {\n const totalElapsedTime = hostData.elapsedTimes.reduce((totalTime, elapsedTime) => {\n const cleanedString = elapsedTime?.replace('ms', '') ?? 0;\n const int = parseInt(cleanedString, 10);\n return totalTime + int;\n }, 0);\n const averageElapsedTime = totalElapsedTime / hostData.elapsedTimes.length;\n\n const totalPacketLoss = hostData.packetLossAverages.reduce((acc, packetLoss) => packetLoss + acc, 0);\n\n const packetLossStat = totalPacketLoss / hostData.packetLossAverages.length / 100;\n const packetSuccessStat = 1 - packetLossStat;\n\n nodeIdField.values.push(host);\n nodeTitleField.values.push(host);\n nodeMainStatField.values.push(Math.round(averageElapsedTime));\n\n Array.from(hostData.nextHosts ?? new Set([])).forEach((nextHost) => {\n edgeIdField.values.push(`${host}_${nextHost}`);\n edgeSourceField.values.push(host);\n edgeTargetField.values.push(nextHost);\n });\n\n if (hostData.isStart) {\n nodeMostRecentDestinationField.values.push(0);\n nodeDestinationField.values.push(0);\n nodeStartField.values.push(1);\n nodeSuccessField.values.push(0);\n nodeErrorField.values.push(0);\n } else if (destinations.has(host)) {\n if (hostData.isMostRecent) {\n nodeMostRecentDestinationField.values.push(1);\n nodeDestinationField.values.push(0);\n } else {\n nodeMostRecentDestinationField.values.push(0);\n nodeDestinationField.values.push(1);\n }\n nodeStartField.values.push(0);\n nodeSuccessField.values.push(0);\n nodeErrorField.values.push(0);\n } else {\n nodeDestinationField.values.push(0);\n nodeMostRecentDestinationField.values.push(0);\n nodeStartField.values.push(0);\n nodeSuccessField.values.push(packetSuccessStat);\n nodeErrorField.values.push(packetLossStat);\n }\n });\n\n return [\n createDataFrame({\n name: 'nodes',\n refId: 'nodeRefId',\n fields: [\n nodeIdField,\n nodeTitleField,\n nodeMainStatField,\n nodeDestinationField,\n nodeStartField,\n nodeMostRecentDestinationField,\n nodeSuccessField,\n nodeErrorField,\n ],\n meta: {\n preferredVisualisationType: 'nodeGraph',\n },\n }),\n createDataFrame({\n name: 'edges',\n refId: 'edgesRefId',\n fields: [edgeIdField, edgeSourceField, edgeTargetField],\n meta: {\n preferredVisualisationType: 'nodeGraph',\n },\n }),\n ];\n};\n","import {\n arrayToDataFrame,\n DataFrame,\n DataQueryRequest,\n DataQueryResponse,\n DataSourceApi,\n DataSourceInstanceSettings,\n ScopedVars,\n TimeRange,\n} from '@grafana/data';\nimport { BackendSrvRequest, getBackendSrv, getTemplateSrv } from '@grafana/runtime';\nimport { isArray } from 'lodash';\nimport { firstValueFrom } from 'rxjs';\n\nimport { Check, CheckAlertDraft, Probe, ThresholdSettings } from '../types';\nimport {\n AccessTokenResponse,\n AddCheckResult,\n type AddProbeResult,\n AdHocCheckResponse,\n CheckAlertsResponse,\n CheckInfoResult,\n DeleteCheckResult,\n DeleteProbeResult,\n ListCheckResult,\n ListProbeResult,\n ListTenantLimitsResponse,\n ListTenantSettingsResult,\n LogsQueryResponse,\n type ResetProbeTokenResult,\n TenantResponse,\n UpdateCheckResult,\n type UpdateProbeResult,\n type UpdateTenantSettingsResult,\n} from './responses.types';\nimport { QueryType, SMOptions, SMQuery } from './types';\nimport { findLinkedDatasource, getRandomProbes, queryLogs } from 'utils';\nimport { ExtendedBulkUpdateCheckResult } from 'data/useChecks';\nimport { ExperimentalSecret, ExperimentalSecretsResponse } from 'data/useSecrets';\nimport { SecretFormValues } from 'page/ConfigPageLayout/tabs/SecretsManagementTab/SecretsManagementTab.utils';\n\nimport { parseTracerouteLogs } from './traceroute-utils';\n\nexport class SMDataSource extends DataSourceApi {\n constructor(public instanceSettings: DataSourceInstanceSettings) {\n super(instanceSettings);\n }\n\n async fetchAPI(url: BackendSrvRequest['url'], options?: Omit) {\n const response = await firstValueFrom(\n getBackendSrv().fetch({\n method: options?.method ?? 'GET',\n url,\n ...options,\n })\n ).catch((error: unknown) => {\n // We could log the error here\n\n throw error;\n });\n\n return response?.data as T;\n }\n\n interpolateVariablesInQueries(queries: SMQuery[], scopedVars: {} | ScopedVars): SMQuery[] {\n const interpolated: SMQuery[] = [];\n const templateSrv = getTemplateSrv();\n queries.forEach((query) => {\n let probe = query.probe ?? '$probe';\n if (!isArray(probe) && probe?.startsWith('$')) {\n probe = templateSrv.replace(probe, scopedVars).replace('{', '').replace('}', '').split(',').join('|');\n }\n if (isArray(probe)) {\n probe = probe.join('|');\n }\n if (probe === '$probe') {\n probe = '.+';\n }\n\n const job = templateSrv.replace(query.job, scopedVars);\n const instance = templateSrv.replace(query.instance, scopedVars);\n\n interpolated.push({\n ...query,\n job,\n instance,\n probe,\n });\n });\n return interpolated;\n }\n\n // these are assumptions which may not hold true in all cases\n // see https://github.com/grafana/synthetic-monitoring-app/pull/911 for more details\n getMetricsDS() {\n const info = this.instanceSettings.jsonData.metrics;\n const ds = findLinkedDatasource({ ...info, uid: 'grafanacloud-metrics' });\n if (ds) {\n return ds;\n }\n return findLinkedDatasource(info);\n }\n\n getLogsDS() {\n const info = this.instanceSettings.jsonData.logs;\n const ds = findLinkedDatasource({ ...info, uid: 'grafanacloud-logs' });\n if (ds) {\n return ds;\n }\n return findLinkedDatasource(this.instanceSettings.jsonData.logs);\n }\n\n async query(options: DataQueryRequest): Promise {\n const data: DataFrame[] = [];\n const interpolated = this.interpolateVariablesInQueries(options.targets, options.scopedVars);\n for (const query of interpolated) {\n if (query.queryType === QueryType.Probes) {\n const probes = await this.listProbes();\n const frame = arrayToDataFrame(\n probes.map((probe) => {\n return {\n ...probe,\n onlineChange: probe.onlineChange * 1000,\n created: probe.created ?? 0 * 1000,\n modified: probe.modified ?? 0 * 1000,\n };\n })\n );\n frame.refId = query.refId;\n // frame.setFieldType('onlineChange', FieldType.time, (s) => (s as number) * 1000); // seconds to ms\n // frame.setFieldType('created', FieldType.time, (s) => (s as number) * 1000); // seconds to ms\n // frame.setFieldType('modified', FieldType.time, (s) => (s as number) * 1000); // seconds to ms\n // frame.refId = query.refId;\n data.push(frame);\n } else if (query.queryType === QueryType.Checks) {\n const checks = await this.listChecks();\n const frame = arrayToDataFrame(\n checks.map((check) => {\n return {\n ...check,\n created: check.created ?? 0 * 1000, // seconds to ms\n modified: check.modified ?? 0 * 1000, // seconds to ms\n };\n })\n );\n // frame.setFieldType('created', FieldType.time, (s) => (s as number) * 1000); // seconds to ms\n // frame.setFieldType('modified', FieldType.time, (s) => (s as number) * 1000); // seconds to ms\n frame.refId = query.refId;\n\n const copy: DataFrame = {\n ...frame,\n fields: frame.fields,\n length: checks.length,\n };\n\n data.push(copy);\n } else if (query.queryType === QueryType.Traceroute) {\n const logsUrl = this.getLogsDS()?.url;\n\n if (!logsUrl) {\n return {\n data: [],\n error: {\n data: {\n message: 'Could not find a Loki datasource',\n },\n },\n };\n }\n\n if (!query.job || !query.instance) {\n return {\n data: [],\n error: {\n data: {\n message: 'A check must be selected',\n },\n },\n };\n }\n\n const finalQuery = `{probe=~\"${query.probe ?? '.+'}\", job=\"${query.job}\", instance=\"${\n query.instance\n }\", check_name=\"traceroute\"} | logfmt`;\n\n const response = await queryLogs(this.getLogsDS()?.uid ?? '', finalQuery, options.range);\n\n const dataFrames = parseTracerouteLogs(response);\n\n return { data: dataFrames };\n }\n }\n return { data };\n }\n\n getProbeValueFromVar(probe: string | string[] | undefined): string {\n const allProbes = '.+';\n const isArray = Array.isArray(probe);\n\n if (!probe || (!isArray && (!probe || probe === '$__all'))) {\n return allProbes;\n }\n if (isArray && probe.length > 1) {\n return (probe as string[]).join('|');\n } else if (isArray && probe.length === 1) {\n if (!probe[0] || probe[0] === '$__all') {\n return allProbes;\n }\n return probe[0];\n }\n\n return allProbes;\n }\n\n async getCheckInfo() {\n return this.fetchAPI(`${this.instanceSettings.url}/sm/checks/info`);\n }\n\n async queryLogs(expr: string, range: TimeRange) {\n return this.fetchAPI(`/api/ds/query`, {\n method: 'POST',\n data: {\n queries: [\n {\n refId: 'A',\n expr,\n queryType: 'range',\n datasource: this.instanceSettings.jsonData.logs,\n intervalMs: 2000,\n maxDataPoints: 1779,\n },\n ],\n from: String(range.from.unix() * 1000),\n to: String(range.to.unix() * 1000),\n },\n }).then((data) => data.results.A.frames);\n }\n\n //--------------------------------------------------------------------------------\n // PROBES\n //--------------------------------------------------------------------------------\n\n async listProbes() {\n return this.fetchAPI(`${this.instanceSettings.url}/sm/probe/list`);\n }\n\n async addProbe(probe: Probe) {\n return this.fetchAPI(`${this.instanceSettings.url}/sm/probe/add`, {\n method: 'POST',\n data: probe,\n });\n }\n\n async updateProbe(probe: Probe) {\n return this.fetchAPI(`${this.instanceSettings.url}/sm/probe/update`, {\n method: 'POST',\n data: probe,\n });\n }\n\n async resetProbeToken(probe: Probe) {\n return this.fetchAPI(`${this.instanceSettings.url}/sm/probe/update?reset-token=true`, {\n method: 'POST',\n data: probe,\n });\n }\n\n async deleteProbe(id: number) {\n return this.fetchAPI(`${this.instanceSettings.url}/sm/probe/delete/${id}`, { method: 'DELETE' });\n }\n\n //--------------------------------------------------------------------------------\n // CHECKS\n //--------------------------------------------------------------------------------\n\n async listChecks() {\n return this.fetchAPI(`${this.instanceSettings.url}/sm/check/list`);\n }\n\n async getCheck(checkId: number) {\n return this.fetchAPI(`${this.instanceSettings.url}/sm/check/${checkId}`);\n }\n\n async testCheck(check: Check) {\n const payload = getTestPayload(check);\n return this.fetchAPI(`${this.instanceSettings.url}/sm/check/adhoc`, {\n method: 'POST',\n data: payload,\n });\n }\n\n async addCheck(check: Check) {\n return this.fetchAPI(`${this.instanceSettings.url}/sm/check/add`, {\n method: 'POST',\n data: check,\n });\n }\n\n async deleteCheck(id: number) {\n return this.fetchAPI(`${this.instanceSettings.url}/sm/check/delete/${id}`, { method: 'DELETE' });\n }\n\n async updateCheck(check: Check) {\n return this.fetchAPI(`${this.instanceSettings.url}/sm/check/update`, {\n method: 'POST',\n data: check,\n });\n }\n\n async bulkUpdateChecks(checks: Check[]) {\n return this.fetchAPI(`${this.instanceSettings.url}/sm/check/update/bulk`, {\n method: 'POST',\n data: checks,\n });\n }\n\n async getTenant() {\n return this.fetchAPI(`${this.instanceSettings.url}/sm/tenant`);\n }\n\n async getTenantLimits() {\n return this.fetchAPI(`${this.instanceSettings.url}/sm/tenant/limits`);\n }\n\n async getTenantSettings() {\n return this.fetchAPI(`${this.instanceSettings.url}/sm/tenant/settings`);\n }\n\n async updateTenantSettings(settings: { thresholds: ThresholdSettings }) {\n return this.fetchAPI(`${this.instanceSettings.url}/sm/tenant/settings/update`, {\n method: 'POST',\n data: {\n ...settings,\n },\n });\n }\n\n async disableTenant(): Promise {\n const tenant = await this.getTenant();\n return this.fetchAPI(`${this.instanceSettings.url}/sm/tenant/update`, {\n method: 'POST',\n data: {\n ...tenant,\n status: 1,\n },\n });\n }\n\n //--------------------------------------------------------------------------------\n // ALERTS PER CHECK\n //--------------------------------------------------------------------------------\n // Note: this endpoints are not yet released. The prototype can be seen here https://github.com/grafana/synthetic-monitoring-api/pull/992\n\n async listAlertsForCheck(checkId: number) {\n return this.fetchAPI(`${this.instanceSettings.url}/sm/check/${checkId}/alerts`);\n }\n\n async updateAlertsForCheck(alerts: CheckAlertDraft[], checkId: number) {\n return this.fetchAPI(`${this.instanceSettings.url}/sm/check/${checkId}/alerts`, {\n method: 'PUT',\n data: { alerts },\n });\n }\n\n //--------------------------------------------------------------------------------\n // SETUP\n //--------------------------------------------------------------------------------\n\n normalizeURL(url: string): string {\n if (url.startsWith('http://')) {\n return url;\n } else if (url.startsWith('https://')) {\n return url;\n } else {\n return 'https://' + url;\n }\n }\n\n onOptionsChange = async (options: SMOptions) => {\n const data = {\n ...this.instanceSettings,\n jsonData: options,\n access: 'proxy',\n };\n await getBackendSrv().put(`api/datasources/${this.instanceSettings.id}`, data);\n };\n\n async registerSave(apiToken: string, options: SMOptions, accessToken: string): Promise {\n const data = {\n ...this.instanceSettings,\n jsonData: options,\n secureJsonData: {\n accessToken,\n },\n access: 'proxy',\n };\n await getBackendSrv().put(`api/datasources/${this.instanceSettings.id}`, data);\n\n // Note the accessToken above must be saved first!\n return await getBackendSrv().fetch({\n method: 'POST',\n url: `${this.instanceSettings.url}/sm/register/save`,\n headers: {\n // ensure the grafana backend doesn't use a cached copy of the\n // datasource config, as it might not have the new accessToken set.\n 'X-Grafana-NoCache': 'true',\n },\n data: {\n apiToken,\n metricsInstanceId: options.metrics.hostedId,\n logsInstanceId: options.logs.hostedId,\n },\n });\n }\n\n async createApiToken(): Promise {\n return this.fetchAPI(`${this.instanceSettings.url}/sm/token/create`, {\n method: 'POST',\n data: {},\n }).then((data) => data.token);\n }\n\n //--------------------------------------------------------------------------------\n // SECRETS MANAGEMENT - DEV ONLY\n //--------------------------------------------------------------------------------\n\n async getSecrets(): Promise {\n return this.fetchAPI(`${this.instanceSettings.url}/api/v1alpha1/secrets`, {\n method: 'GET',\n });\n }\n\n async getSecret(id: string | number): Promise {\n return this.fetchAPI(`${this.instanceSettings.url}/api/v1alpha1/secrets/${id}`, {\n method: 'GET',\n });\n }\n\n async saveSecret(secret: SecretFormValues & { uuid?: string }): Promise {\n if (secret.uuid) {\n return this.fetchAPI(`${this.instanceSettings.url}/api/v1alpha1/secrets/${secret.uuid}`, {\n method: 'PUT',\n data: secret,\n });\n }\n return this.fetchAPI(`${this.instanceSettings.url}/api/v1alpha1/secrets`, {\n method: 'POST',\n data: secret,\n });\n }\n\n async deleteSecret(id: string | number): Promise {\n return this.fetchAPI(`${this.instanceSettings.url}/api/v1alpha1/secrets/${id}`, {\n method: 'DELETE',\n });\n }\n\n //--------------------------------------------------------------------------------\n // TEST\n //--------------------------------------------------------------------------------\n\n async testDatasource() {\n const probes = await this.listProbes();\n if (probes.length) {\n return {\n status: 'OK',\n message: `Found ${probes.length} probes`,\n };\n }\n return {\n status: 'Error',\n message: 'unable to connect',\n };\n }\n}\n\nfunction getTestPayload(check: Check) {\n const randomSelection = getRandomProbes(check.probes, 5);\n\n if (check.id) {\n const { id, ...rest } = check;\n return {\n ...rest,\n probes: randomSelection,\n };\n }\n\n return {\n ...check,\n probes: randomSelection,\n };\n}\n","import React, { PureComponent } from 'react';\nimport { QueryEditorProps, SelectableValue } from '@grafana/data';\nimport { getTemplateSrv } from '@grafana/runtime';\nimport { MultiSelect, Select, Spinner } from '@grafana/ui';\nimport { css } from '@emotion/css';\nimport { defaults } from 'lodash';\n\nimport { defaultQuery, QueryType, SMOptions, SMQuery } from './types';\nimport { CheckType, Probe } from 'types';\nimport { getCheckType } from 'utils';\n\nimport { SMDataSource } from './DataSource';\n\ntype Props = QueryEditorProps;\n\ninterface TracerouteCheckOptionValue {\n job: string;\n instance: string;\n probes: number[];\n}\n\ninterface State {\n tracerouteCheckOptions: Array>;\n tracerouteCheckOptionsLoading: boolean;\n probes: Probe[];\n // tracerouteProbeOptions: Array>;\n}\n\nconst types = [\n { label: 'Probes', value: QueryType.Probes },\n { label: 'Checks', value: QueryType.Checks },\n { label: 'Traceroute', value: QueryType.Traceroute },\n];\n\nconst getStyles = () => ({\n tracerouteFieldWrapper: css`\n display: flex;\n flex-direction: row;\n margin-bottom: 8px;\n `,\n marginRight: css`\n margin-right: 8px;\n `,\n});\n\nfunction getProbeOptionsForCheck(check: TracerouteCheckOptionValue | undefined, probes: Probe[]) {\n if (check === undefined) {\n return [];\n }\n const probeOptions = [] as Array>;\n check.probes.forEach((probeId: number) => {\n const probe = probes.find((probe) => probeId === probe.id);\n if (!probe) {\n return;\n }\n return probeOptions.push({\n value: probe.name,\n label: probe.name,\n });\n });\n return probeOptions;\n}\n\nexport class QueryEditor extends PureComponent {\n constructor(props: Props) {\n super(props);\n this.state = {\n tracerouteCheckOptions: [],\n tracerouteCheckOptionsLoading: true,\n probes: [],\n // tracerouteProbeOptions: [],\n };\n }\n\n componentDidMount() {\n this.getTracerouteCheckOptions();\n }\n\n getTracerouteCheckOptions = async () => {\n const { datasource } = this.props;\n const checks = await datasource.listChecks();\n const probes = await datasource.listProbes();\n\n const tracerouteCheckOptions = checks\n .filter((check) => getCheckType(check.settings) === CheckType.Traceroute)\n .map>((check) => {\n return {\n value: {\n instance: check.target,\n job: check.job,\n probes: check.probes,\n },\n label: check.job,\n description: check.target,\n };\n });\n\n this.setState({\n tracerouteCheckOptions,\n probes,\n tracerouteCheckOptionsLoading: false,\n });\n };\n\n onQueryTypeChanged = (item: SelectableValue) => {\n const { onChange, onRunQuery, query } = this.props;\n\n if (!item.value) {\n return;\n }\n onChange({\n ...query,\n queryType: item.value!,\n instance: '',\n job: '',\n probe: '',\n });\n onRunQuery();\n };\n\n onTracerouteCheckChange = async (check: SelectableValue) => {\n const { onChange, onRunQuery, query } = this.props;\n onChange({\n ...query,\n queryType: QueryType.Traceroute,\n instance: check.value?.instance,\n job: check.value?.job,\n probe: undefined,\n });\n onRunQuery();\n };\n\n onTracerouteProbeChange = async (probe: Array>) => {\n const { onChange, onRunQuery, query } = this.props;\n onChange({\n ...query,\n probe: probe\n .map(({ value }) => value ?? '')\n .filter((val) => Boolean(val))\n .join('|'),\n });\n onRunQuery();\n };\n\n getSelectedTracerouteOption(): TracerouteCheckOptionValue | undefined {\n const { query } = this.props;\n const { tracerouteCheckOptions } = this.state;\n const templateSrv = getTemplateSrv();\n let instance: string | undefined = templateSrv.replace('$instance');\n if (instance === '$instance') {\n instance = query.instance;\n }\n let job: string | undefined = templateSrv.replace('$job');\n if (job === '$job') {\n job = query.job;\n }\n\n const selected = tracerouteCheckOptions.find(\n (option) => option.value?.job === job && option.value?.instance === instance\n );\n\n if (instance && job && selected) {\n return selected?.value;\n }\n return undefined;\n }\n\n getSelectedTracerouteProbeOptions(): Array> {\n const { query } = this.props;\n const templateSrv = getTemplateSrv();\n let probe: string | undefined = templateSrv.replace('$probe');\n if (probe === '$probe') {\n probe = query.probe;\n }\n return (\n probe\n ?.replace('{', '')\n .replace('}', '')\n .split(/[\\|\\,]/)\n .map((probe) => ({ label: probe, value: probe })) ?? []\n );\n }\n\n isOverridenByDashboardVariable(): boolean {\n const templateSrv = getTemplateSrv();\n const instance = templateSrv.replace('$instance');\n const job = templateSrv.replace('$job');\n return instance !== '$instance' && job !== '$job';\n }\n\n render() {\n const query = defaults(this.props.query, defaultQuery);\n const { tracerouteCheckOptions, tracerouteCheckOptionsLoading, probes } = this.state;\n const styles = getStyles();\n\n if (tracerouteCheckOptionsLoading) {\n return ;\n }\n const selectedTracerouteOption = this.getSelectedTracerouteOption();\n const probeOptions = getProbeOptionsForCheck(selectedTracerouteOption, probes);\n const selectedProbeOptions = this.getSelectedTracerouteProbeOptions();\n return (\n
\n
\n t.value === query.queryType)}\n onChange={this.onQueryTypeChanged}\n />\n
\n {query.queryType === QueryType.Traceroute && (\n <>\n
\n option.value === selectedTracerouteOption)}\n onChange={this.onTracerouteCheckChange}\n disabled={this.isOverridenByDashboardVariable()}\n />\n
\n
\n \n
\n \n )}\n
\n );\n }\n}\n"],"names":["module","exports","__WEBPACK_EXTERNAL_MODULE__819__","__WEBPACK_EXTERNAL_MODULE__1269__","__WEBPACK_EXTERNAL_MODULE__1308__","__WEBPACK_EXTERNAL_MODULE__2007__","__WEBPACK_EXTERNAL_MODULE__3241__","__WEBPACK_EXTERNAL_MODULE__5959__","__WEBPACK_EXTERNAL_MODULE__6089__","__WEBPACK_EXTERNAL_MODULE__7781__","__WEBPACK_EXTERNAL_MODULE__8531__","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","undefined","__webpack_modules__","n","getter","__esModule","d","a","definition","key","o","Object","defineProperty","enumerable","get","obj","prop","prototype","hasOwnProperty","call","r","Symbol","toStringTag","value","p","slice","lastIndexOf","ConfigEditor","PureComponent","render","onOptionsChange","options","this","props","ConfigEditorContent","secureJsonData","br","div","className","LegacyForms","SecretFormField","isConfigured","accessToken","label","placeholder","labelWidth","inputWidth","onReset","secureJsonFields","resetAccessToken","onChange","event","target","QueryType","defaultQuery","queryType","CheckType","CheckTypeGroup","FeatureName","CheckStatus","isFeatureEnabled","name","featuresParam","urlUtil","getUrlSearchParams","isEnabledThroughQueryParam","isArray","includes","Boolean","config","featureToggles","createContext","HTTP","ApiTest","PING","GRPC","EXPERIMENTAL","GRPCChecks","DNS","TCP","Traceroute","MULTI_HTTP","MultiStep","Scripted","ScriptedChecks","Browser","PUBLIC_PREVIEW","BrowserChecks","findLinkedDatasource","linkedDSInfo","uid","linkedDS","values","datasources","find","ds","grafanaName","getCheckType","settings","types","keys","length","queryLogs","dsUid","expr","range","getBackendSrv","post","queries","refId","datasource","type","maxLines","legendFormat","intervalMs","maxDataPoints","from","to","results","frames","data","parseTracerouteLogs","queryResponse","edgeIdField","edgeSourceField","edgeTargetField","NodeGraphDataFrameFieldNames","id","FieldType","string","source","mostRecentTraceId","destinations","Set","groupedByTraceID","reduce","acc","stream","traceId","TracerouteID","hosts","Hosts","TTL","probe","split","add","Destination","updatedStream","parseInt","push","LossPercent","ElapsedTime","Success","groupedByHost","entries","streamArray","sort","b","forEach","index","arr","host","nextHosts","has","currentTTL","streamArr","nextHostStreamIndex","findIndex","addresses","findNextHosts","currentHost","nextHost","elapsedTimes","packetLossAverages","isMostRecent","isStart","nodeIdField","nodeTitleField","nodeMainStatField","nodeDestinationField","nodeStartField","nodeMostRecentDestinationField","nodeSuccessField","nodeErrorField","displayName","title","mainStat","number","unit","arc","color","fixedColor","mode","FieldColorModeId","Fixed","getNodeGraphFields","hostData","averageElapsedTime","totalTime","elapsedTime","cleanedString","replace","packetLossStat","packetLoss","packetSuccessStat","Math","round","Array","createDataFrame","fields","meta","preferredVisualisationType","SMDataSource","DataSourceApi","fetchAPI","url","response","firstValueFrom","fetch","method","catch","error","interpolateVariablesInQueries","scopedVars","interpolated","templateSrv","getTemplateSrv","query","startsWith","join","job","instance","getMetricsDS","info","instanceSettings","jsonData","metrics","getLogsDS","logs","targets","Probes","probes","listProbes","frame","arrayToDataFrame","map","onlineChange","created","modified","Checks","checks","listChecks","check","copy","message","finalQuery","getProbeValueFromVar","allProbes","getCheckInfo","String","unix","then","A","addProbe","updateProbe","resetProbeToken","deleteProbe","getCheck","checkId","testCheck","payload","randomSelection","quantity","randomProbes","size","floor","random","getRandomProbes","rest","getTestPayload","addCheck","deleteCheck","updateCheck","bulkUpdateChecks","getTenant","getTenantLimits","getTenantSettings","updateTenantSettings","disableTenant","tenant","status","listAlertsForCheck","updateAlertsForCheck","alerts","normalizeURL","registerSave","apiToken","access","put","headers","metricsInstanceId","hostedId","logsInstanceId","createApiToken","token","getSecrets","getSecret","saveSecret","secret","uuid","deleteSecret","testDatasource","constructor","super","QueryEditor","componentDidMount","getTracerouteCheckOptions","getSelectedTracerouteOption","tracerouteCheckOptions","state","selected","option","getSelectedTracerouteProbeOptions","isOverridenByDashboardVariable","defaults","tracerouteCheckOptionsLoading","styles","tracerouteFieldWrapper","css","marginRight","Spinner","selectedTracerouteOption","probeOptions","probeId","getProbeOptionsForCheck","selectedProbeOptions","Select","t","onQueryTypeChanged","prefix","onTracerouteCheckChange","disabled","MultiSelect","allowCustomValue","onTracerouteProbeChange","filter","description","setState","item","onRunQuery","val"],"sourceRoot":""}