diff --git a/.github/workflows/mixin.yml b/.github/workflows/mixin.yml new file mode 100644 index 0000000..4371049 --- /dev/null +++ b/.github/workflows/mixin.yml @@ -0,0 +1,55 @@ +name: mixin +permissions: + contents: read +on: + push: + branches: + - master + paths: + - "celery-mixin/**" + - ".github/workflows/mixin.yml" + pull_request: + paths: + - "celery-mixin/**" + - ".github/workflows/mixin.yml" + +defaults: + run: + working-directory: ./celery-mixin +jobs: + matrix: + runs-on: ubuntu-latest + name: ${{ matrix.name }} + strategy: + fail-fast: false + matrix: + include: + - name: Lint Alerts + run: make --always-make alerts-lint + - name: Generate yaml + run: make --always-make generate && git diff --exit-code + - name: Lint Grafana Dashboards + run: make --always-make dashboards-lint + - name: Format Jsonnet + run: make --always-make jsonnet-fmt && git diff --exit-code + - name: Lint Jsonnet + run: make --always-make jsonnet-lint + - name: Format Markdown + run: make --always-make markdownfmt && git diff --exit-code + - name: Lint Markdown + run: make --always-make vale && git diff --exit-code + - name: Lint YAML + run: make --always-make pint-lint + - name: Run unit tests + run: make --always-make test + + steps: + - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 + with: + persist-credentials: false + - uses: actions/setup-go@d35c59abb061a4a6fb18e82ac0862c26744d6ab5 # v5.5.0 + with: + go-version-file: ./celery-mixin/scripts/go.mod + cache-dependency-path: ./celery-mixin/scripts/go.sum + - run: ${{ matrix.run }} + name: Run ${{ matrix.name }} diff --git a/celery-mixin/.gitignore b/celery-mixin/.gitignore index ced060f..884a5d8 100644 --- a/celery-mixin/.gitignore +++ b/celery-mixin/.gitignore @@ -1,2 +1,4 @@ vendor -jsonnetfile.lock.json +tmp +dashboards_out/.lint +.vale diff --git a/celery-mixin/.lint b/celery-mixin/.lint new file mode 100644 index 0000000..69bcc38 --- /dev/null +++ b/celery-mixin/.lint @@ -0,0 +1,17 @@ +--- +exclusions: + template-job-rule: + reason: Jobs are set to multi in our case. + target-job-rule: + reason: Jobs are set to multi in our case. + template-instance-rule: + reason: We don't use instances. + panel-datasource-rule: + reason: Using a datasource for each panel. + panel-title-description-rule: + reason: TODO(adinhodovic) + target-instance-rule: + reason: We don't use instances. + target-rate-interval-rule: + reason: Intented 1h range. + entries: diff --git a/celery-mixin/.pint.hcl b/celery-mixin/.pint.hcl new file mode 100644 index 0000000..4a47762 --- /dev/null +++ b/celery-mixin/.pint.hcl @@ -0,0 +1,20 @@ +rule { + match { + name = "CeleryTaskHighFailRate" + } + disable = ["promql/regexp"] +} + +rule { + match { + name = "CeleryHighQueueLength" + } + disable = ["promql/regexp"] +} + +rule { + match { + name = "CeleryWorkerDown" + } + disable = ["promql/regexp"] +} diff --git a/celery-mixin/.vale.ini b/celery-mixin/.vale.ini new file mode 100644 index 0000000..6371aeb --- /dev/null +++ b/celery-mixin/.vale.ini @@ -0,0 +1,8 @@ +StylesPath = .vale/styles + +MinAlertLevel = error + +Packages = Readability, write-good, alex + +[*] +BasedOnStyles = Readability, write-good, alex diff --git a/celery-mixin/Makefile b/celery-mixin/Makefile index abf9432..2eacad6 100644 --- a/celery-mixin/Makefile +++ b/celery-mixin/Makefile @@ -1,28 +1,100 @@ -JSONNET_FMT := jsonnetfmt -n 2 --max-blank-lines 2 --string-style s --comment-style s +BIN_DIR ?= $(shell pwd)/tmp/bin -all: fmt prometheus-alerts.yaml dashboards_out lint +JSONNET_VENDOR=vendor +GRAFANA_DASHBOARD_LINTER_BIN=$(BIN_DIR)/dashboard-linter +JB_BIN=$(BIN_DIR)/jb +JSONNET_BIN=$(BIN_DIR)/jsonnet +JSONNETLINT_BIN=$(BIN_DIR)/jsonnet-lint +JSONNETFMT_BIN=$(BIN_DIR)/jsonnetfmt +MD_FILES = $(shell find . \( -type d -name '.vale' -o -type d -name 'vendor' \) -prune -o -type f -name "*.md" -print) +MARKDOWNFMT_BIN=$(BIN_DIR)/markdownfmt +VALE_BIN=$(BIN_DIR)/vale +PROMTOOL_BIN=$(BIN_DIR)/promtool +PINT_BIN=$(BIN_DIR)/pint +TOOLING=$(JB_BIN) $(JSONNETLINT_BIN) $(JSONNET_BIN) $(JSONNETFMT_BIN) $(PROMTOOL_BIN) $(GRAFANA_DASHBOARD_LINTER_BIN) $(MARKDOWNFMT_BIN) $(VALE_BIN) $(PINT_BIN) +JSONNETFMT_ARGS=-n 2 --max-blank-lines 2 --string-style s --comment-style s +SRC_DIR ?=dashboards +OUT_DIR ?=dashboards_out -fmt: - find . -name 'vendor' -prune -o -name '*.libsonnet' -print -o -name '*.jsonnet' -print | \ - xargs -n 1 -- $(JSONNET_FMT) -i +.PHONY: all +all: fmt generate lint test -prometheus-alerts.yaml: mixin.libsonnet config.libsonnet $(wildcard alerts/*) - jsonnet -S alerts.jsonnet > $@ +.PHONY: generate +generate: prometheus_alerts.yaml prometheus_rules.yaml $(OUT_DIR) -dashboards_out: mixin.libsonnet config.libsonnet $(wildcard dashboards/*) - @mkdir -p dashboards_out - jsonnet -J vendor -m dashboards_out dashboards.jsonnet +$(JSONNET_VENDOR): $(JB_BIN) jsonnetfile.json + $(JB_BIN) install -lint: prometheus-alerts.yaml - find . -name 'vendor' -prune -o -name '*.libsonnet' -print -o -name '*.jsonnet' -print | \ - while read f; do \ - $(JSONNET_FMT) "$$f" | diff -u "$$f" -; \ - done +.PHONY: fmt +fmt: jsonnet-fmt markdownfmt - promtool check rules prometheus-alerts.yaml +.PHONY: jsonnet-fmt +jsonnet-fmt: $(JSONNETFMT_BIN) + @find . -name 'vendor' -prune -o -name '*.libsonnet' -print -o -name '*.jsonnet' -print | \ + xargs -n 1 -- $(JSONNETFMT_BIN) $(JSONNETFMT_ARGS) -i -test: prometheus-alerts.yaml - promtool test rules tests.yaml +.PHONY: markdownfmt +markdownfmt: $(MARKDOWNFMT_BIN) + @for file in $(MD_FILES); do $(MARKDOWNFMT_BIN) -w -gofmt $$file; done +prometheus_alerts.yaml: $(JSONNET_BIN) mixin.libsonnet lib/alerts.jsonnet alerts/*.libsonnet + @$(JSONNET_BIN) -J vendor -S lib/alerts.jsonnet > $@ + +prometheus_rules.yaml: $(JSONNET_BIN) mixin.libsonnet lib/rules.jsonnet rules/*.libsonnet + @$(JSONNET_BIN) -J vendor -S lib/rules.jsonnet > $@ + +$(OUT_DIR): $(JSONNET_BIN) $(JSONNET_VENDOR) mixin.libsonnet lib/dashboards.jsonnet $(SRC_DIR)/*.libsonnet + @mkdir -p $(OUT_DIR) + @$(JSONNET_BIN) -J vendor -m $(OUT_DIR) lib/dashboards.jsonnet + +.PHONY: lint +lint: jsonnet-lint alerts-lint dashboards-lint vale pint-lint + +.PHONY: jsonnet-lint +jsonnet-lint: $(JSONNETLINT_BIN) $(JSONNET_VENDOR) + @find . -name 'vendor' -prune -o -name '*.libsonnet' -print -o -name '*.jsonnet' -print | \ + xargs -n 1 -- $(JSONNETLINT_BIN) -J vendor + +.PHONY: alerts-lint +alerts-lint: $(PROMTOOL_BIN) prometheus_alerts.yaml prometheus_rules.yaml + @$(PROMTOOL_BIN) check rules prometheus_rules.yaml + @$(PROMTOOL_BIN) check rules prometheus_alerts.yaml + +$(OUT_DIR)/.lint: $(OUT_DIR) + @cp .lint $@ + +.PHONY: dashboards-lint +dashboards-lint: $(GRAFANA_DASHBOARD_LINTER_BIN) $(OUT_DIR)/.lint + # Replace $$interval:$$resolution var with $$__rate_interval to make dashboard-linter happy. + @sed -i -e 's/$$interval:$$resolution/$$__rate_interval/g' $(OUT_DIR)/*.json + @find $(OUT_DIR) -name '*.json' ! -name 'celery-tasks.json' -print0 | xargs -n 1 -0 $(GRAFANA_DASHBOARD_LINTER_BIN) lint --strict + +.PHONY: vale +vale: $(VALE_BIN) + @$(VALE_BIN) sync && \ + $(VALE_BIN) $(MD_FILES) + +.PHONY: pint-lint +pint-lint: generate $(PINT_BIN) + @# Pint will not exit with a non-zero status code if there are linting issues. + @output=$$($(PINT_BIN) -n -o -l WARN lint prometheus_alerts.yaml prometheus_rules.yaml 2>&1); \ + if [ -n "$$output" ]; then \ + echo "\n$$output"; \ + exit 1; \ + fi + +.PHONY: clean clean: - rm -rf dashboards_out prometheus-alerts.yaml + # Remove all files and directories ignored by git. + git clean -Xfd . + +.PHONY: test +test: $(PROMTOOL_BIN) prometheus_alerts.yaml prometheus_rules.yaml + @$(PROMTOOL_BIN) test rules tests/*.yaml + +$(BIN_DIR): + mkdir -p $(BIN_DIR) + +$(TOOLING): $(BIN_DIR) + @echo Installing tools from hack/tools.go + @cd scripts && go list -e -mod=mod -tags tools -f '{{ range .Imports }}{{ printf "%s\n" .}}{{end}}' ./ | xargs -tI % go build -mod=mod -o $(BIN_DIR) % diff --git a/celery-mixin/README.md b/celery-mixin/README.md index 00caabf..4c96fa1 100644 --- a/celery-mixin/README.md +++ b/celery-mixin/README.md @@ -4,8 +4,7 @@ A set of Grafana dashboards and Prometheus alerts for Celery. ## How to use -This mixin is designed to be vendored into the repo with your infrastructure config. -To do this, use [jsonnet-bundler](https://github.com/jsonnet-bundler/jsonnet-bundler): +This mixin is designed to be vendored into the repo with your infrastructure config. To do this, use [jsonnet-bundler](https://github.com/jsonnet-bundler/jsonnet-bundler): You then have three options for deploying your dashboards @@ -15,8 +14,7 @@ You then have three options for deploying your dashboards ## Generate config files -You can manually generate the alerts, dashboards and rules files, but first you -must install some tools: +You can manually generate the alerts, dashboards and rules files, but first you must install some tools: ```sh go get github.com/jsonnet-bundler/jsonnet-bundler/cmd/jb @@ -38,10 +36,7 @@ make prometheus-alerts.yaml make dashboards_out ``` -The `prometheus-alerts.yaml` file then need to passed -to your Prometheus server, and the files in `dashboards_out` need to be imported -into you Grafana server. The exact details will depending on how you deploy your -monitoring stack. +The `prometheus-alerts.yaml` file then need to passed to your Prometheus server, and the files in `dashboards_out` need to be imported into you Grafana server. The exact details will depending on how you deploy your monitoring stack. ## Alerts diff --git a/celery-mixin/alerts/alerts.libsonnet b/celery-mixin/alerts/alerts.libsonnet index 2a48448..dd4b38a 100644 --- a/celery-mixin/alerts/alerts.libsonnet +++ b/celery-mixin/alerts/alerts.libsonnet @@ -43,7 +43,7 @@ annotations: { summary: 'Celery high task fail rate.', description: 'More than %(celeryTaskFailedThreshold)s%% tasks failed for the task {{ $labels.job }}/{{ $labels.queue_name }}/{{ $labels.name }} the past %(celeryTaskFailedInterval)s.' % $._config, - dashboard_url: $._config.celeryTasksByTaskUrl + '?var-job={{ $labels.job }}&var-queue_name={{ $labels.queue_name }}&var-task={{ $labels.name }}', + dashboard_url: $._config.dashboardUrls['celery-tasks-by-task'] + '?var-job={{ $labels.job }}&var-queue_name={{ $labels.queue_name }}&var-task={{ $labels.name }}', }, 'for': '1m', labels: { @@ -68,7 +68,7 @@ annotations: { summary: 'Celery high queue length.', description: 'More than %(celeryHighQueueLengthThreshold)s tasks in the queue {{ $labels.job }}/{{ $labels.queue_name }} the past %(celeryHighQueueLengthInterval)s.' % $._config, - dashboard_url: $._config.celeryTasksOverviewUrl + '?&var-job={{ $labels.job }}&var-queue_name={{ $labels.queue_name }}', + dashboard_url: $._config.dashboardUrls['celery-tasks-overview'] + '?&var-job={{ $labels.job }}&var-queue_name={{ $labels.queue_name }}', }, }, if $._config.celeryWorkerDownAlertEnabled then { @@ -83,7 +83,7 @@ annotations: { summary: 'A Celery worker is offline.', description: 'The Celery worker {{ $labels.job }}/{{ $labels.hostname }} is offline.', - dashboard_url: $._config.celeryTasksOverviewUrl + '?&var-job={{ $labels.job }}', + dashboard_url: $._config.dashboardUrls['celery-tasks-overview'] + '?&var-job={{ $labels.job }}', }, }, ]), diff --git a/celery-mixin/config.libsonnet b/celery-mixin/config.libsonnet index c667e07..4035132 100644 --- a/celery-mixin/config.libsonnet +++ b/celery-mixin/config.libsonnet @@ -1,24 +1,22 @@ -local g = import 'github.com/grafana/grafonnet/gen/grafonnet-latest/main.libsonnet'; -local annotation = g.dashboard.annotation; - { _config+:: { + local this = self, + // Selectors are inserted between {} in Prometheus queries. celerySelector: 'job=~".*celery.*"', + // Default datasource name + datasourceName: 'default', + + // Opt-in to multiCluster dashboards by overriding this and the clusterLabel. + showMultiCluster: false, + clusterLabel: 'cluster', + grafanaUrl: 'https://grafana.com', celeryIgnoredTasks: 'None', celeryIgnoredQueues: 'None', - celeryTasksOverviewUid: 'celery-tasks-overview-32s3', - celeryTasksByTaskUid: 'celery-tasks-by-task-32s3', - - celeryTasksOverviewUrl: '%s/d/%s/celery-tasks-overview' % [self.grafanaUrl, self.celeryTasksOverviewUid], - celeryTasksByTaskUrl: '%s/d/%s/celery-tasks-by-task' % [self.grafanaUrl, self.celeryTasksByTaskUid], - - tags: ['celery', 'celery-mixin'], - // If you have autoscaling workers then you maybe do not want to alert on workers that are down. celeryWorkerDownAlertEnabled: true, celeryCeleryHighQueueLengthAlertEnabled: true, @@ -29,23 +27,25 @@ local annotation = g.dashboard.annotation; celeryHighQueueLengthThreshold: '100', celeryWorkerDownInterval: '15m', + dashboardIds: { + 'celery-tasks-overview': 'celery-tasks-overview-32s3', + 'celery-tasks-by-task': 'celery-tasks-by-task-32s3', + }, + dashboardUrls: { + 'celery-tasks-overview': '%s/d/%s/celery-tasks-overview' % [this.grafanaUrl, this.dashboardIds['celery-tasks-overview']], + 'celery-tasks-by-task': '%s/d/%s/celery-tasks-by-task' % [this.grafanaUrl, this.dashboardIds['celery-tasks-by-task']], + }, + + tags: ['celery', 'celery-mixin'], + // Custom annotations to display in graphs annotation: { enabled: false, name: 'Custom Annotation', - datasource: '-- Grafana --', - iconColor: 'green', tags: [], + datasource: '-- Grafana --', + iconColor: 'blue', + type: 'tags', }, - - customAnnotation:: if $._config.annotation.enabled then - annotation.withName($._config.annotation.name) + - annotation.withIconColor($._config.annotation.iconColor) + - annotation.withHide(false) + - annotation.datasource.withUid($._config.annotation.datasource) + - annotation.target.withMatchAny(true) + - annotation.target.withTags($._config.annotation.tags) + - annotation.target.withType('tags') - else {}, }, } diff --git a/celery-mixin/dashboards/celery-tasks-by-task.libsonnet b/celery-mixin/dashboards/celery-tasks-by-task.libsonnet index fb6b6d3..f160118 100644 --- a/celery-mixin/dashboards/celery-tasks-by-task.libsonnet +++ b/celery-mixin/dashboards/celery-tasks-by-task.libsonnet @@ -1,556 +1,383 @@ local g = import 'github.com/grafana/grafonnet/gen/grafonnet-latest/main.libsonnet'; +local dashboardUtil = import 'util.libsonnet'; local dashboard = g.dashboard; local row = g.panel.row; local grid = g.util.grid; -local variable = dashboard.variable; -local datasource = variable.datasource; -local query = variable.query; -local prometheus = g.query.prometheus; - local timeSeriesPanel = g.panel.timeSeries; local tablePanel = g.panel.table; // Timeseries -local tsOptions = timeSeriesPanel.options; local tsStandardOptions = timeSeriesPanel.standardOptions; -local tsQueryOptions = timeSeriesPanel.queryOptions; -local tsFieldConfig = timeSeriesPanel.fieldConfig; -local tsCustom = tsFieldConfig.defaults.custom; -local tsLegend = tsOptions.legend; local tsOverride = tsStandardOptions.override; // Table -local tbOptions = tablePanel.options; local tbStandardOptions = tablePanel.standardOptions; local tbQueryOptions = tablePanel.queryOptions; local tbOverride = tbStandardOptions.override; { + local dashboardName = 'celery-tasks-by-task', grafanaDashboards+:: { + ['%s.json' % dashboardName]: - local datasourceVariable = - datasource.new( - 'datasource', - 'prometheus', - ) + - datasource.generalOptions.withLabel('Data source'), + local defaultVariables = dashboardUtil.variables($._config); - local namespaceVariable = - query.new( - 'namespace', - 'label_values(celery_worker_up{}, namespace)' - ) + - query.withDatasourceFromVariable(datasourceVariable) + - query.withSort(1) + - query.generalOptions.withLabel('Namespace') + - query.selectionOptions.withMulti(false) + - query.selectionOptions.withIncludeAll(false) + - query.refresh.onLoad() + - query.refresh.onTime(), + local variables = [ + defaultVariables.datasource, + defaultVariables.cluster, + defaultVariables.namespace, + defaultVariables.job, + defaultVariables.queueName, + defaultVariables.task, + ]; + local defaultFilters = dashboardUtil.filters($._config); + local queries = { - local jobVariable = - query.new( - 'job', - 'label_values(celery_worker_up{namespace="$namespace"}, job)' - ) + - query.withDatasourceFromVariable(datasourceVariable) + - query.withSort(1) + - query.generalOptions.withLabel('Job') + - query.selectionOptions.withMulti(false) + - query.selectionOptions.withIncludeAll(false) + - query.refresh.onLoad() + - query.refresh.onTime(), + taskExceptions: ||| + round( + sum ( + increase( + celery_task_failed_total{ + %(task)s + }[$__range] + ) + ) by (name, exception) > 0 + ) + ||| % defaultFilters, - local queueNameVariable = - query.new( - 'queue_name', - 'label_values(celery_task_received_total{namespace="$namespace", job="$job", name!~"%(celeryIgnoredQueues)s"}, queue_name)' % $._config - ) + - query.withDatasourceFromVariable(datasourceVariable) + - query.withSort(1) + - query.generalOptions.withLabel('Queue Name') + - query.selectionOptions.withMulti(false) + - query.selectionOptions.withIncludeAll(false) + - query.refresh.onLoad() + - query.refresh.onTime(), + taskFailed: ||| + sum ( + round( + increase( + celery_task_failed_total{ + %(task)s + }[$__range] + ) + ) + ) by (name) > 0 + ||| % defaultFilters, + taskSucceeded: std.strReplace(queries.taskFailed, 'failed', 'succeeded'), + taskSent: std.strReplace(queries.taskFailed, 'failed', 'sent'), + taskReceived: std.strReplace(queries.taskFailed, 'failed', 'received'), + taskRetried: std.strReplace(queries.taskFailed, 'failed', 'retried'), + taskRevoked: std.strReplace(queries.taskFailed, 'failed', 'revoked'), + taskRejected: std.strReplace(queries.taskFailed, 'failed', 'rejected'), + taskSuccessRate: ||| + %s/(%s+%s) > -1 + ||| % [ + // Strip out > 0 from the end of the success query + std.strReplace(queries.taskSucceeded, ' > 0', ''), + std.strReplace(queries.taskSucceeded, ' > 0', ''), + std.strReplace(queries.taskFailed, ' > 0', ''), + ], // Add > -1 to remove NaN results - local taskVariable = - query.new( - 'task', - 'label_values(celery_task_received_total{namespace="$namespace", job="$job", queue_name=~"$queue_name", name!~"%(celeryIgnoredTasks)s"}, name)' % $._config - ) + - query.withDatasourceFromVariable(datasourceVariable) + - query.withSort(1) + - query.generalOptions.withLabel('Task') + - query.selectionOptions.withMulti(true) + - query.selectionOptions.withIncludeAll(false) + - query.refresh.onLoad() + - query.refresh.onTime(), + taskFailedByExceptionInterval: ||| + sum ( + round( + increase( + celery_task_failed_total{ + %(task)s + }[$__rate_interval] + ) + ) + ) by (name, exception) > 0 + ||| % defaultFilters, - local variables = [ - datasourceVariable, - namespaceVariable, - jobVariable, - queueNameVariable, - taskVariable, - ], + taskFailedInterval: ||| + sum ( + round( + increase( + celery_task_failed_total{ + %(task)s + }[$__rate_interval] + ) + ) + ) by (name) > 0 + ||| % defaultFilters, + taskSucceededInterval: std.strReplace(queries.taskFailedInterval, 'failed', 'succeeded'), + taskSentInterval: std.strReplace(queries.taskFailedInterval, 'failed', 'sent'), + taskReceivedInterval: std.strReplace(queries.taskFailedInterval, 'failed', 'received'), + taskRetriedInterval: std.strReplace(queries.taskFailedInterval, 'failed', 'retried'), + taskRevokedInterval: std.strReplace(queries.taskFailedInterval, 'failed', 'revoked'), + taskRejectedInterval: std.strReplace(queries.taskFailedInterval, 'failed', 'rejected'), - local taskExceptionsQuery = ||| - round( - sum ( - increase( - celery_task_failed_total{ - job="$job", - name=~"$task", - queue_name=~"$queue_name" - }[$__range] + tasksRuntimeP50: ||| + histogram_quantile(0.50, + sum( + irate( + celery_task_runtime_bucket{ + %(task)s + }[$__rate_interval] + ) > 0 + ) by (name, job, le) ) - ) by (name, exception) > 0 - ) - |||, - local taskExceptionsTable = - tablePanel.new( - 'Task Exceptions', - ) + - tbStandardOptions.withUnit('short') + - tbOptions.withSortBy( - tbOptions.sortBy.withDisplayName('Value') + - tbOptions.sortBy.withDesc(true) - ) + - tbOptions.footer.withEnablePagination(true) + - tbQueryOptions.withTargets( - prometheus.new( - '$datasource', - taskExceptionsQuery, - ) + - prometheus.withFormat('table') + - prometheus.withInstant(true) - ) + - tbQueryOptions.withTransformations([ - tbQueryOptions.transformation.withId( - 'organize' - ) + - tbQueryOptions.transformation.withOptions( - { - renameByName: { - name: 'Task', - exception: 'Exception', - }, - indexByName: { - name: 0, - exception: 1, - Value: 2, - }, - excludeByName: { - Time: true, - job: true, - }, - } - ), - ]), + ||| % defaultFilters, + tasksRuntimeP95: std.strReplace(queries.tasksRuntimeP50, '0.50', '0.95'), + tasksRuntimeP99: std.strReplace(queries.tasksRuntimeP50, '0.50', '0.99'), + }; - local taskFailedQuery = ||| - sum ( - round( - increase( - celery_task_failed_total{ - job="$job", - name=~"$task", - queue_name=~"$queue_name" - }[$__range] - ) - ) - ) by (name) > 0 - |||, - local taskSucceededQuery = std.strReplace(taskFailedQuery, 'failed', 'succeeded'), - local taskSentQuery = std.strReplace(taskFailedQuery, 'failed', 'sent'), - local taskReceivedQuery = std.strReplace(taskFailedQuery, 'failed', 'received'), - local taskRetriedQuery = std.strReplace(taskFailedQuery, 'failed', 'retried'), - local taskRevokedQuery = std.strReplace(taskFailedQuery, 'failed', 'revoked'), - local taskRejectedQuery = std.strReplace(taskFailedQuery, 'failed', 'rejected'), - local taskSuccessRateQuery = ||| - %s/(%s+%s) > -1 - ||| % [ - // Strip out > 0 from the end of the success query - std.strReplace(taskSucceededQuery, ' > 0', ''), - std.strReplace(taskSucceededQuery, ' > 0', ''), - std.strReplace(taskFailedQuery, ' > 0', ''), - ], // Add > -1 to remove NaN results + local panels = { - local tasksStatsTable = - tablePanel.new( - 'Task Stats', - ) + - tbStandardOptions.withUnit('short') + - tbStandardOptions.withNoValue(0) + - tbOptions.withSortBy( - tbOptions.sortBy.withDisplayName('Succeeded') + - tbOptions.sortBy.withDesc(true) - ) + - tbOptions.footer.withEnablePagination(true) + - tbQueryOptions.withTargets( - [ - prometheus.new( - '$datasource', - taskSuccessRateQuery, - ) + - prometheus.withFormat('table') + - prometheus.withInstant(true), - prometheus.new( - '$datasource', - taskSucceededQuery, - ) + - prometheus.withFormat('table') + - prometheus.withInstant(true), - prometheus.new( - '$datasource', - taskFailedQuery, - ) + - prometheus.withFormat('table') + - prometheus.withInstant(true), - prometheus.new( - '$datasource', - taskSentQuery, - ) + - prometheus.withFormat('table') + - prometheus.withInstant(true), - prometheus.new( - '$datasource', - taskReceivedQuery, - ) + - prometheus.withFormat('table') + - prometheus.withInstant(true), - prometheus.new( - '$datasource', - taskRejectedQuery, - ) + - prometheus.withFormat('table') + - prometheus.withInstant(true), - prometheus.new( - '$datasource', - taskRetriedQuery, - ) + - prometheus.withFormat('table') + - prometheus.withInstant(true), - prometheus.new( - '$datasource', - taskRevokedQuery, - ) + - prometheus.withFormat('table') + - prometheus.withInstant(true), - ] - ) + - tbQueryOptions.withTransformations([ - tbQueryOptions.transformation.withId( - 'merge' - ), - tbQueryOptions.transformation.withId( - 'organize' - ) + - tbQueryOptions.transformation.withOptions( - { - renameByName: { - name: 'Name', - 'Value #A': 'Success Rate', - 'Value #B': 'Succeeded', - 'Value #C': 'Failed', - 'Value #D': 'Sent', - 'Value #E': 'Received', - 'Value #F': 'Rejected', - 'Value #G': 'Retried', - 'Value #H': 'Revoked', - }, - indexByName: { - name: 0, - 'Value #A': 1, - 'Value #B': 2, - 'Value #C': 3, - 'Value #D': 4, - 'Value #E': 5, - 'Value #F': 6, - 'Value #G': 7, - 'Value #H': 8, - }, - excludeByName: { - Time: true, + taskExceptionsTable: + dashboardUtil.tablePanel( + 'Task Exceptions', + 'short', + queries.taskExceptions, + sortBy={ + name: 'Value', + desc: true, }, - } - ), - ]) + - tbStandardOptions.withOverrides([ - tbOverride.byName.new('Success Rate') + - tbOverride.byName.withPropertiesFromOptions( - tbStandardOptions.withUnit('percentunit') - ), - ]), - - local taskFailedByExceptionIntervalQuery = ||| - sum ( - round( - increase( - celery_task_failed_total{ - job="$job", - name=~"$task", - queue_name=~"$queue_name" - }[$__rate_interval] - ) - ) - ) by (name, exception) > 0 - |||, - - local tasksFailedByExceptionTimeSeriesPanel = - timeSeriesPanel.new( - 'Task Exceptions', - ) + - tsQueryOptions.withTargets( - [ - prometheus.new( - '$datasource', - taskFailedByExceptionIntervalQuery, - ) + - prometheus.withLegendFormat( - '{{ name }}/{{ exception }}' + description='A table of task exceptions grouped by task name and exception type.', + transformations=[ + tbQueryOptions.transformation.withId( + 'organize' + ) + + tbQueryOptions.transformation.withOptions( + { + renameByName: { + name: 'Task', + exception: 'Exception', + }, + indexByName: { + name: 0, + exception: 1, + Value: 2, + }, + excludeByName: { + Time: true, + job: true, + }, + } + ), + ] ), - ] - ) + - tsStandardOptions.withUnit('short') + - tsOptions.tooltip.withMode('multi') + - tsOptions.tooltip.withSort('desc') + - tsLegend.withShowLegend(true) + - tsLegend.withDisplayMode('table') + - tsLegend.withPlacement('right') + - tsLegend.withCalcs(['mean', 'max']) + - tsLegend.withSortBy('Mean') + - tsLegend.withSortDesc(true) + - tsCustom.withSpanNulls(false), - local taskFailedIntervalQuery = ||| - sum ( - round( - increase( - celery_task_failed_total{ - job="$job", - name=~"$task", - queue_name=~"$queue_name" - }[$__rate_interval] - ) - ) - ) by (name) > 0 - |||, - local taskSucceededIntervalQuery = std.strReplace(taskFailedIntervalQuery, 'failed', 'succeeded'), - local taskSentIntervalQuery = std.strReplace(taskFailedIntervalQuery, 'failed', 'sent'), - local taskReceivedIntervalQuery = std.strReplace(taskFailedIntervalQuery, 'failed', 'received'), - local taskRetriedIntervalQuery = std.strReplace(taskFailedIntervalQuery, 'failed', 'retried'), - local taskRevokedIntervalQuery = std.strReplace(taskFailedIntervalQuery, 'failed', 'revoked'), - local taskRejectedIntervalQuery = std.strReplace(taskFailedIntervalQuery, 'failed', 'rejected'), - - - local tasksCompletedTimeSeriesPanel = - timeSeriesPanel.new( - 'Tasks Completed', - ) + - tsQueryOptions.withTargets( - [ - prometheus.new( - '$datasource', - taskSucceededIntervalQuery, - ) + - prometheus.withLegendFormat( - 'Succeeded - {{ name }}' - ), - prometheus.new( - '$datasource', - taskFailedIntervalQuery, - ) + - prometheus.withLegendFormat( - 'Failed - {{ name }}' - ), - prometheus.new( - '$datasource', - taskSentIntervalQuery, - ) + - prometheus.withLegendFormat( - 'Sent - {{ name }}' - ), - prometheus.new( - '$datasource', - taskReceivedIntervalQuery, - ) + - prometheus.withLegendFormat( - 'Received - {{ name }}' - ), - prometheus.new( - '$datasource', - taskRetriedIntervalQuery, - ) + - prometheus.withLegendFormat( - 'Retried - {{ name }}' - ), - prometheus.new( - '$datasource', - taskRevokedIntervalQuery, - ) + - prometheus.withLegendFormat( - 'Revoked - {{ name }}' - ), - prometheus.new( - '$datasource', - taskRejectedIntervalQuery, + tasksStatsTable: + dashboardUtil.tablePanel( + 'Task Stats', + 'short', + [ + { + expr: queries.taskSuccessRate, + }, + { + expr: queries.taskSucceeded, + }, + { + expr: queries.taskFailed, + }, + { + expr: queries.taskSent, + }, + { + expr: queries.taskReceived, + }, + { + expr: queries.taskRejected, + }, + { + expr: queries.taskRetried, + }, + { + expr: queries.taskRevoked, + }, + ], + sortBy={ + name: 'Succeeded', + desc: true, + }, + description='A table of task statistics including success rate, succeeded, failed, sent, received, rejected, retried and revoked tasks grouped by task name.', + transformations=[ + tbQueryOptions.transformation.withId( + 'merge' + ), + tbQueryOptions.transformation.withId( + 'organize' + ) + + tbQueryOptions.transformation.withOptions( + { + renameByName: { + name: 'Name', + 'Value #A': 'Success Rate', + 'Value #B': 'Succeeded', + 'Value #C': 'Failed', + 'Value #D': 'Sent', + 'Value #E': 'Received', + 'Value #F': 'Rejected', + 'Value #G': 'Retried', + 'Value #H': 'Revoked', + }, + indexByName: { + name: 0, + 'Value #A': 1, + 'Value #B': 2, + 'Value #C': 3, + 'Value #D': 4, + 'Value #E': 5, + 'Value #F': 6, + 'Value #G': 7, + 'Value #H': 8, + }, + excludeByName: { + Time: true, + }, + } + ), + ], + overrides=[ + tbOverride.byName.new('Success Rate') + + tbOverride.byName.withPropertiesFromOptions( + tbStandardOptions.withUnit('percentunit') + ), + ] ) + - prometheus.withLegendFormat( - 'Rejected - {{ name }}' - ), - ] - ) + - tsStandardOptions.withUnit('short') + - tsOptions.tooltip.withMode('multi') + - tsOptions.tooltip.withSort('desc') + - tsLegend.withShowLegend(true) + - tsLegend.withDisplayMode('table') + - tsLegend.withPlacement('right') + - tsLegend.withCalcs(['mean', 'max']) + - tsLegend.withSortBy('Mean') + - tsLegend.withSortDesc(true) + - tsCustom.withSpanNulls(false), + tbStandardOptions.withNoValue(0), - local tasksRuntimeP50Query = ||| - histogram_quantile(0.50, - sum( - irate( - celery_task_runtime_bucket{ - job="$job", - name=~"$task", - queue_name=~"$queue_name" - }[$__rate_interval] - ) > 0 - ) by (name, job, le) - ) - |||, - local tasksRuntimeP95Query = std.strReplace(tasksRuntimeP50Query, '0.50', '0.95'), - local tasksRuntimeP99Query = std.strReplace(tasksRuntimeP50Query, '0.50', '0.99'), - - local tasksRuntimeTimeSeriesPanel = - timeSeriesPanel.new( - 'Tasks Runtime', - ) + - tsQueryOptions.withTargets( - [ - prometheus.new( - '$datasource', - tasksRuntimeP50Query, - ) + - prometheus.withLegendFormat( - 'P50 - {{ name }}' - ), - prometheus.new( - '$datasource', - tasksRuntimeP95Query, - ) + - prometheus.withLegendFormat( - 'P95 - {{ name }}' + tasksFailedByExceptionTimeSeries: + dashboardUtil.timeSeriesPanel( + 'Task Exceptions', + 'short', + queries.taskFailedByExceptionInterval, + '{{ name }}/{{ exception }}', + description='A time series of task exceptions grouped by task name and exception type.', + stack='normal' ), - prometheus.new( - '$datasource', - tasksRuntimeP99Query, - ) + - prometheus.withLegendFormat( - 'P99 - {{ name }}' + + tasksCompletedTimeSeries: + dashboardUtil.timeSeriesPanel( + 'Tasks Completed', + 'short', + [ + { + expr: queries.taskSucceededInterval, + legend: 'Succeeded - {{ name }}', + }, + { + expr: queries.taskFailedInterval, + legend: 'Failed - {{ name }}', + }, + { + expr: queries.taskSentInterval, + legend: 'Sent - {{ name }}', + }, + { + expr: queries.taskReceivedInterval, + legend: 'Received - {{ name }}', + }, + { + expr: queries.taskRetriedInterval, + legend: 'Retried - {{ name }}', + }, + { + expr: queries.taskRevokedInterval, + legend: 'Revoked - {{ name }}', + }, + { + expr: queries.taskRejectedInterval, + legend: 'Rejected - {{ name }}', + }, + ], + description='A time series of tasks completed including succeeded, failed, sent, received, rejected, retried and revoked tasks grouped by task name.', + stack='normal' ), - ] - ) + - tsStandardOptions.withUnit('s') + - tsOptions.tooltip.withMode('multi') + - tsOptions.tooltip.withSort('desc') + - tsStandardOptions.withOverrides([ - tsOverride.byName.new('P50') + - tsOverride.byName.withPropertiesFromOptions( - tsStandardOptions.color.withMode('fixed') + - tsStandardOptions.color.withFixedColor('green') - ), - tsOverride.byName.new('P95') + - tsOverride.byName.withPropertiesFromOptions( - tsStandardOptions.color.withMode('fixed') + - tsStandardOptions.color.withFixedColor('yellow') - ), - tsOverride.byName.new('P99') + - tsOverride.byName.withPropertiesFromOptions( - tsStandardOptions.color.withMode('fixed') + - tsStandardOptions.color.withFixedColor('red') - ), - ]) + - tsLegend.withShowLegend(true) + - tsLegend.withDisplayMode('table') + - tsLegend.withPlacement('right') + - tsLegend.withCalcs(['mean', 'max']) + - tsLegend.withSortBy('Mean') + - tsLegend.withSortDesc(true) + - tsCustom.withSpanNulls(false), - local tasksRow = - row.new( - title='Tasks' - ), + tasksRuntimeTimeSeries: + dashboardUtil.timeSeriesPanel( + 'Tasks Runtime', + 's', + [ + { + expr: queries.tasksRuntimeP50, + legend: 'P50 - {{ name }}', + }, + { + expr: queries.tasksRuntimeP95, + legend: 'P95 - {{ name }}', + }, + { + expr: queries.tasksRuntimeP99, + legend: 'P99 - {{ name }}', + }, + ], + description='A time series of task runtime percentiles (P50, P95, P99) grouped by task name.', + overrides=[ + tsOverride.byName.new('P50') + + tsOverride.byName.withPropertiesFromOptions( + tsStandardOptions.color.withMode('fixed') + + tsStandardOptions.color.withFixedColor('green') + ), + tsOverride.byName.new('P95') + + tsOverride.byName.withPropertiesFromOptions( + tsStandardOptions.color.withMode('fixed') + + tsStandardOptions.color.withFixedColor('yellow') + ), + tsOverride.byName.new('P99') + + tsOverride.byName.withPropertiesFromOptions( + tsStandardOptions.color.withMode('fixed') + + tsStandardOptions.color.withFixedColor('red') + ), + ] + ), + }; + local rows = + [ + row.new('Summary') + + row.gridPos.withX(0) + + row.gridPos.withY(0) + + row.gridPos.withW(24) + + row.gridPos.withH(1), + ] + + grid.wrapPanels( + [ + panels.tasksStatsTable, + panels.taskExceptionsTable, + ], + panelWidth=24, + panelHeight=8, + startY=1 + ) + + [ + row.new('Tasks') + + row.gridPos.withX(0) + + row.gridPos.withY(17) + + row.gridPos.withW(24) + + row.gridPos.withH(1), + ] + + grid.wrapPanels( + [ + panels.tasksCompletedTimeSeries, + panels.tasksFailedByExceptionTimeSeries, + panels.tasksRuntimeTimeSeries, + ], + panelWidth=24, + panelHeight=6, + startY=18 + ); - 'celery-tasks-by-task.json': - dashboard.new( - 'Celery / Tasks / By Task', - ) + + dashboardUtil.bypassDashboardValidation + + dashboard.new('Celery / Tasks / By Task') + dashboard.withDescription( - 'A dashboard that monitors Celery. It is created using the Celery-mixin for the the (Celery-exporter)[https://github.com/danihodovic/celery-exporter]' + 'A dashboard to monitor Celery tasks grouped by task name. %s' % dashboardUtil.dashboardDescriptionLink ) + - dashboard.withUid($._config.celeryTasksByTaskUid) + + dashboard.withUid($._config.dashboardIds[dashboardName]) + dashboard.withTags($._config.tags) + dashboard.withTimezone('utc') + - dashboard.withEditable(true) + + dashboard.withEditable(false) + dashboard.time.withFrom('now-2d') + dashboard.time.withTo('now') + dashboard.withVariables(variables) + dashboard.withLinks( - [ - dashboard.link.dashboards.new('Celery Dashboards', $._config.tags) + - dashboard.link.link.options.withTargetBlank(true), - ] + dashboardUtil.dashboardLinks($._config) ) + dashboard.withPanels( - [ - tasksRow + - row.gridPos.withX(0) + - row.gridPos.withY(0) + - row.gridPos.withW(24) + - row.gridPos.withH(1), - tasksStatsTable + - timeSeriesPanel.gridPos.withX(0) + - timeSeriesPanel.gridPos.withY(1) + - timeSeriesPanel.gridPos.withW(16) + - timeSeriesPanel.gridPos.withH(8), - taskExceptionsTable + - timeSeriesPanel.gridPos.withX(16) + - timeSeriesPanel.gridPos.withY(1) + - timeSeriesPanel.gridPos.withW(8) + - timeSeriesPanel.gridPos.withH(8), - tasksCompletedTimeSeriesPanel + - timeSeriesPanel.gridPos.withX(0) + - timeSeriesPanel.gridPos.withY(9) + - timeSeriesPanel.gridPos.withW(24) + - timeSeriesPanel.gridPos.withH(8), - tasksFailedByExceptionTimeSeriesPanel + - timeSeriesPanel.gridPos.withX(0) + - timeSeriesPanel.gridPos.withY(17) + - timeSeriesPanel.gridPos.withW(24) + - timeSeriesPanel.gridPos.withH(8), - tasksRuntimeTimeSeriesPanel + - timeSeriesPanel.gridPos.withX(0) + - timeSeriesPanel.gridPos.withY(25) + - timeSeriesPanel.gridPos.withW(24) + - timeSeriesPanel.gridPos.withH(8), - ] + rows ) + - if $._config.annotation.enabled then - dashboard.withAnnotations($._config.customAnnotation) - else {}, + dashboard.withAnnotations( + dashboardUtil.annotations($._config, defaultFilters) + ), }, } diff --git a/celery-mixin/dashboards/celery-tasks-overview.libsonnet b/celery-mixin/dashboards/celery-tasks-overview.libsonnet index dfec62f..ff8d530 100644 --- a/celery-mixin/dashboards/celery-tasks-overview.libsonnet +++ b/celery-mixin/dashboards/celery-tasks-overview.libsonnet @@ -1,859 +1,646 @@ local g = import 'github.com/grafana/grafonnet/gen/grafonnet-latest/main.libsonnet'; +local dashboardUtil = import 'util.libsonnet'; local dashboard = g.dashboard; local row = g.panel.row; local grid = g.util.grid; -local variable = dashboard.variable; -local datasource = variable.datasource; -local query = variable.query; -local prometheus = g.query.prometheus; - -local statPanel = g.panel.stat; local timeSeriesPanel = g.panel.timeSeries; local tablePanel = g.panel.table; +local statPanel = g.panel.stat; // Stat -local stOptions = statPanel.options; local stStandardOptions = statPanel.standardOptions; -local stQueryOptions = statPanel.queryOptions; // Timeseries -local tsOptions = timeSeriesPanel.options; local tsStandardOptions = timeSeriesPanel.standardOptions; -local tsQueryOptions = timeSeriesPanel.queryOptions; -local tsFieldConfig = timeSeriesPanel.fieldConfig; -local tsCustom = tsFieldConfig.defaults.custom; -local tsLegend = tsOptions.legend; local tsOverride = tsStandardOptions.override; // Table -local tbOptions = tablePanel.options; +local tbPanelOptions = tablePanel.panelOptions; local tbStandardOptions = tablePanel.standardOptions; local tbQueryOptions = tablePanel.queryOptions; -local tbPanelOptions = tablePanel.panelOptions; local tbOverride = tbStandardOptions.override; { + local dashboardName = 'celery-tasks-overview', grafanaDashboards+:: { + ['%s.json' % dashboardName]: + + local defaultVariables = dashboardUtil.variables($._config); + + local variables = [ + defaultVariables.datasource, + defaultVariables.cluster, + defaultVariables.namespace, + defaultVariables.job, + defaultVariables.queueName, + ]; + + local defaultFilters = dashboardUtil.filters($._config); + local queries = { + + celeryWorkers: ||| + count( + celery_worker_up{ + %(default)s + } == 1 + ) + ||| % defaultFilters, - local datasourceVariable = - datasource.new( - 'datasource', - 'prometheus', - ) + - datasource.generalOptions.withLabel('Data source'), - - local namespaceVariable = - query.new( - 'namespace', - 'label_values(celery_worker_up{}, namespace)' - ) + - query.withDatasourceFromVariable(datasourceVariable) + - query.withSort(1) + - query.generalOptions.withLabel('Namespace') + - query.selectionOptions.withMulti(false) + - query.selectionOptions.withIncludeAll(false) + - query.refresh.onLoad() + - query.refresh.onTime(), - - - local jobVariable = - query.new( - 'job', - 'label_values(celery_worker_up{namespace="$namespace"}, job)' - ) + - query.withDatasourceFromVariable(datasourceVariable) + - query.withSort(1) + - query.generalOptions.withLabel('Job') + - query.selectionOptions.withMulti(false) + - query.selectionOptions.withIncludeAll(false) + - query.refresh.onLoad() + - query.refresh.onTime(), - - local queueNameVariable = - query.new( - 'queue_name', - 'label_values(celery_task_received_total{namespace="$namespace", job="$job", name!~"%(celeryIgnoredQueues)s"}, queue_name)' % $._config - ) + - query.withDatasourceFromVariable(datasourceVariable) + - query.withSort(1) + - query.generalOptions.withLabel('Queue Name') + - query.selectionOptions.withMulti(false) + - query.selectionOptions.withIncludeAll(false) + - query.refresh.onLoad() + - query.refresh.onTime(), - - local variables = [ - datasourceVariable, - namespaceVariable, - jobVariable, - queueNameVariable, - ], - - local celeryWorkersQuery = ||| - count( - celery_worker_up{ - job="$job", - } == 1 - ) - |||, - local celeryWorkersStatPanel = - statPanel.new( - 'Workers', - ) + - stQueryOptions.withTargets( - prometheus.new( - '$datasource', - celeryWorkersQuery, - ) - ) + - stStandardOptions.withUnit('short') + - stOptions.reduceOptions.withCalcs(['lastNotNull']) + - stStandardOptions.thresholds.withSteps([ - stStandardOptions.threshold.step.withValue(0) + - stStandardOptions.threshold.step.withColor('red'), - stStandardOptions.threshold.step.withValue(0.1) + - stStandardOptions.threshold.step.withColor('green'), - ]), - - local celeryWorkersActiveQuery = ||| - sum( - celery_worker_tasks_active{ - job="$job", - } - ) - |||, - local celeryWorkersActiveStatPanel = - statPanel.new( - 'Tasks Active', - ) + - stQueryOptions.withTargets( - prometheus.new( - '$datasource', - celeryWorkersActiveQuery, - ) - ) + - stStandardOptions.withUnit('short') + - stOptions.reduceOptions.withCalcs(['lastNotNull']) + - stStandardOptions.thresholds.withSteps([ - stStandardOptions.threshold.step.withValue(0) + - stStandardOptions.threshold.step.withColor('red'), - stStandardOptions.threshold.step.withValue(0.1) + - stStandardOptions.threshold.step.withColor('green'), - ]), - - local taskFailed1wQuery = ||| - sum( - round( - increase( - celery_task_failed_total{ - job="$job", - queue_name=~"$queue_name" - }[1w] + celeryWorkersActive: ||| + sum( + celery_worker_tasks_active{ + %(default)s + } ) - ) - ) - |||, - local taskSucceeded1wQuery = std.strReplace(taskFailed1wQuery, 'failed', 'succeeded'), - - local tasksReceived1wQuery = std.strReplace(taskFailed1wQuery, 'failed', 'received'), - local tasksReceivedByWorkers24hStatPanel = - statPanel.new( - 'Tasks received by workers [1w]', - ) + - stQueryOptions.withTargets( - prometheus.new( - '$datasource', - tasksReceived1wQuery, - ) - ) + - stStandardOptions.withUnit('short') + - stOptions.reduceOptions.withCalcs(['lastNotNull']) + - stStandardOptions.thresholds.withSteps([ - stStandardOptions.threshold.step.withValue(0) + - stStandardOptions.threshold.step.withColor('red'), - stStandardOptions.threshold.step.withValue(0.1) + - stStandardOptions.threshold.step.withColor('green'), - ]), - - local taskSuccessRate1wQuery = ||| - %s/(%s+%s) - ||| % [taskSucceeded1wQuery, taskSucceeded1wQuery, taskFailed1wQuery], - local taskSuccessRate1wStatPanel = - statPanel.new( - 'Tasks Success Rate [1w]', - ) + - stQueryOptions.withTargets( - prometheus.new( - '$datasource', - taskSuccessRate1wQuery, - ) - ) + - stStandardOptions.withUnit('percentunit') + - stOptions.reduceOptions.withCalcs(['lastNotNull']) + - stStandardOptions.thresholds.withSteps([ - stStandardOptions.threshold.step.withValue(0) + - stStandardOptions.threshold.step.withColor('red'), - stStandardOptions.threshold.step.withValue(0.95) + - stStandardOptions.threshold.step.withColor('yellow'), - stStandardOptions.threshold.step.withValue(0.99) + - stStandardOptions.threshold.step.withColor('green'), - ]), - - local taskRuntime1wQuery = ||| - sum( - rate( - celery_task_runtime_sum{ - job="$job", - queue_name=~"$queue_name" - }[1w] - ) - ) - / - sum( - rate( - celery_task_runtime_count{ - job="$job", - queue_name=~"$queue_name" - }[1w] - ) - ) > 0 - |||, - local taskRuntime1wStatPanel = - statPanel.new( - 'Average Runtime for Tasks [1w]', - ) + - stQueryOptions.withTargets( - prometheus.new( - '$datasource', - taskRuntime1wQuery, - ) - ) + - stStandardOptions.withUnit('s') + - stOptions.reduceOptions.withCalcs(['lastNotNull']) + - stStandardOptions.thresholds.withSteps([ - stStandardOptions.threshold.step.withValue(0) + - stStandardOptions.threshold.step.withColor('red'), - stStandardOptions.threshold.step.withValue(0.1) + - stStandardOptions.threshold.step.withColor('green'), - ]), - - local tasksFailed1wQuery = ||| - round( - sum ( - increase( - celery_task_failed_total{ - job="$job", - queue_name=~"$queue_name" - }[1w] - ) > 0 - ) by (job, name) - ) - |||, - local tasksFailed1wTable = - tablePanel.new( - 'Top Failed Tasks [1w]', - ) + - tbStandardOptions.withUnit('short') + - tbOptions.withSortBy( - tbOptions.sortBy.withDisplayName('Value') + - tbOptions.sortBy.withDesc(true) - ) + - tbOptions.footer.withEnablePagination(true) + - tbQueryOptions.withTargets( - prometheus.new( - '$datasource', - tasksFailed1wQuery, - ) + - prometheus.withFormat('table') + - prometheus.withInstant(true) - ) + - tbQueryOptions.withTransformations([ - tbQueryOptions.transformation.withId( - 'organize' - ) + - tbQueryOptions.transformation.withOptions( - { - renameByName: { - name: 'Task', - }, - indexByName: { - name: 0, - Value: 1, - }, - excludeByName: { - Time: true, - job: true, - }, - } - ), - ]) + - tbStandardOptions.withOverrides([ - tbOverride.byName.new('Task') + - tbOverride.byName.withPropertiesFromOptions( - tbStandardOptions.withLinks( - tbPanelOptions.link.withTitle('Go To View') + - tbPanelOptions.link.withType('dashboard') + - tbPanelOptions.link.withUrl( - '/d/%s/celery-tasks-by-task?var-task=${__data.fields.Task}' % $._config.celeryTasksByTaskUid - ) + - tbPanelOptions.link.withTargetBlank(true) + ||| % defaultFilters, + + taskFailed1w: ||| + sum( + round( + increase( + celery_task_failed_total{ + %(queue)s + }[1w] + ) + ) ) - ), - ]), - - local topTaskExceptions1wQuery = ||| - round( - sum ( - increase( - celery_task_failed_total{ - job="$job", - queue_name=~"$queue_name" - }[1w] + ||| % defaultFilters, + taskSucceeded1w: std.strReplace(queries.taskFailed1w, 'failed', 'succeeded'), + tasksReceived1w: std.strReplace(queries.taskFailed1w, 'failed', 'received'), + + taskSuccessRate1w: ||| + %s/(%s+%s) + ||| % [queries.taskSucceeded1w, queries.taskSucceeded1w, queries.taskFailed1w], + + taskRuntime1w: ||| + sum( + rate( + celery_task_runtime_sum{ + %(queue)s + }[1w] + ) ) - ) by (job, exception) > 0 - ) - |||, - - local taskExceptions1wTable = - tablePanel.new( - 'Top Task Exceptions [1w]', - ) + - tbStandardOptions.withUnit('short') + - tbOptions.withSortBy( - tbOptions.sortBy.withDisplayName('Value') + - tbOptions.sortBy.withDesc(true) - ) + - tbOptions.footer.withEnablePagination(true) + - tbQueryOptions.withTargets( - prometheus.new( - '$datasource', - topTaskExceptions1wQuery, - ) + - prometheus.withFormat('table') + - prometheus.withInstant(true) - ) + - tbQueryOptions.withTransformations([ - tbQueryOptions.transformation.withId( - 'organize' - ) + - tbQueryOptions.transformation.withOptions( - { - renameByName: { - exception: 'Exception', - }, - indexByName: { - exception: 0, - Value: 1, - }, - excludeByName: { - Time: true, - job: true, - }, - } - ), - ]), - - local topTaskRuntime1wQuery = ||| - sum ( - rate( - celery_task_runtime_sum{ - job="$job", - queue_name=~"$queue_name" - }[1w] - ) - ) by(name) - / - sum ( - rate( - celery_task_runtime_count{ - job="$job", - queue_name=~"$queue_name" - }[1w] - ) - ) by (name) > 0 - |||, - local tasksRuntime1wTable = - tablePanel.new( - 'Top Average Task Runtime [1w]', - ) + - tbStandardOptions.withUnit('s') + - tbOptions.withSortBy( - tbOptions.sortBy.withDisplayName('Runtime') + - tbOptions.sortBy.withDesc(true) - ) + - tbOptions.footer.withEnablePagination(true) + - tbQueryOptions.withTargets( - prometheus.new( - '$datasource', - topTaskRuntime1wQuery, - ) + - prometheus.withFormat('table') + - prometheus.withInstant(true) - ) + - tbQueryOptions.withTransformations([ - tbQueryOptions.transformation.withId( - 'organize' - ) + - tbQueryOptions.transformation.withOptions( - { - renameByName: { - name: 'Task', - Value: 'Runtime', - }, - indexByName: { - name: 0, - Value: 1, - }, - excludeByName: { - Time: true, - }, - } - ), - ]) + - tbStandardOptions.withOverrides([ - tbOverride.byName.new('Task') + - tbOverride.byName.withPropertiesFromOptions( - tbStandardOptions.withLinks( - tbPanelOptions.link.withTitle('Go To Task') + - tbPanelOptions.link.withType('dashboard') + - tbPanelOptions.link.withUrl( - '/d/%s/celery-tasks-by-task?var-task=${__data.fields.Task}' % $._config.celeryTasksByTaskUid - ) + - tbPanelOptions.link.withTargetBlank(true) + / + sum( + rate( + celery_task_runtime_count{ + %(queue)s + }[1w] + ) + ) > 0 + ||| % defaultFilters, + + tasksFailed1w: ||| + round( + sum ( + increase( + celery_task_failed_total{ + %(queue)s + }[1w] + ) > 0 + ) by (job, name) ) - ), - ]), - - local celeryQueueLengthQuery = ||| - sum ( - celery_queue_length{ - job="$job", - queue_name=~"$queue_name" - } - ) by (job, queue_name) - |||, - - - local celeryQueueLengthTimeSeriesPanel = - timeSeriesPanel.new( - 'Queue Length', - ) + - tsQueryOptions.withTargets( - [ - prometheus.new( - '$datasource', - celeryQueueLengthQuery, - ) + - prometheus.withLegendFormat( - '{{ job }}/{{ queue_name }}' - ), - ] - ) + - tsStandardOptions.withUnit('short') + - tsOptions.tooltip.withMode('multi') + - tsOptions.tooltip.withSort('desc') + - tsLegend.withShowLegend(true) + - tsLegend.withDisplayMode('table') + - tsLegend.withPlacement('right') + - tsLegend.withCalcs(['mean', 'max']) + - tsLegend.withSortBy('Mean') + - tsLegend.withSortDesc(true) + - tsCustom.withSpanNulls(false), - - local taskFailedQuery = ||| - sum ( - round( - increase( - celery_task_failed_total{ - job="$job", - queue_name=~"$queue_name" - }[$__range] + ||| % defaultFilters, + + topTaskExceptions1w: ||| + round( + sum ( + increase( + celery_task_failed_total{ + %(queue)s + }[1w] + ) + ) by (job, exception) > 0 ) - ) - ) by (job) > 0 - |||, - local taskSucceededQuery = std.strReplace(taskFailedQuery, 'failed', 'succeeded'), - local taskSentQuery = std.strReplace(taskFailedQuery, 'failed', 'sent'), - local taskReceivedQuery = std.strReplace(taskFailedQuery, 'failed', 'received'), - local taskRetriedQuery = std.strReplace(taskFailedQuery, 'failed', 'retried'), - local taskRevokedQuery = std.strReplace(taskFailedQuery, 'failed', 'revoked'), - local taskRejectedQuery = std.strReplace(taskFailedQuery, 'failed', 'rejected'), - local taskSuccessRateQuery = ||| - %s/(%s+%s) > -1 - ||| % [ - // Strip out > 0 from the end of the success query - std.strReplace(taskSucceededQuery, ' > 0', ''), - std.strReplace(taskSucceededQuery, ' > 0', ''), - std.strReplace(taskFailedQuery, ' > 0', ''), - ], // Add > -1 to remove NaN results - - local tasksStatsTable = - tablePanel.new( - 'Task Stats', - ) + - tbStandardOptions.withUnit('short') + - tbStandardOptions.withNoValue(0) + - tbOptions.withSortBy( - tbOptions.sortBy.withDisplayName('Succeeded') + - tbOptions.sortBy.withDesc(true) - ) + - tbQueryOptions.withTargets( - [ - prometheus.new( - '$datasource', - taskSuccessRateQuery, - ) + - prometheus.withFormat('table') + - prometheus.withInstant(true), - prometheus.new( - '$datasource', - taskSucceededQuery, - ) + - prometheus.withFormat('table') + - prometheus.withInstant(true), - prometheus.new( - '$datasource', - taskFailedQuery, - ) + - prometheus.withFormat('table') + - prometheus.withInstant(true), - prometheus.new( - '$datasource', - taskSentQuery, - ) + - prometheus.withFormat('table') + - prometheus.withInstant(true), - prometheus.new( - '$datasource', - taskReceivedQuery, - ) + - prometheus.withFormat('table') + - prometheus.withInstant(true), - prometheus.new( - '$datasource', - taskRejectedQuery, - ) + - prometheus.withFormat('table') + - prometheus.withInstant(true), - prometheus.new( - '$datasource', - taskRetriedQuery, - ) + - prometheus.withFormat('table') + - prometheus.withInstant(true), - prometheus.new( - '$datasource', - taskRevokedQuery, - ) + - prometheus.withFormat('table') + - prometheus.withInstant(true), - ] - ) + - tbQueryOptions.withTransformations([ - tbQueryOptions.transformation.withId( - 'merge' - ), - tbQueryOptions.transformation.withId( - 'organize' - ) + - tbQueryOptions.transformation.withOptions( - { - renameByName: { - job: 'Job', - 'Value #A': 'Success Rate', - 'Value #B': 'Succeeded', - 'Value #C': 'Failed', - 'Value #D': 'Sent', - 'Value #E': 'Received', - 'Value #F': 'Rejected', - 'Value #G': 'Retried', - 'Value #H': 'Revoked', - }, - indexByName: { - job: 0, - 'Value #A': 1, - 'Value #B': 2, - 'Value #C': 3, - 'Value #D': 4, - 'Value #E': 5, - 'Value #F': 6, - 'Value #G': 7, - 'Value #H': 8, - }, - excludeByName: { - Time: true, - }, - } - ), - ]) + - tbStandardOptions.withOverrides([ - tbOverride.byName.new('Success Rate') + - tbOverride.byName.withPropertiesFromOptions( - tbStandardOptions.withUnit('percentunit') - ), - ]), - - local taskFailedIntervalQuery = ||| - sum ( - round( - increase( - celery_task_failed_total{ - job="$job", - queue_name=~"$queue_name" - }[$__rate_interval] + ||| % defaultFilters, + + topTaskRuntime1w: ||| + sum ( + rate( + celery_task_runtime_sum{ + %(queue)s + }[1w] + ) + ) by(name) + / + sum ( + rate( + celery_task_runtime_count{ + %(queue)s + }[1w] + ) + ) by (name) > 0 + ||| % defaultFilters, + + celeryQueueLength: ||| + sum ( + celery_queue_length{ + %(queue)s + } + ) by (job, queue_name) + ||| % defaultFilters, + + taskFailed: ||| + sum ( + round( + increase( + celery_task_failed_total{ + %(queue)s + }[$__range] + ) + ) + ) by (job) > 0 + ||| % defaultFilters, + taskSucceeded: std.strReplace(queries.taskFailed, 'failed', 'succeeded'), + taskSent: std.strReplace(queries.taskFailed, 'failed', 'sent'), + taskReceived: std.strReplace(queries.taskFailed, 'failed', 'received'), + taskRetried: std.strReplace(queries.taskFailed, 'failed', 'retried'), + taskRevoked: std.strReplace(queries.taskFailed, 'failed', 'revoked'), + taskRejected: std.strReplace(queries.taskFailed, 'failed', 'rejected'), + taskSuccessRate: ||| + %s/(%s+%s) > -1 + ||| % [ + // Strip out > 0 from the end of the success query + std.strReplace(queries.taskSucceeded, ' > 0', ''), + std.strReplace(queries.taskSucceeded, ' > 0', ''), + std.strReplace(queries.taskFailed, ' > 0', ''), + ], // Add > -1 to remove NaN results + + + taskFailedInterval: ||| + sum ( + round( + increase( + celery_task_failed_total{ + %(queue)s + }[$__rate_interval] + ) + ) ) - ) - ) - |||, - local taskSucceededIntervalQuery = std.strReplace(taskFailedIntervalQuery, 'failed', 'succeeded'), - local taskSentIntervalQuery = std.strReplace(taskFailedIntervalQuery, 'failed', 'sent'), - local taskReceivedIntervalQuery = std.strReplace(taskFailedIntervalQuery, 'failed', 'received'), - local taskRetriedIntervalQuery = std.strReplace(taskFailedIntervalQuery, 'failed', 'retried'), - local taskRevokedIntervalQuery = std.strReplace(taskFailedIntervalQuery, 'failed', 'revoked'), - local taskRejectedIntervalQuery = std.strReplace(taskFailedIntervalQuery, 'failed', 'rejected'), - - local tasksCompletedTimeSeriesPanel = - timeSeriesPanel.new( - 'Tasks Completed', - ) + - tsQueryOptions.withTargets( - [ - prometheus.new( - '$datasource', - taskSucceededIntervalQuery, - ) + - prometheus.withLegendFormat( - 'Succeeded' + ||| % defaultFilters, + taskSucceededInterval: std.strReplace(queries.taskFailedInterval, 'failed', 'succeeded'), + taskSentInterval: std.strReplace(queries.taskFailedInterval, 'failed', 'sent'), + taskReceivedInterval: std.strReplace(queries.taskFailedInterval, 'failed', 'received'), + taskRetriedInterval: std.strReplace(queries.taskFailedInterval, 'failed', 'retried'), + taskRevokedInterval: std.strReplace(queries.taskFailedInterval, 'failed', 'revoked'), + taskRejectedInterval: std.strReplace(queries.taskFailedInterval, 'failed', 'rejected'), + + tasksRuntimeP50: ||| + histogram_quantile(0.50, + sum( + irate( + celery_task_runtime_bucket{ + %(queue)s + }[$__rate_interval] + ) > 0 + ) by (job, le) + ) + ||| % defaultFilters, + tasksRuntimeP95: std.strReplace(queries.tasksRuntimeP50, '0.50', '0.95'), + tasksRuntimeP99: std.strReplace(queries.tasksRuntimeP50, '0.50', '0.99'), + }; + + local panels = { + + celeryWorkersStat: + dashboardUtil.statPanel( + 'Workers', + 'short', + queries.celeryWorkers, + description='Number of active Celery Workers', ), - prometheus.new( - '$datasource', - taskFailedIntervalQuery, - ) + - prometheus.withLegendFormat( - 'Failed' + + celeryWorkersActiveStat: + dashboardUtil.statPanel( + 'Workers Active Tasks', + 'short', + queries.celeryWorkersActive, + description='Number of active tasks across all workers', ), - prometheus.new( - '$datasource', - taskSentIntervalQuery, - ) + - prometheus.withLegendFormat( - 'Sent' + + tasksReceivedByWorkers24hStat: + dashboardUtil.statPanel( + 'Tasks received by workers [1w]', + 'short', + queries.tasksReceived1w, + description='Number of tasks received by workers in the last week', ), - prometheus.new( - '$datasource', - taskReceivedIntervalQuery, - ) + - prometheus.withLegendFormat( - 'Received' + + taskSuccessRate1wStat: + dashboardUtil.statPanel( + 'Tasks Success Rate [1w]', + 'percentunit', + queries.taskSuccessRate1w, + description='Rate of successful tasks in the last week', + steps=[ + stStandardOptions.threshold.step.withValue(0) + + stStandardOptions.threshold.step.withColor('red'), + stStandardOptions.threshold.step.withValue(0.95) + + stStandardOptions.threshold.step.withColor('yellow'), + stStandardOptions.threshold.step.withValue(0.99) + + stStandardOptions.threshold.step.withColor('green'), + ] ), - prometheus.new( - '$datasource', - taskRetriedIntervalQuery, - ) + - prometheus.withLegendFormat( - 'Retried' + + taskRuntime1wStat: + dashboardUtil.statPanel( + 'Average Runtime for Tasks [1w]', + 's', + queries.taskRuntime1w, + description='Average runtime for tasks in the last week', ), - prometheus.new( - '$datasource', - taskRevokedIntervalQuery, - ) + - prometheus.withLegendFormat( - 'Revoked' + + tasksFailed1wTable: + dashboardUtil.tablePanel( + 'Top Failed Tasks [1w]', + 'short', + queries.tasksFailed1w, + description='Table of tasks with the most failures in the last week', + sortBy={ + name: 'Value', + desc: true, + }, + transformations=[ + tbQueryOptions.transformation.withId( + 'organize' + ) + + tbQueryOptions.transformation.withOptions( + { + renameByName: { + name: 'Task', + }, + indexByName: { + name: 0, + Value: 1, + }, + excludeByName: { + Time: true, + job: true, + }, + } + ), + ], + overrides=[ + tbOverride.byName.new('Task') + + tbOverride.byName.withPropertiesFromOptions( + tbStandardOptions.withLinks( + tbPanelOptions.link.withTitle('Go To View') + + tbPanelOptions.link.withType('dashboard') + + tbPanelOptions.link.withUrl( + '/d/%s/celery-tasks-by-task?var-task=${__data.fields.Task}' % $._config.dashboardIds['celery-tasks-by-task'] + ) + + tbPanelOptions.link.withTargetBlank(true) + ) + ), + ] ), - prometheus.new( - '$datasource', - taskRejectedIntervalQuery, - ) + - prometheus.withLegendFormat( - 'Rejected' + + taskExceptions1wTable: + dashboardUtil.tablePanel( + 'Top Task Exceptions [1w]', + 'short', + queries.topTaskExceptions1w, + description='Table of the most common exceptions in the last week', + sortBy={ + name: 'Value', + desc: true, + }, + transformations=[ + tbQueryOptions.transformation.withId( + 'organize' + ) + + tbQueryOptions.transformation.withOptions( + { + renameByName: { + exception: 'Exception', + }, + indexByName: { + exception: 0, + Value: 1, + }, + excludeByName: { + Time: true, + job: true, + }, + } + ), + ], ), - ] - ) + - tsStandardOptions.withUnit('short') + - tsOptions.tooltip.withMode('multi') + - tsOptions.tooltip.withSort('desc') + - tsLegend.withShowLegend(true) + - tsLegend.withDisplayMode('table') + - tsLegend.withPlacement('right') + - tsLegend.withCalcs(['mean', 'max']) + - tsLegend.withSortBy('Mean') + - tsLegend.withSortDesc(true) + - tsCustom.withSpanNulls(false), - - local tasksRuntimeP50Query = ||| - histogram_quantile(0.50, - sum( - irate( - celery_task_runtime_bucket{ - job="$job", - queue_name=~"$queue_name" - }[$__rate_interval] - ) > 0 - ) by (job, le) - ) - |||, - local tasksRuntimeP95Query = std.strReplace(tasksRuntimeP50Query, '0.50', '0.95'), - local tasksRuntimeP99Query = std.strReplace(tasksRuntimeP50Query, '0.50', '0.99'), - - local tasksRuntimeTimeSeriesPanel = - timeSeriesPanel.new( - 'Tasks Runtime', - ) + - tsQueryOptions.withTargets( - [ - prometheus.new( - '$datasource', - tasksRuntimeP50Query, - ) + - prometheus.withLegendFormat( - 'P50' + + tasksRuntime1wTable: + dashboardUtil.tablePanel( + 'Top Average Task Runtime [1w]', + 's', + queries.topTaskRuntime1w, + description='Table of tasks with the highest average runtime in the last week', + sortBy={ + name: 'Runtime', + desc: true, + }, + transformations=[ + tbQueryOptions.transformation.withId( + 'organize' + ) + + tbQueryOptions.transformation.withOptions( + { + renameByName: { + name: 'Task', + Value: 'Runtime', + }, + indexByName: { + name: 0, + Value: 1, + }, + excludeByName: { + Time: true, + }, + } + ), + ], + overrides=[ + tbOverride.byName.new('Task') + + tbOverride.byName.withPropertiesFromOptions( + tbStandardOptions.withLinks( + tbPanelOptions.link.withTitle('Go To Task') + + tbPanelOptions.link.withType('dashboard') + + tbPanelOptions.link.withUrl( + '/d/%s/celery-tasks-by-task?var-task=${__data.fields.Task}' % $._config.dashboardIds['celery-tasks-by-task'] + ) + + tbPanelOptions.link.withTargetBlank(true) + ) + ), + ] ), - prometheus.new( - '$datasource', - tasksRuntimeP95Query, - ) + - prometheus.withLegendFormat( - 'P95' + + celeryQueueLengthTimeSeries: + dashboardUtil.timeSeriesPanel( + 'Queue Length', + 'short', + queries.celeryQueueLength, + '{{ job }}/{{ queue_name }}', + description='Length of Celery queues', + stack='normal' ), - prometheus.new( - '$datasource', - tasksRuntimeP99Query, + + tasksStatsTable: + dashboardUtil.tablePanel( + 'Task Stats', + 'short', + [ + { + expr: queries.taskSuccessRate, + }, + { + expr: queries.taskSucceeded, + }, + { + expr: queries.taskFailed, + }, + { + expr: queries.taskSent, + }, + { + expr: queries.taskReceived, + }, + { + expr: queries.taskRejected, + }, + { + expr: queries.taskRetried, + }, + { + expr: queries.taskRevoked, + }, + ], + description='Table with an overview of task statistics', + sortBy={ + name: 'Succeeded', + desc: true, + }, + transformations=[ + tbQueryOptions.transformation.withId( + 'merge' + ), + tbQueryOptions.transformation.withId( + 'organize' + ) + + tbQueryOptions.transformation.withOptions( + { + renameByName: { + job: 'Job', + 'Value #A': 'Success Rate', + 'Value #B': 'Succeeded', + 'Value #C': 'Failed', + 'Value #D': 'Sent', + 'Value #E': 'Received', + 'Value #F': 'Rejected', + 'Value #G': 'Retried', + 'Value #H': 'Revoked', + }, + indexByName: { + job: 0, + 'Value #A': 1, + 'Value #B': 2, + 'Value #C': 3, + 'Value #D': 4, + 'Value #E': 5, + 'Value #F': 6, + 'Value #G': 7, + 'Value #H': 8, + }, + excludeByName: { + Time: true, + }, + } + ), + ], + overrides=[ + tbOverride.byName.new('Success Rate') + + tbOverride.byName.withPropertiesFromOptions( + tbStandardOptions.withUnit('percentunit') + ), + ], ) + - prometheus.withLegendFormat( - 'P99' + tbStandardOptions.withNoValue(0), + + tasksCompletedTimeSeries: + dashboardUtil.timeSeriesPanel( + 'Tasks Completed', + 'short', + [ + { + expr: queries.taskSucceededInterval, + legend: 'Succeeded', + }, + { + expr: queries.taskFailedInterval, + legend: 'Failed', + }, + { + expr: queries.taskSentInterval, + legend: 'Sent', + }, + { + expr: queries.taskReceivedInterval, + legend: 'Received', + }, + { + expr: queries.taskRetriedInterval, + legend: 'Retried', + }, + { + expr: queries.taskRevokedInterval, + legend: 'Revoked', + }, + { + expr: queries.taskRejectedInterval, + legend: 'Rejected', + }, + ], + description='Number of tasks completed over time', + stack='normal' ), - ] - ) + - tsStandardOptions.withUnit('s') + - tsOptions.tooltip.withMode('multi') + - tsOptions.tooltip.withSort('desc') + - tsStandardOptions.withOverrides([ - tsOverride.byName.new('P50') + - tsOverride.byName.withPropertiesFromOptions( - tsStandardOptions.color.withMode('fixed') + - tsStandardOptions.color.withFixedColor('green') - ), - tsOverride.byName.new('P95') + - tsOverride.byName.withPropertiesFromOptions( - tsStandardOptions.color.withMode('fixed') + - tsStandardOptions.color.withFixedColor('yellow') - ), - tsOverride.byName.new('P99') + - tsOverride.byName.withPropertiesFromOptions( - tsStandardOptions.color.withMode('fixed') + - tsStandardOptions.color.withFixedColor('red') - ), - ]) + - tsLegend.withShowLegend(true) + - tsLegend.withDisplayMode('table') + - tsLegend.withPlacement('right') + - tsLegend.withCalcs(['mean', 'max']) + - tsLegend.withSortBy('Mean') + - tsLegend.withSortDesc(true) + - tsCustom.withSpanNulls(false), - - local summaryRow = - row.new( - title='Summary' - ), - - local queuesRow = - row.new( - title='Queues' - ), - - local tasksRow = - row.new( - title='Tasks' - ), + tasksRuntimeTimeSeries: + dashboardUtil.timeSeriesPanel( + 'Tasks Runtime', + 's', + [ + { + expr: queries.tasksRuntimeP50, + legend: 'P50', + }, + { + expr: queries.tasksRuntimeP95, + legend: 'P95', + }, + { + expr: queries.tasksRuntimeP99, + legend: 'P99', + }, + ], + description='Task runtime percentiles over time', + overrides=[ + tsOverride.byName.new('P50') + + tsOverride.byName.withPropertiesFromOptions( + tsStandardOptions.color.withMode('fixed') + + tsStandardOptions.color.withFixedColor('green') + ), + tsOverride.byName.new('P95') + + tsOverride.byName.withPropertiesFromOptions( + tsStandardOptions.color.withMode('fixed') + + tsStandardOptions.color.withFixedColor('yellow') + ), + tsOverride.byName.new('P99') + + tsOverride.byName.withPropertiesFromOptions( + tsStandardOptions.color.withMode('fixed') + + tsStandardOptions.color.withFixedColor('red') + ), + ] + ), + }; - 'celery-tasks-overview.json': - dashboard.new( - 'Celery / Tasks / Overview', - ) + - dashboard.withDescription( - 'A dashboard that monitors Celery. It is created using the Celery-mixin for the the (Celery-exporter)[https://github.com/danihodovic/celery-exporter].' - ) + - dashboard.withUid($._config.celeryTasksOverviewUid) + - dashboard.withTags($._config.tags) + - dashboard.withTimezone('utc') + - dashboard.withEditable(true) + - dashboard.time.withFrom('now-2d') + - dashboard.time.withTo('now') + - dashboard.withVariables(variables) + - dashboard.withLinks( + local rows = [ - dashboard.link.dashboards.new('Celery Dashboards', $._config.tags) + - dashboard.link.link.options.withTargetBlank(true), - ] - ) + - dashboard.withPanels( - [ - summaryRow + + row.new( + 'Summary' + ) + row.gridPos.withX(0) + row.gridPos.withY(0) + row.gridPos.withW(24) + row.gridPos.withH(1), ] + - grid.makeGrid( - [celeryWorkersStatPanel, celeryWorkersActiveStatPanel, tasksReceivedByWorkers24hStatPanel, taskSuccessRate1wStatPanel], + grid.wrapPanels( + [ + panels.celeryWorkersStat, + panels.celeryWorkersActiveStat, + panels.tasksReceivedByWorkers24hStat, + panels.taskSuccessRate1wStat, + ], panelWidth=5, panelHeight=4, startY=1 ) + [ - taskRuntime1wStatPanel + + panels.taskRuntime1wStat + timeSeriesPanel.gridPos.withX(20) + timeSeriesPanel.gridPos.withY(1) + timeSeriesPanel.gridPos.withW(4) + timeSeriesPanel.gridPos.withH(4), ] + - grid.makeGrid( - [tasksFailed1wTable, taskExceptions1wTable, tasksRuntime1wTable], + grid.wrapPanels( + [ + panels.tasksFailed1wTable, + panels.taskExceptions1wTable, + panels.tasksRuntime1wTable, + ], panelWidth=8, panelHeight=8, startY=5 ) + [ - queuesRow + + row.new( + 'Queues' + ) + row.gridPos.withX(0) + row.gridPos.withY(13) + row.gridPos.withW(24) + row.gridPos.withH(1), - celeryQueueLengthTimeSeriesPanel + + panels.celeryQueueLengthTimeSeries + timeSeriesPanel.gridPos.withX(0) + timeSeriesPanel.gridPos.withY(14) + timeSeriesPanel.gridPos.withW(24) + timeSeriesPanel.gridPos.withH(6), ] + [ - tasksRow + + row.new( + 'Tasks' + ) + row.gridPos.withX(0) + row.gridPos.withY(20) + row.gridPos.withW(24) + row.gridPos.withH(1), - tasksStatsTable + + panels.tasksStatsTable + tablePanel.gridPos.withX(0) + tablePanel.gridPos.withY(21) + tablePanel.gridPos.withW(24) + - tablePanel.gridPos.withH(4), - tasksCompletedTimeSeriesPanel + + tablePanel.gridPos.withH(5), + panels.tasksCompletedTimeSeries + timeSeriesPanel.gridPos.withX(0) + - timeSeriesPanel.gridPos.withY(25) + + timeSeriesPanel.gridPos.withY(26) + timeSeriesPanel.gridPos.withW(24) + timeSeriesPanel.gridPos.withH(10), - tasksRuntimeTimeSeriesPanel + + panels.tasksRuntimeTimeSeries + timeSeriesPanel.gridPos.withX(0) + - timeSeriesPanel.gridPos.withY(35) + + timeSeriesPanel.gridPos.withY(36) + timeSeriesPanel.gridPos.withW(24) + timeSeriesPanel.gridPos.withH(10), - ] + ]; + + dashboardUtil.bypassDashboardValidation + + dashboard.new( + 'Celery / Tasks / Overview', ) + - if $._config.annotation.enabled then - dashboard.withAnnotations($._config.customAnnotation) - else {}, + dashboard.withDescription( + 'A dashboard that monitors Celery. %s' % dashboardUtil.dashboardDescriptionLink + ) + + dashboard.withUid($._config.dashboardIds[dashboardName]) + + dashboard.withTags($._config.tags) + + dashboard.withTimezone('utc') + + dashboard.withEditable(false) + + dashboard.time.withFrom('now-2d') + + dashboard.time.withTo('now') + + dashboard.withVariables(variables) + + dashboard.withLinks( + dashboardUtil.dashboardLinks($._config) + ) + + dashboard.withPanels( + rows + ) + + dashboard.withAnnotations( + dashboardUtil.annotations($._config, defaultFilters) + ), }, } diff --git a/celery-mixin/dashboards/util.libsonnet b/celery-mixin/dashboards/util.libsonnet new file mode 100644 index 0000000..972f4e9 --- /dev/null +++ b/celery-mixin/dashboards/util.libsonnet @@ -0,0 +1,367 @@ +local g = import 'github.com/grafana/grafonnet/gen/grafonnet-latest/main.libsonnet'; + +local dashboard = g.dashboard; +local annotation = g.dashboard.annotation; + +local variable = dashboard.variable; +local datasource = variable.datasource; +local query = variable.query; +local prometheus = g.query.prometheus; + +local stat = g.panel.stat; +local timeSeries = g.panel.timeSeries; +local table = g.panel.table; +local pieChart = g.panel.pieChart; + +// Stat +local stStandardOptions = stat.standardOptions; +local stQueryOptions = stat.queryOptions; +local stPanelOptions = stat.panelOptions; + +// PieChart +local pcOptions = pieChart.options; +local pcStandardOptions = pieChart.standardOptions; +local pcPanelOptions = pieChart.panelOptions; +local pcQueryOptions = pieChart.queryOptions; +local pcLegend = pcOptions.legend; + +// TimeSeries +local tsOptions = timeSeries.options; +local tsStandardOptions = timeSeries.standardOptions; +local tsPanelOptions = timeSeries.panelOptions; +local tsQueryOptions = timeSeries.queryOptions; +local tsFieldConfig = timeSeries.fieldConfig; +local tsCustom = tsFieldConfig.defaults.custom; +local tsLegend = tsOptions.legend; + +// Table +local tbOptions = table.options; +local tbStandardOptions = table.standardOptions; +local tbQueryOptions = table.queryOptions; + +{ + // Bypasses grafana.com/dashboards validator + bypassDashboardValidation: { + __inputs: [], + __requires: [], + }, + + dashboardDescriptionLink: 'The dashboards were generated using [celery-mixin](https://github.com/danihodovic/celery-exporter). Open issues and create feature requests in the repository.', + + filters(config):: { + local this = self, + cluster: '%(clusterLabel)s="$cluster"' % config, + namespace: 'namespace="$namespace"', + job: 'job=~"$job"', + queueName: 'queue_name=~"$queue_name"', + celeryIgnoredQueues: 'queue_name!~"%(celeryIgnoredQueues)s"' % config, + taskV: 'name=~"$task"', + celeryIgnoredTasks: 'name!~"%(celeryIgnoredTasks)s"' % config, + + // Django + base: ||| + %(cluster)s, + %(namespace)s, + %(job)s + ||| % this, + + default: ||| + %(cluster)s, + %(namespace)s, + %(job)s + ||| % this, + + queue: ||| + %(base)s, + %(queueName)s + ||| % this, + + task: ||| + %(queue)s, + %(taskV)s, + %(celeryIgnoredTasks)s + ||| % this, + }, + + variables(config):: { + local this = self, + + local defaultFilters = $.filters(config), + + datasource: + datasource.new( + 'datasource', + 'prometheus', + ) + + datasource.generalOptions.withLabel('Data source') + + { + current: { + selected: true, + text: config.datasourceName, + value: config.datasourceName, + }, + }, + + cluster: + query.new( + config.clusterLabel, + 'label_values(celery_worker_up{}, cluster)', + ) + + query.withDatasourceFromVariable(this.datasource) + + query.withSort() + + query.generalOptions.withLabel('Cluster') + + query.refresh.onLoad() + + query.refresh.onTime() + + ( + if config.showMultiCluster + then query.generalOptions.showOnDashboard.withLabelAndValue() + else query.generalOptions.showOnDashboard.withNothing() + ), + + namespace: + query.new( + 'namespace', + 'label_values(celery_worker_up{%(cluster)s}, namespace)' % defaultFilters + ) + + query.withDatasourceFromVariable(this.datasource) + + query.withSort() + + query.generalOptions.withLabel('Namespace') + + query.selectionOptions.withMulti(false) + + query.selectionOptions.withIncludeAll(false) + + query.refresh.onLoad() + + query.refresh.onTime(), + + job: + query.new( + 'job', + 'label_values(celery_worker_up{%(cluster)s, %(namespace)s}, job)' % defaultFilters + ) + + query.withDatasourceFromVariable(this.datasource) + + query.withSort() + + query.generalOptions.withLabel('Job') + + query.selectionOptions.withMulti(false) + + query.selectionOptions.withIncludeAll(false) + + query.refresh.onLoad() + + query.refresh.onTime(), + + queueName: + query.new( + 'queue_name', + 'label_values(celery_task_received_total{%(cluster)s, %(namespace)s, %(job)s, %(celeryIgnoredQueues)s}, queue_name)' % defaultFilters + ) + + query.withDatasourceFromVariable(this.datasource) + + query.withSort() + + query.generalOptions.withLabel('Queue Name') + + query.selectionOptions.withMulti(false) + + query.selectionOptions.withIncludeAll(false) + + query.refresh.onLoad() + + query.refresh.onTime(), + + task: + query.new( + 'task', + 'label_values(celery_task_received_total{%(cluster)s, %(namespace)s, %(job)s, %(queueName)s, %(celeryIgnoredTasks)s}, name)' % defaultFilters + ) + + query.withDatasourceFromVariable(this.datasource) + + query.withSort() + + query.generalOptions.withLabel('Task') + + query.selectionOptions.withMulti(true) + + query.selectionOptions.withIncludeAll(false) + + query.refresh.onLoad() + + query.refresh.onTime(), + }, + + statPanel( + title, + unit, + query, + description=null, + steps=[ + stStandardOptions.threshold.step.withValue(0) + + stStandardOptions.threshold.step.withColor('green'), + ], + mappings=[] + ):: + stat.new(title) + + ( + if description != null then + stPanelOptions.withDescription(description) + else {} + ) + + stQueryOptions.withTargets([ + prometheus.new('${datasource}', query), + ]) + + variable.query.withDatasource('prometheus', '$datasource') + + stStandardOptions.withUnit(unit) + + stStandardOptions.thresholds.withSteps(steps) + + stStandardOptions.withMappings( + mappings + ), + + + pieChartPanel(title, unit, query, legend='', description='', values=['percent']):: + pieChart.new( + title, + ) + + pieChart.new(title) + + ( + if description != '' then + pcPanelOptions.withDescription(description) + else {} + ) + + variable.query.withDatasource('prometheus', '$datasource') + + pcQueryOptions.withTargets( + if std.isArray(query) then + [ + prometheus.new( + '$datasource', + q.expr, + ) + + prometheus.withLegendFormat( + q.legend + ) + + prometheus.withInstant(true) + for q in query + ] else + prometheus.new( + '$datasource', + query, + ) + + prometheus.withLegendFormat( + legend + ) + + prometheus.withInstant(true) + ) + + pcStandardOptions.withUnit(unit) + + pcOptions.tooltip.withMode('multi') + + pcOptions.tooltip.withSort('desc') + + pcOptions.withDisplayLabels(values) + + pcLegend.withShowLegend(true) + + pcLegend.withDisplayMode('table') + + pcLegend.withPlacement('right') + + pcLegend.withValues(values), + + timeSeriesPanel(title, unit, query, legend='', calcs=['mean', 'max'], stack=null, description=null, exemplar=false, overrides=[]):: + timeSeries.new(title) + + ( + if description != null then + tsPanelOptions.withDescription(description) + else {} + ) + + variable.query.withDatasource('prometheus', '$datasource') + + tsQueryOptions.withTargets( + if std.isArray(query) then + [ + prometheus.new( + '$datasource', + q.expr, + ) + + prometheus.withLegendFormat( + q.legend + ) + + prometheus.withExemplar( + // allows us to override exemplar per query if needed + std.get(q, 'exemplar', default=exemplar) + ) + for q in query + ] else + prometheus.new( + '$datasource', + query, + ) + + prometheus.withLegendFormat( + legend + ) + + prometheus.withExemplar(exemplar) + ) + + tsStandardOptions.withUnit(unit) + + tsOptions.tooltip.withMode('multi') + + tsOptions.tooltip.withSort('desc') + + tsLegend.withShowLegend() + + tsLegend.withDisplayMode('table') + + tsLegend.withPlacement('right') + + tsLegend.withCalcs(calcs) + + tsLegend.withSortBy('Mean') + + tsLegend.withSortDesc(true) + + tsCustom.withFillOpacity(10) + + tsStandardOptions.withOverrides(overrides) + + ( + if stack == 'normal' then + tsCustom.withAxisSoftMin(0) + + tsCustom.withFillOpacity(100) + + tsCustom.stacking.withMode(stack) + + tsCustom.withLineWidth(1) + else if stack == 'percent' then + tsCustom.withFillOpacity(100) + + tsCustom.stacking.withMode(stack) + + tsCustom.withLineWidth(1) + else {} + ), + + tablePanel(title, unit, query, description=null, sortBy=null, transformations=[], overrides=[]):: + table.new(title) + + ( + if description != null then + tsPanelOptions.withDescription(description) + else {} + ) + + tbStandardOptions.withUnit(unit) + + tbOptions.footer.withEnablePagination(true) + + variable.query.withDatasource('prometheus', '$datasource') + + tsQueryOptions.withTargets( + if std.isArray(query) then + [ + prometheus.new( + '$datasource', + q.expr, + ) + + prometheus.withFormat('table') + + prometheus.withInstant(true) + for q in query + ] else + prometheus.new( + '$datasource', + query, + ) + + prometheus.withFormat('table') + + prometheus.withInstant(true) + ) + + ( + if sortBy != null then + tbOptions.withSortBy( + tbOptions.sortBy.withDisplayName(sortBy.name) + + tbOptions.sortBy.withDesc(sortBy.desc) + ) else {} + ) + + tbQueryOptions.withTransformations(transformations) + + tbStandardOptions.withOverrides(overrides), + + annotations(config, filters):: + local customAnnotation = + annotation.withName(config.annotation.name) + + annotation.withIconColor(config.annotation.iconColor) + + annotation.withEnable(true) + + annotation.withHide(false) + + annotation.datasource.withUid(config.annotation.datasource) + + annotation.target.withType(config.annotation.type) + + ( + if config.annotation.type == 'tags' then + annotation.target.withMatchAny(true) + + if std.length(config.annotation.tags) > 0 then + annotation.target.withTags(config.annotation.tags) + else {} + else {} + ); + + std.prune([ + if config.annotation.enabled then customAnnotation, + ]), + + dashboardLinks(config):: [ + dashboard.link.dashboards.new('Celery', config.tags) + + dashboard.link.link.options.withTargetBlank(true) + + dashboard.link.link.options.withAsDropdown(true) + + dashboard.link.link.options.withIncludeVars(true) + + dashboard.link.link.options.withKeepTime(true), + ], +} diff --git a/celery-mixin/dashboards_out/celery-tasks-by-task.json b/celery-mixin/dashboards_out/celery-tasks-by-task.json index 98da03e..92296ab 100644 --- a/celery-mixin/dashboards_out/celery-tasks-by-task.json +++ b/celery-mixin/dashboards_out/celery-tasks-by-task.json @@ -1,14 +1,22 @@ { - "description": "A dashboard that monitors Celery. It is created using the Celery-mixin for the the (Celery-exporter)[https://github.com/danihodovic/celery-exporter]", - "editable": true, + "__inputs": [ ], + "__requires": [ ], + "annotations": { + "list": [ ] + }, + "description": "A dashboard to monitor Celery tasks grouped by task name. The dashboards were generated using [celery-mixin](https://github.com/danihodovic/celery-exporter). Open issues and create feature requests in the repository.", + "editable": false, "links": [ { + "asDropdown": true, + "includeVars": true, + "keepTime": true, "tags": [ "celery", "celery-mixin" ], "targetBlank": true, - "title": "Celery Dashboards", + "title": "Celery", "type": "dashboards" } ], @@ -22,14 +30,15 @@ "y": 0 }, "id": 1, - "title": "Tasks", + "title": "Summary", "type": "row" }, { "datasource": { - "type": "datasource", - "uid": "-- Mixed --" + "type": "prometheus", + "uid": "$datasource" }, + "description": "A table of task statistics including success rate, succeeded, failed, sent, received, rejected, retried and revoked tasks grouped by task name.", "fieldConfig": { "defaults": { "noValue": 0, @@ -52,7 +61,7 @@ }, "gridPos": { "h": 8, - "w": 16, + "w": 24, "x": 0, "y": 1 }, @@ -68,14 +77,14 @@ } ] }, - "pluginVersion": "v11.1.0", + "pluginVersion": "v11.4.0", "targets": [ { "datasource": { "type": "prometheus", "uid": "$datasource" }, - "expr": "sum (\n round(\n increase(\n celery_task_succeeded_total{\n job=\"$job\",\n name=~\"$task\",\n queue_name=~\"$queue_name\"\n }[$__range]\n )\n )\n) by (name)\n/(sum (\n round(\n increase(\n celery_task_succeeded_total{\n job=\"$job\",\n name=~\"$task\",\n queue_name=~\"$queue_name\"\n }[$__range]\n )\n )\n) by (name)\n+sum (\n round(\n increase(\n celery_task_failed_total{\n job=\"$job\",\n name=~\"$task\",\n queue_name=~\"$queue_name\"\n }[$__range]\n )\n )\n) by (name)\n) > -1\n", + "expr": "sum (\n round(\n increase(\n celery_task_succeeded_total{\n cluster=\"$cluster\",\nnamespace=\"$namespace\",\njob=~\"$job\"\n,\nqueue_name=~\"$queue_name\"\n,\nname=~\"$task\",\nname!~\"None\"\n\n }[$__range]\n )\n )\n) by (name)\n/(sum (\n round(\n increase(\n celery_task_succeeded_total{\n cluster=\"$cluster\",\nnamespace=\"$namespace\",\njob=~\"$job\"\n,\nqueue_name=~\"$queue_name\"\n,\nname=~\"$task\",\nname!~\"None\"\n\n }[$__range]\n )\n )\n) by (name)\n+sum (\n round(\n increase(\n celery_task_failed_total{\n cluster=\"$cluster\",\nnamespace=\"$namespace\",\njob=~\"$job\"\n,\nqueue_name=~\"$queue_name\"\n,\nname=~\"$task\",\nname!~\"None\"\n\n }[$__range]\n )\n )\n) by (name)\n) > -1\n", "format": "table", "instant": true }, @@ -84,7 +93,7 @@ "type": "prometheus", "uid": "$datasource" }, - "expr": "sum (\n round(\n increase(\n celery_task_succeeded_total{\n job=\"$job\",\n name=~\"$task\",\n queue_name=~\"$queue_name\"\n }[$__range]\n )\n )\n) by (name) > 0\n", + "expr": "sum (\n round(\n increase(\n celery_task_succeeded_total{\n cluster=\"$cluster\",\nnamespace=\"$namespace\",\njob=~\"$job\"\n,\nqueue_name=~\"$queue_name\"\n,\nname=~\"$task\",\nname!~\"None\"\n\n }[$__range]\n )\n )\n) by (name) > 0\n", "format": "table", "instant": true }, @@ -93,7 +102,7 @@ "type": "prometheus", "uid": "$datasource" }, - "expr": "sum (\n round(\n increase(\n celery_task_failed_total{\n job=\"$job\",\n name=~\"$task\",\n queue_name=~\"$queue_name\"\n }[$__range]\n )\n )\n) by (name) > 0\n", + "expr": "sum (\n round(\n increase(\n celery_task_failed_total{\n cluster=\"$cluster\",\nnamespace=\"$namespace\",\njob=~\"$job\"\n,\nqueue_name=~\"$queue_name\"\n,\nname=~\"$task\",\nname!~\"None\"\n\n }[$__range]\n )\n )\n) by (name) > 0\n", "format": "table", "instant": true }, @@ -102,7 +111,7 @@ "type": "prometheus", "uid": "$datasource" }, - "expr": "sum (\n round(\n increase(\n celery_task_sent_total{\n job=\"$job\",\n name=~\"$task\",\n queue_name=~\"$queue_name\"\n }[$__range]\n )\n )\n) by (name) > 0\n", + "expr": "sum (\n round(\n increase(\n celery_task_sent_total{\n cluster=\"$cluster\",\nnamespace=\"$namespace\",\njob=~\"$job\"\n,\nqueue_name=~\"$queue_name\"\n,\nname=~\"$task\",\nname!~\"None\"\n\n }[$__range]\n )\n )\n) by (name) > 0\n", "format": "table", "instant": true }, @@ -111,7 +120,7 @@ "type": "prometheus", "uid": "$datasource" }, - "expr": "sum (\n round(\n increase(\n celery_task_received_total{\n job=\"$job\",\n name=~\"$task\",\n queue_name=~\"$queue_name\"\n }[$__range]\n )\n )\n) by (name) > 0\n", + "expr": "sum (\n round(\n increase(\n celery_task_received_total{\n cluster=\"$cluster\",\nnamespace=\"$namespace\",\njob=~\"$job\"\n,\nqueue_name=~\"$queue_name\"\n,\nname=~\"$task\",\nname!~\"None\"\n\n }[$__range]\n )\n )\n) by (name) > 0\n", "format": "table", "instant": true }, @@ -120,7 +129,7 @@ "type": "prometheus", "uid": "$datasource" }, - "expr": "sum (\n round(\n increase(\n celery_task_rejected_total{\n job=\"$job\",\n name=~\"$task\",\n queue_name=~\"$queue_name\"\n }[$__range]\n )\n )\n) by (name) > 0\n", + "expr": "sum (\n round(\n increase(\n celery_task_rejected_total{\n cluster=\"$cluster\",\nnamespace=\"$namespace\",\njob=~\"$job\"\n,\nqueue_name=~\"$queue_name\"\n,\nname=~\"$task\",\nname!~\"None\"\n\n }[$__range]\n )\n )\n) by (name) > 0\n", "format": "table", "instant": true }, @@ -129,7 +138,7 @@ "type": "prometheus", "uid": "$datasource" }, - "expr": "sum (\n round(\n increase(\n celery_task_retried_total{\n job=\"$job\",\n name=~\"$task\",\n queue_name=~\"$queue_name\"\n }[$__range]\n )\n )\n) by (name) > 0\n", + "expr": "sum (\n round(\n increase(\n celery_task_retried_total{\n cluster=\"$cluster\",\nnamespace=\"$namespace\",\njob=~\"$job\"\n,\nqueue_name=~\"$queue_name\"\n,\nname=~\"$task\",\nname!~\"None\"\n\n }[$__range]\n )\n )\n) by (name) > 0\n", "format": "table", "instant": true }, @@ -138,7 +147,7 @@ "type": "prometheus", "uid": "$datasource" }, - "expr": "sum (\n round(\n increase(\n celery_task_revoked_total{\n job=\"$job\",\n name=~\"$task\",\n queue_name=~\"$queue_name\"\n }[$__range]\n )\n )\n) by (name) > 0\n", + "expr": "sum (\n round(\n increase(\n celery_task_revoked_total{\n cluster=\"$cluster\",\nnamespace=\"$namespace\",\njob=~\"$job\"\n,\nqueue_name=~\"$queue_name\"\n,\nname=~\"$task\",\nname!~\"None\"\n\n }[$__range]\n )\n )\n) by (name) > 0\n", "format": "table", "instant": true } @@ -183,19 +192,21 @@ }, { "datasource": { - "type": "datasource", - "uid": "-- Mixed --" + "type": "prometheus", + "uid": "$datasource" }, + "description": "A table of task exceptions grouped by task name and exception type.", "fieldConfig": { "defaults": { "unit": "short" - } + }, + "overrides": [ ] }, "gridPos": { "h": 8, - "w": 8, - "x": 16, - "y": 1 + "w": 24, + "x": 0, + "y": 9 }, "id": 3, "options": { @@ -209,14 +220,14 @@ } ] }, - "pluginVersion": "v11.1.0", + "pluginVersion": "v11.4.0", "targets": [ { "datasource": { "type": "prometheus", "uid": "$datasource" }, - "expr": "round(\n sum (\n increase(\n celery_task_failed_total{\n job=\"$job\",\n name=~\"$task\",\n queue_name=~\"$queue_name\"\n }[$__range]\n )\n ) by (name, exception) > 0\n)\n", + "expr": "round(\n sum (\n increase(\n celery_task_failed_total{\n cluster=\"$cluster\",\nnamespace=\"$namespace\",\njob=~\"$job\"\n,\nqueue_name=~\"$queue_name\"\n,\nname=~\"$task\",\nname!~\"None\"\n\n }[$__range]\n )\n ) by (name, exception) > 0\n)\n", "format": "table", "instant": true } @@ -244,26 +255,45 @@ ], "type": "table" }, + { + "collapsed": false, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 17 + }, + "id": 4, + "title": "Tasks", + "type": "row" + }, { "datasource": { - "type": "datasource", - "uid": "-- Mixed --" + "type": "prometheus", + "uid": "$datasource" }, + "description": "A time series of tasks completed including succeeded, failed, sent, received, rejected, retried and revoked tasks grouped by task name.", "fieldConfig": { "defaults": { "custom": { - "spanNulls": false + "axisSoftMin": 0, + "fillOpacity": 100, + "lineWidth": 1, + "stacking": { + "mode": "normal" + } }, "unit": "short" - } + }, + "overrides": [ ] }, "gridPos": { - "h": 8, + "h": 6, "w": 24, "x": 0, - "y": 9 + "y": 18 }, - "id": 4, + "id": 5, "options": { "legend": { "calcs": [ @@ -281,14 +311,15 @@ "sort": "desc" } }, - "pluginVersion": "v11.1.0", + "pluginVersion": "v11.4.0", "targets": [ { "datasource": { "type": "prometheus", "uid": "$datasource" }, - "expr": "sum (\n round(\n increase(\n celery_task_succeeded_total{\n job=\"$job\",\n name=~\"$task\",\n queue_name=~\"$queue_name\"\n }[$__rate_interval]\n )\n )\n) by (name) > 0\n", + "exemplar": false, + "expr": "sum (\n round(\n increase(\n celery_task_succeeded_total{\n cluster=\"$cluster\",\nnamespace=\"$namespace\",\njob=~\"$job\"\n,\nqueue_name=~\"$queue_name\"\n,\nname=~\"$task\",\nname!~\"None\"\n\n }[$__rate_interval]\n )\n )\n) by (name) > 0\n", "legendFormat": "Succeeded - {{ name }}" }, { @@ -296,7 +327,8 @@ "type": "prometheus", "uid": "$datasource" }, - "expr": "sum (\n round(\n increase(\n celery_task_failed_total{\n job=\"$job\",\n name=~\"$task\",\n queue_name=~\"$queue_name\"\n }[$__rate_interval]\n )\n )\n) by (name) > 0\n", + "exemplar": false, + "expr": "sum (\n round(\n increase(\n celery_task_failed_total{\n cluster=\"$cluster\",\nnamespace=\"$namespace\",\njob=~\"$job\"\n,\nqueue_name=~\"$queue_name\"\n,\nname=~\"$task\",\nname!~\"None\"\n\n }[$__rate_interval]\n )\n )\n) by (name) > 0\n", "legendFormat": "Failed - {{ name }}" }, { @@ -304,7 +336,8 @@ "type": "prometheus", "uid": "$datasource" }, - "expr": "sum (\n round(\n increase(\n celery_task_sent_total{\n job=\"$job\",\n name=~\"$task\",\n queue_name=~\"$queue_name\"\n }[$__rate_interval]\n )\n )\n) by (name) > 0\n", + "exemplar": false, + "expr": "sum (\n round(\n increase(\n celery_task_sent_total{\n cluster=\"$cluster\",\nnamespace=\"$namespace\",\njob=~\"$job\"\n,\nqueue_name=~\"$queue_name\"\n,\nname=~\"$task\",\nname!~\"None\"\n\n }[$__rate_interval]\n )\n )\n) by (name) > 0\n", "legendFormat": "Sent - {{ name }}" }, { @@ -312,7 +345,8 @@ "type": "prometheus", "uid": "$datasource" }, - "expr": "sum (\n round(\n increase(\n celery_task_received_total{\n job=\"$job\",\n name=~\"$task\",\n queue_name=~\"$queue_name\"\n }[$__rate_interval]\n )\n )\n) by (name) > 0\n", + "exemplar": false, + "expr": "sum (\n round(\n increase(\n celery_task_received_total{\n cluster=\"$cluster\",\nnamespace=\"$namespace\",\njob=~\"$job\"\n,\nqueue_name=~\"$queue_name\"\n,\nname=~\"$task\",\nname!~\"None\"\n\n }[$__rate_interval]\n )\n )\n) by (name) > 0\n", "legendFormat": "Received - {{ name }}" }, { @@ -320,7 +354,8 @@ "type": "prometheus", "uid": "$datasource" }, - "expr": "sum (\n round(\n increase(\n celery_task_retried_total{\n job=\"$job\",\n name=~\"$task\",\n queue_name=~\"$queue_name\"\n }[$__rate_interval]\n )\n )\n) by (name) > 0\n", + "exemplar": false, + "expr": "sum (\n round(\n increase(\n celery_task_retried_total{\n cluster=\"$cluster\",\nnamespace=\"$namespace\",\njob=~\"$job\"\n,\nqueue_name=~\"$queue_name\"\n,\nname=~\"$task\",\nname!~\"None\"\n\n }[$__rate_interval]\n )\n )\n) by (name) > 0\n", "legendFormat": "Retried - {{ name }}" }, { @@ -328,7 +363,8 @@ "type": "prometheus", "uid": "$datasource" }, - "expr": "sum (\n round(\n increase(\n celery_task_revoked_total{\n job=\"$job\",\n name=~\"$task\",\n queue_name=~\"$queue_name\"\n }[$__rate_interval]\n )\n )\n) by (name) > 0\n", + "exemplar": false, + "expr": "sum (\n round(\n increase(\n celery_task_revoked_total{\n cluster=\"$cluster\",\nnamespace=\"$namespace\",\njob=~\"$job\"\n,\nqueue_name=~\"$queue_name\"\n,\nname=~\"$task\",\nname!~\"None\"\n\n }[$__rate_interval]\n )\n )\n) by (name) > 0\n", "legendFormat": "Revoked - {{ name }}" }, { @@ -336,7 +372,8 @@ "type": "prometheus", "uid": "$datasource" }, - "expr": "sum (\n round(\n increase(\n celery_task_rejected_total{\n job=\"$job\",\n name=~\"$task\",\n queue_name=~\"$queue_name\"\n }[$__rate_interval]\n )\n )\n) by (name) > 0\n", + "exemplar": false, + "expr": "sum (\n round(\n increase(\n celery_task_rejected_total{\n cluster=\"$cluster\",\nnamespace=\"$namespace\",\njob=~\"$job\"\n,\nqueue_name=~\"$queue_name\"\n,\nname=~\"$task\",\nname!~\"None\"\n\n }[$__rate_interval]\n )\n )\n) by (name) > 0\n", "legendFormat": "Rejected - {{ name }}" } ], @@ -345,24 +382,31 @@ }, { "datasource": { - "type": "datasource", - "uid": "-- Mixed --" + "type": "prometheus", + "uid": "$datasource" }, + "description": "A time series of task exceptions grouped by task name and exception type.", "fieldConfig": { "defaults": { "custom": { - "spanNulls": false + "axisSoftMin": 0, + "fillOpacity": 100, + "lineWidth": 1, + "stacking": { + "mode": "normal" + } }, "unit": "short" - } + }, + "overrides": [ ] }, "gridPos": { - "h": 8, + "h": 6, "w": 24, "x": 0, - "y": 17 + "y": 24 }, - "id": 5, + "id": 6, "options": { "legend": { "calcs": [ @@ -380,14 +424,15 @@ "sort": "desc" } }, - "pluginVersion": "v11.1.0", + "pluginVersion": "v11.4.0", "targets": [ { "datasource": { "type": "prometheus", "uid": "$datasource" }, - "expr": "sum (\n round(\n increase(\n celery_task_failed_total{\n job=\"$job\",\n name=~\"$task\",\n queue_name=~\"$queue_name\"\n }[$__rate_interval]\n )\n )\n) by (name, exception) > 0\n", + "exemplar": false, + "expr": "sum (\n round(\n increase(\n celery_task_failed_total{\n cluster=\"$cluster\",\nnamespace=\"$namespace\",\njob=~\"$job\"\n,\nqueue_name=~\"$queue_name\"\n,\nname=~\"$task\",\nname!~\"None\"\n\n }[$__rate_interval]\n )\n )\n) by (name, exception) > 0\n", "legendFormat": "{{ name }}/{{ exception }}" } ], @@ -396,13 +441,14 @@ }, { "datasource": { - "type": "datasource", - "uid": "-- Mixed --" + "type": "prometheus", + "uid": "$datasource" }, + "description": "A time series of task runtime percentiles (P50, P95, P99) grouped by task name.", "fieldConfig": { "defaults": { "custom": { - "spanNulls": false + "fillOpacity": 10 }, "unit": "s" }, @@ -455,12 +501,12 @@ ] }, "gridPos": { - "h": 8, + "h": 6, "w": 24, "x": 0, - "y": 25 + "y": 30 }, - "id": 6, + "id": 7, "options": { "legend": { "calcs": [ @@ -478,14 +524,15 @@ "sort": "desc" } }, - "pluginVersion": "v11.1.0", + "pluginVersion": "v11.4.0", "targets": [ { "datasource": { "type": "prometheus", "uid": "$datasource" }, - "expr": "histogram_quantile(0.50,\n sum(\n irate(\n celery_task_runtime_bucket{\n job=\"$job\",\n name=~\"$task\",\n queue_name=~\"$queue_name\"\n }[$__rate_interval]\n ) > 0\n ) by (name, job, le)\n)\n", + "exemplar": false, + "expr": "histogram_quantile(0.50,\n sum(\n irate(\n celery_task_runtime_bucket{\n cluster=\"$cluster\",\nnamespace=\"$namespace\",\njob=~\"$job\"\n,\nqueue_name=~\"$queue_name\"\n,\nname=~\"$task\",\nname!~\"None\"\n\n }[$__rate_interval]\n ) > 0\n ) by (name, job, le)\n)\n", "legendFormat": "P50 - {{ name }}" }, { @@ -493,7 +540,8 @@ "type": "prometheus", "uid": "$datasource" }, - "expr": "histogram_quantile(0.95,\n sum(\n irate(\n celery_task_runtime_bucket{\n job=\"$job\",\n name=~\"$task\",\n queue_name=~\"$queue_name\"\n }[$__rate_interval]\n ) > 0\n ) by (name, job, le)\n)\n", + "exemplar": false, + "expr": "histogram_quantile(0.95,\n sum(\n irate(\n celery_task_runtime_bucket{\n cluster=\"$cluster\",\nnamespace=\"$namespace\",\njob=~\"$job\"\n,\nqueue_name=~\"$queue_name\"\n,\nname=~\"$task\",\nname!~\"None\"\n\n }[$__rate_interval]\n ) > 0\n ) by (name, job, le)\n)\n", "legendFormat": "P95 - {{ name }}" }, { @@ -501,7 +549,8 @@ "type": "prometheus", "uid": "$datasource" }, - "expr": "histogram_quantile(0.99,\n sum(\n irate(\n celery_task_runtime_bucket{\n job=\"$job\",\n name=~\"$task\",\n queue_name=~\"$queue_name\"\n }[$__rate_interval]\n ) > 0\n ) by (name, job, le)\n)\n", + "exemplar": false, + "expr": "histogram_quantile(0.99,\n sum(\n irate(\n celery_task_runtime_bucket{\n cluster=\"$cluster\",\nnamespace=\"$namespace\",\njob=~\"$job\"\n,\nqueue_name=~\"$queue_name\"\n,\nname=~\"$task\",\nname!~\"None\"\n\n }[$__rate_interval]\n ) > 0\n ) by (name, job, le)\n)\n", "legendFormat": "P99 - {{ name }}" } ], @@ -517,11 +566,29 @@ "templating": { "list": [ { + "current": { + "selected": true, + "text": "default", + "value": "default" + }, "label": "Data source", "name": "datasource", "query": "prometheus", "type": "datasource" }, + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "hide": 2, + "label": "Cluster", + "name": "cluster", + "query": "label_values(celery_worker_up{}, cluster)", + "refresh": 2, + "sort": 1, + "type": "query" + }, { "datasource": { "type": "prometheus", @@ -531,7 +598,7 @@ "label": "Namespace", "multi": false, "name": "namespace", - "query": "label_values(celery_worker_up{}, namespace)", + "query": "label_values(celery_worker_up{cluster=\"$cluster\"}, namespace)", "refresh": 2, "sort": 1, "type": "query" @@ -545,7 +612,7 @@ "label": "Job", "multi": false, "name": "job", - "query": "label_values(celery_worker_up{namespace=\"$namespace\"}, job)", + "query": "label_values(celery_worker_up{cluster=\"$cluster\", namespace=\"$namespace\"}, job)", "refresh": 2, "sort": 1, "type": "query" @@ -559,7 +626,7 @@ "label": "Queue Name", "multi": false, "name": "queue_name", - "query": "label_values(celery_task_received_total{namespace=\"$namespace\", job=\"$job\", name!~\"None\"}, queue_name)", + "query": "label_values(celery_task_received_total{cluster=\"$cluster\", namespace=\"$namespace\", job=~\"$job\", queue_name!~\"None\"}, queue_name)", "refresh": 2, "sort": 1, "type": "query" @@ -573,7 +640,7 @@ "label": "Task", "multi": true, "name": "task", - "query": "label_values(celery_task_received_total{namespace=\"$namespace\", job=\"$job\", queue_name=~\"$queue_name\", name!~\"None\"}, name)", + "query": "label_values(celery_task_received_total{cluster=\"$cluster\", namespace=\"$namespace\", job=~\"$job\", queue_name=~\"$queue_name\", name!~\"None\"}, name)", "refresh": 2, "sort": 1, "type": "query" diff --git a/celery-mixin/dashboards_out/celery-tasks-overview.json b/celery-mixin/dashboards_out/celery-tasks-overview.json index c752bf5..0708cc9 100644 --- a/celery-mixin/dashboards_out/celery-tasks-overview.json +++ b/celery-mixin/dashboards_out/celery-tasks-overview.json @@ -1,14 +1,22 @@ { - "description": "A dashboard that monitors Celery. It is created using the Celery-mixin for the the (Celery-exporter)[https://github.com/danihodovic/celery-exporter].", - "editable": true, + "__inputs": [ ], + "__requires": [ ], + "annotations": { + "list": [ ] + }, + "description": "A dashboard that monitors Celery. The dashboards were generated using [celery-mixin](https://github.com/danihodovic/celery-exporter). Open issues and create feature requests in the repository.", + "editable": false, "links": [ { + "asDropdown": true, + "includeVars": true, + "keepTime": true, "tags": [ "celery", "celery-mixin" ], "targetBlank": true, - "title": "Celery Dashboards", + "title": "Celery", "type": "dashboards" } ], @@ -27,20 +35,18 @@ }, { "datasource": { - "type": "datasource", - "uid": "-- Mixed --" + "type": "prometheus", + "uid": "$datasource" }, + "description": "Number of active Celery Workers", "fieldConfig": { "defaults": { + "mappings": [ ], "thresholds": { "steps": [ - { - "color": "red", - "value": 0 - }, { "color": "green", - "value": 0.10000000000000001 + "value": 0 } ] }, @@ -54,21 +60,14 @@ "y": 1 }, "id": 2, - "options": { - "reduceOptions": { - "calcs": [ - "lastNotNull" - ] - } - }, - "pluginVersion": "v11.1.0", + "pluginVersion": "v11.4.0", "targets": [ { "datasource": { "type": "prometheus", - "uid": "$datasource" + "uid": "${datasource}" }, - "expr": "count(\n celery_worker_up{\n job=\"$job\",\n } == 1\n)\n" + "expr": "count(\n celery_worker_up{\n cluster=\"$cluster\",\nnamespace=\"$namespace\",\njob=~\"$job\"\n\n } == 1\n)\n" } ], "title": "Workers", @@ -76,20 +75,18 @@ }, { "datasource": { - "type": "datasource", - "uid": "-- Mixed --" + "type": "prometheus", + "uid": "$datasource" }, + "description": "Number of active tasks across all workers", "fieldConfig": { "defaults": { + "mappings": [ ], "thresholds": { "steps": [ - { - "color": "red", - "value": 0 - }, { "color": "green", - "value": 0.10000000000000001 + "value": 0 } ] }, @@ -103,42 +100,33 @@ "y": 1 }, "id": 3, - "options": { - "reduceOptions": { - "calcs": [ - "lastNotNull" - ] - } - }, - "pluginVersion": "v11.1.0", + "pluginVersion": "v11.4.0", "targets": [ { "datasource": { "type": "prometheus", - "uid": "$datasource" + "uid": "${datasource}" }, - "expr": "sum(\n celery_worker_tasks_active{\n job=\"$job\",\n }\n)\n" + "expr": "sum(\n celery_worker_tasks_active{\n cluster=\"$cluster\",\nnamespace=\"$namespace\",\njob=~\"$job\"\n\n }\n)\n" } ], - "title": "Tasks Active", + "title": "Workers Active Tasks", "type": "stat" }, { "datasource": { - "type": "datasource", - "uid": "-- Mixed --" + "type": "prometheus", + "uid": "$datasource" }, + "description": "Number of tasks received by workers in the last week", "fieldConfig": { "defaults": { + "mappings": [ ], "thresholds": { "steps": [ - { - "color": "red", - "value": 0 - }, { "color": "green", - "value": 0.10000000000000001 + "value": 0 } ] }, @@ -152,21 +140,14 @@ "y": 1 }, "id": 4, - "options": { - "reduceOptions": { - "calcs": [ - "lastNotNull" - ] - } - }, - "pluginVersion": "v11.1.0", + "pluginVersion": "v11.4.0", "targets": [ { "datasource": { "type": "prometheus", - "uid": "$datasource" + "uid": "${datasource}" }, - "expr": "sum(\n round(\n increase(\n celery_task_received_total{\n job=\"$job\",\n queue_name=~\"$queue_name\"\n }[1w]\n )\n )\n)\n" + "expr": "sum(\n round(\n increase(\n celery_task_received_total{\n cluster=\"$cluster\",\nnamespace=\"$namespace\",\njob=~\"$job\"\n,\nqueue_name=~\"$queue_name\"\n\n }[1w]\n )\n )\n)\n" } ], "title": "Tasks received by workers [1w]", @@ -174,11 +155,13 @@ }, { "datasource": { - "type": "datasource", - "uid": "-- Mixed --" + "type": "prometheus", + "uid": "$datasource" }, + "description": "Rate of successful tasks in the last week", "fieldConfig": { "defaults": { + "mappings": [ ], "thresholds": { "steps": [ { @@ -205,21 +188,14 @@ "y": 1 }, "id": 5, - "options": { - "reduceOptions": { - "calcs": [ - "lastNotNull" - ] - } - }, - "pluginVersion": "v11.1.0", + "pluginVersion": "v11.4.0", "targets": [ { "datasource": { "type": "prometheus", - "uid": "$datasource" + "uid": "${datasource}" }, - "expr": "sum(\n round(\n increase(\n celery_task_succeeded_total{\n job=\"$job\",\n queue_name=~\"$queue_name\"\n }[1w]\n )\n )\n)\n/(sum(\n round(\n increase(\n celery_task_succeeded_total{\n job=\"$job\",\n queue_name=~\"$queue_name\"\n }[1w]\n )\n )\n)\n+sum(\n round(\n increase(\n celery_task_failed_total{\n job=\"$job\",\n queue_name=~\"$queue_name\"\n }[1w]\n )\n )\n)\n)\n" + "expr": "sum(\n round(\n increase(\n celery_task_succeeded_total{\n cluster=\"$cluster\",\nnamespace=\"$namespace\",\njob=~\"$job\"\n,\nqueue_name=~\"$queue_name\"\n\n }[1w]\n )\n )\n)\n/(sum(\n round(\n increase(\n celery_task_succeeded_total{\n cluster=\"$cluster\",\nnamespace=\"$namespace\",\njob=~\"$job\"\n,\nqueue_name=~\"$queue_name\"\n\n }[1w]\n )\n )\n)\n+sum(\n round(\n increase(\n celery_task_failed_total{\n cluster=\"$cluster\",\nnamespace=\"$namespace\",\njob=~\"$job\"\n,\nqueue_name=~\"$queue_name\"\n\n }[1w]\n )\n )\n)\n)\n" } ], "title": "Tasks Success Rate [1w]", @@ -227,20 +203,18 @@ }, { "datasource": { - "type": "datasource", - "uid": "-- Mixed --" + "type": "prometheus", + "uid": "$datasource" }, + "description": "Average runtime for tasks in the last week", "fieldConfig": { "defaults": { + "mappings": [ ], "thresholds": { "steps": [ - { - "color": "red", - "value": 0 - }, { "color": "green", - "value": 0.10000000000000001 + "value": 0 } ] }, @@ -254,21 +228,14 @@ "y": 1 }, "id": 6, - "options": { - "reduceOptions": { - "calcs": [ - "lastNotNull" - ] - } - }, - "pluginVersion": "v11.1.0", + "pluginVersion": "v11.4.0", "targets": [ { "datasource": { "type": "prometheus", - "uid": "$datasource" + "uid": "${datasource}" }, - "expr": "sum(\n rate(\n celery_task_runtime_sum{\n job=\"$job\",\n queue_name=~\"$queue_name\"\n }[1w]\n )\n)\n/\nsum(\n rate(\n celery_task_runtime_count{\n job=\"$job\",\n queue_name=~\"$queue_name\"\n }[1w]\n )\n) > 0\n" + "expr": "sum(\n rate(\n celery_task_runtime_sum{\n cluster=\"$cluster\",\nnamespace=\"$namespace\",\njob=~\"$job\"\n,\nqueue_name=~\"$queue_name\"\n\n }[1w]\n )\n)\n/\nsum(\n rate(\n celery_task_runtime_count{\n cluster=\"$cluster\",\nnamespace=\"$namespace\",\njob=~\"$job\"\n,\nqueue_name=~\"$queue_name\"\n\n }[1w]\n )\n) > 0\n" } ], "title": "Average Runtime for Tasks [1w]", @@ -276,9 +243,10 @@ }, { "datasource": { - "type": "datasource", - "uid": "-- Mixed --" + "type": "prometheus", + "uid": "$datasource" }, + "description": "Table of tasks with the most failures in the last week", "fieldConfig": { "defaults": { "unit": "short" @@ -323,14 +291,14 @@ } ] }, - "pluginVersion": "v11.1.0", + "pluginVersion": "v11.4.0", "targets": [ { "datasource": { "type": "prometheus", "uid": "$datasource" }, - "expr": "round(\n sum (\n increase(\n celery_task_failed_total{\n job=\"$job\",\n queue_name=~\"$queue_name\"\n }[1w]\n ) > 0\n ) by (job, name)\n)\n", + "expr": "round(\n sum (\n increase(\n celery_task_failed_total{\n cluster=\"$cluster\",\nnamespace=\"$namespace\",\njob=~\"$job\"\n,\nqueue_name=~\"$queue_name\"\n\n }[1w]\n ) > 0\n ) by (job, name)\n)\n", "format": "table", "instant": true } @@ -358,13 +326,15 @@ }, { "datasource": { - "type": "datasource", - "uid": "-- Mixed --" + "type": "prometheus", + "uid": "$datasource" }, + "description": "Table of the most common exceptions in the last week", "fieldConfig": { "defaults": { "unit": "short" - } + }, + "overrides": [ ] }, "gridPos": { "h": 8, @@ -384,14 +354,14 @@ } ] }, - "pluginVersion": "v11.1.0", + "pluginVersion": "v11.4.0", "targets": [ { "datasource": { "type": "prometheus", "uid": "$datasource" }, - "expr": "round(\n sum (\n increase(\n celery_task_failed_total{\n job=\"$job\",\n queue_name=~\"$queue_name\"\n }[1w]\n )\n ) by (job, exception) > 0\n)\n", + "expr": "round(\n sum (\n increase(\n celery_task_failed_total{\n cluster=\"$cluster\",\nnamespace=\"$namespace\",\njob=~\"$job\"\n,\nqueue_name=~\"$queue_name\"\n\n }[1w]\n )\n ) by (job, exception) > 0\n)\n", "format": "table", "instant": true } @@ -419,9 +389,10 @@ }, { "datasource": { - "type": "datasource", - "uid": "-- Mixed --" + "type": "prometheus", + "uid": "$datasource" }, + "description": "Table of tasks with the highest average runtime in the last week", "fieldConfig": { "defaults": { "unit": "s" @@ -466,14 +437,14 @@ } ] }, - "pluginVersion": "v11.1.0", + "pluginVersion": "v11.4.0", "targets": [ { "datasource": { "type": "prometheus", "uid": "$datasource" }, - "expr": "sum (\n rate(\n celery_task_runtime_sum{\n job=\"$job\",\n queue_name=~\"$queue_name\"\n }[1w]\n )\n) by(name)\n/\nsum (\n rate(\n celery_task_runtime_count{\n job=\"$job\",\n queue_name=~\"$queue_name\"\n }[1w]\n )\n) by (name) > 0\n", + "expr": "sum (\n rate(\n celery_task_runtime_sum{\n cluster=\"$cluster\",\nnamespace=\"$namespace\",\njob=~\"$job\"\n,\nqueue_name=~\"$queue_name\"\n\n }[1w]\n )\n) by(name)\n/\nsum (\n rate(\n celery_task_runtime_count{\n cluster=\"$cluster\",\nnamespace=\"$namespace\",\njob=~\"$job\"\n,\nqueue_name=~\"$queue_name\"\n\n }[1w]\n )\n) by (name) > 0\n", "format": "table", "instant": true } @@ -513,16 +484,23 @@ }, { "datasource": { - "type": "datasource", - "uid": "-- Mixed --" + "type": "prometheus", + "uid": "$datasource" }, + "description": "Length of Celery queues", "fieldConfig": { "defaults": { "custom": { - "spanNulls": false + "axisSoftMin": 0, + "fillOpacity": 100, + "lineWidth": 1, + "stacking": { + "mode": "normal" + } }, "unit": "short" - } + }, + "overrides": [ ] }, "gridPos": { "h": 6, @@ -548,14 +526,15 @@ "sort": "desc" } }, - "pluginVersion": "v11.1.0", + "pluginVersion": "v11.4.0", "targets": [ { "datasource": { "type": "prometheus", "uid": "$datasource" }, - "expr": "sum (\n celery_queue_length{\n job=\"$job\",\n queue_name=~\"$queue_name\"\n }\n) by (job, queue_name)\n", + "exemplar": false, + "expr": "sum (\n celery_queue_length{\n cluster=\"$cluster\",\nnamespace=\"$namespace\",\njob=~\"$job\"\n,\nqueue_name=~\"$queue_name\"\n\n }\n) by (job, queue_name)\n", "legendFormat": "{{ job }}/{{ queue_name }}" } ], @@ -576,9 +555,10 @@ }, { "datasource": { - "type": "datasource", - "uid": "-- Mixed --" + "type": "prometheus", + "uid": "$datasource" }, + "description": "Table with an overview of task statistics", "fieldConfig": { "defaults": { "noValue": 0, @@ -600,13 +580,16 @@ ] }, "gridPos": { - "h": 4, + "h": 5, "w": 24, "x": 0, "y": 21 }, "id": 13, "options": { + "footer": { + "enablePagination": true + }, "sortBy": [ { "desc": true, @@ -614,14 +597,14 @@ } ] }, - "pluginVersion": "v11.1.0", + "pluginVersion": "v11.4.0", "targets": [ { "datasource": { "type": "prometheus", "uid": "$datasource" }, - "expr": "sum (\n round(\n increase(\n celery_task_succeeded_total{\n job=\"$job\",\n queue_name=~\"$queue_name\"\n }[$__range]\n )\n )\n) by (job)\n/(sum (\n round(\n increase(\n celery_task_succeeded_total{\n job=\"$job\",\n queue_name=~\"$queue_name\"\n }[$__range]\n )\n )\n) by (job)\n+sum (\n round(\n increase(\n celery_task_failed_total{\n job=\"$job\",\n queue_name=~\"$queue_name\"\n }[$__range]\n )\n )\n) by (job)\n) > -1\n", + "expr": "sum (\n round(\n increase(\n celery_task_succeeded_total{\n cluster=\"$cluster\",\nnamespace=\"$namespace\",\njob=~\"$job\"\n,\nqueue_name=~\"$queue_name\"\n\n }[$__range]\n )\n )\n) by (job)\n/(sum (\n round(\n increase(\n celery_task_succeeded_total{\n cluster=\"$cluster\",\nnamespace=\"$namespace\",\njob=~\"$job\"\n,\nqueue_name=~\"$queue_name\"\n\n }[$__range]\n )\n )\n) by (job)\n+sum (\n round(\n increase(\n celery_task_failed_total{\n cluster=\"$cluster\",\nnamespace=\"$namespace\",\njob=~\"$job\"\n,\nqueue_name=~\"$queue_name\"\n\n }[$__range]\n )\n )\n) by (job)\n) > -1\n", "format": "table", "instant": true }, @@ -630,7 +613,7 @@ "type": "prometheus", "uid": "$datasource" }, - "expr": "sum (\n round(\n increase(\n celery_task_succeeded_total{\n job=\"$job\",\n queue_name=~\"$queue_name\"\n }[$__range]\n )\n )\n) by (job) > 0\n", + "expr": "sum (\n round(\n increase(\n celery_task_succeeded_total{\n cluster=\"$cluster\",\nnamespace=\"$namespace\",\njob=~\"$job\"\n,\nqueue_name=~\"$queue_name\"\n\n }[$__range]\n )\n )\n) by (job) > 0\n", "format": "table", "instant": true }, @@ -639,7 +622,7 @@ "type": "prometheus", "uid": "$datasource" }, - "expr": "sum (\n round(\n increase(\n celery_task_failed_total{\n job=\"$job\",\n queue_name=~\"$queue_name\"\n }[$__range]\n )\n )\n) by (job) > 0\n", + "expr": "sum (\n round(\n increase(\n celery_task_failed_total{\n cluster=\"$cluster\",\nnamespace=\"$namespace\",\njob=~\"$job\"\n,\nqueue_name=~\"$queue_name\"\n\n }[$__range]\n )\n )\n) by (job) > 0\n", "format": "table", "instant": true }, @@ -648,7 +631,7 @@ "type": "prometheus", "uid": "$datasource" }, - "expr": "sum (\n round(\n increase(\n celery_task_sent_total{\n job=\"$job\",\n queue_name=~\"$queue_name\"\n }[$__range]\n )\n )\n) by (job) > 0\n", + "expr": "sum (\n round(\n increase(\n celery_task_sent_total{\n cluster=\"$cluster\",\nnamespace=\"$namespace\",\njob=~\"$job\"\n,\nqueue_name=~\"$queue_name\"\n\n }[$__range]\n )\n )\n) by (job) > 0\n", "format": "table", "instant": true }, @@ -657,7 +640,7 @@ "type": "prometheus", "uid": "$datasource" }, - "expr": "sum (\n round(\n increase(\n celery_task_received_total{\n job=\"$job\",\n queue_name=~\"$queue_name\"\n }[$__range]\n )\n )\n) by (job) > 0\n", + "expr": "sum (\n round(\n increase(\n celery_task_received_total{\n cluster=\"$cluster\",\nnamespace=\"$namespace\",\njob=~\"$job\"\n,\nqueue_name=~\"$queue_name\"\n\n }[$__range]\n )\n )\n) by (job) > 0\n", "format": "table", "instant": true }, @@ -666,7 +649,7 @@ "type": "prometheus", "uid": "$datasource" }, - "expr": "sum (\n round(\n increase(\n celery_task_rejected_total{\n job=\"$job\",\n queue_name=~\"$queue_name\"\n }[$__range]\n )\n )\n) by (job) > 0\n", + "expr": "sum (\n round(\n increase(\n celery_task_rejected_total{\n cluster=\"$cluster\",\nnamespace=\"$namespace\",\njob=~\"$job\"\n,\nqueue_name=~\"$queue_name\"\n\n }[$__range]\n )\n )\n) by (job) > 0\n", "format": "table", "instant": true }, @@ -675,7 +658,7 @@ "type": "prometheus", "uid": "$datasource" }, - "expr": "sum (\n round(\n increase(\n celery_task_retried_total{\n job=\"$job\",\n queue_name=~\"$queue_name\"\n }[$__range]\n )\n )\n) by (job) > 0\n", + "expr": "sum (\n round(\n increase(\n celery_task_retried_total{\n cluster=\"$cluster\",\nnamespace=\"$namespace\",\njob=~\"$job\"\n,\nqueue_name=~\"$queue_name\"\n\n }[$__range]\n )\n )\n) by (job) > 0\n", "format": "table", "instant": true }, @@ -684,7 +667,7 @@ "type": "prometheus", "uid": "$datasource" }, - "expr": "sum (\n round(\n increase(\n celery_task_revoked_total{\n job=\"$job\",\n queue_name=~\"$queue_name\"\n }[$__range]\n )\n )\n) by (job) > 0\n", + "expr": "sum (\n round(\n increase(\n celery_task_revoked_total{\n cluster=\"$cluster\",\nnamespace=\"$namespace\",\njob=~\"$job\"\n,\nqueue_name=~\"$queue_name\"\n\n }[$__range]\n )\n )\n) by (job) > 0\n", "format": "table", "instant": true } @@ -729,22 +712,29 @@ }, { "datasource": { - "type": "datasource", - "uid": "-- Mixed --" + "type": "prometheus", + "uid": "$datasource" }, + "description": "Number of tasks completed over time", "fieldConfig": { "defaults": { "custom": { - "spanNulls": false + "axisSoftMin": 0, + "fillOpacity": 100, + "lineWidth": 1, + "stacking": { + "mode": "normal" + } }, "unit": "short" - } + }, + "overrides": [ ] }, "gridPos": { "h": 10, "w": 24, "x": 0, - "y": 25 + "y": 26 }, "id": 14, "options": { @@ -764,14 +754,15 @@ "sort": "desc" } }, - "pluginVersion": "v11.1.0", + "pluginVersion": "v11.4.0", "targets": [ { "datasource": { "type": "prometheus", "uid": "$datasource" }, - "expr": "sum (\n round(\n increase(\n celery_task_succeeded_total{\n job=\"$job\",\n queue_name=~\"$queue_name\"\n }[$__rate_interval]\n )\n )\n)\n", + "exemplar": false, + "expr": "sum (\n round(\n increase(\n celery_task_succeeded_total{\n cluster=\"$cluster\",\nnamespace=\"$namespace\",\njob=~\"$job\"\n,\nqueue_name=~\"$queue_name\"\n\n }[$__rate_interval]\n )\n )\n)\n", "legendFormat": "Succeeded" }, { @@ -779,7 +770,8 @@ "type": "prometheus", "uid": "$datasource" }, - "expr": "sum (\n round(\n increase(\n celery_task_failed_total{\n job=\"$job\",\n queue_name=~\"$queue_name\"\n }[$__rate_interval]\n )\n )\n)\n", + "exemplar": false, + "expr": "sum (\n round(\n increase(\n celery_task_failed_total{\n cluster=\"$cluster\",\nnamespace=\"$namespace\",\njob=~\"$job\"\n,\nqueue_name=~\"$queue_name\"\n\n }[$__rate_interval]\n )\n )\n)\n", "legendFormat": "Failed" }, { @@ -787,7 +779,8 @@ "type": "prometheus", "uid": "$datasource" }, - "expr": "sum (\n round(\n increase(\n celery_task_sent_total{\n job=\"$job\",\n queue_name=~\"$queue_name\"\n }[$__rate_interval]\n )\n )\n)\n", + "exemplar": false, + "expr": "sum (\n round(\n increase(\n celery_task_sent_total{\n cluster=\"$cluster\",\nnamespace=\"$namespace\",\njob=~\"$job\"\n,\nqueue_name=~\"$queue_name\"\n\n }[$__rate_interval]\n )\n )\n)\n", "legendFormat": "Sent" }, { @@ -795,7 +788,8 @@ "type": "prometheus", "uid": "$datasource" }, - "expr": "sum (\n round(\n increase(\n celery_task_received_total{\n job=\"$job\",\n queue_name=~\"$queue_name\"\n }[$__rate_interval]\n )\n )\n)\n", + "exemplar": false, + "expr": "sum (\n round(\n increase(\n celery_task_received_total{\n cluster=\"$cluster\",\nnamespace=\"$namespace\",\njob=~\"$job\"\n,\nqueue_name=~\"$queue_name\"\n\n }[$__rate_interval]\n )\n )\n)\n", "legendFormat": "Received" }, { @@ -803,7 +797,8 @@ "type": "prometheus", "uid": "$datasource" }, - "expr": "sum (\n round(\n increase(\n celery_task_retried_total{\n job=\"$job\",\n queue_name=~\"$queue_name\"\n }[$__rate_interval]\n )\n )\n)\n", + "exemplar": false, + "expr": "sum (\n round(\n increase(\n celery_task_retried_total{\n cluster=\"$cluster\",\nnamespace=\"$namespace\",\njob=~\"$job\"\n,\nqueue_name=~\"$queue_name\"\n\n }[$__rate_interval]\n )\n )\n)\n", "legendFormat": "Retried" }, { @@ -811,7 +806,8 @@ "type": "prometheus", "uid": "$datasource" }, - "expr": "sum (\n round(\n increase(\n celery_task_revoked_total{\n job=\"$job\",\n queue_name=~\"$queue_name\"\n }[$__rate_interval]\n )\n )\n)\n", + "exemplar": false, + "expr": "sum (\n round(\n increase(\n celery_task_revoked_total{\n cluster=\"$cluster\",\nnamespace=\"$namespace\",\njob=~\"$job\"\n,\nqueue_name=~\"$queue_name\"\n\n }[$__rate_interval]\n )\n )\n)\n", "legendFormat": "Revoked" }, { @@ -819,7 +815,8 @@ "type": "prometheus", "uid": "$datasource" }, - "expr": "sum (\n round(\n increase(\n celery_task_rejected_total{\n job=\"$job\",\n queue_name=~\"$queue_name\"\n }[$__rate_interval]\n )\n )\n)\n", + "exemplar": false, + "expr": "sum (\n round(\n increase(\n celery_task_rejected_total{\n cluster=\"$cluster\",\nnamespace=\"$namespace\",\njob=~\"$job\"\n,\nqueue_name=~\"$queue_name\"\n\n }[$__rate_interval]\n )\n )\n)\n", "legendFormat": "Rejected" } ], @@ -828,13 +825,14 @@ }, { "datasource": { - "type": "datasource", - "uid": "-- Mixed --" + "type": "prometheus", + "uid": "$datasource" }, + "description": "Task runtime percentiles over time", "fieldConfig": { "defaults": { "custom": { - "spanNulls": false + "fillOpacity": 10 }, "unit": "s" }, @@ -890,7 +888,7 @@ "h": 10, "w": 24, "x": 0, - "y": 35 + "y": 36 }, "id": 15, "options": { @@ -910,14 +908,15 @@ "sort": "desc" } }, - "pluginVersion": "v11.1.0", + "pluginVersion": "v11.4.0", "targets": [ { "datasource": { "type": "prometheus", "uid": "$datasource" }, - "expr": "histogram_quantile(0.50,\n sum(\n irate(\n celery_task_runtime_bucket{\n job=\"$job\",\n queue_name=~\"$queue_name\"\n }[$__rate_interval]\n ) > 0\n ) by (job, le)\n)\n", + "exemplar": false, + "expr": "histogram_quantile(0.50,\n sum(\n irate(\n celery_task_runtime_bucket{\n cluster=\"$cluster\",\nnamespace=\"$namespace\",\njob=~\"$job\"\n,\nqueue_name=~\"$queue_name\"\n\n }[$__rate_interval]\n ) > 0\n ) by (job, le)\n)\n", "legendFormat": "P50" }, { @@ -925,7 +924,8 @@ "type": "prometheus", "uid": "$datasource" }, - "expr": "histogram_quantile(0.95,\n sum(\n irate(\n celery_task_runtime_bucket{\n job=\"$job\",\n queue_name=~\"$queue_name\"\n }[$__rate_interval]\n ) > 0\n ) by (job, le)\n)\n", + "exemplar": false, + "expr": "histogram_quantile(0.95,\n sum(\n irate(\n celery_task_runtime_bucket{\n cluster=\"$cluster\",\nnamespace=\"$namespace\",\njob=~\"$job\"\n,\nqueue_name=~\"$queue_name\"\n\n }[$__rate_interval]\n ) > 0\n ) by (job, le)\n)\n", "legendFormat": "P95" }, { @@ -933,7 +933,8 @@ "type": "prometheus", "uid": "$datasource" }, - "expr": "histogram_quantile(0.99,\n sum(\n irate(\n celery_task_runtime_bucket{\n job=\"$job\",\n queue_name=~\"$queue_name\"\n }[$__rate_interval]\n ) > 0\n ) by (job, le)\n)\n", + "exemplar": false, + "expr": "histogram_quantile(0.99,\n sum(\n irate(\n celery_task_runtime_bucket{\n cluster=\"$cluster\",\nnamespace=\"$namespace\",\njob=~\"$job\"\n,\nqueue_name=~\"$queue_name\"\n\n }[$__rate_interval]\n ) > 0\n ) by (job, le)\n)\n", "legendFormat": "P99" } ], @@ -949,11 +950,29 @@ "templating": { "list": [ { + "current": { + "selected": true, + "text": "default", + "value": "default" + }, "label": "Data source", "name": "datasource", "query": "prometheus", "type": "datasource" }, + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "hide": 2, + "label": "Cluster", + "name": "cluster", + "query": "label_values(celery_worker_up{}, cluster)", + "refresh": 2, + "sort": 1, + "type": "query" + }, { "datasource": { "type": "prometheus", @@ -963,7 +982,7 @@ "label": "Namespace", "multi": false, "name": "namespace", - "query": "label_values(celery_worker_up{}, namespace)", + "query": "label_values(celery_worker_up{cluster=\"$cluster\"}, namespace)", "refresh": 2, "sort": 1, "type": "query" @@ -977,7 +996,7 @@ "label": "Job", "multi": false, "name": "job", - "query": "label_values(celery_worker_up{namespace=\"$namespace\"}, job)", + "query": "label_values(celery_worker_up{cluster=\"$cluster\", namespace=\"$namespace\"}, job)", "refresh": 2, "sort": 1, "type": "query" @@ -991,7 +1010,7 @@ "label": "Queue Name", "multi": false, "name": "queue_name", - "query": "label_values(celery_task_received_total{namespace=\"$namespace\", job=\"$job\", name!~\"None\"}, queue_name)", + "query": "label_values(celery_task_received_total{cluster=\"$cluster\", namespace=\"$namespace\", job=~\"$job\", queue_name!~\"None\"}, queue_name)", "refresh": 2, "sort": 1, "type": "query" diff --git a/celery-mixin/jsonnetfile.json b/celery-mixin/jsonnetfile.json index 2d56d91..4bd12be 100644 --- a/celery-mixin/jsonnetfile.json +++ b/celery-mixin/jsonnetfile.json @@ -9,7 +9,24 @@ } }, "version": "main" + }, + { + "source": { + "git": { + "remote": "https://github.com/jsonnet-libs/docsonnet.git", + "subdir": "doc-util" + } + }, + "version": "master" + }, + { + "source": { + "git": { + "remote": "https://github.com/jsonnet-libs/xtd.git", + "subdir": "" + } + }, + "version": "master" } - ], - "legacyImports": false + ] } diff --git a/celery-mixin/jsonnetfile.lock.json b/celery-mixin/jsonnetfile.lock.json new file mode 100644 index 0000000..6dbf548 --- /dev/null +++ b/celery-mixin/jsonnetfile.lock.json @@ -0,0 +1,46 @@ +{ + "version": 1, + "dependencies": [ + { + "source": { + "git": { + "remote": "https://github.com/grafana/grafonnet.git", + "subdir": "gen/grafonnet-latest" + } + }, + "version": "42d098fae987f25f08480e203ca6ddc548c6efbf", + "sum": "V9vAj21qJOc2DlMPDgB1eEjSQU4A+sAA4AXuJ6bd4xc=" + }, + { + "source": { + "git": { + "remote": "https://github.com/grafana/grafonnet.git", + "subdir": "gen/grafonnet-v11.4.0" + } + }, + "version": "42d098fae987f25f08480e203ca6ddc548c6efbf", + "sum": "aVAX09paQYNOoCSKVpuk1exVIyBoMt/C50QJI+Q/3nA=" + }, + { + "source": { + "git": { + "remote": "https://github.com/jsonnet-libs/docsonnet.git", + "subdir": "doc-util" + } + }, + "version": "6ac6c69685b8c29c54515448eaca583da2d88150", + "sum": "BrAL/k23jq+xy9oA7TWIhUx07dsA/QLm3g7ktCwe//U=" + }, + { + "source": { + "git": { + "remote": "https://github.com/jsonnet-libs/xtd.git", + "subdir": "" + } + }, + "version": "4eee017d21cb63a303925d1dcd9fc5c496809b46", + "sum": "Kh0GbIycNmJPzk6IOMXn1BbtLNyaiiimclYk7+mvsns=" + } + ], + "legacyImports": false +} diff --git a/celery-mixin/lib/alerts.jsonnet b/celery-mixin/lib/alerts.jsonnet new file mode 100644 index 0000000..d396a38 --- /dev/null +++ b/celery-mixin/lib/alerts.jsonnet @@ -0,0 +1 @@ +std.manifestYamlDoc((import '../mixin.libsonnet').prometheusAlerts) diff --git a/celery-mixin/lib/dashboards.jsonnet b/celery-mixin/lib/dashboards.jsonnet new file mode 100644 index 0000000..dadaebe --- /dev/null +++ b/celery-mixin/lib/dashboards.jsonnet @@ -0,0 +1,6 @@ +local dashboards = (import '../mixin.libsonnet').grafanaDashboards; + +{ + [name]: dashboards[name] + for name in std.objectFields(dashboards) +} diff --git a/celery-mixin/lib/rules.jsonnet b/celery-mixin/lib/rules.jsonnet new file mode 100644 index 0000000..2d7fa91 --- /dev/null +++ b/celery-mixin/lib/rules.jsonnet @@ -0,0 +1 @@ +std.manifestYamlDoc((import '../mixin.libsonnet').prometheusRules) diff --git a/celery-mixin/mixin.libsonnet b/celery-mixin/mixin.libsonnet index 119d2cd..33ec3bc 100644 --- a/celery-mixin/mixin.libsonnet +++ b/celery-mixin/mixin.libsonnet @@ -1,3 +1,4 @@ (import 'alerts/alerts.libsonnet') + +(import 'rules/rules.libsonnet') + (import 'dashboards/dashboards.libsonnet') + (import 'config.libsonnet') diff --git a/celery-mixin/prometheus-alerts.yaml b/celery-mixin/prometheus_alerts.yaml similarity index 90% rename from celery-mixin/prometheus-alerts.yaml rename to celery-mixin/prometheus_alerts.yaml index 8fb327c..69b805a 100644 --- a/celery-mixin/prometheus-alerts.yaml +++ b/celery-mixin/prometheus_alerts.yaml @@ -10,7 +10,7 @@ sum( increase( celery_task_failed_total{ - job=~"celery|celery-exporter", + job=~".*celery.*", queue_name!~"None", name!~"None" }[10m] @@ -21,7 +21,7 @@ sum( increase( celery_task_failed_total{ - job=~"celery|celery-exporter", + job=~".*celery.*", queue_name!~"None", name!~"None" }[10m] @@ -31,7 +31,7 @@ sum( increase( celery_task_succeeded_total{ - job=~"celery|celery-exporter", + job=~".*celery.*", queue_name!~"None", name!~"None" }[10m] @@ -50,7 +50,7 @@ "expr": | sum( celery_queue_length{ - job=~"celery|celery-exporter", + job=~".*celery.*", queue_name!~"None" } ) by (job, namespace, queue_name) @@ -64,7 +64,7 @@ "description": "The Celery worker {{ $labels.job }}/{{ $labels.hostname }} is offline." "summary": "A Celery worker is offline." "expr": | - celery_worker_up{job=~"celery|celery-exporter"} == 0 + celery_worker_up{job=~".*celery.*"} == 0 "for": "15m" "labels": "severity": "warning" diff --git a/celery-mixin/prometheus_rules.yaml b/celery-mixin/prometheus_rules.yaml new file mode 100644 index 0000000..1e60703 --- /dev/null +++ b/celery-mixin/prometheus_rules.yaml @@ -0,0 +1 @@ +"groups": [] diff --git a/celery-mixin/rules/rules.libsonnet b/celery-mixin/rules/rules.libsonnet new file mode 100644 index 0000000..146331f --- /dev/null +++ b/celery-mixin/rules/rules.libsonnet @@ -0,0 +1,5 @@ +{ + prometheusRules+:: { + groups+: [], + }, +} diff --git a/celery-mixin/scripts/go.mod b/celery-mixin/scripts/go.mod new file mode 100644 index 0000000..34bdf81 --- /dev/null +++ b/celery-mixin/scripts/go.mod @@ -0,0 +1,288 @@ +module _ + +go 1.24.0 + +toolchain go1.24.1 + +require ( + github.com/Kunde21/markdownfmt/v3 v3.1.0 + github.com/cloudflare/pint v0.74.6 + github.com/errata-ai/vale/v3 v3.12.0 + github.com/google/go-jsonnet v0.21.0 + github.com/grafana/dashboard-linter v0.0.0-20231114210226-c458893a5731 + github.com/jsonnet-bundler/jsonnet-bundler v0.6.0 + github.com/prometheus/prometheus v0.304.2 +) + +require ( + atomicgo.dev/cursor v0.2.0 // indirect + atomicgo.dev/keyboard v0.2.9 // indirect + atomicgo.dev/schedule v0.1.0 // indirect + cloud.google.com/go v0.115.1 // indirect + cloud.google.com/go/auth v0.16.0 // indirect + cloud.google.com/go/auth/oauth2adapt v0.2.8 // indirect + cloud.google.com/go/compute/metadata v0.6.0 // indirect + cloud.google.com/go/iam v1.2.0 // indirect + cloud.google.com/go/storage v1.43.0 // indirect + dario.cat/mergo v1.0.1 // indirect + github.com/Azure/azure-sdk-for-go/sdk/azcore v1.18.0 // indirect + github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.9.0 // indirect + github.com/Azure/azure-sdk-for-go/sdk/internal v1.11.1 // indirect + github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/compute/armcompute/v5 v5.7.0 // indirect + github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/network/armnetwork/v4 v4.3.0 // indirect + github.com/Azure/go-ansiterm v0.0.0-20230124172434-306776ec8161 // indirect + github.com/AzureAD/microsoft-authentication-library-for-go v1.4.2 // indirect + github.com/BurntSushi/toml v1.4.0 // indirect + github.com/Code-Hex/go-generics-cache v1.5.1 // indirect + github.com/Masterminds/goutils v1.1.1 // indirect + github.com/Masterminds/semver/v3 v3.3.1 // indirect + github.com/Masterminds/sprig/v3 v3.3.0 // indirect + github.com/Microsoft/go-winio v0.6.1 // indirect + github.com/adrg/frontmatter v0.2.0 // indirect + github.com/adrg/strutil v0.3.1 // indirect + github.com/adrg/xdg v0.5.3 // indirect + github.com/agext/levenshtein v1.2.1 // indirect + github.com/alecthomas/kingpin/v2 v2.4.0 // indirect + github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751 // indirect + github.com/alecthomas/units v0.0.0-20240927000941-0f3dac36c52b // indirect + github.com/apparentlymart/go-textseg/v15 v15.0.0 // indirect + github.com/armon/go-metrics v0.4.1 // indirect + github.com/asaskevich/govalidator v0.0.0-20230301143203-a9d515a09cc2 // indirect + github.com/aws/aws-sdk-go v1.55.7 // indirect + github.com/bboreham/go-loser v0.0.0-20230920113527-fcc2c21820a3 // indirect + github.com/benbjohnson/clock v1.3.5 // indirect + github.com/beorn7/perks v1.0.1 // indirect + github.com/bmatcuk/doublestar/v4 v4.7.1 // indirect + github.com/cespare/xxhash/v2 v2.3.0 // indirect + github.com/cncf/xds/go v0.0.0-20250121191232-2f005788dc42 // indirect + github.com/containerd/console v1.0.3 // indirect + github.com/coreos/go-systemd/v22 v22.5.0 // indirect + github.com/d5/tengo/v2 v2.17.0 // indirect + github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect + github.com/dennwc/varint v1.0.0 // indirect + github.com/digitalocean/godo v1.144.0 // indirect + github.com/distribution/reference v0.5.0 // indirect + github.com/docker/docker v28.1.1+incompatible // indirect + github.com/docker/go-connections v0.4.0 // indirect + github.com/docker/go-units v0.5.0 // indirect + github.com/edsrzf/mmap-go v1.2.0 // indirect + github.com/elliotchance/orderedmap/v2 v2.2.0 // indirect + github.com/emicklei/go-restful/v3 v3.11.0 // indirect + github.com/envoyproxy/go-control-plane/envoy v1.32.4 // indirect + github.com/envoyproxy/protoc-gen-validate v1.2.1 // indirect + github.com/errata-ai/ini v1.63.0 // indirect + github.com/errata-ai/regexp2 v1.7.0 // indirect + github.com/expr-lang/expr v1.17.0 // indirect + github.com/facette/natsort v0.0.0-20181210072756-2cd4dd1e2dcb // indirect + github.com/fatih/color v1.18.0 // indirect + github.com/felixge/httpsnoop v1.0.4 // indirect + github.com/fsnotify/fsnotify v1.8.0 // indirect + github.com/fxamacker/cbor/v2 v2.7.0 // indirect + github.com/ghodss/yaml v1.0.0 // indirect + github.com/go-logr/logr v1.4.2 // indirect + github.com/go-logr/stdr v1.2.2 // indirect + github.com/go-openapi/analysis v0.23.0 // indirect + github.com/go-openapi/errors v0.22.0 // indirect + github.com/go-openapi/jsonpointer v0.21.0 // indirect + github.com/go-openapi/jsonreference v0.21.0 // indirect + github.com/go-openapi/loads v0.22.0 // indirect + github.com/go-openapi/spec v0.21.0 // indirect + github.com/go-openapi/strfmt v0.23.0 // indirect + github.com/go-openapi/swag v0.23.0 // indirect + github.com/go-openapi/validate v0.24.0 // indirect + github.com/go-resty/resty/v2 v2.16.5 // indirect + github.com/go-viper/mapstructure/v2 v2.3.0 // indirect + github.com/go-zookeeper/zk v1.0.4 // indirect + github.com/gobwas/glob v0.2.3 // indirect + github.com/gogo/protobuf v1.3.2 // indirect + github.com/golang-jwt/jwt/v5 v5.2.2 // indirect + github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect + github.com/golang/protobuf v1.5.4 // indirect + github.com/golang/snappy v1.0.0 // indirect + github.com/google/gnostic-models v0.6.8 // indirect + github.com/google/go-cmp v0.7.0 // indirect + github.com/google/go-github/v73 v73.0.0 // indirect + github.com/google/go-querystring v1.1.0 // indirect + github.com/google/gofuzz v1.2.0 // indirect + github.com/google/pprof v0.0.0-20241210010833-40e02aabc2ad // indirect + github.com/google/s2a-go v0.1.9 // indirect + github.com/google/uuid v1.6.0 // indirect + github.com/googleapis/enterprise-certificate-proxy v0.3.6 // indirect + github.com/googleapis/gax-go/v2 v2.14.1 // indirect + github.com/gookit/color v1.5.4 // indirect + github.com/gophercloud/gophercloud/v2 v2.7.0 // indirect + github.com/gorilla/websocket v1.5.0 // indirect + github.com/grafana/regexp v0.0.0-20240518133315-a468a5bfb3bc // indirect + github.com/hashicorp/consul/api v1.32.0 // indirect + github.com/hashicorp/cronexpr v1.1.2 // indirect + github.com/hashicorp/errwrap v1.1.0 // indirect + github.com/hashicorp/go-cleanhttp v0.5.2 // indirect + github.com/hashicorp/go-hclog v1.6.3 // indirect + github.com/hashicorp/go-immutable-radix v1.3.1 // indirect + github.com/hashicorp/go-multierror v1.1.1 // indirect + github.com/hashicorp/go-retryablehttp v0.7.8 // indirect + github.com/hashicorp/go-rootcerts v1.0.2 // indirect + github.com/hashicorp/go-version v1.7.0 // indirect + github.com/hashicorp/golang-lru v0.6.0 // indirect + github.com/hashicorp/hcl v1.0.0 // indirect + github.com/hashicorp/hcl/v2 v2.24.0 // indirect + github.com/hashicorp/nomad/api v0.0.0-20241218080744-e3ac00f30eec // indirect + github.com/hashicorp/serf v0.10.1 // indirect + github.com/hetznercloud/hcloud-go/v2 v2.21.0 // indirect + github.com/huandu/xstrings v1.5.0 // indirect + github.com/inconshreveable/mousetrap v1.1.0 // indirect + github.com/ionos-cloud/sdk-go/v6 v6.3.3 // indirect + github.com/jdkato/go-tree-sitter-julia v0.1.0 // indirect + github.com/jdkato/twine v0.10.2 // indirect + github.com/jmespath/go-jmespath v0.4.0 // indirect + github.com/josharian/intern v1.0.0 // indirect + github.com/jpillora/backoff v1.0.0 // indirect + github.com/json-iterator/go v1.1.12 // indirect + github.com/klauspost/compress v1.18.0 // indirect + github.com/knadh/koanf/maps v0.1.2 // indirect + github.com/knadh/koanf/providers/confmap v0.1.0 // indirect + github.com/knadh/koanf/v2 v2.1.2 // indirect + github.com/kolo/xmlrpc v0.0.0-20220921171641-a4b6fa1dd06b // indirect + github.com/kylelemons/godebug v1.1.0 // indirect + github.com/linode/linodego v1.49.0 // indirect + github.com/lithammer/fuzzysearch v1.1.8 // indirect + github.com/magiconair/properties v1.8.7 // indirect + github.com/mailru/easyjson v0.7.7 // indirect + github.com/mattn/go-colorable v0.1.13 // indirect + github.com/mattn/go-isatty v0.0.20 // indirect + github.com/mattn/go-runewidth v0.0.16 // indirect + github.com/mdlayher/socket v0.4.1 // indirect + github.com/mdlayher/vsock v1.2.1 // indirect + github.com/miekg/dns v1.1.65 // indirect + github.com/mitchellh/copystructure v1.2.0 // indirect + github.com/mitchellh/go-homedir v1.1.0 // indirect + github.com/mitchellh/go-wordwrap v1.0.1 // indirect + github.com/mitchellh/mapstructure v1.5.0 // indirect + github.com/mitchellh/reflectwalk v1.0.2 // indirect + github.com/moby/docker-image-spec v1.3.1 // indirect + github.com/moby/sys/sequential v0.6.0 // indirect + github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect + github.com/modern-go/reflect2 v1.0.2 // indirect + github.com/montanaflynn/stats v0.7.1 // indirect + github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect + github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f // indirect + github.com/niklasfasching/go-org v1.7.0 // indirect + github.com/nsf/jsondiff v0.0.0-20230430225905-43f6cf3098c1 // indirect + github.com/oklog/ulid v1.3.1 // indirect + github.com/oklog/ulid/v2 v2.1.0 // indirect + github.com/olekukonko/tablewriter v0.0.5 // indirect + github.com/open-telemetry/opentelemetry-collector-contrib/internal/exp/metrics v0.124.1 // indirect + github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatautil v0.124.1 // indirect + github.com/open-telemetry/opentelemetry-collector-contrib/processor/deltatocumulativeprocessor v0.124.1 // indirect + github.com/opencontainers/go-digest v1.0.0 // indirect + github.com/opencontainers/image-spec v1.0.2 // indirect + github.com/otiai10/copy v1.14.0 // indirect + github.com/ovh/go-ovh v1.7.0 // indirect + github.com/pelletier/go-toml/v2 v2.2.3 // indirect + github.com/pkg/browser v0.0.0-20240102092130-5ac0b6a4141c // indirect + github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e // indirect + github.com/pkg/errors v0.9.1 // indirect + github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10 // indirect + github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect + github.com/prometheus/alertmanager v0.28.1 // indirect + github.com/prometheus/client_golang v1.22.0 // indirect + github.com/prometheus/client_model v0.6.2 // indirect + github.com/prometheus/common v0.65.0 // indirect + github.com/prometheus/exporter-toolkit v0.14.0 // indirect + github.com/prometheus/otlptranslator v0.0.0-20250320144820-d800c8b0eb07 // indirect + github.com/prometheus/procfs v0.15.1 // indirect + github.com/prometheus/sigv4 v0.1.2 // indirect + github.com/prymitive/current v0.1.1 // indirect + github.com/pterm/pterm v0.12.76 // indirect + github.com/puzpuzpuz/xsync/v3 v3.5.1 // indirect + github.com/remeh/sizedwaitgroup v1.0.0 // indirect + github.com/rivo/uniseg v0.4.7 // indirect + github.com/scaleway/scaleway-sdk-go v1.0.0-beta.33 // indirect + github.com/shopspring/decimal v1.4.0 // indirect + github.com/smacker/go-tree-sitter v0.0.0-20240827094217-dd81d9e9be82 // indirect + github.com/spf13/afero v1.10.0 // indirect + github.com/spf13/cast v1.7.1 // indirect + github.com/spf13/cobra v1.8.0 // indirect + github.com/spf13/jwalterweatherman v1.1.0 // indirect + github.com/spf13/pflag v1.0.5 // indirect + github.com/spf13/viper v1.16.0 // indirect + github.com/stretchr/testify v1.10.0 // indirect + github.com/subosito/gotenv v1.4.2 // indirect + github.com/tomwright/dasel/v2 v2.8.1 // indirect + github.com/urfave/cli/v3 v3.3.8 // indirect + github.com/vultr/govultr/v2 v2.17.2 // indirect + github.com/x448/float16 v0.8.4 // indirect + github.com/xeipuuv/gojsonpointer v0.0.0-20190905194746-02993c407bfb // indirect + github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415 // indirect + github.com/xeipuuv/gojsonschema v1.2.0 // indirect + github.com/xhit/go-str2duration/v2 v2.1.0 // indirect + github.com/xo/terminfo v0.0.0-20220910002029-abceb7e1c41e // indirect + github.com/yuin/goldmark v1.7.8 // indirect + github.com/zclconf/go-cty v1.16.3 // indirect + github.com/zeitlinger/conflate v0.0.0-20230622100834-279724abda8c // indirect + gitlab.com/gitlab-org/api/client-go v0.137.0 // indirect + go.mongodb.org/mongo-driver v1.14.0 // indirect + go.opencensus.io v0.24.0 // indirect + go.opentelemetry.io/auto/sdk v1.1.0 // indirect + go.opentelemetry.io/collector/component v1.30.0 // indirect + go.opentelemetry.io/collector/confmap v1.30.0 // indirect + go.opentelemetry.io/collector/confmap/xconfmap v0.124.0 // indirect + go.opentelemetry.io/collector/consumer v1.30.0 // indirect + go.opentelemetry.io/collector/featuregate v1.30.0 // indirect + go.opentelemetry.io/collector/internal/telemetry v0.124.0 // indirect + go.opentelemetry.io/collector/pdata v1.30.0 // indirect + go.opentelemetry.io/collector/pipeline v0.124.0 // indirect + go.opentelemetry.io/collector/processor v1.30.0 // indirect + go.opentelemetry.io/collector/semconv v0.124.0 // indirect + go.opentelemetry.io/contrib/bridges/otelzap v0.10.0 // indirect + go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.60.0 // indirect + go.opentelemetry.io/contrib/instrumentation/net/http/httptrace/otelhttptrace v0.60.0 // indirect + go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.60.0 // indirect + go.opentelemetry.io/otel v1.35.0 // indirect + go.opentelemetry.io/otel/log v0.11.0 // indirect + go.opentelemetry.io/otel/metric v1.35.0 // indirect + go.opentelemetry.io/otel/sdk v1.35.0 // indirect + go.opentelemetry.io/otel/trace v1.35.0 // indirect + go.uber.org/atomic v1.11.0 // indirect + go.uber.org/automaxprocs v1.6.0 // indirect + go.uber.org/goleak v1.3.0 // indirect + go.uber.org/multierr v1.11.0 // indirect + go.uber.org/ratelimit v0.3.1 // indirect + go.uber.org/zap v1.27.0 // indirect + golang.org/x/crypto v0.38.0 // indirect + golang.org/x/exp v0.0.0-20250106191152-7588d65b2ba8 // indirect + golang.org/x/mod v0.24.0 // indirect + golang.org/x/net v0.40.0 // indirect + golang.org/x/oauth2 v0.30.0 // indirect + golang.org/x/sync v0.14.0 // indirect + golang.org/x/sys v0.33.0 // indirect + golang.org/x/term v0.32.0 // indirect + golang.org/x/text v0.25.0 // indirect + golang.org/x/time v0.12.0 // indirect + golang.org/x/tools v0.32.0 // indirect + google.golang.org/api v0.230.0 // indirect + google.golang.org/genproto v0.0.0-20240903143218-8af14fe29dc1 // indirect + google.golang.org/genproto/googleapis/api v0.0.0-20250303144028-a0af3efb3deb // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20250414145226-207652e42e2e // indirect + google.golang.org/grpc v1.72.0 // indirect + google.golang.org/protobuf v1.36.6 // indirect + gopkg.in/alecthomas/kingpin.v2 v2.2.6 // indirect + gopkg.in/evanphx/json-patch.v4 v4.12.0 // indirect + gopkg.in/inf.v0 v0.9.1 // indirect + gopkg.in/ini.v1 v1.67.0 // indirect + gopkg.in/neurosnap/sentences.v1 v1.0.7 // indirect + gopkg.in/yaml.v2 v2.4.0 // indirect + gopkg.in/yaml.v3 v3.0.1 // indirect + k8s.io/api v0.32.3 // indirect + k8s.io/apimachinery v0.32.3 // indirect + k8s.io/client-go v0.32.3 // indirect + k8s.io/klog/v2 v2.130.1 // indirect + k8s.io/kube-openapi v0.0.0-20241105132330-32ad38e42d3f // indirect + k8s.io/utils v0.0.0-20241104100929-3ea5e8cea738 // indirect + sigs.k8s.io/json v0.0.0-20241010143419-9aa6b5e7a4b3 // indirect + sigs.k8s.io/structured-merge-diff/v4 v4.4.2 // indirect + sigs.k8s.io/yaml v1.4.0 // indirect +) + +// TODO: This could be removed after https://github.com/mholt/archiver/pull/396 merged +replace github.com/mholt/archiver/v3 => github.com/anchore/archiver/v3 v3.5.2 diff --git a/celery-mixin/scripts/go.sum b/celery-mixin/scripts/go.sum new file mode 100644 index 0000000..d75c808 --- /dev/null +++ b/celery-mixin/scripts/go.sum @@ -0,0 +1,1337 @@ +atomicgo.dev/assert v0.0.2 h1:FiKeMiZSgRrZsPo9qn/7vmr7mCsh5SZyXY4YGYiYwrg= +atomicgo.dev/assert v0.0.2/go.mod h1:ut4NcI3QDdJtlmAxQULOmA13Gz6e2DWbSAS8RUOmNYQ= +atomicgo.dev/cursor v0.2.0 h1:H6XN5alUJ52FZZUkI7AlJbUc1aW38GWZalpYRPpoPOw= +atomicgo.dev/cursor v0.2.0/go.mod h1:Lr4ZJB3U7DfPPOkbH7/6TOtJ4vFGHlgj1nc+n900IpU= +atomicgo.dev/keyboard v0.2.9 h1:tOsIid3nlPLZ3lwgG8KZMp/SFmr7P0ssEN5JUsm78K8= +atomicgo.dev/keyboard v0.2.9/go.mod h1:BC4w9g00XkxH/f1HXhW2sXmJFOCWbKn9xrOunSFtExQ= +atomicgo.dev/schedule v0.1.0 h1:nTthAbhZS5YZmgYbb2+DH8uQIZcTlIrd4eYr3UQxEjs= +atomicgo.dev/schedule v0.1.0/go.mod h1:xeUa3oAkiuHYh8bKiQBRojqAMq3PXXbJujjb0hw8pEU= +cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= +cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= +cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU= +cloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU= +cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= +cloud.google.com/go v0.44.3/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= +cloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc= +cloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0= +cloud.google.com/go v0.50.0/go.mod h1:r9sluTvynVuxRIOHXQEHMFffphuXHOMZMycpNR5e6To= +cloud.google.com/go v0.52.0/go.mod h1:pXajvRH/6o3+F9jDHZWQ5PbGhn+o8w9qiu/CffaVdO4= +cloud.google.com/go v0.53.0/go.mod h1:fp/UouUEsRkN6ryDKNW/Upv/JBKnv6WDthjR6+vze6M= +cloud.google.com/go v0.54.0/go.mod h1:1rq2OEkV3YMf6n/9ZvGWI3GWw0VoqH/1x2nd8Is/bPc= +cloud.google.com/go v0.56.0/go.mod h1:jr7tqZxxKOVYizybht9+26Z/gUq7tiRzu+ACVAMbKVk= +cloud.google.com/go v0.57.0/go.mod h1:oXiQ6Rzq3RAkkY7N6t3TcE6jE+CIBBbA36lwQ1JyzZs= +cloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOYc= +cloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHObY= +cloud.google.com/go v0.72.0/go.mod h1:M+5Vjvlc2wnp6tjzE102Dw08nGShTscUx2nZMufOKPI= +cloud.google.com/go v0.74.0/go.mod h1:VV1xSbzvo+9QJOxLDaJfTjx5e+MePCpCWwvftOeQmWk= +cloud.google.com/go v0.75.0/go.mod h1:VGuuCn7PG0dwsd5XPVm2Mm3wlh3EL55/79EKB6hlPTY= +cloud.google.com/go v0.115.1 h1:Jo0SM9cQnSkYfp44+v+NQXHpcHqlnRJk2qxh6yvxxxQ= +cloud.google.com/go v0.115.1/go.mod h1:DuujITeaufu3gL68/lOFIirVNJwQeyf5UXyi+Wbgknc= +cloud.google.com/go/auth v0.16.0 h1:Pd8P1s9WkcrBE2n/PhAwKsdrR35V3Sg2II9B+ndM3CU= +cloud.google.com/go/auth v0.16.0/go.mod h1:1howDHJ5IETh/LwYs3ZxvlkXF48aSqqJUM+5o02dNOI= +cloud.google.com/go/auth/oauth2adapt v0.2.8 h1:keo8NaayQZ6wimpNSmW5OPc283g65QNIiLpZnkHRbnc= +cloud.google.com/go/auth/oauth2adapt v0.2.8/go.mod h1:XQ9y31RkqZCcwJWNSx2Xvric3RrU88hAYYbjDWYDL+c= +cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= +cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE= +cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc= +cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg= +cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc= +cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ= +cloud.google.com/go/compute/metadata v0.6.0 h1:A6hENjEsCDtC1k8byVsgwvVcioamEHvZ4j01OwKxG9I= +cloud.google.com/go/compute/metadata v0.6.0/go.mod h1:FjyFAW1MW0C203CEOMDTu3Dk1FlqW3Rga40jzHL4hfg= +cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= +cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk= +cloud.google.com/go/iam v1.2.0 h1:kZKMKVNk/IsSSc/udOb83K0hL/Yh/Gcqpz+oAkoIFN8= +cloud.google.com/go/iam v1.2.0/go.mod h1:zITGuWgsLZxd8OwAlX+eMFgZDXzBm7icj1PVTYG766Q= +cloud.google.com/go/longrunning v0.6.0 h1:mM1ZmaNsQsnb+5n1DNPeL0KwQd9jQRqSqSDEkBZr+aI= +cloud.google.com/go/longrunning v0.6.0/go.mod h1:uHzSZqW89h7/pasCWNYdUpwGz3PcVWhrWupreVPYLts= +cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= +cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw= +cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA= +cloud.google.com/go/pubsub v1.3.1/go.mod h1:i+ucay31+CNRpDW4Lu78I4xXG+O1r/MAHgjpRVR+TSU= +cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw= +cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos= +cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk= +cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs= +cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0= +cloud.google.com/go/storage v1.14.0/go.mod h1:GrKmX003DSIwi9o29oFT7YDnHYwZoctc3fOKtUw0Xmo= +cloud.google.com/go/storage v1.43.0 h1:CcxnSohZwizt4LCzQHWvBf1/kvtHUn7gk9QERXPyXFs= +cloud.google.com/go/storage v1.43.0/go.mod h1:ajvxEa7WmZS1PxvKRq4bq0tFT3vMd502JwstCcYv0Q0= +dario.cat/mergo v1.0.1 h1:Ra4+bf83h2ztPIQYNP99R6m+Y7KfnARDfID+a+vLl4s= +dario.cat/mergo v1.0.1/go.mod h1:uNxQE+84aUszobStD9th8a29P2fMDhsBdgRYvZOxGmk= +dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= +github.com/Azure/azure-sdk-for-go/sdk/azcore v1.18.0 h1:Gt0j3wceWMwPmiazCa8MzMA0MfhmPIz0Qp0FJ6qcM0U= +github.com/Azure/azure-sdk-for-go/sdk/azcore v1.18.0/go.mod h1:Ot/6aikWnKWi4l9QB7qVSwa8iMphQNqkWALMoNT3rzM= +github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.9.0 h1:OVoM452qUFBrX+URdH3VpR299ma4kfom0yB0URYky9g= +github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.9.0/go.mod h1:kUjrAo8bgEwLeZ/CmHqNl3Z/kPm7y6FKfxxK0izYUg4= +github.com/Azure/azure-sdk-for-go/sdk/azidentity/cache v0.3.2 h1:yz1bePFlP5Vws5+8ez6T3HWXPmwOK7Yvq8QxDBD3SKY= +github.com/Azure/azure-sdk-for-go/sdk/azidentity/cache v0.3.2/go.mod h1:Pa9ZNPuoNu/GztvBSKk9J1cDJW6vk/n0zLtV4mgd8N8= +github.com/Azure/azure-sdk-for-go/sdk/internal v1.11.1 h1:FPKJS1T+clwv+OLGt13a8UjqeRuh0O4SJ3lUriThc+4= +github.com/Azure/azure-sdk-for-go/sdk/internal v1.11.1/go.mod h1:j2chePtV91HrC22tGoRX3sGY42uF13WzmmV80/OdVAA= +github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/compute/armcompute/v5 v5.7.0 h1:LkHbJbgF3YyvC53aqYGR+wWQDn2Rdp9AQdGndf9QvY4= +github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/compute/armcompute/v5 v5.7.0/go.mod h1:QyiQdW4f4/BIfB8ZutZ2s+28RAgfa/pT+zS++ZHyM1I= +github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/internal/v2 v2.0.0 h1:PTFGRSlMKCQelWwxUyYVEUqseBJVemLyqWJjvMyt0do= +github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/internal/v2 v2.0.0/go.mod h1:LRr2FzBTQlONPPa5HREE5+RjSCTXl7BwOvYOaWTqCaI= +github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/network/armnetwork/v4 v4.3.0 h1:bXwSugBiSbgtz7rOtbfGf+woewp4f06orW9OP5BjHLA= +github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/network/armnetwork/v4 v4.3.0/go.mod h1:Y/HgrePTmGy9HjdSGTqZNa+apUpTVIEVKXJyARP2lrk= +github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/resources/armresources v1.1.1 h1:7CBQ+Ei8SP2c6ydQTGCCrS35bDxgTMfoP2miAwK++OU= +github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/resources/armresources v1.1.1/go.mod h1:c/wcGeGx5FUPbM/JltUYHZcKmigwyVLJlDq+4HdtXaw= +github.com/Azure/go-ansiterm v0.0.0-20230124172434-306776ec8161 h1:L/gRVlceqvL25UVaW/CKtUDjefjrs0SPonmDGUVOYP0= +github.com/Azure/go-ansiterm v0.0.0-20230124172434-306776ec8161/go.mod h1:xomTg63KZ2rFqZQzSB4Vz2SUXa1BpHTVz9L5PTmPC4E= +github.com/AzureAD/microsoft-authentication-extensions-for-go/cache v0.1.1 h1:WJTmL004Abzc5wDB5VtZG2PJk5ndYDgVacGqfirKxjM= +github.com/AzureAD/microsoft-authentication-extensions-for-go/cache v0.1.1/go.mod h1:tCcJZ0uHAmvjsVYzEFivsRTN00oz5BEsRgQHu5JZ9WE= +github.com/AzureAD/microsoft-authentication-library-for-go v1.4.2 h1:oygO0locgZJe7PpYPXT5A29ZkwJaPqcva7BVeemZOZs= +github.com/AzureAD/microsoft-authentication-library-for-go v1.4.2/go.mod h1:wP83P5OoQ5p6ip3ScPr0BAq0BvuPAvacpEuSzyouqAI= +github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= +github.com/BurntSushi/toml v1.4.0 h1:kuoIxZQy2WRRk1pttg9asf+WVv6tWQuBNVmK8+nqPr0= +github.com/BurntSushi/toml v1.4.0/go.mod h1:ukJfTF/6rtPPRCnwkur4qwRxa8vTRFBF0uk2lLoLwho= +github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= +github.com/Code-Hex/go-generics-cache v1.5.1 h1:6vhZGc5M7Y/YD8cIUcY8kcuQLB4cHR7U+0KMqAA0KcU= +github.com/Code-Hex/go-generics-cache v1.5.1/go.mod h1:qxcC9kRVrct9rHeiYpFWSoW1vxyillCVzX13KZG8dl4= +github.com/DataDog/datadog-go v3.2.0+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ= +github.com/Kunde21/markdownfmt/v3 v3.1.0 h1:KiZu9LKs+wFFBQKhrZJrFZwtLnCCWJahL+S+E/3VnM0= +github.com/Kunde21/markdownfmt/v3 v3.1.0/go.mod h1:tPXN1RTyOzJwhfHoon9wUr4HGYmWgVxSQN6VBJDkrVc= +github.com/MarvinJWendt/testza v0.1.0/go.mod h1:7AxNvlfeHP7Z/hDQ5JtE3OKYT3XFUeLCDE2DQninSqs= +github.com/MarvinJWendt/testza v0.2.1/go.mod h1:God7bhG8n6uQxwdScay+gjm9/LnO4D3kkcZX4hv9Rp8= +github.com/MarvinJWendt/testza v0.2.8/go.mod h1:nwIcjmr0Zz+Rcwfh3/4UhBp7ePKVhuBExvZqnKYWlII= +github.com/MarvinJWendt/testza v0.2.10/go.mod h1:pd+VWsoGUiFtq+hRKSU1Bktnn+DMCSrDrXDpX2bG66k= +github.com/MarvinJWendt/testza v0.2.12/go.mod h1:JOIegYyV7rX+7VZ9r77L/eH6CfJHHzXjB69adAhzZkI= +github.com/MarvinJWendt/testza v0.3.0/go.mod h1:eFcL4I0idjtIx8P9C6KkAuLgATNKpX4/2oUqKc6bF2c= +github.com/MarvinJWendt/testza v0.4.2/go.mod h1:mSdhXiKH8sg/gQehJ63bINcCKp7RtYewEjXsvsVUPbE= +github.com/MarvinJWendt/testza v0.5.2 h1:53KDo64C1z/h/d/stCYCPY69bt/OSwjq5KpFNwi+zB4= +github.com/MarvinJWendt/testza v0.5.2/go.mod h1:xu53QFE5sCdjtMCKk8YMQ2MnymimEctc4n3EjyIYvEY= +github.com/Masterminds/goutils v1.1.1 h1:5nUrii3FMTL5diU80unEVvNevw1nH4+ZV4DSLVJLSYI= +github.com/Masterminds/goutils v1.1.1/go.mod h1:8cTjp+g8YejhMuvIA5y2vz3BpJxksy863GQaJW2MFNU= +github.com/Masterminds/semver/v3 v3.3.1 h1:QtNSWtVZ3nBfk8mAOu/B6v7FMJ+NHTIgUPi7rj+4nv4= +github.com/Masterminds/semver/v3 v3.3.1/go.mod h1:4V+yj/TJE1HU9XfppCwVMZq3I84lprf4nC11bSS5beM= +github.com/Masterminds/sprig/v3 v3.3.0 h1:mQh0Yrg1XPo6vjYXgtf5OtijNAKJRNcTdOOGZe3tPhs= +github.com/Masterminds/sprig/v3 v3.3.0/go.mod h1:Zy1iXRYNqNLUolqCpL4uhk6SHUMAOSCzdgBfDb35Lz0= +github.com/Microsoft/go-winio v0.6.1 h1:9/kr64B9VUZrLm5YYwbGtUJnMgqWVOdUAXu6Migciow= +github.com/Microsoft/go-winio v0.6.1/go.mod h1:LRdKpFKfdobln8UmuiYcKPot9D2v6svN5+sAH+4kjUM= +github.com/adrg/frontmatter v0.2.0 h1:/DgnNe82o03riBd1S+ZDjd43wAmC6W35q67NHeLkPd4= +github.com/adrg/frontmatter v0.2.0/go.mod h1:93rQCj3z3ZlwyxxpQioRKC1wDLto4aXHrbqIsnH9wmE= +github.com/adrg/strutil v0.3.1 h1:OLvSS7CSJO8lBii4YmBt8jiK9QOtB9CzCzwl4Ic/Fz4= +github.com/adrg/strutil v0.3.1/go.mod h1:8h90y18QLrs11IBffcGX3NW/GFBXCMcNg4M7H6MspPA= +github.com/adrg/xdg v0.5.3 h1:xRnxJXne7+oWDatRhR1JLnvuccuIeCoBu2rtuLqQB78= +github.com/adrg/xdg v0.5.3/go.mod h1:nlTsY+NNiCBGCK2tpm09vRqfVzrc2fLmXGpBLF0zlTQ= +github.com/agext/levenshtein v1.2.1 h1:QmvMAjj2aEICytGiWzmxoE0x2KZvE0fvmqMOfy2tjT8= +github.com/agext/levenshtein v1.2.1/go.mod h1:JEDfjyjHDjOF/1e4FlBE/PkbqA9OfWu2ki2W0IB5558= +github.com/akedrou/textdiff v0.1.0 h1:K7nbOVQju7/coCXnJRJ2fsltTwbSvC+M4hKBUJRBRGY= +github.com/akedrou/textdiff v0.1.0/go.mod h1:a9CCC49AKtFTmVDNFHDlCg7V/M7C7QExDAhb2SkL6DQ= +github.com/alecthomas/kingpin/v2 v2.4.0 h1:f48lwail6p8zpO1bC4TxtqACaGqHYA22qkHjHpqDjYY= +github.com/alecthomas/kingpin/v2 v2.4.0/go.mod h1:0gyi0zQnjuFk8xrkNKamJoyUo382HRL7ATRpFZCw6tE= +github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= +github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751 h1:JYp7IbQjafoB+tBA3gMyHYHrpOtNuDiK/uB5uXxq5wM= +github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= +github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= +github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= +github.com/alecthomas/units v0.0.0-20240927000941-0f3dac36c52b h1:mimo19zliBX/vSQ6PWWSL9lK8qwHozUj03+zLoEB8O0= +github.com/alecthomas/units v0.0.0-20240927000941-0f3dac36c52b/go.mod h1:fvzegU4vN3H1qMT+8wDmzjAcDONcgo2/SZ/TyfdUOFs= +github.com/apparentlymart/go-textseg/v15 v15.0.0 h1:uYvfpb3DyLSCGWnctWKGj857c6ew1u1fNQOlOtuGxQY= +github.com/apparentlymart/go-textseg/v15 v15.0.0/go.mod h1:K8XmNZdhEBkdlyDdvbmmsvpAG721bKi0joRfFdHIWJ4= +github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o= +github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY= +github.com/armon/go-metrics v0.4.1 h1:hR91U9KYmb6bLBYLQjyM+3j+rcd/UhE+G78SFnF8gJA= +github.com/armon/go-metrics v0.4.1/go.mod h1:E6amYzXo6aW1tqzoZGT755KkbgrJsSdpwZ+3JqfkOG4= +github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= +github.com/armon/go-radix v1.0.0/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= +github.com/asaskevich/govalidator v0.0.0-20230301143203-a9d515a09cc2 h1:DklsrG3dyBCFEj5IhUbnKptjxatkF07cF2ak3yi77so= +github.com/asaskevich/govalidator v0.0.0-20230301143203-a9d515a09cc2/go.mod h1:WaHUgvxTVq04UNunO+XhnAqY/wQc+bxr74GqbsZ/Jqw= +github.com/atomicgo/cursor v0.0.1/go.mod h1:cBON2QmmrysudxNBFthvMtN32r3jxVRIvzkUiF/RuIk= +github.com/aws/aws-sdk-go v1.55.7 h1:UJrkFq7es5CShfBwlWAC8DA077vp8PyVbQd3lqLiztE= +github.com/aws/aws-sdk-go v1.55.7/go.mod h1:eRwEWoyTWFMVYVQzKMNHWP5/RV4xIUGMQfXQHfHkpNU= +github.com/bboreham/go-loser v0.0.0-20230920113527-fcc2c21820a3 h1:6df1vn4bBlDDo4tARvBm7l6KA9iVMnE3NWizDeWSrps= +github.com/bboreham/go-loser v0.0.0-20230920113527-fcc2c21820a3/go.mod h1:CIWtjkly68+yqLPbvwwR/fjNJA/idrtULjZWh2v1ys0= +github.com/benbjohnson/clock v1.3.5 h1:VvXlSJBzZpA/zum6Sj74hxwYI2DIxRWuNIoXAzHZz5o= +github.com/benbjohnson/clock v1.3.5/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= +github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= +github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= +github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= +github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= +github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= +github.com/bmatcuk/doublestar/v4 v4.7.1 h1:fdDeAqgT47acgwd9bd9HxJRDmc9UAmPpc+2m0CXv75Q= +github.com/bmatcuk/doublestar/v4 v4.7.1/go.mod h1:xBQ8jztBU6kakFMg+8WGxn0c6z1fTSPVIjEY1Wr7jzc= +github.com/bool64/shared v0.1.5 h1:fp3eUhBsrSjNCQPcSdQqZxxh9bBwrYiZ+zOKFkM0/2E= +github.com/bool64/shared v0.1.5/go.mod h1:081yz68YC9jeFB3+Bbmno2RFWvGKv1lPKkMP6MHJlPs= +github.com/cenkalti/backoff/v4 v4.3.0 h1:MyRJ/UdXutAwSAT+s3wNd7MfTIcy71VQueUuFK343L8= +github.com/cenkalti/backoff/v4 v4.3.0/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE= +github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= +github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= +github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= +github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= +github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= +github.com/circonus-labs/circonus-gometrics v2.3.1+incompatible/go.mod h1:nmEj6Dob7S7YxXgwXpfOuvO54S+tGdZdw9fuRZt25Ag= +github.com/circonus-labs/circonusllhist v0.1.3/go.mod h1:kMXHVDlOchFAehlya5ePtbp5jckzBHf4XRpQvBOLI+I= +github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= +github.com/cloudflare/pint v0.74.6 h1:Vx8xJVqpF3w/U7m1SH60XYHIDrO5g+qP7F02r3iEb3M= +github.com/cloudflare/pint v0.74.6/go.mod h1:uq6NSeoK0BbkuyN2j2ZJN43PLJ+BpQLv1iQ9ANgP9FY= +github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= +github.com/cncf/udpa/go v0.0.0-20200629203442-efcf912fb354/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= +github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= +github.com/cncf/xds/go v0.0.0-20250121191232-2f005788dc42 h1:Om6kYQYDUk5wWbT0t0q6pvyM49i9XZAv9dDrkDA7gjk= +github.com/cncf/xds/go v0.0.0-20250121191232-2f005788dc42/go.mod h1:W+zGtBO5Y1IgJhy4+A9GOqVhqLpfZi+vwmdNXUehLA8= +github.com/containerd/console v1.0.3 h1:lIr7SlA5PxZyMV30bDW0MGbiOPXwc63yRuCP0ARubLw= +github.com/containerd/console v1.0.3/go.mod h1:7LqA/THxQ86k76b8c/EMSiaJ3h1eZkMkXar0TQ1gf3U= +github.com/containerd/log v0.1.0 h1:TCJt7ioM2cr/tfR8GPbGf9/VRAX8D2B4PjzCpfX540I= +github.com/containerd/log v0.1.0/go.mod h1:VRRf09a7mHDIRezVKTRCrOq78v577GXq3bSa3EhrzVo= +github.com/coreos/go-systemd/v22 v22.5.0 h1:RrqgGjYQKalulkV8NGVIfkXQf6YYmOyiJKk8iXXhfZs= +github.com/coreos/go-systemd/v22 v22.5.0/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= +github.com/cpuguy83/go-md2man/v2 v2.0.3/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= +github.com/d5/tengo/v2 v2.17.0 h1:BWUN9NoJzw48jZKiYDXDIF3QrIVZRm1uV1gTzeZ2lqM= +github.com/d5/tengo/v2 v2.17.0/go.mod h1:XRGjEs5I9jYIKTxly6HCF8oiiilk5E/RYXOZ5b0DZC8= +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/dennwc/varint v1.0.0 h1:kGNFFSSw8ToIy3obO/kKr8U9GZYUAxQEVuix4zfDWzE= +github.com/dennwc/varint v1.0.0/go.mod h1:hnItb35rvZvJrbTALZtY/iQfDs48JKRG1RPpgziApxA= +github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f h1:lO4WD4F/rVNCu3HqELle0jiPLLBs70cWOduZpkS1E78= +github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f/go.mod h1:cuUVRXasLTGF7a8hSLbxyZXjz+1KgoB3wDUb6vlszIc= +github.com/digitalocean/godo v1.144.0 h1:rDCsmpwcDe5egFQ3Ae45HTde685/GzX037mWRMPufW0= +github.com/digitalocean/godo v1.144.0/go.mod h1:tYeiWY5ZXVpU48YaFv0M5irUFHXGorZpDNm7zzdWMzM= +github.com/distribution/reference v0.5.0 h1:/FUIFXtfc/x2gpa5/VGfiGLuOIdYa1t65IKK2OFGvA0= +github.com/distribution/reference v0.5.0/go.mod h1:BbU0aIcezP1/5jX/8MP0YiH4SdvB5Y4f/wlDRiLyi3E= +github.com/dnaeon/go-vcr v1.2.0 h1:zHCHvJYTMh1N7xnV7zf1m1GPBF9Ad0Jk/whtQ1663qI= +github.com/dnaeon/go-vcr v1.2.0/go.mod h1:R4UdLID7HZT3taECzJs4YgbbH6PIGXB6W/sc5OLb6RQ= +github.com/docker/docker v28.1.1+incompatible h1:49M11BFLsVO1gxY9UX9p/zwkE/rswggs8AdFmXQw51I= +github.com/docker/docker v28.1.1+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= +github.com/docker/go-connections v0.4.0 h1:El9xVISelRB7BuFusrZozjnkIM5YnzCViNKohAFqRJQ= +github.com/docker/go-connections v0.4.0/go.mod h1:Gbd7IOopHjR8Iph03tsViu4nIes5XhDvyHbTtUxmeec= +github.com/docker/go-units v0.5.0 h1:69rxXcBk27SvSaaxTtLh/8llcHD8vYHT7WSdRZ/jvr4= +github.com/docker/go-units v0.5.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= +github.com/edsrzf/mmap-go v1.2.0 h1:hXLYlkbaPzt1SaQk+anYwKSRNhufIDCchSPkUD6dD84= +github.com/edsrzf/mmap-go v1.2.0/go.mod h1:19H/e8pUPLicwkyNgOykDXkJ9F0MHE+Z52B8EIth78Q= +github.com/elliotchance/orderedmap/v2 v2.2.0 h1:7/2iwO98kYT4XkOjA9mBEIwvi4KpGB4cyHeOFOnj4Vk= +github.com/elliotchance/orderedmap/v2 v2.2.0/go.mod h1:85lZyVbpGaGvHvnKa7Qhx7zncAdBIBq6u56Hb1PRU5Q= +github.com/emicklei/go-restful/v3 v3.11.0 h1:rAQeMHw1c7zTmncogyy8VvRZwtkmkZ4FxERmMY4rD+g= +github.com/emicklei/go-restful/v3 v3.11.0/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc= +github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= +github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= +github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= +github.com/envoyproxy/go-control-plane v0.9.7/go.mod h1:cwu0lG7PUMfa9snN8LXBig5ynNVH9qI8YYLbd1fK2po= +github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= +github.com/envoyproxy/go-control-plane/envoy v1.32.4 h1:jb83lalDRZSpPWW2Z7Mck/8kXZ5CQAFYVjQcdVIr83A= +github.com/envoyproxy/go-control-plane/envoy v1.32.4/go.mod h1:Gzjc5k8JcJswLjAx1Zm+wSYE20UrLtt7JZMWiWQXQEw= +github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= +github.com/envoyproxy/protoc-gen-validate v1.2.1 h1:DEo3O99U8j4hBFwbJfrz9VtgcDfUKS7KJ7spH3d86P8= +github.com/envoyproxy/protoc-gen-validate v1.2.1/go.mod h1:d/C80l/jxXLdfEIhX1W2TmLfsJ31lvEjwamM4DxlWXU= +github.com/errata-ai/ini v1.63.0 h1:XRFKXTn7FvF8mnC9RPOlYaL4Ud7dP0i35LnLcbIhWYU= +github.com/errata-ai/ini v1.63.0/go.mod h1:PhjYff6ijif0unCnaJtXxnVsmlY95CSiNJDLXQYXdX8= +github.com/errata-ai/regexp2 v1.7.0 h1:N+weOlhwTd5iyDTcTCAMljXnfzkftcOZrdXno6G+QPM= +github.com/errata-ai/regexp2 v1.7.0/go.mod h1:59rO+jaxayJPF1WKI5m9R5F3Y3zR2Wn0DHnQbxtPm4A= +github.com/errata-ai/vale/v3 v3.12.0 h1:2yRMQl8f9dujNE26Y9g9+LU5OXidngLg5HftfIFi/4U= +github.com/errata-ai/vale/v3 v3.12.0/go.mod h1:BPNw4yScYrtxqvrca0T4UaiUGt2c05DUokXD91Sof3M= +github.com/expr-lang/expr v1.17.0 h1:+vpszOyzKLQXC9VF+wA8cVA0tlA984/Wabc/1hF9Whg= +github.com/expr-lang/expr v1.17.0/go.mod h1:8/vRC7+7HBzESEqt5kKpYXxrxkr31SaO8r40VO/1IT4= +github.com/facette/natsort v0.0.0-20181210072756-2cd4dd1e2dcb h1:IT4JYU7k4ikYg1SCxNI1/Tieq/NFvh6dzLdgi7eu0tM= +github.com/facette/natsort v0.0.0-20181210072756-2cd4dd1e2dcb/go.mod h1:bH6Xx7IW64qjjJq8M2u4dxNaBiDfKK+z/3eGDpXEQhc= +github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= +github.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU= +github.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk= +github.com/fatih/color v1.18.0 h1:S8gINlzdQ840/4pfAwic/ZE0djQEH3wM94VfqLTZcOM= +github.com/fatih/color v1.18.0/go.mod h1:4FelSpRwEGDpQ12mAdzqdOukCy4u8WUtOY6lkT/6HfU= +github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2Wg= +github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= +github.com/frankban/quicktest v1.14.6 h1:7Xjx+VpznH+oBnejlPUj8oUpdxnVs4f8XU8WnHkI4W8= +github.com/frankban/quicktest v1.14.6/go.mod h1:4ptaffx2x8+WTWXmUCuVU6aPUX1/Mz7zb5vbUoiM6w0= +github.com/fsnotify/fsnotify v1.8.0 h1:dAwr6QBTBZIkG8roQaJjGof0pp0EeF+tNV7YBP3F/8M= +github.com/fsnotify/fsnotify v1.8.0/go.mod h1:8jBTzvmWwFyi3Pb8djgCCO5IBqzKJ/Jwo8TRcHyHii0= +github.com/fxamacker/cbor/v2 v2.7.0 h1:iM5WgngdRBanHcxugY4JySA0nk1wZorNOpTgCMedv5E= +github.com/fxamacker/cbor/v2 v2.7.0/go.mod h1:pxXPTn3joSm21Gbwsv0w9OSA2y1HFR9qXEeXQVeNoDQ= +github.com/ghodss/yaml v1.0.0 h1:wQHKEahhL6wmXdzwWG11gIVCkOv05bNOh+Rxn0yngAk= +github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= +github.com/gkampitakis/ciinfo v0.3.2 h1:JcuOPk8ZU7nZQjdUhctuhQofk7BGHuIy0c9Ez8BNhXs= +github.com/gkampitakis/ciinfo v0.3.2/go.mod h1:1NIwaOcFChN4fa/B0hEBdAb6npDlFL8Bwx4dfRLRqAo= +github.com/gkampitakis/go-diff v1.3.2 h1:Qyn0J9XJSDTgnsgHRdz9Zp24RaJeKMUHg2+PDZZdC4M= +github.com/gkampitakis/go-diff v1.3.2/go.mod h1:LLgOrpqleQe26cte8s36HTWcTmMEur6OPYerdAAS9tk= +github.com/gkampitakis/go-snaps v0.5.13 h1:Hhjmvv1WboSCxkR9iU2mj5PQ8tsz/y8ECGrIbjjPF8Q= +github.com/gkampitakis/go-snaps v0.5.13/go.mod h1:HNpx/9GoKisdhw9AFOBT1N7DBs9DiHo/hGheFGBZ+mc= +github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= +github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= +github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= +github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= +github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= +github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= +github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= +github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= +github.com/go-logr/logr v1.4.2 h1:6pFjapn8bFcIbiKo3XT4j/BhANplGihG6tvd+8rYgrY= +github.com/go-logr/logr v1.4.2/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= +github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= +github.com/go-openapi/analysis v0.23.0 h1:aGday7OWupfMs+LbmLZG4k0MYXIANxcuBTYUC03zFCU= +github.com/go-openapi/analysis v0.23.0/go.mod h1:9mz9ZWaSlV8TvjQHLl2mUW2PbZtemkE8yA5v22ohupo= +github.com/go-openapi/errors v0.22.0 h1:c4xY/OLxUBSTiepAg3j/MHuAv5mJhnf53LLMWFB+u/w= +github.com/go-openapi/errors v0.22.0/go.mod h1:J3DmZScxCDufmIMsdOuDHxJbdOGC0xtUynjIx092vXE= +github.com/go-openapi/jsonpointer v0.21.0 h1:YgdVicSA9vH5RiHs9TZW5oyafXZFc6+2Vc1rr/O9oNQ= +github.com/go-openapi/jsonpointer v0.21.0/go.mod h1:IUyH9l/+uyhIYQ/PXVA41Rexl+kOkAPDdXEYns6fzUY= +github.com/go-openapi/jsonreference v0.21.0 h1:Rs+Y7hSXT83Jacb7kFyjn4ijOuVGSvOdF2+tg1TRrwQ= +github.com/go-openapi/jsonreference v0.21.0/go.mod h1:LmZmgsrTkVg9LG4EaHeY8cBDslNPMo06cago5JNLkm4= +github.com/go-openapi/loads v0.22.0 h1:ECPGd4jX1U6NApCGG1We+uEozOAvXvJSF4nnwHZ8Aco= +github.com/go-openapi/loads v0.22.0/go.mod h1:yLsaTCS92mnSAZX5WWoxszLj0u+Ojl+Zs5Stn1oF+rs= +github.com/go-openapi/spec v0.21.0 h1:LTVzPc3p/RzRnkQqLRndbAzjY0d0BCL72A6j3CdL9ZY= +github.com/go-openapi/spec v0.21.0/go.mod h1:78u6VdPw81XU44qEWGhtr982gJ5BWg2c0I5XwVMotYk= +github.com/go-openapi/strfmt v0.23.0 h1:nlUS6BCqcnAk0pyhi9Y+kdDVZdZMHfEKQiS4HaMgO/c= +github.com/go-openapi/strfmt v0.23.0/go.mod h1:NrtIpfKtWIygRkKVsxh7XQMDQW5HKQl6S5ik2elW+K4= +github.com/go-openapi/swag v0.23.0 h1:vsEVJDUo2hPJ2tu0/Xc+4noaxyEffXNIs3cOULZ+GrE= +github.com/go-openapi/swag v0.23.0/go.mod h1:esZ8ITTYEsH1V2trKHjAN8Ai7xHb8RV+YSZ577vPjgQ= +github.com/go-openapi/validate v0.24.0 h1:LdfDKwNbpB6Vn40xhTdNZAnfLECL81w+VX3BumrGD58= +github.com/go-openapi/validate v0.24.0/go.mod h1:iyeX1sEufmv3nPbBdX3ieNviWnOZaJ1+zquzJEf2BAQ= +github.com/go-resty/resty/v2 v2.16.5 h1:hBKqmWrr7uRc3euHVqmh1HTHcKn99Smr7o5spptdhTM= +github.com/go-resty/resty/v2 v2.16.5/go.mod h1:hkJtXbA2iKHzJheXYvQ8snQES5ZLGKMwQ07xAwp/fiA= +github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= +github.com/go-task/slim-sprig/v3 v3.0.0 h1:sUs3vkvUymDpBKi3qH1YSqBQk9+9D/8M2mN1vB6EwHI= +github.com/go-task/slim-sprig/v3 v3.0.0/go.mod h1:W848ghGpv3Qj3dhTPRyJypKRiqCdHZiAzKg9hl15HA8= +github.com/go-test/deep v1.0.3 h1:ZrJSEWsXzPOxaZnFteGEfooLba+ju3FYIbOrS+rQd68= +github.com/go-test/deep v1.0.3/go.mod h1:wGDj63lr65AM2AQyKZd/NYHGb0R+1RLqB8NKt3aSFNA= +github.com/go-viper/mapstructure/v2 v2.3.0 h1:27XbWsHIqhbdR5TIC911OfYvgSaW93HM+dX7970Q7jk= +github.com/go-viper/mapstructure/v2 v2.3.0/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= +github.com/go-zookeeper/zk v1.0.4 h1:DPzxraQx7OrPyXq2phlGlNSIyWEsAox0RJmjTseMV6I= +github.com/go-zookeeper/zk v1.0.4/go.mod h1:nOB03cncLtlp4t+UAkGSV+9beXP/akpekBwL+UX1Qcw= +github.com/gobwas/glob v0.2.3 h1:A4xDbljILXROh+kObIiy5kIaPYD8e96x1tgBhUI5J+Y= +github.com/gobwas/glob v0.2.3/go.mod h1:d3Ez4x06l9bZtSvzIay5+Yzi0fmZzPgnTbPcKjJAkT8= +github.com/goccy/go-yaml v1.18.0 h1:8W7wMFS12Pcas7KU+VVkaiCng+kG8QiFeFwzFb+rwuw= +github.com/goccy/go-yaml v1.18.0/go.mod h1:XBurs7gK8ATbW4ZPGKgcbrY1Br56PdM69F7LkFRi1kA= +github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= +github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= +github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= +github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= +github.com/golang-jwt/jwt/v5 v5.2.2 h1:Rl4B7itRWVtYIHFrSNd7vhTiz9UpLdi6gZhZ3wEeDy8= +github.com/golang-jwt/jwt/v5 v5.2.2/go.mod h1:pqrtFR0X4osieyHYxtmOUWsAWrfe1Q5UVIyoH402zdk= +github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= +github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da h1:oI5xCqsCo564l8iNU+DwB5epxmsaqB+rhGL0m5jtYqE= +github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= +github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= +github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y= +github.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= +github.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= +github.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= +github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4= +github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= +github.com/golang/protobuf v1.3.4/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= +github.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk= +github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= +github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= +github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= +github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= +github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= +github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8= +github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= +github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= +github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= +github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= +github.com/golang/snappy v1.0.0 h1:Oy607GVXHs7RtbggtPBnr2RmDArIsAefDwvrdWvRhGs= +github.com/golang/snappy v1.0.0/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= +github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= +github.com/google/btree v1.0.1 h1:gK4Kx5IaGY9CD5sPJ36FHiBJ6ZXl0kilRiiCj+jdYp4= +github.com/google/btree v1.0.1/go.mod h1:xXMiIv4Fb/0kKde4SpL7qlzvu5cMJDRkFDxJfI9uaxA= +github.com/google/gnostic-models v0.6.8 h1:yo/ABAfM5IMRsS1VnXjTBvUb61tFIHozhlYvRgGre9I= +github.com/google/gnostic-models v0.6.8/go.mod h1:5n7qKqH0f5wFt+aWF8CW6pZLLNOfYuF5OpfBSENuI8U= +github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= +github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.4.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8= +github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU= +github.com/google/go-github/v73 v73.0.0 h1:aR+Utnh+Y4mMkS+2qLQwcQ/cF9mOTpdwnzlaw//rG24= +github.com/google/go-github/v73 v73.0.0/go.mod h1:fa6w8+/V+edSU0muqdhCVY7Beh1M8F1IlQPZIANKIYw= +github.com/google/go-jsonnet v0.21.0 h1:43Bk3K4zMRP/aAZm9Po2uSEjY6ALCkYUVIcz9HLGMvA= +github.com/google/go-jsonnet v0.21.0/go.mod h1:tCGAu8cpUpEZcdGMmdOu37nh8bGgqubhI5v2iSk3KJQ= +github.com/google/go-querystring v1.1.0 h1:AnCroh3fv4ZBgVIf1Iwtovgjaw/GiKJo8M8yD/fhyJ8= +github.com/google/go-querystring v1.1.0/go.mod h1:Kcdr2DB4koayq7X8pmAG4sNG59So17icRSOU623lUBU= +github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0= +github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/martian v2.1.0+incompatible h1:/CP5g8u/VJHijgedC/Legn3BAbAaWPgecwXBIDzw5no= +github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= +github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= +github.com/google/martian/v3 v3.1.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= +github.com/google/martian/v3 v3.3.3 h1:DIhPTQrbPkgs2yJYdXU/eNACCG5DVQjySNRNlflZ9Fc= +github.com/google/martian/v3 v3.3.3/go.mod h1:iEPrYcgCF7jA9OtScMFQyAlZZ4YXTKEtJ1E6RWzmBA0= +github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= +github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= +github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20201023163331-3e6fc7fc9c4c/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20201203190320-1bf35d6f28c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20201218002935-b9804c9f04c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20241210010833-40e02aabc2ad h1:a6HEuzUHeKH6hwfN/ZoQgRgVIWFJljSWa/zetS2WTvg= +github.com/google/pprof v0.0.0-20241210010833-40e02aabc2ad/go.mod h1:vavhavw2zAxS5dIdcRluK6cSGGPlZynqzFM8NdvU144= +github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= +github.com/google/s2a-go v0.1.9 h1:LGD7gtMgezd8a/Xak7mEWL0PjoTQFvpRudN895yqKW0= +github.com/google/s2a-go v0.1.9/go.mod h1:YA0Ei2ZQL3acow2O62kdp9UlnvMmU7kA6Eutn0dXayM= +github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= +github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/googleapis/enterprise-certificate-proxy v0.3.6 h1:GW/XbdyBFQ8Qe+YAmFU9uHLo7OnF5tL52HFAgMmyrf4= +github.com/googleapis/enterprise-certificate-proxy v0.3.6/go.mod h1:MkHOF77EYAE7qfSuSS9PU6g4Nt4e11cnsDUowfwewLA= +github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= +github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= +github.com/googleapis/gax-go/v2 v2.14.1 h1:hb0FFeiPaQskmvakKu5EbCbpntQn48jyHuvrkurSS/Q= +github.com/googleapis/gax-go/v2 v2.14.1/go.mod h1:Hb/NubMaVM88SrNkvl8X/o8XWwDJEPqouaLeN2IUxoA= +github.com/googleapis/google-cloud-go-testing v0.0.0-20200911160855-bcd43fbb19e8/go.mod h1:dvDLG8qkwmyD9a/MJJN3XJcT3xFxOKAvTZGvuZmac9g= +github.com/gookit/color v1.4.2/go.mod h1:fqRyamkC1W8uxl+lxCQxOT09l/vYfZ+QeiX3rKQHCoQ= +github.com/gookit/color v1.5.0/go.mod h1:43aQb+Zerm/BWh2GnrgOQm7ffz7tvQXEKV6BFMl7wAo= +github.com/gookit/color v1.5.4 h1:FZmqs7XOyGgCAxmWyPslpiok1k05wmY3SJTytgvYFs0= +github.com/gookit/color v1.5.4/go.mod h1:pZJOeOS8DM43rXbp4AZo1n9zCU2qjpcRko0b6/QJi9w= +github.com/gophercloud/gophercloud/v2 v2.7.0 h1:o0m4kgVcPgHlcXiWAjoVxGd8QCmvM5VU+YM71pFbn0E= +github.com/gophercloud/gophercloud/v2 v2.7.0/go.mod h1:Ki/ILhYZr/5EPebrPL9Ej+tUg4lqx71/YH2JWVeU+Qk= +github.com/gorilla/websocket v1.5.0 h1:PPwGk2jz7EePpoHN/+ClbZu8SPxiqlu12wZP/3sWmnc= +github.com/gorilla/websocket v1.5.0/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= +github.com/grafana/dashboard-linter v0.0.0-20231114210226-c458893a5731 h1:DfFbnpd1251Pe5vR/J/CBXsCJJM6N0nt+odU/8EPwwQ= +github.com/grafana/dashboard-linter v0.0.0-20231114210226-c458893a5731/go.mod h1:nciNdOgPMsTHwNUpYDfTqi8lRfZVtSZxXjtXfeXlQds= +github.com/grafana/regexp v0.0.0-20240518133315-a468a5bfb3bc h1:GN2Lv3MGO7AS6PrRoT6yV5+wkrOpcszoIsO4+4ds248= +github.com/grafana/regexp v0.0.0-20240518133315-a468a5bfb3bc/go.mod h1:+JKpmjMGhpgPL+rXZ5nsZieVzvarn86asRlBg4uNGnk= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.26.3 h1:5ZPtiqj0JL5oKWmcsq4VMaAW5ukBEgSGXEN89zeH1Jo= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.26.3/go.mod h1:ndYquD05frm2vACXE1nsccT4oJzjhw2arTS2cpUD1PI= +github.com/hashicorp/consul/api v1.32.0 h1:5wp5u780Gri7c4OedGEPzmlUEzi0g2KyiPphSr6zjVg= +github.com/hashicorp/consul/api v1.32.0/go.mod h1:Z8YgY0eVPukT/17ejW+l+C7zJmKwgPHtjU1q16v/Y40= +github.com/hashicorp/consul/sdk v0.16.1 h1:V8TxTnImoPD5cj0U9Spl0TUxcytjcbbJeADFF07KdHg= +github.com/hashicorp/consul/sdk v0.16.1/go.mod h1:fSXvwxB2hmh1FMZCNl6PwX0Q/1wdWtHJcZ7Ea5tns0s= +github.com/hashicorp/cronexpr v1.1.2 h1:wG/ZYIKT+RT3QkOdgYc+xsKWVRgnxJ1OJtjjy84fJ9A= +github.com/hashicorp/cronexpr v1.1.2/go.mod h1:P4wA0KBl9C5q2hABiMO7cp6jcIg96CDh1Efb3g1PWA4= +github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= +github.com/hashicorp/errwrap v1.1.0 h1:OxrOeh75EUXMY8TBjag2fzXGZ40LB6IKw45YeGUDY2I= +github.com/hashicorp/errwrap v1.1.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= +github.com/hashicorp/go-cleanhttp v0.5.0/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= +github.com/hashicorp/go-cleanhttp v0.5.2 h1:035FKYIWjmULyFRBKPs8TBQoi0x6d9G4xc9neXJWAZQ= +github.com/hashicorp/go-cleanhttp v0.5.2/go.mod h1:kO/YDlP8L1346E6Sodw+PrpBSV4/SoxCXGY6BqNFT48= +github.com/hashicorp/go-hclog v1.6.3 h1:Qr2kF+eVWjTiYmU7Y31tYlP1h0q/X3Nl3tPGdaB11/k= +github.com/hashicorp/go-hclog v1.6.3/go.mod h1:W4Qnvbt70Wk/zYJryRzDRU/4r0kIg0PVHBcfoyhpF5M= +github.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= +github.com/hashicorp/go-immutable-radix v1.3.1 h1:DKHmCUm2hRBK510BaiZlwvpD40f8bJFeZnpfm2KLowc= +github.com/hashicorp/go-immutable-radix v1.3.1/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= +github.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM= +github.com/hashicorp/go-msgpack v0.5.5 h1:i9R9JSrqIz0QVLz3sz+i3YJdT7TTSLcfLLzJi9aZTuI= +github.com/hashicorp/go-msgpack v0.5.5/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM= +github.com/hashicorp/go-msgpack/v2 v2.1.1 h1:xQEY9yB2wnHitoSzk/B9UjXWRQ67QKu5AOm8aFp8N3I= +github.com/hashicorp/go-msgpack/v2 v2.1.1/go.mod h1:upybraOAblm4S7rx0+jeNy+CWWhzywQsSRV5033mMu4= +github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk= +github.com/hashicorp/go-multierror v1.1.0/go.mod h1:spPvp8C1qA32ftKqdAHm4hHTbPw+vmowP0z+KUhOZdA= +github.com/hashicorp/go-multierror v1.1.1 h1:H5DkEtf6CXdFp0N0Em5UCwQpXMWke8IA0+lD48awMYo= +github.com/hashicorp/go-multierror v1.1.1/go.mod h1:iw975J/qwKPdAO1clOe2L8331t/9/fmwbPZ6JB6eMoM= +github.com/hashicorp/go-retryablehttp v0.5.3/go.mod h1:9B5zBasrRhHXnJnui7y6sL7es7NDiJgTc6Er0maI1Xs= +github.com/hashicorp/go-retryablehttp v0.7.8 h1:ylXZWnqa7Lhqpk0L1P1LzDtGcCR0rPVUrx/c8Unxc48= +github.com/hashicorp/go-retryablehttp v0.7.8/go.mod h1:rjiScheydd+CxvumBsIrFKlx3iS0jrZ7LvzFGFmuKbw= +github.com/hashicorp/go-rootcerts v1.0.2 h1:jzhAVGtqPKbwpyCPELlgNWhE1znq+qwJtW5Oi2viEzc= +github.com/hashicorp/go-rootcerts v1.0.2/go.mod h1:pqUvnprVnM5bf7AOirdbb01K4ccR319Vf4pU3K5EGc8= +github.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU= +github.com/hashicorp/go-sockaddr v1.0.7 h1:G+pTkSO01HpR5qCxg7lxfsFEZaG+C0VssTy/9dbT+Fw= +github.com/hashicorp/go-sockaddr v1.0.7/go.mod h1:FZQbEYa1pxkQ7WLpyXJ6cbjpT8q0YgQaK/JakXqGyWw= +github.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4= +github.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= +github.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= +github.com/hashicorp/go-uuid v1.0.3 h1:2gKiV6YVmrJ1i2CKKa9obLvRieoRGviZFL26PcT/Co8= +github.com/hashicorp/go-uuid v1.0.3/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= +github.com/hashicorp/go-version v1.7.0 h1:5tqGy27NaOTB8yJKUZELlFAS/LTKJkrmONwQKeRZfjY= +github.com/hashicorp/go-version v1.7.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= +github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= +github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= +github.com/hashicorp/golang-lru v0.6.0 h1:uL2shRDx7RTrOrTCUZEGP/wJUFiUI8QT6E7z5o8jga4= +github.com/hashicorp/golang-lru v0.6.0/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= +github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4= +github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= +github.com/hashicorp/hcl/v2 v2.24.0 h1:2QJdZ454DSsYGoaE6QheQZjtKZSUs9Nh2izTWiwQxvE= +github.com/hashicorp/hcl/v2 v2.24.0/go.mod h1:oGoO1FIQYfn/AgyOhlg9qLC6/nOJPX3qGbkZpYAcqfM= +github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64= +github.com/hashicorp/mdns v1.0.4/go.mod h1:mtBihi+LeNXGtG8L9dX59gAEa12BDtBQSp4v/YAJqrc= +github.com/hashicorp/memberlist v0.5.0/go.mod h1:yvyXLpo0QaGE59Y7hDTsTzDD25JYBZ4mHgHUZ8lrOI0= +github.com/hashicorp/memberlist v0.5.1 h1:mk5dRuzeDNis2bi6LLoQIXfMH7JQvAzt3mQD0vNZZUo= +github.com/hashicorp/memberlist v0.5.1/go.mod h1:zGDXV6AqbDTKTM6yxW0I4+JtFzZAJVoIPvss4hV8F24= +github.com/hashicorp/nomad/api v0.0.0-20241218080744-e3ac00f30eec h1:+YBzb977VrmffaCX/OBm17dEVJUcWn5dW+eqs3aIJ/A= +github.com/hashicorp/nomad/api v0.0.0-20241218080744-e3ac00f30eec/go.mod h1:svtxn6QnrQ69P23VvIWMR34tg3vmwLz4UdUzm1dSCgE= +github.com/hashicorp/serf v0.10.1 h1:Z1H2J60yRKvfDYAOZLd2MU0ND4AH/WDz7xYHDWQsIPY= +github.com/hashicorp/serf v0.10.1/go.mod h1:yL2t6BqATOLGc5HF7qbFkTfXoPIY0WZdWHfEvMqbG+4= +github.com/hetznercloud/hcloud-go/v2 v2.21.0 h1:wUpQT+fgAxIcdMtFvuCJ78ziqc/VARubpOQPQyj4Q84= +github.com/hetznercloud/hcloud-go/v2 v2.21.0/go.mod h1:WSM7w+9tT86sJTNcF8a/oHljC3HUmQfcLxYsgx6PpSc= +github.com/huandu/xstrings v1.5.0 h1:2ag3IFq9ZDANvthTwTiqSSZLjDc+BedvHPAp5tJy2TI= +github.com/huandu/xstrings v1.5.0/go.mod h1:y5/lhBue+AyNmUVz9RLU9xbLR0o4KIIExikq4ovT0aE= +github.com/iancoleman/orderedmap v0.2.0 h1:sq1N/TFpYH++aViPcaKjys3bDClUEU7s5B+z6jq8pNA= +github.com/iancoleman/orderedmap v0.2.0/go.mod h1:N0Wam8K1arqPXNWjMo21EXnBPOPp36vB07FNRdD2geA= +github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= +github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= +github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8= +github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= +github.com/ionos-cloud/sdk-go/v6 v6.3.3 h1:q33Sw1ZqsvqDkFaKG53dGk7BCOvPCPbGZpYqsF6tdjw= +github.com/ionos-cloud/sdk-go/v6 v6.3.3/go.mod h1:wCVwNJ/21W29FWFUv+fNawOTMlFoP1dS3L+ZuztFW48= +github.com/itchyny/json2yaml v0.1.4 h1:/pErVOXGG5iTyXHi/QKR4y3uzhLjGTEmmJIy97YT+k8= +github.com/itchyny/json2yaml v0.1.4/go.mod h1:6iudhBZdarpjLFRNj+clWLAkGft+9uCcjAZYXUH9eGI= +github.com/jarcoal/httpmock v1.3.1 h1:iUx3whfZWVf3jT01hQTO/Eo5sAYtB2/rqaUuOtpInww= +github.com/jarcoal/httpmock v1.3.1/go.mod h1:3yb8rc4BI7TCBhFY8ng0gjuLKJNquuDNiPaZjnENuYg= +github.com/jdkato/go-tree-sitter-julia v0.1.0 h1:z+6zTbd6PHMKAge7GJx9QIwPQX2NOKb4Pj5jteJvaYY= +github.com/jdkato/go-tree-sitter-julia v0.1.0/go.mod h1:lXNEZorcvU63DcANEklLMbDRjwam4VQ44MIV1Cck0w8= +github.com/jdkato/twine v0.10.2 h1:oUsxT6PT1Kz9JlJmAYOIjU/81+6uaj3/EVYIZJFIAdI= +github.com/jdkato/twine v0.10.2/go.mod h1:bYejIksa/MD4jxI5/o+DFxMb7Bw7JcGZDoA6ib4j+dg= +github.com/jmespath/go-jmespath v0.4.0 h1:BEgLn5cpjn8UN1mAw4NjwDrS35OdebyEtFe+9YPoQUg= +github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo= +github.com/jmespath/go-jmespath/internal/testify v1.5.1 h1:shLQSRRSCCPj3f2gpwzGwWFoC7ycTf1rcQZHOlsJ6N8= +github.com/jmespath/go-jmespath/internal/testify v1.5.1/go.mod h1:L3OGu8Wl2/fWfCI6z80xFu9LTZmf1ZRjMHUOPmWr69U= +github.com/josharian/intern v1.0.0 h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8HmY= +github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y= +github.com/jpillora/backoff v1.0.0 h1:uvFg412JmmHBHw7iwprIxkPMI+sGQ4kzOWsMeHnm2EA= +github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4= +github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= +github.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= +github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= +github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= +github.com/jsonnet-bundler/jsonnet-bundler v0.6.0 h1:DBnynmjyWBVQ9gUBmTh49x3Dw5/u4CvGO3k2k1CsYNo= +github.com/jsonnet-bundler/jsonnet-bundler v0.6.0/go.mod h1:5esRxD59TyScj6qxT3o7GH0sryBKvVmx2zaEYDXtQkg= +github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= +github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= +github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= +github.com/keybase/go-keychain v0.0.1 h1:way+bWYa6lDppZoZcgMbYsvC7GxljxrskdNInRtuthU= +github.com/keybase/go-keychain v0.0.1/go.mod h1:PdEILRW3i9D8JcdM+FmY6RwkHGnhHxXwkPPMeUgOK1k= +github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= +github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= +github.com/klauspost/compress v1.18.0 h1:c/Cqfb0r+Yi+JtIEq73FWXVkRonBlf0CRNYc8Zttxdo= +github.com/klauspost/compress v1.18.0/go.mod h1:2Pp+KzxcywXVXMr50+X0Q/Lsb43OQHYWRCY2AiWywWQ= +github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= +github.com/klauspost/cpuid/v2 v2.0.10/go.mod h1:g2LTdtYhdyuGPqyWyv7qRAmj1WBqxuObKfj5c0PQa7c= +github.com/klauspost/cpuid/v2 v2.0.12/go.mod h1:g2LTdtYhdyuGPqyWyv7qRAmj1WBqxuObKfj5c0PQa7c= +github.com/klauspost/cpuid/v2 v2.2.3 h1:sxCkb+qR91z4vsqw4vGGZlDgPz3G7gjaLyK3V8y70BU= +github.com/klauspost/cpuid/v2 v2.2.3/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY= +github.com/knadh/koanf/maps v0.1.2 h1:RBfmAW5CnZT+PJ1CVc1QSJKf4Xu9kxfQgYVQSu8hpbo= +github.com/knadh/koanf/maps v0.1.2/go.mod h1:npD/QZY3V6ghQDdcQzl1W4ICNVTkohC8E73eI2xW4yI= +github.com/knadh/koanf/providers/confmap v0.1.0 h1:gOkxhHkemwG4LezxxN8DMOFopOPghxRVp7JbIvdvqzU= +github.com/knadh/koanf/providers/confmap v0.1.0/go.mod h1:2uLhxQzJnyHKfxG927awZC7+fyHFdQkd697K4MdLnIU= +github.com/knadh/koanf/v2 v2.1.2 h1:I2rtLRqXRy1p01m/utEtpZSSA6dcJbgGVuE27kW2PzQ= +github.com/knadh/koanf/v2 v2.1.2/go.mod h1:Gphfaen0q1Fc1HTgJgSTC4oRX9R2R5ErYMZJy8fLJBo= +github.com/kolo/xmlrpc v0.0.0-20220921171641-a4b6fa1dd06b h1:udzkj9S/zlT5X367kqJis0QP7YMxobob6zhzq6Yre00= +github.com/kolo/xmlrpc v0.0.0-20220921171641-a4b6fa1dd06b/go.mod h1:pcaDhQK0/NJZEvtCO0qQPPropqV0sJOJ6YW7X+9kRwM= +github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= +github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg= +github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= +github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= +github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= +github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= +github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= +github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= +github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= +github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= +github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc= +github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= +github.com/linode/linodego v1.49.0 h1:MNd3qwvQzbXB5mCpvdCqlUIu1RPA9oC+50LyB9kK+GQ= +github.com/linode/linodego v1.49.0/go.mod h1:B+HAM3//4w1wOS0BwdaQBKwBxlfe6kYJ7bSC6jJ/xtc= +github.com/lithammer/fuzzysearch v1.1.8 h1:/HIuJnjHuXS8bKaiTMeeDlW2/AyIWk2brx1V8LFgLN4= +github.com/lithammer/fuzzysearch v1.1.8/go.mod h1:IdqeyBClc3FFqSzYq/MXESsS4S0FsZ5ajtkr5xPLts4= +github.com/magiconair/properties v1.8.7 h1:IeQXZAiQcpL9mgcAe1Nu6cX9LLw6ExEHKjN0VQdvPDY= +github.com/magiconair/properties v1.8.7/go.mod h1:Dhd985XPs7jluiymwWYZ0G4Z61jb3vdS329zhj2hYo0= +github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0= +github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= +github.com/maruel/natural v1.1.1 h1:Hja7XhhmvEFhcByqDoHz9QZbkWey+COd9xWfCfn1ioo= +github.com/maruel/natural v1.1.1/go.mod h1:v+Rfd79xlw1AgVBjbO0BEQmptqb5HvL/k9GRHB7ZKEg= +github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= +github.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= +github.com/mattn/go-colorable v0.1.6/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= +github.com/mattn/go-colorable v0.1.9/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= +github.com/mattn/go-colorable v0.1.12/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4= +github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= +github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg= +github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= +github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= +github.com/mattn/go-isatty v0.0.11/go.mod h1:PhnuNfih5lzO57/f3n+odYbM4JtupLOxQOAqxQCu2WE= +github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= +github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94= +github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= +github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= +github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= +github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= +github.com/mattn/go-runewidth v0.0.13/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= +github.com/mattn/go-runewidth v0.0.16 h1:E5ScNMtiwvlvB5paMFdw9p4kSQzbXFikJ5SQO6TULQc= +github.com/mattn/go-runewidth v0.0.16/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= +github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= +github.com/maxatome/go-testdeep v1.12.0 h1:Ql7Go8Tg0C1D/uMMX59LAoYK7LffeJQ6X2T04nTH68g= +github.com/maxatome/go-testdeep v1.12.0/go.mod h1:lPZc/HAcJMP92l7yI6TRz1aZN5URwUBUAfUNvrclaNM= +github.com/mdlayher/socket v0.4.1 h1:eM9y2/jlbs1M615oshPQOHZzj6R6wMT7bX5NPiQvn2U= +github.com/mdlayher/socket v0.4.1/go.mod h1:cAqeGjoufqdxWkD7DkpyS+wcefOtmu5OQ8KuoJGIReA= +github.com/mdlayher/vsock v1.2.1 h1:pC1mTJTvjo1r9n9fbm7S1j04rCgCzhCOS5DY0zqHlnQ= +github.com/mdlayher/vsock v1.2.1/go.mod h1:NRfCibel++DgeMD8z/hP+PPTjlNJsdPOmxcnENvE+SE= +github.com/miekg/dns v1.1.26/go.mod h1:bPDLeHnStXmXAq1m/Ch/hvfNHr14JKNPMBo3VZKjuso= +github.com/miekg/dns v1.1.41/go.mod h1:p6aan82bvRIyn+zDIv9xYNUpwa73JcSh9BKwknJysuI= +github.com/miekg/dns v1.1.65 h1:0+tIPHzUW0GCge7IiK3guGP57VAw7hoPDfApjkMD1Fc= +github.com/miekg/dns v1.1.65/go.mod h1:Dzw9769uoKVaLuODMDZz9M6ynFU6Em65csPuoi8G0ck= +github.com/mitchellh/cli v1.1.0/go.mod h1:xcISNoH86gajksDmfB23e/pu+B+GeFRMYmoHXxx3xhI= +github.com/mitchellh/copystructure v1.2.0 h1:vpKXTN4ewci03Vljg/q9QvCGUDttBOGBIa15WveJJGw= +github.com/mitchellh/copystructure v1.2.0/go.mod h1:qLl+cE2AmVv+CoeAwDPye/v+N2HKCj9FbZEVFJRxO9s= +github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y= +github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= +github.com/mitchellh/go-testing-interface v1.14.1 h1:jrgshOhYAUVNMAJiKbEu7EqAwgJJ2JqpQmpLJOu07cU= +github.com/mitchellh/go-testing-interface v1.14.1/go.mod h1:gfgS7OtZj6MA4U1UrDRp04twqAjfvlZyCfX3sDjEym8= +github.com/mitchellh/go-wordwrap v1.0.1 h1:TLuKupo69TCn6TQSyGxwI1EblZZEsQ0vMlAFQflz0v0= +github.com/mitchellh/go-wordwrap v1.0.1/go.mod h1:R62XHJLzvMFRBbcrT7m7WgmE1eOyTSsCt+hzestvNj0= +github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= +github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY= +github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= +github.com/mitchellh/reflectwalk v1.0.2 h1:G2LzWKi524PWgd3mLHV8Y5k7s6XUvT0Gef6zxSIeXaQ= +github.com/mitchellh/reflectwalk v1.0.2/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw= +github.com/moby/docker-image-spec v1.3.1 h1:jMKff3w6PgbfSa69GfNg+zN/XLhfXJGnEx3Nl2EsFP0= +github.com/moby/docker-image-spec v1.3.1/go.mod h1:eKmb5VW8vQEh/BAr2yvVNvuiJuY6UIocYsFu/DxxRpo= +github.com/moby/sys/atomicwriter v0.1.0 h1:kw5D/EqkBwsBFi0ss9v1VG3wIkVhzGvLklJ+w3A14Sw= +github.com/moby/sys/atomicwriter v0.1.0/go.mod h1:Ul8oqv2ZMNHOceF643P6FKPXeCmYtlQMvpizfsSoaWs= +github.com/moby/sys/sequential v0.6.0 h1:qrx7XFUd/5DxtqcoH1h438hF5TmOvzC/lspjy7zgvCU= +github.com/moby/sys/sequential v0.6.0/go.mod h1:uyv8EUTrca5PnDsdMGXhZe6CCe8U/UiTWd+lL+7b/Ko= +github.com/moby/term v0.0.0-20210619224110-3f7ff695adc6 h1:dcztxKSvZ4Id8iPpHERQBbIJfabdt4wUm5qy3wOL2Zc= +github.com/moby/term v0.0.0-20210619224110-3f7ff695adc6/go.mod h1:E2VnQOmVuvZB6UYnnDB0qG5Nq/1tD9acaOpo6xmt0Kw= +github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= +github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= +github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M= +github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= +github.com/montanaflynn/stats v0.7.1 h1:etflOAAHORrCC44V+aR6Ftzort912ZU+YLiSTuV8eaE= +github.com/montanaflynn/stats v0.7.1/go.mod h1:etXPPgVO6n31NxCd9KQUMvCM+ve0ruNzt6R8Bnaayow= +github.com/morikuni/aec v1.0.0 h1:nP9CBfwrvYnBRgY6qfDQkygYDmYwOilePFkwzv4dU8A= +github.com/morikuni/aec v1.0.0/go.mod h1:BbKIizmSmc5MMPqRYbxO4ZU0S0+P200+tUnFx7PXmsc= +github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq1c1nUAm88MOHcQC9l5mIlSMApZMrHA= +github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= +github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= +github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f h1:KUppIJq7/+SVif2QVs3tOP0zanoHgBEVAwHxUSIzRqU= +github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= +github.com/neilotoole/slogt v1.1.0 h1:c7qE92sq+V0yvCuaxph+RQ2jOKL61c4hqS1Bv9W7FZE= +github.com/neilotoole/slogt v1.1.0/go.mod h1:RCrGXkPc/hYybNulqQrMHRtvlQ7F6NktNVLuLwk6V+w= +github.com/neurosnap/sentences v1.1.2 h1:iphYOzx/XckXeBiLIUBkPu2EKMJ+6jDbz/sLJZ7ZoUw= +github.com/neurosnap/sentences v1.1.2/go.mod h1:/pwU4E9XNL21ygMIkOIllv/SMy2ujHwpf8GQPu1YPbQ= +github.com/niklasfasching/go-org v1.7.0 h1:vyMdcMWWTe/XmANk19F4k8XGBYg0GQ/gJGMimOjGMek= +github.com/niklasfasching/go-org v1.7.0/go.mod h1:WuVm4d45oePiE0eX25GqTDQIt/qPW1T9DGkRscqLW5o= +github.com/nsf/jsondiff v0.0.0-20230430225905-43f6cf3098c1 h1:dOYG7LS/WK00RWZc8XGgcUTlTxpp3mKhdR2Q9z9HbXM= +github.com/nsf/jsondiff v0.0.0-20230430225905-43f6cf3098c1/go.mod h1:mpRZBD8SJ55OIICQ3iWH0Yz3cjzA61JdqMLoWXeB2+8= +github.com/oklog/ulid v1.3.1 h1:EGfNDEx6MqHz8B3uNV6QAib1UR2Lm97sHi3ocA6ESJ4= +github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U= +github.com/oklog/ulid/v2 v2.1.0 h1:+9lhoxAP56we25tyYETBBY1YLA2SaoLvUFgrP2miPJU= +github.com/oklog/ulid/v2 v2.1.0/go.mod h1:rcEKHmBBKfef9DhnvX7y1HZBYxjXb0cP5ExxNsTT1QQ= +github.com/olekukonko/tablewriter v0.0.5 h1:P2Ga83D34wi1o9J6Wh1mRuqd4mF/x/lgBS7N7AbDhec= +github.com/olekukonko/tablewriter v0.0.5/go.mod h1:hPp6KlRPjbx+hW8ykQs1w3UBbZlj6HuIJcUGPhkA7kY= +github.com/onsi/ginkgo/v2 v2.21.0 h1:7rg/4f3rB88pb5obDgNZrNHrQ4e6WpjonchcpuBRnZM= +github.com/onsi/ginkgo/v2 v2.21.0/go.mod h1:7Du3c42kxCUegi0IImZ1wUQzMBVecgIHjR1C+NkhLQo= +github.com/onsi/gomega v1.35.1 h1:Cwbd75ZBPxFSuZ6T+rN/WCb/gOc6YgFBXLlZLhC7Ds4= +github.com/onsi/gomega v1.35.1/go.mod h1:PvZbdDc8J6XJEpDK4HCuRBm8a6Fzp9/DmhC9C7yFlog= +github.com/open-telemetry/opentelemetry-collector-contrib/internal/exp/metrics v0.124.1 h1:jOG1ceAx+IATloKXHsE2Cy88XTgqPB/hiXicOrxENx8= +github.com/open-telemetry/opentelemetry-collector-contrib/internal/exp/metrics v0.124.1/go.mod h1:mtNCoy09iO1f2zy5bEqkyRfRPaNKea57yK63cfHixts= +github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatatest v0.124.1 h1:G2daAIXiQhAwQSz9RK71QsBH9rmH/m/vdkFuGIEPfS4= +github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatatest v0.124.1/go.mod h1:/WAA1PKvHNz7E5SrtGg2KfAWl/PrmS0FVYOanoGxk0I= +github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatautil v0.124.1 h1:mMVzpkpy6rKL1Q/xXNogZVtWebIlxTRzhsgp3b9ioCM= +github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatautil v0.124.1/go.mod h1:jM8Gsd0fIiwRzWrzd7Gm6PZYi5AgHPRkz0625Rtqyxo= +github.com/open-telemetry/opentelemetry-collector-contrib/processor/deltatocumulativeprocessor v0.124.1 h1:gmmzhgewk2fU0Md0vmaDEFgfRycfCfjgPvMA4SEdKiU= +github.com/open-telemetry/opentelemetry-collector-contrib/processor/deltatocumulativeprocessor v0.124.1/go.mod h1:AsQJBuUUY1/yqK2c87hv4deeteaKwktwLIfQCN2OGk4= +github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8Oi/yOhh5U= +github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM= +github.com/opencontainers/image-spec v1.0.2 h1:9yCKha/T5XdGtO0q9Q9a6T5NUCsTn/DrBg0D7ufOcFM= +github.com/opencontainers/image-spec v1.0.2/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0= +github.com/otiai10/copy v1.14.0 h1:dCI/t1iTdYGtkvCuBG2BgR6KZa83PTclw4U5n2wAllU= +github.com/otiai10/copy v1.14.0/go.mod h1:ECfuL02W+/FkTWZWgQqXPWZgW9oeKCSQ5qVfSc4qc4w= +github.com/otiai10/mint v1.5.1 h1:XaPLeE+9vGbuyEHem1JNk3bYc7KKqyI/na0/mLd/Kks= +github.com/otiai10/mint v1.5.1/go.mod h1:MJm72SBthJjz8qhefc4z1PYEieWmy8Bku7CjcAqyUSM= +github.com/ovh/go-ovh v1.7.0 h1:V14nF7FwDjQrZt9g7jzcvAAQ3HN6DNShRFRMC3jLoPw= +github.com/ovh/go-ovh v1.7.0/go.mod h1:cTVDnl94z4tl8pP1uZ/8jlVxntjSIf09bNcQ5TJSC7c= +github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= +github.com/pascaldekloe/goe v0.1.0 h1:cBOtyMzM9HTpWjXfbbunk26uA6nG3a8n06Wieeh0MwY= +github.com/pascaldekloe/goe v0.1.0/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= +github.com/pborman/getopt v0.0.0-20170112200414-7148bc3a4c30/go.mod h1:85jBQOZwpVEaDAr341tbn15RS4fCAsIst0qp7i8ex1o= +github.com/pelletier/go-toml/v2 v2.2.3 h1:YmeHyLY8mFWbdkNWwpr+qIL2bEqT0o95WSdkNHvL12M= +github.com/pelletier/go-toml/v2 v2.2.3/go.mod h1:MfCQTFTvCcUyyvvwm1+G6H/jORL20Xlb6rzQu9GuUkc= +github.com/pkg/browser v0.0.0-20240102092130-5ac0b6a4141c h1:+mdjkGKdHQG3305AYmdv1U2eRNDiU2ErMBj1gwrq8eQ= +github.com/pkg/browser v0.0.0-20240102092130-5ac0b6a4141c/go.mod h1:7rwL4CYBLnjLxUqIJNnCWiEdr3bn6IUYi15bNlnbCCU= +github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e h1:aoZm08cpOy4WuID//EZDgcC4zIxODThtZNPirFr42+A= +github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA= +github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= +github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pkg/sftp v1.13.1/go.mod h1:3HaPG6Dq1ILlpPZRO0HVMrsydcdLt6HRDccSgb87qRg= +github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10 h1:GFCKgmp0tecUJ0sJuv4pzYCqS9+RGSn52M3FUwPs+uo= +github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10/go.mod h1:t/avpk3KcrXxUnYOhZhMXJlSEyie6gQbtLq5NM3loB8= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= +github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI= +github.com/posener/complete v1.2.3/go.mod h1:WZIdtGGp+qx0sLrYKtIRAruyNpv6hFCicSgv7Sy7s/s= +github.com/prashantv/gostub v1.1.0 h1:BTyx3RfQjRHnUWaGF9oQos79AlQ5k8WNktv7VGvVH4g= +github.com/prashantv/gostub v1.1.0/go.mod h1:A5zLQHz7ieHGG7is6LLXLz7I8+3LZzsrV0P1IAHhP5U= +github.com/prometheus/alertmanager v0.28.1 h1:BK5pCoAtaKg01BYRUJhEDV1tqJMEtYBGzPw8QdvnnvA= +github.com/prometheus/alertmanager v0.28.1/go.mod h1:0StpPUDDHi1VXeM7p2yYfeZgLVi/PPlt39vo9LQUHxM= +github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= +github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= +github.com/prometheus/client_golang v1.4.0/go.mod h1:e9GMxYsXl05ICDXkRhurwBS4Q3OK1iX/F2sw+iXX5zU= +github.com/prometheus/client_golang v1.22.0 h1:rb93p9lokFEsctTys46VnV1kLCDpVZ0a/Y92Vm0Zc6Q= +github.com/prometheus/client_golang v1.22.0/go.mod h1:R7ljNsLXhuQXYZYtw6GAE9AZg8Y7vEW5scdCXrWRXC0= +github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= +github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/prometheus/client_model v0.6.2 h1:oBsgwpGs7iVziMvrGhE53c/GrLUsZdHnqNwqPLxwZyk= +github.com/prometheus/client_model v0.6.2/go.mod h1:y3m2F6Gdpfy6Ut/GBsUqTWZqCUvMVzSfMLjcu6wAwpE= +github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= +github.com/prometheus/common v0.9.1/go.mod h1:yhUN8i9wzaXS3w1O07YhxHEBxD+W35wd8bs7vj7HSQ4= +github.com/prometheus/common v0.65.0 h1:QDwzd+G1twt//Kwj/Ww6E9FQq1iVMmODnILtW1t2VzE= +github.com/prometheus/common v0.65.0/go.mod h1:0gZns+BLRQ3V6NdaerOhMbwwRbNh9hkGINtQAsP5GS8= +github.com/prometheus/exporter-toolkit v0.14.0 h1:NMlswfibpcZZ+H0sZBiTjrA3/aBFHkNZqE+iCj5EmRg= +github.com/prometheus/exporter-toolkit v0.14.0/go.mod h1:Gu5LnVvt7Nr/oqTBUC23WILZepW0nffNo10XdhQcwWA= +github.com/prometheus/otlptranslator v0.0.0-20250320144820-d800c8b0eb07 h1:YaJ1JqyKGIUFIMUpMeT22yewZMXiTt5sLgWG1D/m4Yc= +github.com/prometheus/otlptranslator v0.0.0-20250320144820-d800c8b0eb07/go.mod h1:ZO/4EUanXL7wbvfMHcS+rq9sCBxICdaU8RBFkVg5wv0= +github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= +github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= +github.com/prometheus/procfs v0.0.8/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+GxbHq6oeK9A= +github.com/prometheus/procfs v0.15.1 h1:YagwOFzUgYfKKHX6Dr+sHT7km/hxC76UB0learggepc= +github.com/prometheus/procfs v0.15.1/go.mod h1:fB45yRUv8NstnjriLhBQLuOUt+WW4BsoGhij/e3PBqk= +github.com/prometheus/prometheus v0.304.2 h1:HhjbaAwet87x8Be19PFI/5W96UMubGy3zt24kayEuh4= +github.com/prometheus/prometheus v0.304.2/go.mod h1:ioGx2SGKTY+fLnJSQCdTHqARVldGNS8OlIe3kvp98so= +github.com/prometheus/sigv4 v0.1.2 h1:R7570f8AoM5YnTUPFm3mjZH5q2k4D+I/phCWvZ4PXG8= +github.com/prometheus/sigv4 v0.1.2/go.mod h1:GF9fwrvLgkQwDdQ5BXeV9XUSCH/IPNqzvAoaohfjqMU= +github.com/prymitive/current v0.1.1 h1:RNMYkRQV0M9H1ndtnvGIeUHG6P7vwRxoHn01KvHKuIs= +github.com/prymitive/current v0.1.1/go.mod h1:Zjs6a6tU1nIrtp5pefJXg2NKES2L/eqH3Lf05/wr5R4= +github.com/pterm/pterm v0.12.27/go.mod h1:PhQ89w4i95rhgE+xedAoqous6K9X+r6aSOI2eFF7DZI= +github.com/pterm/pterm v0.12.29/go.mod h1:WI3qxgvoQFFGKGjGnJR849gU0TsEOvKn5Q8LlY1U7lg= +github.com/pterm/pterm v0.12.30/go.mod h1:MOqLIyMOgmTDz9yorcYbcw+HsgoZo3BQfg2wtl3HEFE= +github.com/pterm/pterm v0.12.31/go.mod h1:32ZAWZVXD7ZfG0s8qqHXePte42kdz8ECtRyEejaWgXU= +github.com/pterm/pterm v0.12.33/go.mod h1:x+h2uL+n7CP/rel9+bImHD5lF3nM9vJj80k9ybiiTTE= +github.com/pterm/pterm v0.12.36/go.mod h1:NjiL09hFhT/vWjQHSj1athJpx6H8cjpHXNAK5bUw8T8= +github.com/pterm/pterm v0.12.40/go.mod h1:ffwPLwlbXxP+rxT0GsgDTzS3y3rmpAO1NMjUkGTYf8s= +github.com/pterm/pterm v0.12.76 h1:x1gbA2c7mJEd0PjJP3EYN04PR1DVrE3Z8sRDMP+qH6g= +github.com/pterm/pterm v0.12.76/go.mod h1:1v/gzOF1N0FsjbgTHZ1wVycRkKiatFvJSJC4IGaQAAo= +github.com/puzpuzpuz/xsync/v3 v3.5.1 h1:GJYJZwO6IdxN/IKbneznS6yPkVC+c3zyY/j19c++5Fg= +github.com/puzpuzpuz/xsync/v3 v3.5.1/go.mod h1:VjzYrABPabuM4KyBh1Ftq6u8nhwY5tBPKP9jpmh0nnA= +github.com/redis/go-redis/v9 v9.7.3 h1:YpPyAayJV+XErNsatSElgRZZVCwXX9QzkKYNvO7x0wM= +github.com/redis/go-redis/v9 v9.7.3/go.mod h1:bGUrSggJ9X9GUmZpZNEOQKaANxSGgOEBRltRTZHSvrA= +github.com/remeh/sizedwaitgroup v1.0.0 h1:VNGGFwNo/R5+MJBf6yrsr110p0m4/OX4S3DCy7Kyl5E= +github.com/remeh/sizedwaitgroup v1.0.0/go.mod h1:3j2R4OIe/SeS6YDhICBy22RWjJC5eNCJ1V+9+NVNYlo= +github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= +github.com/rivo/uniseg v0.4.7 h1:WUdvkW8uEhrYfLC4ZzdpI2ztxP1I582+49Oc5Mq64VQ= +github.com/rivo/uniseg v0.4.7/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= +github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= +github.com/rogpeppe/go-internal v1.14.1 h1:UQB4HGPB6osV0SQTLymcB4TgvyWu6ZyliaW0tI/otEQ= +github.com/rogpeppe/go-internal v1.14.1/go.mod h1:MaRKkUm5W0goXpeCfT7UZI6fk/L7L7so1lCWt35ZSgc= +github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= +github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= +github.com/scaleway/scaleway-sdk-go v1.0.0-beta.33 h1:KhF0WejiUTDbL5X55nXowP7zNopwpowa6qaMAWyIE+0= +github.com/scaleway/scaleway-sdk-go v1.0.0-beta.33/go.mod h1:792k1RTU+5JeMXm35/e2Wgp71qPH/DmDoZrRc+EFZDk= +github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529 h1:nn5Wsu0esKSJiIVhscUtVbo7ada43DJhG55ua/hjS5I= +github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= +github.com/sergi/go-diff v1.2.0/go.mod h1:STckp+ISIX8hZLjrqAeVduY0gWCT9IjLuqbuNXdaHfM= +github.com/sergi/go-diff v1.3.1 h1:xkr+Oxo4BOQKmkn/B9eMK0g5Kg/983T9DqqPHwYqD+8= +github.com/sergi/go-diff v1.3.1/go.mod h1:aMJSSKb2lpPvRNec0+w3fl7LP9IOFzdc9Pa4NFbPK1I= +github.com/shoenig/test v1.7.1 h1:UJcjSAI3aUKx52kfcfhblgyhZceouhvvs3OYdWgn+PY= +github.com/shoenig/test v1.7.1/go.mod h1:UxJ6u/x2v/TNs/LoLxBNJRV9DiwBBKYxXSyczsBHFoI= +github.com/shopspring/decimal v1.4.0 h1:bxl37RwXBklmTi0C79JfXCEBD1cqqHt0bbgBAGFp81k= +github.com/shopspring/decimal v1.4.0/go.mod h1:gawqmDU56v4yIKSwfBSFip1HdCCXN8/+DMd9qYNcwME= +github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= +github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= +github.com/sirupsen/logrus v1.9.0 h1:trlNQbNUG3OdDrDil03MCb1H2o9nJ1x4/5LYw7byDE0= +github.com/sirupsen/logrus v1.9.0/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= +github.com/smacker/go-tree-sitter v0.0.0-20240827094217-dd81d9e9be82 h1:6C8qej6f1bStuePVkLSFxoU22XBS165D3klxlzRg8F4= +github.com/smacker/go-tree-sitter v0.0.0-20240827094217-dd81d9e9be82/go.mod h1:xe4pgH49k4SsmkQq5OT8abwhWmnzkhpgnXeekbx2efw= +github.com/spf13/afero v1.10.0 h1:EaGW2JJh15aKOejeuJ+wpFSHnbd7GE6Wvp3TsNhb6LY= +github.com/spf13/afero v1.10.0/go.mod h1:UBogFpq8E9Hx+xc5CNTTEpTnuHVmXDwZcZcE1eb/UhQ= +github.com/spf13/cast v1.7.1 h1:cuNEagBQEHWN1FnbGEjCXL2szYEXqfJPbP2HNUaca9Y= +github.com/spf13/cast v1.7.1/go.mod h1:ancEpBxwJDODSW/UG4rDrAqiKolqNNh2DX3mk86cAdo= +github.com/spf13/cobra v1.8.0 h1:7aJaZx1B85qltLMc546zn58BxxfZdR/W22ej9CFoEf0= +github.com/spf13/cobra v1.8.0/go.mod h1:WXLWApfZ71AjXPya3WOlMsY9yMs7YeiHhFVlvLyhcho= +github.com/spf13/jwalterweatherman v1.1.0 h1:ue6voC5bR5F8YxI5S67j9i582FU4Qvo2bmqnqMYADFk= +github.com/spf13/jwalterweatherman v1.1.0/go.mod h1:aNWZUN0dPAAO/Ljvb5BEdw96iTZ0EXowPYD95IqWIGo= +github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= +github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= +github.com/spf13/viper v1.16.0 h1:rGGH0XDZhdUOryiDWjmIvUSWpbNqisK8Wk0Vyefw8hc= +github.com/spf13/viper v1.16.0/go.mod h1:yg78JgCJcbrQOvV9YLXgkLaZqUidkY9K+Dd1FofRzQg= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= +github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= +github.com/stretchr/objx v0.5.2 h1:xuMeJ0Sdp5ZMRXx/aWO6RZxdr3beISkG5/G/aIRr3pY= +github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA= +github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= +github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= +github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= +github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= +github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.7.2/go.mod h1:R6va5+xMeoiuVRoj+gSkQ7d3FALtqAAGI1FQKckRals= +github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= +github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= +github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= +github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= +github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/subosito/gotenv v1.4.2 h1:X1TuBLAMDFbaTAChgCBLu3DU3UPyELpnF2jjJ2cz/S8= +github.com/subosito/gotenv v1.4.2/go.mod h1:ayKnFf/c6rvx/2iiLrJUk1e6plDbT3edrFNGqEflhK0= +github.com/swaggest/assertjson v1.7.0 h1:SKw5Rn0LQs6UvmGrIdaKQbMR1R3ncXm5KNon+QJ7jtw= +github.com/swaggest/assertjson v1.7.0/go.mod h1:vxMJMehbSVJd+dDWFCKv3QRZKNTpy/ktZKTz9LOEDng= +github.com/tidwall/gjson v1.18.0 h1:FIDeeyB800efLX89e5a8Y0BNH+LOngJyGrIWxG2FKQY= +github.com/tidwall/gjson v1.18.0/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk= +github.com/tidwall/match v1.1.1 h1:+Ho715JplO36QYgwN9PGYNhgZvoUSc9X2c80KVTi+GA= +github.com/tidwall/match v1.1.1/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JTxsfmM= +github.com/tidwall/pretty v1.2.1 h1:qjsOFOWWQl+N3RsoF5/ssm1pHmJJwhjlSbZ51I6wMl4= +github.com/tidwall/pretty v1.2.1/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU= +github.com/tidwall/sjson v1.2.5 h1:kLy8mja+1c9jlljvWTlSazM7cKDRfJuR/bOJhcY5NcY= +github.com/tidwall/sjson v1.2.5/go.mod h1:Fvgq9kS/6ociJEDnK0Fk1cpYF4FIW6ZF7LAe+6jwd28= +github.com/tomwright/dasel/v2 v2.8.1 h1:mo5SlL0V2d3a0uPsD9Rrndn0cHWpbNDheB4+Fm++z8k= +github.com/tomwright/dasel/v2 v2.8.1/go.mod h1:6bNDNAnmGEtGpuIvksuQwiNcAgQ87pmzndynsqTNglc= +github.com/tv42/httpunix v0.0.0-20150427012821-b75d8614f926/go.mod h1:9ESjWnEqriFuLhtthL60Sar/7RFoluCcXsuvEwTV5KM= +github.com/urfave/cli/v3 v3.3.8 h1:BzolUExliMdet9NlJ/u4m5vHSotJ3PzEqSAZ1oPMa/E= +github.com/urfave/cli/v3 v3.3.8/go.mod h1:FJSKtM/9AiiTOJL4fJ6TbMUkxBXn7GO9guZqoZtpYpo= +github.com/vultr/govultr/v2 v2.17.2 h1:gej/rwr91Puc/tgh+j33p/BLR16UrIPnSr+AIwYWZQs= +github.com/vultr/govultr/v2 v2.17.2/go.mod h1:ZFOKGWmgjytfyjeyAdhQlSWwTjh2ig+X49cAp50dzXI= +github.com/x448/float16 v0.8.4 h1:qLwI1I70+NjRFUR3zs1JPUCgaCXSh3SW62uAKT1mSBM= +github.com/x448/float16 v0.8.4/go.mod h1:14CWIYCyZA/cWjXOioeEpHeN/83MdbZDRQHoFcYsOfg= +github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU= +github.com/xeipuuv/gojsonpointer v0.0.0-20190905194746-02993c407bfb h1:zGWFAtiMcyryUHoUjUJX0/lt1H2+i2Ka2n+D3DImSNo= +github.com/xeipuuv/gojsonpointer v0.0.0-20190905194746-02993c407bfb/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU= +github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415 h1:EzJWgHovont7NscjpAxXsDA8S8BMYve8Y5+7cuRE7R0= +github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415/go.mod h1:GwrjFmJcFw6At/Gs6z4yjiIwzuJ1/+UwLxMQDVQXShQ= +github.com/xeipuuv/gojsonschema v1.2.0 h1:LhYJRs+L4fBtjZUfuSZIKGeVu0QRy8e5Xi7D17UxZ74= +github.com/xeipuuv/gojsonschema v1.2.0/go.mod h1:anYRn/JVcOK2ZgGU+IjEV4nwlhoK5sQluxsYJ78Id3Y= +github.com/xhit/go-str2duration/v2 v2.1.0 h1:lxklc02Drh6ynqX+DdPyp5pCKLUQpRT8bp8Ydu2Bstc= +github.com/xhit/go-str2duration/v2 v2.1.0/go.mod h1:ohY8p+0f07DiV6Em5LKB0s2YpLtXVyJfNt1+BlmyAsU= +github.com/xo/terminfo v0.0.0-20210125001918-ca9a967f8778/go.mod h1:2MuV+tbUrU1zIOPMxZ5EncGwgmMJsa+9ucAQZXxsObs= +github.com/xo/terminfo v0.0.0-20220910002029-abceb7e1c41e h1:JVG44RsyaB9T2KIHavMF/ppJZNG9ZpyihvCd0w101no= +github.com/xo/terminfo v0.0.0-20220910002029-abceb7e1c41e/go.mod h1:RbqR21r5mrJuqunuUZ/Dhy/avygyECGrLceyNeo4LiM= +github.com/yudai/gojsondiff v1.0.0 h1:27cbfqXLVEJ1o8I6v3y9lg8Ydm53EKqHXAOMxEGlCOA= +github.com/yudai/gojsondiff v1.0.0/go.mod h1:AY32+k2cwILAkW1fbgxQ5mUmMiZFgLIV+FBNExI05xg= +github.com/yudai/golcs v0.0.0-20170316035057-ecda9a501e82 h1:BHyfKlQyqbsFN5p3IfnEUduWvb9is428/nNb5L3U01M= +github.com/yudai/golcs v0.0.0-20170316035057-ecda9a501e82/go.mod h1:lgjkn3NuSvDfVJdfcVVdX+jpBxNmX4rDAzaS45IcYoM= +github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= +github.com/yuin/goldmark v1.7.8 h1:iERMLn0/QJeHFhxSt3p6PeN9mGnvIKSpG9YYorDMnic= +github.com/yuin/goldmark v1.7.8/go.mod h1:uzxRWxtg69N339t3louHJ7+O03ezfj6PlliRlaOzY1E= +github.com/zclconf/go-cty v1.16.3 h1:osr++gw2T61A8KVYHoQiFbFd1Lh3JOCXc/jFLJXKTxk= +github.com/zclconf/go-cty v1.16.3/go.mod h1:VvMs5i0vgZdhYawQNq5kePSpLAoz8u1xvZgrPIxfnZE= +github.com/zclconf/go-cty-debug v0.0.0-20240509010212-0d6042c53940 h1:4r45xpDWB6ZMSMNJFMOjqrGHynW3DIBuR2H9j0ug+Mo= +github.com/zclconf/go-cty-debug v0.0.0-20240509010212-0d6042c53940/go.mod h1:CmBdvvj3nqzfzJ6nTCIwDTPZ56aVGvDrmztiO5g3qrM= +github.com/zeitlinger/conflate v0.0.0-20230622100834-279724abda8c h1:PtECnCzGLw8MuQ0tmPRaN5c95ZfNTFZOobvgC6A83zk= +github.com/zeitlinger/conflate v0.0.0-20230622100834-279724abda8c/go.mod h1:KsJBt1tGR0Q7u+3T7CLN+zITAI06GiXVi/cgP9Xrpb8= +gitlab.com/gitlab-org/api/client-go v0.137.0 h1:H26yL44qnb38Czl20pEINCJrcj63W6/BX8iKPVUKQP0= +gitlab.com/gitlab-org/api/client-go v0.137.0/go.mod h1:AcAYES3lfkIS4zhso04S/wyUaWQmDYve2Fd9AF7C6qc= +go.mongodb.org/mongo-driver v1.14.0 h1:P98w8egYRjYe3XDjxhYJagTokP/H6HzlsnojRgZRd80= +go.mongodb.org/mongo-driver v1.14.0/go.mod h1:Vzb0Mk/pa7e6cWw85R4F/endUC3u0U9jGcNU603k65c= +go.nhat.io/httpmock v0.11.0 h1:GSADjr4/sn1HXqnyluPr9PYpSmMh/h3ty0O7lEozD3c= +go.nhat.io/httpmock v0.11.0/go.mod h1:276uIJ0K7BYfC8EW2WUK4S9PyEjiR71Ex0+43b3eNtk= +go.nhat.io/matcher/v2 v2.0.0 h1:W+rbHi0hKuZHtOQH4U5g+KwyKyfVioIxrxjoGRcUETE= +go.nhat.io/matcher/v2 v2.0.0/go.mod h1:cL5oYp0M9A4L8jEGqjmUfy+k7AXVDddoVt6aYIL1r5g= +go.nhat.io/wait v0.1.0 h1:aQ4YDzaOgFbypiJ9c/eAfOIB1G25VOv7Gd2QS8uz1gw= +go.nhat.io/wait v0.1.0/go.mod h1:+ijMghc9/9zXi+HDcs49HNReprvXOZha2Q3jTOtqJrE= +go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= +go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= +go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= +go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= +go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= +go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk= +go.opencensus.io v0.24.0 h1:y73uSU6J157QMP2kn2r30vwW1A2W2WFwSCGnAVxeaD0= +go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo= +go.opentelemetry.io/auto/sdk v1.1.0 h1:cH53jehLUN6UFLY71z+NDOiNJqDdPRaXzTel0sJySYA= +go.opentelemetry.io/auto/sdk v1.1.0/go.mod h1:3wSPjt5PWp2RhlCcmmOial7AvC4DQqZb7a7wCow3W8A= +go.opentelemetry.io/collector/component v1.30.0 h1:HXjqBHaQ47/EEuWdnkjr4Y3kRWvmyWIDvqa1Q262Fls= +go.opentelemetry.io/collector/component v1.30.0/go.mod h1:vfM9kN+BM6oHBXWibquiprz8CVawxd4/aYy3nbhme3E= +go.opentelemetry.io/collector/component/componentstatus v0.124.0 h1:0WHaANNktxLIk+lN+CtgPBESI1MJBrfVW/LvNCbnMQ4= +go.opentelemetry.io/collector/component/componentstatus v0.124.0/go.mod h1:a/wa8nxJGWOGuLwCN8gHCzFHCaUVZ+VyUYuKz9Yaq38= +go.opentelemetry.io/collector/component/componenttest v0.124.0 h1:Wsc+DmDrWTFs/aEyjDA3slNwV+h/0NOyIR5Aywvr6Zw= +go.opentelemetry.io/collector/component/componenttest v0.124.0/go.mod h1:NQ4ATOzMFc7QA06B993tq8o27DR0cu/JR/zK7slGJ3E= +go.opentelemetry.io/collector/confmap v1.30.0 h1:Y0MXhjQCdMyJN9xZMWWdNPWs6ncMVf7YVnyAEN2dAcM= +go.opentelemetry.io/collector/confmap v1.30.0/go.mod h1:9DdThVDIC3VsdtTb7DgT+HwusWOocoqDkd/TErEtQgA= +go.opentelemetry.io/collector/confmap/xconfmap v0.124.0 h1:PK+CaSgjLvzHaafBieJ3AjiUTAPuf40C+/Fn38LvmW8= +go.opentelemetry.io/collector/confmap/xconfmap v0.124.0/go.mod h1:DZmFSgWiqXQrzld9uU+73YAVI5JRIgd8RkK5HcaXGU0= +go.opentelemetry.io/collector/consumer v1.30.0 h1:Nn6kFTH+EJbv13E0W+sNvWrTgbiFCRv8f6DaA2F1DQs= +go.opentelemetry.io/collector/consumer v1.30.0/go.mod h1:edRyfk61ugdhCQ93PBLRZfYMVWjdMPpKP8z5QLyESf0= +go.opentelemetry.io/collector/consumer/consumertest v0.124.0 h1:2arChG4RPrHW3lfVWlK/KDF7Y7qkUm/YAiBXh8oTue0= +go.opentelemetry.io/collector/consumer/consumertest v0.124.0/go.mod h1:Hlu+EXbINHxVAyIT1baKO2d0j5odR3fLlLAiaP+JqQg= +go.opentelemetry.io/collector/consumer/xconsumer v0.124.0 h1:/cut96EWVNoz6lIeGI9+EzS6UClMtnZkx5YIpkD0Xe0= +go.opentelemetry.io/collector/consumer/xconsumer v0.124.0/go.mod h1:fHH/MpzFCRNk/4foiYE6BoXQCAMf5sJTO35uvzVrrd4= +go.opentelemetry.io/collector/featuregate v1.30.0 h1:mx7+iP/FQnY7KO8qw/xE3Qd1MQkWcU8VgcqLNrJ8EU8= +go.opentelemetry.io/collector/featuregate v1.30.0/go.mod h1:Y/KsHbvREENKvvN9RlpiWk/IGBK+CATBYzIIpU7nccc= +go.opentelemetry.io/collector/internal/telemetry v0.124.0 h1:kzd1/ZYhLj4bt2pDB529mL4rIRrRacemXodFNxfhdWk= +go.opentelemetry.io/collector/internal/telemetry v0.124.0/go.mod h1:ZjXjqV0dJ+6D4XGhTOxg/WHjnhdmXsmwmUSgALea66Y= +go.opentelemetry.io/collector/pdata v1.30.0 h1:j3jyq9um436r6WzWySzexP2nLnFdmL5uVBYAlyr9nDM= +go.opentelemetry.io/collector/pdata v1.30.0/go.mod h1:0Bxu1ktuj4wE7PIASNSvd0SdBscQ1PLtYasymJ13/Cs= +go.opentelemetry.io/collector/pdata/pprofile v0.124.0 h1:ZjL9wKqzP4BHj0/F1jfGxs1Va8B7xmYayipZeNVoWJE= +go.opentelemetry.io/collector/pdata/pprofile v0.124.0/go.mod h1:1EN3Gw5LSI4fSVma/Yfv/6nqeuYgRTm1/kmG5nE5Oyo= +go.opentelemetry.io/collector/pdata/testdata v0.124.0 h1:vY+pWG7CQfzzGSB5+zGYHQOltRQr59Ek9QiPe+rI+NY= +go.opentelemetry.io/collector/pdata/testdata v0.124.0/go.mod h1:lNH48lGhGv4CYk27fJecpsR1zYHmZjKgNrAprwjym0o= +go.opentelemetry.io/collector/pipeline v0.124.0 h1:hKvhDyH2GPnNO8LGL34ugf36sY7EOXPjBvlrvBhsOdw= +go.opentelemetry.io/collector/pipeline v0.124.0/go.mod h1:TO02zju/K6E+oFIOdi372Wk0MXd+Szy72zcTsFQwXl4= +go.opentelemetry.io/collector/processor v1.30.0 h1:dxmu+sO6MzQydyrf2CON5Hm1KU7yV4ofH1stmreUtPk= +go.opentelemetry.io/collector/processor v1.30.0/go.mod h1:DjXAgelT8rfIWCTJP5kiPpxPqz4JLE1mJwsE2kJMTk8= +go.opentelemetry.io/collector/processor/processortest v0.124.0 h1:qcyo0dSWmgpNFxjObsKk3Rd/wWV8CkMevd+jApkTQWE= +go.opentelemetry.io/collector/processor/processortest v0.124.0/go.mod h1:1YDTxd4c/uVU3Ui1+AzvYW94mo5DbhNmB1xSof6zvD0= +go.opentelemetry.io/collector/processor/xprocessor v0.124.0 h1:KAe8gIje8TcB8varZ4PDy0HV5xX5rNdaQ7q46BE915w= +go.opentelemetry.io/collector/processor/xprocessor v0.124.0/go.mod h1:ItJBBlR6/141vg1v4iRrcsBrGjPCgmXAztxS2x2YkdI= +go.opentelemetry.io/collector/semconv v0.124.0 h1:YTdo3UFwNyDQCh9DiSm2rbzAgBuwn/9dNZ0rv454goA= +go.opentelemetry.io/collector/semconv v0.124.0/go.mod h1:te6VQ4zZJO5Lp8dM2XIhDxDiL45mwX0YAQQWRQ0Qr9U= +go.opentelemetry.io/contrib/bridges/otelzap v0.10.0 h1:ojdSRDvjrnm30beHOmwsSvLpoRF40MlwNCA+Oo93kXU= +go.opentelemetry.io/contrib/bridges/otelzap v0.10.0/go.mod h1:oTTm4g7NEtHSV2i/0FeVdPaPgUIZPfQkFbq0vbzqnv0= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.60.0 h1:x7wzEgXfnzJcHDwStJT+mxOz4etr2EcexjqhBvmoakw= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.60.0/go.mod h1:rg+RlpR5dKwaS95IyyZqj5Wd4E13lk/msnTS0Xl9lJM= +go.opentelemetry.io/contrib/instrumentation/net/http/httptrace/otelhttptrace v0.60.0 h1:0tY123n7CdWMem7MOVdKOt0YfshufLCwfE5Bob+hQuM= +go.opentelemetry.io/contrib/instrumentation/net/http/httptrace/otelhttptrace v0.60.0/go.mod h1:CosX/aS4eHnG9D7nESYpV753l4j9q5j3SL/PUYd2lR8= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.60.0 h1:sbiXRNDSWJOTobXh5HyQKjq6wUC5tNybqjIqDpAY4CU= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.60.0/go.mod h1:69uWxva0WgAA/4bu2Yy70SLDBwZXuQ6PbBpbsa5iZrQ= +go.opentelemetry.io/otel v1.35.0 h1:xKWKPxrxB6OtMCbmMY021CqC45J+3Onta9MqjhnusiQ= +go.opentelemetry.io/otel v1.35.0/go.mod h1:UEqy8Zp11hpkUrL73gSlELM0DupHoiq72dR+Zqel/+Y= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.35.0 h1:1fTNlAIJZGWLP5FVu0fikVry1IsiUnXjf7QFvoNN3Xw= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.35.0/go.mod h1:zjPK58DtkqQFn+YUMbx0M2XV3QgKU0gS9LeGohREyK4= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.35.0 h1:xJ2qHD0C1BeYVTLLR9sX12+Qb95kfeD/byKj6Ky1pXg= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.35.0/go.mod h1:u5BF1xyjstDowA1R5QAO9JHzqK+ublenEW/dyqTjBVk= +go.opentelemetry.io/otel/log v0.11.0 h1:c24Hrlk5WJ8JWcwbQxdBqxZdOK7PcP/LFtOtwpDTe3Y= +go.opentelemetry.io/otel/log v0.11.0/go.mod h1:U/sxQ83FPmT29trrifhQg+Zj2lo1/IPN1PF6RTFqdwc= +go.opentelemetry.io/otel/metric v1.35.0 h1:0znxYu2SNyuMSQT4Y9WDWej0VpcsxkuklLa4/siN90M= +go.opentelemetry.io/otel/metric v1.35.0/go.mod h1:nKVFgxBZ2fReX6IlyW28MgZojkoAkJGaE8CpgeAU3oE= +go.opentelemetry.io/otel/sdk v1.35.0 h1:iPctf8iprVySXSKJffSS79eOjl9pvxV9ZqOWT0QejKY= +go.opentelemetry.io/otel/sdk v1.35.0/go.mod h1:+ga1bZliga3DxJ3CQGg3updiaAJoNECOgJREo9KHGQg= +go.opentelemetry.io/otel/sdk/metric v1.35.0 h1:1RriWBmCKgkeHEhM7a2uMjMUfP7MsOF5JpUCaEqEI9o= +go.opentelemetry.io/otel/sdk/metric v1.35.0/go.mod h1:is6XYCUMpcKi+ZsOvfluY5YstFnhW0BidkR+gL+qN+w= +go.opentelemetry.io/otel/trace v1.35.0 h1:dPpEfJu1sDIqruz7BHFG3c7528f6ddfSWfFDVt/xgMs= +go.opentelemetry.io/otel/trace v1.35.0/go.mod h1:WUk7DtFp1Aw2MkvqGdwiXYDZZNvA/1J8o6xRXLrIkyc= +go.opentelemetry.io/proto/otlp v1.5.0 h1:xJvq7gMzB31/d406fB8U5CBdyQGw4P399D1aQWU/3i4= +go.opentelemetry.io/proto/otlp v1.5.0/go.mod h1:keN8WnHxOy8PG0rQZjJJ5A2ebUoafqWp0eVQ4yIXvJ4= +go.uber.org/atomic v1.11.0 h1:ZvwS0R+56ePWxUNi+Atn9dWONBPp/AUETXlHW0DxSjE= +go.uber.org/atomic v1.11.0/go.mod h1:LUxbIzbOniOlMKjJjyPfpl4v+PKK2cNJn91OQbhoJI0= +go.uber.org/automaxprocs v1.6.0 h1:O3y2/QNTOdbF+e/dpXNNW7Rx2hZ4sTIPyybbxyNqTUs= +go.uber.org/automaxprocs v1.6.0/go.mod h1:ifeIMSnPZuznNm6jmdzmU3/bfk01Fe2fotchwEFJ8r8= +go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= +go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= +go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= +go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= +go.uber.org/ratelimit v0.3.1 h1:K4qVE+byfv/B3tC+4nYWP7v/6SimcO7HzHekoMNBma0= +go.uber.org/ratelimit v0.3.1/go.mod h1:6euWsTB6U/Nb3X++xEUXA8ciPJvr19Q/0h1+oDcJhRk= +go.uber.org/zap v1.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8= +go.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E= +golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20190923035154-9ee001bba392/go.mod h1:/lpIB1dKB+9EgE3H3cr1v9wB50oz8l4C4h62xy7jSTY= +golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= +golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +golang.org/x/crypto v0.0.0-20220722155217-630584e8d5aa/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= +golang.org/x/crypto v0.38.0 h1:jt+WWG8IZlBnVbomuhg2Mdq0+BBQaHbtqHEFEigjUV8= +golang.org/x/crypto v0.38.0/go.mod h1:MvrbAqul58NNYPKnOra203SB9vpuZW0e+RRZV+Ggqjw= +golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= +golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek= +golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY= +golang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= +golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= +golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= +golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= +golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= +golang.org/x/exp v0.0.0-20250106191152-7588d65b2ba8 h1:yqrTHse8TCMW1M1ZCP+VAR/l0kKxwaAIqN/il7x4voA= +golang.org/x/exp v0.0.0-20250106191152-7588d65b2ba8/go.mod h1:tujkw807nyEEAamNbDrEGzRav+ilXA7PCRAd6xsmwiU= +golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= +golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= +golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= +golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= +golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= +golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs= +golang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= +golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= +golang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= +golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= +golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= +golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= +golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY= +golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= +golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= +golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= +golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= +golang.org/x/mod v0.24.0 h1:ZfthKaKaT4NrhGVZHO1/WDTwGES4De8KtWO0SIbNJMU= +golang.org/x/mod v0.24.0/go.mod h1:IXM97Txy2VM4PJ3gI61r1YEk/gAj6zAHN3AdZt6S9Ww= +golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= +golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190923162816-aa69164e4478/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200222125558-5a598a2470a0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200501053045-e0ff5e5a1de5/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200506145744-7e3656a0809f/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200513185701-a91f0712d120/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20201031054903-ff519b6c9102/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20201209123823-ac852fbbde11/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20201224014010-6772e930b67b/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20210410081132-afb366fc7cd1/go.mod h1:9tjilg8BloeKEkVJvy7fQ90B1CfIiPueXVOjqfkSzI8= +golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= +golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= +golang.org/x/net v0.40.0 h1:79Xs7wF06Gbdcg4kdCCIQArK11Z1hr5POQ6+fIYHNuY= +golang.org/x/net v0.40.0/go.mod h1:y0hY0exeL2Pku80/zKK7tpntoX23cqL3Oa6njdgRtds= +golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= +golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.0.0-20200902213428-5d25da1a8d43/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20201109201403-9fd604954f58/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20201208152858-08078c50e5b5/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210218202405-ba52d332ba99/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.30.0 h1:dnDm7JmhM45NNpd8FDDeLhK6FwqbOf4MLCM9zb1BOHI= +golang.org/x/oauth2 v0.30.0/go.mod h1:B++QgG3ZKulg6sRPGD/mqlHQs5rB3Ml9erfeDY7xKlU= +golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.14.0 h1:woo0S4Yywslg6hp4eUFjTVOyKt0RookbpAHG4c1HmhQ= +golang.org/x/sync v0.14.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA= +golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190922100055-0a153f010e69/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190924154521-2837fb4f24fe/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200331124033-c3d80250170d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200501052902-10377860bb8e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200511232937-7e40ca221e25/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200905004654-be1d3432aa8f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201201145000-ef89a241ccb3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210104204734-6f8348627aad/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210225134936-a50acf3fe073/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210303074136-134d130e1a04/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210423185535-09eb48e85fd7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210616094352-59db8d763f22/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211013075003-97ac67df715c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220319134239-a9b59b0215f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220503163025-988cb79eb6c6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220728004956-3c1f35247d10/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.33.0 h1:q3i8TbbEz+JRD9ywIRlyRAQbM0qF7hu24q3teo2hbuw= +golang.org/x/sys v0.33.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k= +golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= +golang.org/x/term v0.0.0-20210220032956-6a3ed077a48d/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= +golang.org/x/term v0.0.0-20210615171337-6886f2dfbf5b/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= +golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= +golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= +golang.org/x/term v0.32.0 h1:DR4lr0TjUs3epypdhTOkMmuF5CDFJ/8pOnbzMZPQ7bg= +golang.org/x/term v0.32.0/go.mod h1:uZG1FhGx848Sqfsq4/DlJr3xGGsYMu/L5GW4abiaEPQ= +golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= +golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= +golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= +golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= +golang.org/x/text v0.25.0 h1:qVyWApTSYLk/drJRO5mDlNYskwQznZmkpV2c8q9zls4= +golang.org/x/text v0.25.0/go.mod h1:WEdwpYrmk1qmdHvhkSTNPm3app7v4rsT8F2UD6+VHIA= +golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.12.0 h1:ScB/8o8olJvc+CQPWrK3fPZNfh7qgwCrY0zJmoEQLSE= +golang.org/x/time v0.12.0/go.mod h1:CDIdPxbZBQxdj6cxyCIdrNogrJKMJ7pr37NYpMcMDSg= +golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= +golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20190907020128-2ca718005c18/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191216173652-a0e659d51361/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200117161641-43d50277825c/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200122220014-bf1340f18c4a/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200204074204-1cc6d1ef6c74/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200207183749-b753a1ba74fa/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200212150539-ea181f53ac56/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200224181240-023911ca70b2/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200227222343-706bc42d1f0d/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200304193943-95d2e580d8eb/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= +golang.org/x/tools v0.0.0-20200312045724-11d5b4c81c7d/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= +golang.org/x/tools v0.0.0-20200331025713-a30bf2db82d4/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8= +golang.org/x/tools v0.0.0-20200501065659-ab2804fb9c9d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200512131952-2bc93b1c0c88/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200515010526-7d3b6ebf133d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200618134242-20370b0cb4b2/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= +golang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= +golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= +golang.org/x/tools v0.0.0-20200904185747-39188db58858/go.mod h1:Cj7w3i3Rnn0Xh82ur9kSqwfTHTeVxaDqrfMjpcNT6bE= +golang.org/x/tools v0.0.0-20201110124207-079ba7bd75cd/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20201201161351-ac6f37ff4c2a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20201208233053-a543418bbed2/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20210105154028-b0ab187a4818/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20210108195828-e2f9c7f1fc8e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= +golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= +golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= +golang.org/x/tools v0.32.0 h1:Q7N1vhpkQv7ybVzLFtTjvQya2ewbwNDZzUgfXGqtMWU= +golang.org/x/tools v0.32.0/go.mod h1:ZxrU41P/wAbZD8EDa6dDCa6XfpkhJ7HFMjHJXfBDu8s= +golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= +google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= +google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= +google.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= +google.golang.org/api v0.13.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= +google.golang.org/api v0.14.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= +google.golang.org/api v0.15.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= +google.golang.org/api v0.17.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.18.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.19.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.20.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.22.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.24.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= +google.golang.org/api v0.28.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= +google.golang.org/api v0.29.0/go.mod h1:Lcubydp8VUV7KeIHD9z2Bys/sm/vGKnG1UHuDBSrHWM= +google.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz5138Fc= +google.golang.org/api v0.35.0/go.mod h1:/XrVsuzM0rZmrsbjJutiuftIzeuTQcEeaYcSk/mQ1dg= +google.golang.org/api v0.36.0/go.mod h1:+z5ficQTmoYpPn8LCUNVpK5I7hwkpjbcgqA7I34qYtE= +google.golang.org/api v0.40.0/go.mod h1:fYKFpnQN0DsDSKRVRcQSDQNtqWPfM9i+zNPxepjRCQ8= +google.golang.org/api v0.230.0 h1:2u1hni3E+UXAXrONrrkfWpi/V6cyKVAbfGVeGtC3OxM= +google.golang.org/api v0.230.0/go.mod h1:aqvtoMk7YkiXx+6U12arQFExiRV9D/ekvMCwCd/TksQ= +google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= +google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= +google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= +google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= +google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= +google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= +google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= +google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= +google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= +google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= +google.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8= +google.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20191115194625-c23dd37a84c9/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20191216164720-4f79533eabd1/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20191230161307-f3c370f40bfb/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20200115191322-ca5a22157cba/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20200122232147-0452cf42e150/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20200204135345-fa8e72b47b90/go.mod h1:GmwEX6Z4W5gMy59cAlVYjN9JhxgbQH6Gn+gFDQe2lzA= +google.golang.org/genproto v0.0.0-20200212174721-66ed5ce911ce/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200224152610-e50cd9704f63/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200228133532-8c2c7df3a383/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200305110556-506484158171/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200312145019-da6875a35672/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200331122359-1ee6d9798940/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200430143042-b979b6f78d84/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200511104702-f5ebc3bea380/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200515170657-fc4c6c6a6587/go.mod h1:YsZOwe1myG/8QRHRsmBRE1LrgQY60beZKjly0O1fX9U= +google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= +google.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA= +google.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20200904004341-0bd0a958aa1d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20201109203340-2640f1f9cdfb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20201201144952-b05cb90ed32e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20201210142538-e3217bee35cc/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20201214200347-8c77b98c765d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210108203827-ffc7fda8c3d7/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210226172003-ab064af71705/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20240903143218-8af14fe29dc1 h1:BulPr26Jqjnd4eYDVe+YvyR7Yc2vJGkO5/0UxD0/jZU= +google.golang.org/genproto v0.0.0-20240903143218-8af14fe29dc1/go.mod h1:hL97c3SYopEHblzpxRL4lSs523++l8DYxGM1FQiYmb4= +google.golang.org/genproto/googleapis/api v0.0.0-20250303144028-a0af3efb3deb h1:p31xT4yrYrSM/G4Sn2+TNUkVhFCbG9y8itM2S6Th950= +google.golang.org/genproto/googleapis/api v0.0.0-20250303144028-a0af3efb3deb/go.mod h1:jbe3Bkdp+Dh2IrslsFCklNhweNTBgSYanP1UXhJDhKg= +google.golang.org/genproto/googleapis/rpc v0.0.0-20250414145226-207652e42e2e h1:ztQaXfzEXTmCBvbtWYRhJxW+0iJcz2qXfd38/e9l7bA= +google.golang.org/genproto/googleapis/rpc v0.0.0-20250414145226-207652e42e2e/go.mod h1:qQ0YXyHHx3XkvlzUtpXDkS29lDSafHMZBAZDc03LQ3A= +google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= +google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= +google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= +google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= +google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= +google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= +google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= +google.golang.org/grpc v1.27.1/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= +google.golang.org/grpc v1.28.0/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKal+60= +google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk= +google.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= +google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= +google.golang.org/grpc v1.31.1/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= +google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc= +google.golang.org/grpc v1.34.0/go.mod h1:WotjhfgOW/POjDeRt8vscBtXq+2VjORFy659qA51WJ8= +google.golang.org/grpc v1.35.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= +google.golang.org/grpc v1.72.0 h1:S7UkcVa60b5AAQTaO6ZKamFp1zMZSU0fGDK2WZLbBnM= +google.golang.org/grpc v1.72.0/go.mod h1:wH5Aktxcg25y1I3w7H69nHfXdOG3UiadoBtjh3izSDM= +google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= +google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= +google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= +google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= +google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= +google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4= +google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= +google.golang.org/protobuf v1.36.6 h1:z1NpPI8ku2WgiWnf+t9wTPsn6eP1L7ksHUlkfLvd9xY= +google.golang.org/protobuf v1.36.6/go.mod h1:jduwjTPXsFjZGTmRluh+L6NjiWu7pchiJ2/5YcXBHnY= +gopkg.in/alecthomas/kingpin.v2 v2.2.6 h1:jMFz6MfLP0/4fUyZle81rXUoxOBFi19VUFKVDOQfozc= +gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= +gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= +gopkg.in/evanphx/json-patch.v4 v4.12.0 h1:n6jtcsulIzXPJaxegRbvFNNrZDjbij7ny3gmSPG+6V4= +gopkg.in/evanphx/json-patch.v4 v4.12.0/go.mod h1:p8EYWUEYMpynmqDbY58zCKCFZw8pRWMG4EsWvDvM72M= +gopkg.in/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc= +gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= +gopkg.in/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA= +gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= +gopkg.in/neurosnap/sentences.v1 v1.0.7 h1:gpTUYnqthem4+o8kyTLiYIB05W+IvdQFYR29erfe8uU= +gopkg.in/neurosnap/sentences.v1 v1.0.7/go.mod h1:YlK+SN+fLQZj+kY3r8DkGDhDr91+S3JmTb5LSxFRQo0= +gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= +gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gotest.tools/v3 v3.0.3 h1:4AuOwCGf4lLR9u3YOe2awrHygurzhO/HeQ6laiA6Sx0= +gotest.tools/v3 v3.0.3/go.mod h1:Z7Lb0S5l+klDB31fvDQX8ss/FlKDxtlFlw3Oa8Ymbl8= +honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= +honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= +honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= +k8s.io/api v0.32.3 h1:Hw7KqxRusq+6QSplE3NYG4MBxZw1BZnq4aP4cJVINls= +k8s.io/api v0.32.3/go.mod h1:2wEDTXADtm/HA7CCMD8D8bK4yuBUptzaRhYcYEEYA3k= +k8s.io/apimachinery v0.32.3 h1:JmDuDarhDmA/Li7j3aPrwhpNBA94Nvk5zLeOge9HH1U= +k8s.io/apimachinery v0.32.3/go.mod h1:GpHVgxoKlTxClKcteaeuF1Ul/lDVb74KpZcxcmLDElE= +k8s.io/client-go v0.32.3 h1:RKPVltzopkSgHS7aS98QdscAgtgah/+zmpAogooIqVU= +k8s.io/client-go v0.32.3/go.mod h1:3v0+3k4IcT9bXTc4V2rt+d2ZPPG700Xy6Oi0Gdl2PaY= +k8s.io/klog/v2 v2.130.1 h1:n9Xl7H1Xvksem4KFG4PYbdQCQxqc/tTUyrgXaOhHSzk= +k8s.io/klog/v2 v2.130.1/go.mod h1:3Jpz1GvMt720eyJH1ckRHK1EDfpxISzJ7I9OYgaDtPE= +k8s.io/kube-openapi v0.0.0-20241105132330-32ad38e42d3f h1:GA7//TjRY9yWGy1poLzYYJJ4JRdzg3+O6e8I+e+8T5Y= +k8s.io/kube-openapi v0.0.0-20241105132330-32ad38e42d3f/go.mod h1:R/HEjbvWI0qdfb8viZUeVZm0X6IZnxAydC7YU42CMw4= +k8s.io/utils v0.0.0-20241104100929-3ea5e8cea738 h1:M3sRQVHv7vB20Xc2ybTt7ODCeFj6JSWYFzOFnYeS6Ro= +k8s.io/utils v0.0.0-20241104100929-3ea5e8cea738/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0= +rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= +rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= +rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= +sigs.k8s.io/json v0.0.0-20241010143419-9aa6b5e7a4b3 h1:/Rv+M11QRah1itp8VhT6HoVx1Ray9eB4DBr+K+/sCJ8= +sigs.k8s.io/json v0.0.0-20241010143419-9aa6b5e7a4b3/go.mod h1:18nIHnGi6636UCz6m8i4DhaJ65T6EruyzmoQqI2BVDo= +sigs.k8s.io/structured-merge-diff/v4 v4.4.2 h1:MdmvkGuXi/8io6ixD5wud3vOLwc1rj0aNqRlpuvjmwA= +sigs.k8s.io/structured-merge-diff/v4 v4.4.2/go.mod h1:N8f93tFZh9U6vpxwRArLiikrE5/2tiu1w1AGfACIGE4= +sigs.k8s.io/yaml v1.4.0 h1:Mk1wCc2gy/F0THH0TAp1QYyJNzRm2KCLy3o5ASXVI5E= +sigs.k8s.io/yaml v1.4.0/go.mod h1:Ejl7/uTz7PSA4eKMyQCUTnhZYNmLIl+5c2lQPGR2BPY= diff --git a/celery-mixin/scripts/tools.go b/celery-mixin/scripts/tools.go new file mode 100644 index 0000000..3a39db7 --- /dev/null +++ b/celery-mixin/scripts/tools.go @@ -0,0 +1,18 @@ +//go:build tools +// +build tools + +// Packae tols tracks dependencies for tools that used in the build process. +// See https://github.com/golang/go/issues/25922 +package tools + +import ( + _ "github.com/Kunde21/markdownfmt/v3/cmd/markdownfmt" + _ "github.com/cloudflare/pint/cmd/pint" + _ "github.com/errata-ai/vale/v3/cmd/vale" + _ "github.com/google/go-jsonnet/cmd/jsonnet" + _ "github.com/google/go-jsonnet/cmd/jsonnet-lint" + _ "github.com/google/go-jsonnet/cmd/jsonnetfmt" + _ "github.com/grafana/dashboard-linter" + _ "github.com/jsonnet-bundler/jsonnet-bundler/cmd/jb" + _ "github.com/prometheus/prometheus/cmd/promtool" +) diff --git a/celery-mixin/tests.yaml b/celery-mixin/tests/tests.yaml similarity index 98% rename from celery-mixin/tests.yaml rename to celery-mixin/tests/tests.yaml index a3e1a56..3775220 100644 --- a/celery-mixin/tests.yaml +++ b/celery-mixin/tests/tests.yaml @@ -1,7 +1,7 @@ # yamllint disable rule:line-length --- rule_files: - - prometheus-alerts.yaml + - ../prometheus_alerts.yaml tests: - interval: 5m