diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index f731115a9978..b3c2c598de6b 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -5,7 +5,7 @@ jobs: name: Test strategy: matrix: - platform: [macos-latest, windows-latest] + platform: [macos-latest, windows-2019] runs-on: ${{ matrix.platform }} steps: - name: Set up Go 1.17 diff --git a/CHANGELOG.md b/CHANGELOG.md index e6fa14ec6d67..94decc3e416b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,10 +9,14 @@ - [ENHANCEMENT] Upgrade to loki v2.4.2. The following metrics will now be prefixed with `agent_dskit_` instead of `cortex_`: `cortex_kv_request_duration_seconds`, `cortex_member_consul_heartbeats_total`, `cortex_member_ring_tokens_owned`, `cortex_member_ring_tokens_to_own`, `cortex_ring_member_ownership_percent`, `cortex_ring_members`, `cortex_ring_oldest_member_timestamp`, `cortex_ring_tokens_owned`, `cortex_ring_tokens_total`. (@rlankfo) +- [ENHANCEMENT] Introduce EXPERIMENTAL support for dynamic configuration. (@mattdurham) + - [FEATURE] Added config read API support to GrafanaAgent Custom Resource Definition. - [FEATURE] Added consulagent_sd to target discovery. (@chuckyz) +- [BUGFIX] Ensure singleton integrations are honored in v2 integrations (@mattdurham) + # v0.23.0 (2022-01-13) - [ENHANCEMENT] Go 1.17 is now used for all builds of the Agent. (@tpaschalis) diff --git a/cmd/agentctl/main.go b/cmd/agentctl/main.go index 91dab12ded5c..a19eb9b70b35 100644 --- a/cmd/agentctl/main.go +++ b/cmd/agentctl/main.go @@ -10,6 +10,8 @@ import ( "strings" "time" + "gopkg.in/yaml.v2" + // Adds version information _ "github.com/grafana/agent/pkg/build" "github.com/grafana/agent/pkg/client/grafanacloud" @@ -60,6 +62,7 @@ func main() { samplesCmd(), operatorDetachCmd(), cloudConfigCmd(), + templateDryRunCmd(), ) _ = cmd.Execute() @@ -474,6 +477,40 @@ config that may be used with this agent.`, return cmd } +func templateDryRunCmd() *cobra.Command { + cmd := &cobra.Command{ + Use: "template-parse [directory]", + Short: "dry run dynamic configuration", + Long: `This will load the dynamic configuration, load configs, run templates and then output the full config as yaml`, + Args: cobra.ExactArgs(1), + + RunE: func(_ *cobra.Command, args []string) error { + cmf, err := config.NewDynamicLoader() + if err != nil { + return err + } + c := &config.Config{} + err = cmf.LoadConfigByPath(args[0]) + if err != nil { + return err + } + err = cmf.ProcessConfigs(c) + if err != nil { + return fmt.Errorf("error processing config templates %s", err) + } + + outBytes, err := yaml.Marshal(c) + if err != nil { + return err + } + fmt.Println(string(outBytes)) + return nil + }, + } + + return cmd +} + func must(err error) { if err != nil { panic(err) diff --git a/docs/user/configuration/dynamic-config.md b/docs/user/configuration/dynamic-config.md new file mode 100644 index 000000000000..9b01fbb4e7bf --- /dev/null +++ b/docs/user/configuration/dynamic-config.md @@ -0,0 +1,127 @@ +# Dynamic Configuration - Experimental + +**This is experimental and subject to change at anytime, feedback is much appreciated. This is a feature that MAY NOT make it production.** + +Dynamic Configuration is the combination of two things: + +* Loading from multiple files +* Using templates and datasources + +Both of these make heavy use of the excellent [gomplate](https://github.com/hairyhenderson/gomplate). The goal is +that as the configuration grows that it can be split it up into smaller segments to allow better readability and handling. +The configurations cannot be patched in any order and instead are allowed at several levels. + +The second goal is to allow the use of templating, functions for [gomplate doc](https://docs.gomplate.ca/) go into detail +on what functions are available. + +## Configuration + +Location of the dynamic configuration is used via the feature flag `dynamic-config`, then it will use `-config.dynamic-config-path` to +load the configuration for dynamic configuration. + +```yaml +# Sources to pull template values +datasources: + [- ] + +# Locations to use searching for templates, the system does NOT look into subdirectories. Follows gomplate schema +# from [gomplate datasources](https://docs.gomplate.ca/datasources/). File and S3/GCP templates are currently supported +template_paths: + [ - string ] + +# Filters allow you to override the default naming convention + +agent_filter: string # defaults to agent-*.yml +server_filter: string # defaults to server-*.yml +metrics_filter: string # defaults to metrics-*.yml +metrics_instance_filter: string # defaults to metrics_instances-*.yml +integrations_filter: string # defaults to integrations-*.yml +logs_filter: string # defaults to logs-*.yml +traces_filter: string # defaults to traces-*.yml +``` + +### sources_config +```yaml +# Name of the source to use when templating +name: string + +# Path to datasource using schema from [gomplate datasources](https://docs.gomplate.ca/datasources/) +url: string + +``` + +## Templates + +Note when adding a template you MUST NOT add the type as the top level yaml field. For instance if using traces: + +Incorrect + +```yaml +traces: + configs: + - name: default + automatic_logging: + backend: loki + loki_name: default + spans: true +``` + +Correct + +```yaml +configs: +- name: default + automatic_logging: + backend: loki + loki_name: default + spans: true +``` + +Configurations are loaded in the order as they are listed below. + +### Agent + + +Agent template is the standard agent configuration file in its entirety. The default filter is `agent-*.yml`. Only +one file is supported. This is processed first then any subsequent configurations found REPLACE the values here, it is +not additive. + +Reference {{< relref "./" >}}) + +### Server + +The default filter is `server-*.yml`, only ONE server file is supported. + +Reference {{< relref "./server-config.md" >}}) + + +### Metrics + +The default filter is `metrics-*.yml`, only ONE metrics file is supported. + +Reference {{< relref "./metrics-config.md" >}}) + +### Metric Instances + +The default filter is `metrics_instances-*.yml`. Any metric instances are appended to the instances defined in Metrics above. Any number of metric instance files are supporter. + +Reference {{< relref "./metrics-config.md#metrics_instance_config" >}}) in the metrics instance + + +### Integrations + +The default filter is `integrations-*.yml`, these support more than one file, and multiple integrations can be defined in a file. Do not assume any order of loading for integrations. For any integration that is a singleton, loading multiple of those will result in an error. + +Reference {{< relref "./integrations/" >}}) + +### Traces + +The default filter is `traces-*.yml`. This supports ONE file. + +Reference {{< relref "./traces-config.md" >}}) + +### Logs + +The default filter is `logs-*.yml`. This supports ONE file. + +Reference {{< relref "./logs-config.md" >}}) diff --git a/docs/user/cookbook/dynamic-configuration/01_Basics/01_Structure.md b/docs/user/cookbook/dynamic-configuration/01_Basics/01_Structure.md new file mode 100644 index 000000000000..b7ba07b370ce --- /dev/null +++ b/docs/user/cookbook/dynamic-configuration/01_Basics/01_Structure.md @@ -0,0 +1,64 @@ +# 01 Structure + +Dynamic Configuration uses a series of files to load templates. This example will show how they all combine together. Running the below command will combine all the templates into the final.yml. Any failure while loading the config will revert to the original config, or if this is the initial load Grafana Agent will quit. + +`docker run -v ${PWD}/:/etc/grafana grafana/agentctl:latest template-parse file:///etc/grafana/01_config.yml` + +## Dynamic Configuration + +[config.yml](01_config.yml) + +```yaml +template_paths: + - "file:///etc/grafana/01_assets" +``` + +Tells the Grafana Agent where to load files from. It is important to note that dynamic configuration does NOT traverse directories. It will look at the directory specified only, if you need more directories then add them to the `template_paths` array. NOTE, if no protocol specified ie `file://` above, then file access will be assumed. `file:///etc/grafana/01_assets` is equivalent to `//etc/grafana/01_assets` + +## Agent + +Dynamic Configuration will find the first file matching pattern `agent-*.yml` and load that as the base. You can only have one agent template. If multiple matching templates are found then the configuration will fail to load. + +[agent-1.yml](01_assets/agent-1.yml) + +```yaml +server: + http_listen_port: 12345 + log_level: debug +metrics: + wal_directory: /tmp/grafana-agent-normal + global: + scrape_interval: 60s + remote_write: + - url: https://prometheus-us-central1.grafana.net/api/prom/push + basic_auth: + username: 12345 + password: secretpassword +integrations: + node_exporter: + enabled: true + agent: + enabled: true +``` + +## Server + +Dynamic configuration will find the first file matching pattern `server-*.yml` and replace the `Server` config block in +the Agent Configuration. Note that you do NOT include the `server:` tag, dynamic configuration knows by the name that it +is a configuration block. + +You can only have 1 server template. + +[server-1.yml](01_assets/server-1.yml) + + +```yaml +http_listen_port: 12345 +log_level: info +``` + +## Final + +[final.yml](01_assets/final.yml) + +In the above example the `log_level: debug` block will be replaced with `log_level: info` from the server-1.yml diff --git a/docs/user/cookbook/dynamic-configuration/01_Basics/01_assets/agent-1.yml b/docs/user/cookbook/dynamic-configuration/01_Basics/01_assets/agent-1.yml new file mode 100644 index 000000000000..63f679399e68 --- /dev/null +++ b/docs/user/cookbook/dynamic-configuration/01_Basics/01_assets/agent-1.yml @@ -0,0 +1,19 @@ +server: + http_listen_port: 12345 + log_level: debug +metrics: + wal_directory: /tmp/grafana-agent-normal + global: + scrape_interval: 60s + remote_write: + - url: https://prometheus-us-central1.grafana.net/api/prom/push + basic_auth: + username: 12345 + password: secretpassword +integrations: + node_exporter: + autoscrape: + enable: true + agent: + autoscrape: + enable: true \ No newline at end of file diff --git a/docs/user/cookbook/dynamic-configuration/01_Basics/01_assets/final.yml b/docs/user/cookbook/dynamic-configuration/01_Basics/01_assets/final.yml new file mode 100644 index 000000000000..649953a37932 --- /dev/null +++ b/docs/user/cookbook/dynamic-configuration/01_Basics/01_assets/final.yml @@ -0,0 +1,186 @@ +server: + http_listen_network: "" + http_listen_address: "" + http_listen_port: 12345 + http_listen_conn_limit: 0 + grpc_listen_network: "" + grpc_listen_address: "" + grpc_listen_port: 0 + grpc_listen_conn_limit: 0 + http_tls_config: + cert_file: "" + key_file: "" + client_auth_type: "" + client_ca_file: "" + cipher_suites: [] + curve_preferences: [] + min_version: 0 + max_version: 0 + prefer_server_cipher_suites: false + grpc_tls_config: + cert_file: "" + key_file: "" + client_auth_type: "" + client_ca_file: "" + cipher_suites: [] + curve_preferences: [] + min_version: 0 + max_version: 0 + prefer_server_cipher_suites: false + register_instrumentation: false + graceful_shutdown_timeout: 0s + http_server_read_timeout: 0s + http_server_write_timeout: 0s + http_server_idle_timeout: 0s + grpc_server_max_recv_msg_size: 0 + grpc_server_max_send_msg_size: 0 + grpc_server_max_concurrent_streams: 0 + grpc_server_max_connection_idle: 0s + grpc_server_max_connection_age: 0s + grpc_server_max_connection_age_grace: 0s + grpc_server_keepalive_time: 0s + grpc_server_keepalive_timeout: 0s + grpc_server_min_time_between_pings: 0s + grpc_server_ping_without_stream_allowed: false + log_format: "" + log_level: info + log_source_ips_enabled: false + log_source_ips_header: "" + log_source_ips_regex: "" + http_path_prefix: "" +metrics: + global: + scrape_interval: 1m + scrape_timeout: 10s + evaluation_interval: 1m + remote_write: + - url: https://prometheus-us-central1.grafana.net/api/prom/push + remote_timeout: 30s + basic_auth: + username: "12345" + password: + follow_redirects: true + queue_config: + capacity: 2500 + max_shards: 200 + min_shards: 1 + max_samples_per_send: 500 + batch_send_deadline: 5s + min_backoff: 30ms + max_backoff: 100ms + metadata_config: + send: true + send_interval: 1m + max_samples_per_send: 500 + wal_directory: /tmp/grafana-agent-normal + wal_cleanup_age: 12h0m0s + wal_cleanup_period: 30m0s + scraping_service: + enabled: false + reshard_interval: 1m0s + reshard_timeout: 30s + cluster_reshard_event_timeout: 30s + kvstore: + store: consul + prefix: configurations/ + consul: + host: localhost:8500 + acl_token: + http_client_timeout: 20s + consistent_reads: false + watch_rate_limit: 1 + watch_burst_size: 1 + etcd: + endpoints: [] + dial_timeout: 10s + max_retries: 10 + tls_enabled: false + tls_cert_path: "" + tls_key_path: "" + tls_ca_path: "" + tls_server_name: "" + tls_insecure_skip_verify: false + username: "" + password: + multi: + primary: "" + secondary: "" + mirror_enabled: false + mirror_timeout: 2s + lifecycler: + ring: + kvstore: + store: consul + prefix: collectors/ + consul: + host: localhost:8500 + acl_token: + http_client_timeout: 20s + consistent_reads: false + watch_rate_limit: 1 + watch_burst_size: 1 + etcd: + endpoints: [] + dial_timeout: 10s + max_retries: 10 + tls_enabled: false + tls_cert_path: "" + tls_key_path: "" + tls_ca_path: "" + tls_server_name: "" + tls_insecure_skip_verify: false + username: "" + password: + multi: + primary: "" + secondary: "" + mirror_enabled: false + mirror_timeout: 2s + heartbeat_timeout: 1m0s + replication_factor: 3 + zone_awareness_enabled: false + num_tokens: 128 + heartbeat_period: 5s + observe_period: 0s + join_after: 0s + min_ready_duration: 1m0s + interface_names: + - eth0 + - en0 + final_sleep: 30s + tokens_file_path: "" + availability_zone: "" + unregister_on_shutdown: true + address: "" + port: 0 + id: 4c1ed28ad826 + dangerous_allow_reading_files: false + scraping_service_client: + grpc_client_config: + max_recv_msg_size: 104857600 + max_send_msg_size: 16777216 + grpc_compression: "" + rate_limit: 0 + rate_limit_burst: 0 + backoff_on_ratelimits: false + backoff_config: + min_period: 100ms + max_period: 10s + max_retries: 10 + tls_enabled: false + tls_cert_path: "" + tls_key_path: "" + tls_ca_path: "" + tls_server_name: "" + tls_insecure_skip_verify: false + instance_restart_backoff: 5s + instance_mode: shared +integrations: + metrics: + autoscrape: + enable: true + metrics_instance: default + scrape_interval: 1m + scrape_timeout: 10s + agent: {} + diff --git a/docs/user/cookbook/dynamic-configuration/01_Basics/01_assets/server-1.yml b/docs/user/cookbook/dynamic-configuration/01_Basics/01_assets/server-1.yml new file mode 100644 index 000000000000..9bf1c55694a8 --- /dev/null +++ b/docs/user/cookbook/dynamic-configuration/01_Basics/01_assets/server-1.yml @@ -0,0 +1,2 @@ +http_listen_port: 12345 +log_level: info \ No newline at end of file diff --git a/docs/user/cookbook/dynamic-configuration/01_Basics/01_config.yml b/docs/user/cookbook/dynamic-configuration/01_Basics/01_config.yml new file mode 100644 index 000000000000..ab67edcade05 --- /dev/null +++ b/docs/user/cookbook/dynamic-configuration/01_Basics/01_config.yml @@ -0,0 +1,2 @@ +template_paths: + - "file:///etc/grafana/01_assets" \ No newline at end of file diff --git a/docs/user/cookbook/dynamic-configuration/01_Basics/02_Instances.md b/docs/user/cookbook/dynamic-configuration/01_Basics/02_Instances.md new file mode 100644 index 000000000000..476544892a92 --- /dev/null +++ b/docs/user/cookbook/dynamic-configuration/01_Basics/02_Instances.md @@ -0,0 +1,63 @@ +# 02 Instances + +Dynamic configuration allows multiple prometheus instances to be loaded with a parent metric. This uses +the same agent-1 and server-1 yml from 01. + +`docker run -v ${PWD}/:/etc/grafana grafana/agentctl:latest template-parse file:///etc/grafana/02_config.yml` + +## Dynamic Configuration + +[config.yml](02_config.yml) + +Tells the Grafana Agent where to load files from. + +## Metrics + +Dynamic Configuration will find the first file matching pattern `metrics-*.yml` and load that as the base. You can only have one metrics template. + +[metrics-1.yml](02_assets/metrics-1.yml) + +```yaml +configs: + - name: default +global: + scrape_interval: 60s + scrape_timeout: 20s +wal_directory: /tmp/grafana-agent-wal +``` + +## Metrics Instances + +You can have any number of metrics_instances and they are added to any existing metrics instances defined previously. + +[metrics_instances-1.yml](02_assets/metrics_instances-1.yml) + +```yaml +name: instance1 +scrape_configs: + - job_name: instance1_job + static_configs: + - targets: + - localhost:4000 +``` + +[metrics_instances-2.yml](02_assets/metrics_instances-2.yml) + +```yaml +name: instance2 +scrape_configs: + - job_name: instance2_job + static_configs: + - targets: + - localhost:5555 +``` + +## Final + +[final.yml](01_assets/final.yml) + +In the above you will see the `final.yml` includes all the instance configurations +- default +- instance1 +- instance2 + diff --git a/docs/user/cookbook/dynamic-configuration/01_Basics/02_assets/agent-1.yml b/docs/user/cookbook/dynamic-configuration/01_Basics/02_assets/agent-1.yml new file mode 100644 index 000000000000..186ed83dd358 --- /dev/null +++ b/docs/user/cookbook/dynamic-configuration/01_Basics/02_assets/agent-1.yml @@ -0,0 +1,15 @@ +server: + http_listen_port: 12345 + log_level: debug +metrics: + wal_directory: /tmp/grafana-agent-normal + global: + scrape_interval: 60s + remote_write: + - url: https://prometheus-us-central1.grafana.net/api/prom/push + basic_auth: + username: 12345 + password: secretpassword +integrations: + node_exporter: {} + agent: {} \ No newline at end of file diff --git a/docs/user/cookbook/dynamic-configuration/01_Basics/02_assets/final.yml b/docs/user/cookbook/dynamic-configuration/01_Basics/02_assets/final.yml new file mode 100644 index 000000000000..245de0c81137 --- /dev/null +++ b/docs/user/cookbook/dynamic-configuration/01_Basics/02_assets/final.yml @@ -0,0 +1,205 @@ +server: + http_listen_network: "" + http_listen_address: "" + http_listen_port: 12345 + http_listen_conn_limit: 0 + grpc_listen_network: "" + grpc_listen_address: "" + grpc_listen_port: 0 + grpc_listen_conn_limit: 0 + http_tls_config: + cert_file: "" + key_file: "" + client_auth_type: "" + client_ca_file: "" + cipher_suites: [] + curve_preferences: [] + min_version: 0 + max_version: 0 + prefer_server_cipher_suites: false + grpc_tls_config: + cert_file: "" + key_file: "" + client_auth_type: "" + client_ca_file: "" + cipher_suites: [] + curve_preferences: [] + min_version: 0 + max_version: 0 + prefer_server_cipher_suites: false + register_instrumentation: false + graceful_shutdown_timeout: 0s + http_server_read_timeout: 0s + http_server_write_timeout: 0s + http_server_idle_timeout: 0s + grpc_server_max_recv_msg_size: 0 + grpc_server_max_send_msg_size: 0 + grpc_server_max_concurrent_streams: 0 + grpc_server_max_connection_idle: 0s + grpc_server_max_connection_age: 0s + grpc_server_max_connection_age_grace: 0s + grpc_server_keepalive_time: 0s + grpc_server_keepalive_timeout: 0s + grpc_server_min_time_between_pings: 0s + grpc_server_ping_without_stream_allowed: false + log_format: "" + log_level: info + log_source_ips_enabled: false + log_source_ips_header: "" + log_source_ips_regex: "" + http_path_prefix: "" +metrics: + global: + scrape_interval: 1m + scrape_timeout: 20s + evaluation_interval: 1m + wal_directory: /tmp/grafana-agent-wal + wal_cleanup_age: 12h0m0s + wal_cleanup_period: 30m0s + scraping_service: + enabled: false + reshard_interval: 1m0s + reshard_timeout: 30s + cluster_reshard_event_timeout: 30s + kvstore: + store: consul + prefix: configurations/ + consul: + host: localhost:8500 + acl_token: + http_client_timeout: 20s + consistent_reads: false + watch_rate_limit: 1 + watch_burst_size: 1 + etcd: + endpoints: [] + dial_timeout: 10s + max_retries: 10 + tls_enabled: false + tls_cert_path: "" + tls_key_path: "" + tls_ca_path: "" + tls_server_name: "" + tls_insecure_skip_verify: false + username: "" + password: + multi: + primary: "" + secondary: "" + mirror_enabled: false + mirror_timeout: 2s + lifecycler: + ring: + kvstore: + store: consul + prefix: collectors/ + consul: + host: localhost:8500 + acl_token: + http_client_timeout: 20s + consistent_reads: false + watch_rate_limit: 1 + watch_burst_size: 1 + etcd: + endpoints: [] + dial_timeout: 10s + max_retries: 10 + tls_enabled: false + tls_cert_path: "" + tls_key_path: "" + tls_ca_path: "" + tls_server_name: "" + tls_insecure_skip_verify: false + username: "" + password: + multi: + primary: "" + secondary: "" + mirror_enabled: false + mirror_timeout: 2s + heartbeat_timeout: 1m0s + replication_factor: 3 + zone_awareness_enabled: false + num_tokens: 128 + heartbeat_period: 5s + observe_period: 0s + join_after: 0s + min_ready_duration: 1m0s + interface_names: + - eth0 + - en0 + final_sleep: 30s + tokens_file_path: "" + availability_zone: "" + unregister_on_shutdown: true + address: "" + port: 0 + id: 04802136a818 + dangerous_allow_reading_files: false + scraping_service_client: + grpc_client_config: + max_recv_msg_size: 104857600 + max_send_msg_size: 16777216 + grpc_compression: "" + rate_limit: 0 + rate_limit_burst: 0 + backoff_on_ratelimits: false + backoff_config: + min_period: 100ms + max_period: 10s + max_retries: 10 + tls_enabled: false + tls_cert_path: "" + tls_key_path: "" + tls_ca_path: "" + tls_server_name: "" + tls_insecure_skip_verify: false + configs: + - name: default + wal_truncate_frequency: 1h0m0s + min_wal_time: 5m0s + max_wal_time: 4h0m0s + remote_flush_deadline: 1m0s + - name: instance1 + scrape_configs: + - job_name: instance1_job + honor_timestamps: true + scrape_interval: 1m + scrape_timeout: 20s + metrics_path: /metrics + scheme: http + follow_redirects: true + static_configs: + - targets: + - localhost:4000 + wal_truncate_frequency: 1h0m0s + min_wal_time: 5m0s + max_wal_time: 4h0m0s + remote_flush_deadline: 1m0s + - name: instance2 + scrape_configs: + - job_name: instance2_job + honor_timestamps: true + scrape_interval: 1m + scrape_timeout: 20s + metrics_path: /metrics + scheme: http + follow_redirects: true + static_configs: + - targets: + - localhost:5555 + wal_truncate_frequency: 1h0m0s + min_wal_time: 5m0s + max_wal_time: 4h0m0s + remote_flush_deadline: 1m0s + instance_restart_backoff: 5s + instance_mode: shared +integrations: + metrics: + autoscrape: + enable: true + metrics_instance: default + scrape_interval: 1m + scrape_timeout: 20s + agent: {} + diff --git a/docs/user/cookbook/dynamic-configuration/01_Basics/02_assets/metrics-1.yml b/docs/user/cookbook/dynamic-configuration/01_Basics/02_assets/metrics-1.yml new file mode 100644 index 000000000000..630e75672beb --- /dev/null +++ b/docs/user/cookbook/dynamic-configuration/01_Basics/02_assets/metrics-1.yml @@ -0,0 +1,6 @@ +configs: +- name: default +global: + scrape_interval: 60s + scrape_timeout: 20s +wal_directory: /tmp/grafana-agent-wal \ No newline at end of file diff --git a/docs/user/cookbook/dynamic-configuration/01_Basics/02_assets/metrics_instances-1.yml b/docs/user/cookbook/dynamic-configuration/01_Basics/02_assets/metrics_instances-1.yml new file mode 100644 index 000000000000..4b93d728201a --- /dev/null +++ b/docs/user/cookbook/dynamic-configuration/01_Basics/02_assets/metrics_instances-1.yml @@ -0,0 +1,6 @@ +name: instance1 +scrape_configs: + - job_name: instance1_job + static_configs: + - targets: + - localhost:4000 \ No newline at end of file diff --git a/docs/user/cookbook/dynamic-configuration/01_Basics/02_assets/metrics_instances-2.yml b/docs/user/cookbook/dynamic-configuration/01_Basics/02_assets/metrics_instances-2.yml new file mode 100644 index 000000000000..12a82ab97e9a --- /dev/null +++ b/docs/user/cookbook/dynamic-configuration/01_Basics/02_assets/metrics_instances-2.yml @@ -0,0 +1,6 @@ +name: instance2 +scrape_configs: + - job_name: instance2_job + static_configs: + - targets: + - localhost:5555 \ No newline at end of file diff --git a/docs/user/cookbook/dynamic-configuration/01_Basics/02_assets/server-1.yml b/docs/user/cookbook/dynamic-configuration/01_Basics/02_assets/server-1.yml new file mode 100644 index 000000000000..9bf1c55694a8 --- /dev/null +++ b/docs/user/cookbook/dynamic-configuration/01_Basics/02_assets/server-1.yml @@ -0,0 +1,2 @@ +http_listen_port: 12345 +log_level: info \ No newline at end of file diff --git a/docs/user/cookbook/dynamic-configuration/01_Basics/02_config.yml b/docs/user/cookbook/dynamic-configuration/01_Basics/02_config.yml new file mode 100644 index 000000000000..28bc47c99d38 --- /dev/null +++ b/docs/user/cookbook/dynamic-configuration/01_Basics/02_config.yml @@ -0,0 +1,2 @@ +template_paths: + - "file:///etc/grafana/02_assets" \ No newline at end of file diff --git a/docs/user/cookbook/dynamic-configuration/01_Basics/03_Integrations.md b/docs/user/cookbook/dynamic-configuration/01_Basics/03_Integrations.md new file mode 100644 index 000000000000..d4a6bc0b004b --- /dev/null +++ b/docs/user/cookbook/dynamic-configuration/01_Basics/03_Integrations.md @@ -0,0 +1,43 @@ +# 03 Integrations + +Dynamic configuration requires the use of `integrations-next` feature flag, to allow arrays of integrations. In this we will load integrations of various types. This is all built on the previous examples. + +`docker run -v ${PWD}/:/etc/grafana grafana/agentctl:latest template-parse file:///etc/grafana/03_config.yml` + +## Dynamic Configuration + +[config.yml](03_config.yml) + +Tells the Grafana Agent where to load files from. + +## Integrations + +Integrations are loaded from files matching `integrations-*.yml` and are combined together. You can declare for example multiple sets of `redis_exporter_configs` across several files. + +[integrations-node.yml](03_assets/integrations-node.yml) + +Note: You do NOT have to name the above file `integrations-node.yml` with `node`, `integrations-1.yml` would work the same. The name does NOT determine the type of integrations a template can contain and a template can contain integrations of different types. + +```yaml +node_exporter: {} +``` + +[integrations-redis.yml](03_assets/integrations-redis.yml) + +```yaml +redis_exporter_configs: + - redis_addr: localhost:6379 + autoscrape: + metric_relabel_configs: + - source_labels: [__address__] + target_label: "banana" + replacement: "apple" + - redis_addr: localhost:6380 +``` + +## Final + +[final.yml](03_assets/final.yml) + +The final result should have 3 integrations enabled, 1 node_exporter and 2 redis_exporters. + diff --git a/docs/user/cookbook/dynamic-configuration/01_Basics/03_assets/agent-1.yml b/docs/user/cookbook/dynamic-configuration/01_Basics/03_assets/agent-1.yml new file mode 100644 index 000000000000..186ed83dd358 --- /dev/null +++ b/docs/user/cookbook/dynamic-configuration/01_Basics/03_assets/agent-1.yml @@ -0,0 +1,15 @@ +server: + http_listen_port: 12345 + log_level: debug +metrics: + wal_directory: /tmp/grafana-agent-normal + global: + scrape_interval: 60s + remote_write: + - url: https://prometheus-us-central1.grafana.net/api/prom/push + basic_auth: + username: 12345 + password: secretpassword +integrations: + node_exporter: {} + agent: {} \ No newline at end of file diff --git a/docs/user/cookbook/dynamic-configuration/01_Basics/03_assets/final.yml b/docs/user/cookbook/dynamic-configuration/01_Basics/03_assets/final.yml new file mode 100644 index 000000000000..840aac17b065 --- /dev/null +++ b/docs/user/cookbook/dynamic-configuration/01_Basics/03_assets/final.yml @@ -0,0 +1,253 @@ +server: + http_listen_network: "" + http_listen_address: "" + http_listen_port: 12345 + http_listen_conn_limit: 0 + grpc_listen_network: "" + grpc_listen_address: "" + grpc_listen_port: 0 + grpc_listen_conn_limit: 0 + http_tls_config: + cert_file: "" + key_file: "" + client_auth_type: "" + client_ca_file: "" + cipher_suites: [] + curve_preferences: [] + min_version: 0 + max_version: 0 + prefer_server_cipher_suites: false + grpc_tls_config: + cert_file: "" + key_file: "" + client_auth_type: "" + client_ca_file: "" + cipher_suites: [] + curve_preferences: [] + min_version: 0 + max_version: 0 + prefer_server_cipher_suites: false + register_instrumentation: false + graceful_shutdown_timeout: 0s + http_server_read_timeout: 0s + http_server_write_timeout: 0s + http_server_idle_timeout: 0s + grpc_server_max_recv_msg_size: 0 + grpc_server_max_send_msg_size: 0 + grpc_server_max_concurrent_streams: 0 + grpc_server_max_connection_idle: 0s + grpc_server_max_connection_age: 0s + grpc_server_max_connection_age_grace: 0s + grpc_server_keepalive_time: 0s + grpc_server_keepalive_timeout: 0s + grpc_server_min_time_between_pings: 0s + grpc_server_ping_without_stream_allowed: false + log_format: "" + log_level: info + log_source_ips_enabled: false + log_source_ips_header: "" + log_source_ips_regex: "" + http_path_prefix: "" +metrics: + global: + scrape_interval: 1m + scrape_timeout: 20s + evaluation_interval: 1m + wal_directory: /tmp/grafana-agent-wal + wal_cleanup_age: 12h0m0s + wal_cleanup_period: 30m0s + scraping_service: + enabled: false + reshard_interval: 1m0s + reshard_timeout: 30s + cluster_reshard_event_timeout: 30s + kvstore: + store: consul + prefix: configurations/ + consul: + host: localhost:8500 + acl_token: + http_client_timeout: 20s + consistent_reads: false + watch_rate_limit: 1 + watch_burst_size: 1 + etcd: + endpoints: [] + dial_timeout: 10s + max_retries: 10 + tls_enabled: false + tls_cert_path: "" + tls_key_path: "" + tls_ca_path: "" + tls_server_name: "" + tls_insecure_skip_verify: false + username: "" + password: + multi: + primary: "" + secondary: "" + mirror_enabled: false + mirror_timeout: 2s + lifecycler: + ring: + kvstore: + store: consul + prefix: collectors/ + consul: + host: localhost:8500 + acl_token: + http_client_timeout: 20s + consistent_reads: false + watch_rate_limit: 1 + watch_burst_size: 1 + etcd: + endpoints: [] + dial_timeout: 10s + max_retries: 10 + tls_enabled: false + tls_cert_path: "" + tls_key_path: "" + tls_ca_path: "" + tls_server_name: "" + tls_insecure_skip_verify: false + username: "" + password: + multi: + primary: "" + secondary: "" + mirror_enabled: false + mirror_timeout: 2s + heartbeat_timeout: 1m0s + replication_factor: 3 + zone_awareness_enabled: false + num_tokens: 128 + heartbeat_period: 5s + observe_period: 0s + join_after: 0s + min_ready_duration: 1m0s + interface_names: + - eth0 + - en0 + final_sleep: 30s + tokens_file_path: "" + availability_zone: "" + unregister_on_shutdown: true + address: "" + port: 0 + id: 920e9b32116a + dangerous_allow_reading_files: false + scraping_service_client: + grpc_client_config: + max_recv_msg_size: 104857600 + max_send_msg_size: 16777216 + grpc_compression: "" + rate_limit: 0 + rate_limit_burst: 0 + backoff_on_ratelimits: false + backoff_config: + min_period: 100ms + max_period: 10s + max_retries: 10 + tls_enabled: false + tls_cert_path: "" + tls_key_path: "" + tls_ca_path: "" + tls_server_name: "" + tls_insecure_skip_verify: false + configs: + - name: default + wal_truncate_frequency: 1h0m0s + min_wal_time: 5m0s + max_wal_time: 4h0m0s + remote_flush_deadline: 1m0s + - name: instance1 + scrape_configs: + - job_name: instance1_job + honor_timestamps: true + scrape_interval: 1m + scrape_timeout: 20s + metrics_path: /metrics + scheme: http + follow_redirects: true + static_configs: + - targets: + - localhost:4000 + wal_truncate_frequency: 1h0m0s + min_wal_time: 5m0s + max_wal_time: 4h0m0s + remote_flush_deadline: 1m0s + - name: instance2 + scrape_configs: + - job_name: instance2_job + honor_timestamps: true + scrape_interval: 1m + scrape_timeout: 20s + metrics_path: /metrics + scheme: http + follow_redirects: true + static_configs: + - targets: + - localhost:5555 + wal_truncate_frequency: 1h0m0s + min_wal_time: 5m0s + max_wal_time: 4h0m0s + remote_flush_deadline: 1m0s + instance_restart_backoff: 5s + instance_mode: shared +integrations: + metrics: + autoscrape: + enable: true + metrics_instance: default + scrape_interval: 1m + scrape_timeout: 20s + node_exporter: + procfs_path: /proc + sysfs_path: /sys + rootfs_path: / + diskstats_ignored_devices: ^(ram|loop|fd|(h|s|v|xv)d[a-z]|nvme\d+n\d+p)\d+$ + ethtool_metrics_include: .* + filesystem_fs_types_exclude: ^(autofs|binfmt_misc|bpf|cgroup2?|configfs|debugfs|devpts|devtmpfs|fusectl|hugetlbfs|iso9660|mqueue|nsfs|overlay|proc|procfs|pstore|rpc_pipefs|securityfs|selinuxfs|squashfs|sysfs|tracefs)$ + filesystem_mount_points_exclude: ^/(dev|proc|run/credentials/.+|sys|var/lib/docker/.+)($|/) + filesystem_mount_timeout: 5s + ntp_ip_ttl: 1 + ntp_local_offset_tolerance: 1ms + ntp_max_distance: 3.46608s + ntp_protocol_version: 4 + ntp_server: 127.0.0.1 + netclass_ignored_devices: ^$ + netstat_fields: ^(.*_(InErrors|InErrs)|Ip_Forwarding|Ip(6|Ext)_(InOctets|OutOctets)|Icmp6?_(InMsgs|OutMsgs)|TcpExt_(Listen.*|Syncookies.*|TCPSynRetrans|TCPTimeouts)|Tcp_(ActiveOpens|InSegs|OutSegs|OutRsts|PassiveOpens|RetransSegs|CurrEstab)|Udp6?_(InDatagrams|OutDatagrams|NoPorts|RcvbufErrors|SndbufErrors))$ + powersupply_ignored_supplies: ^$ + runit_service_dir: /etc/service + supervisord_url: http://localhost:9001/RPC2 + systemd_unit_exclude: .+\.(automount|device|mount|scope|slice) + systemd_unit_include: .+ + tapestats_ignored_devices: ^$ + vmstat_fields: ^(oom_kill|pgpg|pswp|pg.*fault).* + redis_exporter_configs: + - autoscrape: + metric_relabel_configs: + - source_labels: + - __address__ + separator: ; + regex: (.*) + target_label: banana + replacement: apple + action: replace + include_exporter_metrics: false + redis_addr: localhost:6379 + namespace: redis + config_command: CONFIG + check_key_groups_batch_size: 10000 + max_distinct_key_groups: 100 + connection_timeout: 15s + set_client_name: true + - include_exporter_metrics: false + redis_addr: localhost:6380 + namespace: redis + config_command: CONFIG + check_key_groups_batch_size: 10000 + max_distinct_key_groups: 100 + connection_timeout: 15s + set_client_name: true + diff --git a/docs/user/cookbook/dynamic-configuration/01_Basics/03_assets/integrations-node.yml b/docs/user/cookbook/dynamic-configuration/01_Basics/03_assets/integrations-node.yml new file mode 100644 index 000000000000..61f9cb2c8e4c --- /dev/null +++ b/docs/user/cookbook/dynamic-configuration/01_Basics/03_assets/integrations-node.yml @@ -0,0 +1 @@ +node_exporter: {} \ No newline at end of file diff --git a/docs/user/cookbook/dynamic-configuration/01_Basics/03_assets/integrations-redis.yml b/docs/user/cookbook/dynamic-configuration/01_Basics/03_assets/integrations-redis.yml new file mode 100644 index 000000000000..e3022ec607dd --- /dev/null +++ b/docs/user/cookbook/dynamic-configuration/01_Basics/03_assets/integrations-redis.yml @@ -0,0 +1,8 @@ +redis_exporter_configs: + - redis_addr: localhost:6379 + autoscrape: + metric_relabel_configs: + - source_labels: [__address__] + target_label: "banana" + replacement: "apple" + - redis_addr: localhost:6380 \ No newline at end of file diff --git a/docs/user/cookbook/dynamic-configuration/01_Basics/03_assets/metrics-1.yml b/docs/user/cookbook/dynamic-configuration/01_Basics/03_assets/metrics-1.yml new file mode 100644 index 000000000000..630e75672beb --- /dev/null +++ b/docs/user/cookbook/dynamic-configuration/01_Basics/03_assets/metrics-1.yml @@ -0,0 +1,6 @@ +configs: +- name: default +global: + scrape_interval: 60s + scrape_timeout: 20s +wal_directory: /tmp/grafana-agent-wal \ No newline at end of file diff --git a/docs/user/cookbook/dynamic-configuration/01_Basics/03_assets/metrics_instances-1.yml b/docs/user/cookbook/dynamic-configuration/01_Basics/03_assets/metrics_instances-1.yml new file mode 100644 index 000000000000..4b93d728201a --- /dev/null +++ b/docs/user/cookbook/dynamic-configuration/01_Basics/03_assets/metrics_instances-1.yml @@ -0,0 +1,6 @@ +name: instance1 +scrape_configs: + - job_name: instance1_job + static_configs: + - targets: + - localhost:4000 \ No newline at end of file diff --git a/docs/user/cookbook/dynamic-configuration/01_Basics/03_assets/metrics_instances-2.yml b/docs/user/cookbook/dynamic-configuration/01_Basics/03_assets/metrics_instances-2.yml new file mode 100644 index 000000000000..12a82ab97e9a --- /dev/null +++ b/docs/user/cookbook/dynamic-configuration/01_Basics/03_assets/metrics_instances-2.yml @@ -0,0 +1,6 @@ +name: instance2 +scrape_configs: + - job_name: instance2_job + static_configs: + - targets: + - localhost:5555 \ No newline at end of file diff --git a/docs/user/cookbook/dynamic-configuration/01_Basics/03_assets/server-1.yml b/docs/user/cookbook/dynamic-configuration/01_Basics/03_assets/server-1.yml new file mode 100644 index 000000000000..9bf1c55694a8 --- /dev/null +++ b/docs/user/cookbook/dynamic-configuration/01_Basics/03_assets/server-1.yml @@ -0,0 +1,2 @@ +http_listen_port: 12345 +log_level: info \ No newline at end of file diff --git a/docs/user/cookbook/dynamic-configuration/01_Basics/03_config.yml b/docs/user/cookbook/dynamic-configuration/01_Basics/03_config.yml new file mode 100644 index 000000000000..93e04557d703 --- /dev/null +++ b/docs/user/cookbook/dynamic-configuration/01_Basics/03_config.yml @@ -0,0 +1,2 @@ +template_paths: + - "file:///etc/grafana/03_assets" \ No newline at end of file diff --git a/docs/user/cookbook/dynamic-configuration/01_Basics/04_Logs_and_Traces.md b/docs/user/cookbook/dynamic-configuration/01_Basics/04_Logs_and_Traces.md new file mode 100644 index 000000000000..3775da9afdc4 --- /dev/null +++ b/docs/user/cookbook/dynamic-configuration/01_Basics/04_Logs_and_Traces.md @@ -0,0 +1,46 @@ +# 04 Logs and Traces + +Logs and Traces can also be templated. This is built ontop of the previous examples. + +`docker run -v ${PWD}/:/etc/grafana grafana/agentctl:latest template-parse file:///etc/grafana/04_config.yml` + +## Dynamic Configuration + +[config.yml](04_config.yml) + +Tells the Grafana Agent where to load files from. + +## Logs + +Logs are loaded from a template matching `logs-*.yml`. There can ONLY be 1 template loaded + +[logs-1.yml](04_assets/logs-1.yml) + +```yaml +configs: + - name: test_logs + positions: + filename: /tmp/positions.yaml + scrape_configs: + - job_name: test + pipeline_stages: + - regex: + source: filename + expression: '\\temp\\Logs\\(?P.+?)\\' +``` + +[traces.yml](04_assets/traces-1.yml) + +```yaml +configs: + - name: test_traces + automatic_logging: + backend: stdout + loki_name: default + spans: true +``` + +## Final + +[final.yml](04_assets/final.yml) + diff --git a/docs/user/cookbook/dynamic-configuration/01_Basics/04_assets/agent-1.yml b/docs/user/cookbook/dynamic-configuration/01_Basics/04_assets/agent-1.yml new file mode 100644 index 000000000000..186ed83dd358 --- /dev/null +++ b/docs/user/cookbook/dynamic-configuration/01_Basics/04_assets/agent-1.yml @@ -0,0 +1,15 @@ +server: + http_listen_port: 12345 + log_level: debug +metrics: + wal_directory: /tmp/grafana-agent-normal + global: + scrape_interval: 60s + remote_write: + - url: https://prometheus-us-central1.grafana.net/api/prom/push + basic_auth: + username: 12345 + password: secretpassword +integrations: + node_exporter: {} + agent: {} \ No newline at end of file diff --git a/docs/user/cookbook/dynamic-configuration/01_Basics/04_assets/final.yml b/docs/user/cookbook/dynamic-configuration/01_Basics/04_assets/final.yml new file mode 100644 index 000000000000..95a6f4575228 --- /dev/null +++ b/docs/user/cookbook/dynamic-configuration/01_Basics/04_assets/final.yml @@ -0,0 +1,278 @@ +server: + http_listen_network: "" + http_listen_address: "" + http_listen_port: 12345 + http_listen_conn_limit: 0 + grpc_listen_network: "" + grpc_listen_address: "" + grpc_listen_port: 0 + grpc_listen_conn_limit: 0 + http_tls_config: + cert_file: "" + key_file: "" + client_auth_type: "" + client_ca_file: "" + cipher_suites: [] + curve_preferences: [] + min_version: 0 + max_version: 0 + prefer_server_cipher_suites: false + grpc_tls_config: + cert_file: "" + key_file: "" + client_auth_type: "" + client_ca_file: "" + cipher_suites: [] + curve_preferences: [] + min_version: 0 + max_version: 0 + prefer_server_cipher_suites: false + register_instrumentation: false + graceful_shutdown_timeout: 0s + http_server_read_timeout: 0s + http_server_write_timeout: 0s + http_server_idle_timeout: 0s + grpc_server_max_recv_msg_size: 0 + grpc_server_max_send_msg_size: 0 + grpc_server_max_concurrent_streams: 0 + grpc_server_max_connection_idle: 0s + grpc_server_max_connection_age: 0s + grpc_server_max_connection_age_grace: 0s + grpc_server_keepalive_time: 0s + grpc_server_keepalive_timeout: 0s + grpc_server_min_time_between_pings: 0s + grpc_server_ping_without_stream_allowed: false + log_format: "" + log_level: info + log_source_ips_enabled: false + log_source_ips_header: "" + log_source_ips_regex: "" + http_path_prefix: "" +metrics: + global: + scrape_interval: 1m + scrape_timeout: 20s + evaluation_interval: 1m + wal_directory: /tmp/grafana-agent-wal + wal_cleanup_age: 12h0m0s + wal_cleanup_period: 30m0s + scraping_service: + enabled: false + reshard_interval: 1m0s + reshard_timeout: 30s + cluster_reshard_event_timeout: 30s + kvstore: + store: consul + prefix: configurations/ + consul: + host: localhost:8500 + acl_token: + http_client_timeout: 20s + consistent_reads: false + watch_rate_limit: 1 + watch_burst_size: 1 + etcd: + endpoints: [] + dial_timeout: 10s + max_retries: 10 + tls_enabled: false + tls_cert_path: "" + tls_key_path: "" + tls_ca_path: "" + tls_server_name: "" + tls_insecure_skip_verify: false + username: "" + password: + multi: + primary: "" + secondary: "" + mirror_enabled: false + mirror_timeout: 2s + lifecycler: + ring: + kvstore: + store: consul + prefix: collectors/ + consul: + host: localhost:8500 + acl_token: + http_client_timeout: 20s + consistent_reads: false + watch_rate_limit: 1 + watch_burst_size: 1 + etcd: + endpoints: [] + dial_timeout: 10s + max_retries: 10 + tls_enabled: false + tls_cert_path: "" + tls_key_path: "" + tls_ca_path: "" + tls_server_name: "" + tls_insecure_skip_verify: false + username: "" + password: + multi: + primary: "" + secondary: "" + mirror_enabled: false + mirror_timeout: 2s + heartbeat_timeout: 1m0s + replication_factor: 3 + zone_awareness_enabled: false + num_tokens: 128 + heartbeat_period: 5s + observe_period: 0s + join_after: 0s + min_ready_duration: 1m0s + interface_names: + - eth0 + - en0 + final_sleep: 30s + tokens_file_path: "" + availability_zone: "" + unregister_on_shutdown: true + address: "" + port: 0 + id: 2555e70c377f + dangerous_allow_reading_files: false + scraping_service_client: + grpc_client_config: + max_recv_msg_size: 104857600 + max_send_msg_size: 16777216 + grpc_compression: "" + rate_limit: 0 + rate_limit_burst: 0 + backoff_on_ratelimits: false + backoff_config: + min_period: 100ms + max_period: 10s + max_retries: 10 + tls_enabled: false + tls_cert_path: "" + tls_key_path: "" + tls_ca_path: "" + tls_server_name: "" + tls_insecure_skip_verify: false + configs: + - name: default + wal_truncate_frequency: 1h0m0s + min_wal_time: 5m0s + max_wal_time: 4h0m0s + remote_flush_deadline: 1m0s + - name: instance1 + scrape_configs: + - job_name: instance1_job + honor_timestamps: true + scrape_interval: 1m + scrape_timeout: 20s + metrics_path: /metrics + scheme: http + follow_redirects: true + static_configs: + - targets: + - localhost:4000 + wal_truncate_frequency: 1h0m0s + min_wal_time: 5m0s + max_wal_time: 4h0m0s + remote_flush_deadline: 1m0s + - name: instance2 + scrape_configs: + - job_name: instance2_job + honor_timestamps: true + scrape_interval: 1m + scrape_timeout: 20s + metrics_path: /metrics + scheme: http + follow_redirects: true + static_configs: + - targets: + - localhost:5555 + wal_truncate_frequency: 1h0m0s + min_wal_time: 5m0s + max_wal_time: 4h0m0s + remote_flush_deadline: 1m0s + instance_restart_backoff: 5s + instance_mode: shared +integrations: + metrics: + autoscrape: + enable: true + metrics_instance: default + scrape_interval: 1m + scrape_timeout: 20s + redis_exporter_configs: + - autoscrape: + metric_relabel_configs: + - source_labels: + - __address__ + separator: ; + regex: (.*) + target_label: banana + replacement: apple + action: replace + include_exporter_metrics: false + redis_addr: localhost:6379 + namespace: redis + config_command: CONFIG + check_key_groups_batch_size: 10000 + max_distinct_key_groups: 100 + connection_timeout: 15s + set_client_name: true + - include_exporter_metrics: false + redis_addr: localhost:6380 + namespace: redis + config_command: CONFIG + check_key_groups_batch_size: 10000 + max_distinct_key_groups: 100 + connection_timeout: 15s + set_client_name: true + node_exporter: + procfs_path: /proc + sysfs_path: /sys + rootfs_path: / + diskstats_ignored_devices: ^(ram|loop|fd|(h|s|v|xv)d[a-z]|nvme\d+n\d+p)\d+$ + ethtool_metrics_include: .* + filesystem_fs_types_exclude: ^(autofs|binfmt_misc|bpf|cgroup2?|configfs|debugfs|devpts|devtmpfs|fusectl|hugetlbfs|iso9660|mqueue|nsfs|overlay|proc|procfs|pstore|rpc_pipefs|securityfs|selinuxfs|squashfs|sysfs|tracefs)$ + filesystem_mount_points_exclude: ^/(dev|proc|run/credentials/.+|sys|var/lib/docker/.+)($|/) + filesystem_mount_timeout: 5s + ntp_ip_ttl: 1 + ntp_local_offset_tolerance: 1ms + ntp_max_distance: 3.46608s + ntp_protocol_version: 4 + ntp_server: 127.0.0.1 + netclass_ignored_devices: ^$ + netstat_fields: ^(.*_(InErrors|InErrs)|Ip_Forwarding|Ip(6|Ext)_(InOctets|OutOctets)|Icmp6?_(InMsgs|OutMsgs)|TcpExt_(Listen.*|Syncookies.*|TCPSynRetrans|TCPTimeouts)|Tcp_(ActiveOpens|InSegs|OutSegs|OutRsts|PassiveOpens|RetransSegs|CurrEstab)|Udp6?_(InDatagrams|OutDatagrams|NoPorts|RcvbufErrors|SndbufErrors))$ + powersupply_ignored_supplies: ^$ + runit_servic e_dir: /etc/service + supervisord_url: http://localhost:9001/RPC2 + systemd_unit_exclude: .+\.(automount|device|mount|scope|slice) + systemd_unit_include: .+ + tapestats_ignored_devices: ^$ + vmstat_fields: ^(oom_kill|pgpg|pswp|pg.*fault).* +traces: + configs: + - name: test_traces + automatic_logging: + backend: stdout + logs_instance_name: default + spans: true + load_balancing: null +logs: + configs: + - name: test_logs + positions: + sync_period: 10s + filename: /tmp/positions.yaml + ignore_invalid_yaml: false + scrape_configs: + - job_name: test + pipeline_stages: + - expression: \\temp\\Logs\\(?P.+?)\\ + regex: null + source: filename + static_configs: [] + target_config: + sync_period: 10s + stdin: false + diff --git a/docs/user/cookbook/dynamic-configuration/01_Basics/04_assets/integrations-node.yml b/docs/user/cookbook/dynamic-configuration/01_Basics/04_assets/integrations-node.yml new file mode 100644 index 000000000000..61f9cb2c8e4c --- /dev/null +++ b/docs/user/cookbook/dynamic-configuration/01_Basics/04_assets/integrations-node.yml @@ -0,0 +1 @@ +node_exporter: {} \ No newline at end of file diff --git a/docs/user/cookbook/dynamic-configuration/01_Basics/04_assets/integrations-redis.yml b/docs/user/cookbook/dynamic-configuration/01_Basics/04_assets/integrations-redis.yml new file mode 100644 index 000000000000..e3022ec607dd --- /dev/null +++ b/docs/user/cookbook/dynamic-configuration/01_Basics/04_assets/integrations-redis.yml @@ -0,0 +1,8 @@ +redis_exporter_configs: + - redis_addr: localhost:6379 + autoscrape: + metric_relabel_configs: + - source_labels: [__address__] + target_label: "banana" + replacement: "apple" + - redis_addr: localhost:6380 \ No newline at end of file diff --git a/docs/user/cookbook/dynamic-configuration/01_Basics/04_assets/logs-1.yml b/docs/user/cookbook/dynamic-configuration/01_Basics/04_assets/logs-1.yml new file mode 100644 index 000000000000..508fc09b9872 --- /dev/null +++ b/docs/user/cookbook/dynamic-configuration/01_Basics/04_assets/logs-1.yml @@ -0,0 +1,10 @@ +configs: + - name: test_logs + positions: + filename: /tmp/positions.yaml + scrape_configs: + - job_name: test + pipeline_stages: + - regex: + source: filename + expression: '\\temp\\Logs\\(?P.+?)\\' \ No newline at end of file diff --git a/docs/user/cookbook/dynamic-configuration/01_Basics/04_assets/metrics-1.yml b/docs/user/cookbook/dynamic-configuration/01_Basics/04_assets/metrics-1.yml new file mode 100644 index 000000000000..630e75672beb --- /dev/null +++ b/docs/user/cookbook/dynamic-configuration/01_Basics/04_assets/metrics-1.yml @@ -0,0 +1,6 @@ +configs: +- name: default +global: + scrape_interval: 60s + scrape_timeout: 20s +wal_directory: /tmp/grafana-agent-wal \ No newline at end of file diff --git a/docs/user/cookbook/dynamic-configuration/01_Basics/04_assets/metrics_instances-1.yml b/docs/user/cookbook/dynamic-configuration/01_Basics/04_assets/metrics_instances-1.yml new file mode 100644 index 000000000000..4b93d728201a --- /dev/null +++ b/docs/user/cookbook/dynamic-configuration/01_Basics/04_assets/metrics_instances-1.yml @@ -0,0 +1,6 @@ +name: instance1 +scrape_configs: + - job_name: instance1_job + static_configs: + - targets: + - localhost:4000 \ No newline at end of file diff --git a/docs/user/cookbook/dynamic-configuration/01_Basics/04_assets/metrics_instances-2.yml b/docs/user/cookbook/dynamic-configuration/01_Basics/04_assets/metrics_instances-2.yml new file mode 100644 index 000000000000..12a82ab97e9a --- /dev/null +++ b/docs/user/cookbook/dynamic-configuration/01_Basics/04_assets/metrics_instances-2.yml @@ -0,0 +1,6 @@ +name: instance2 +scrape_configs: + - job_name: instance2_job + static_configs: + - targets: + - localhost:5555 \ No newline at end of file diff --git a/docs/user/cookbook/dynamic-configuration/01_Basics/04_assets/server-1.yml b/docs/user/cookbook/dynamic-configuration/01_Basics/04_assets/server-1.yml new file mode 100644 index 000000000000..9bf1c55694a8 --- /dev/null +++ b/docs/user/cookbook/dynamic-configuration/01_Basics/04_assets/server-1.yml @@ -0,0 +1,2 @@ +http_listen_port: 12345 +log_level: info \ No newline at end of file diff --git a/docs/user/cookbook/dynamic-configuration/01_Basics/04_assets/traces-1.yml b/docs/user/cookbook/dynamic-configuration/01_Basics/04_assets/traces-1.yml new file mode 100644 index 000000000000..5696c9530ced --- /dev/null +++ b/docs/user/cookbook/dynamic-configuration/01_Basics/04_assets/traces-1.yml @@ -0,0 +1,6 @@ +configs: + - name: test_traces + automatic_logging: + backend: stdout + loki_name: default + spans: true \ No newline at end of file diff --git a/docs/user/cookbook/dynamic-configuration/01_Basics/04_config.yml b/docs/user/cookbook/dynamic-configuration/01_Basics/04_config.yml new file mode 100644 index 000000000000..cffdcacc05e5 --- /dev/null +++ b/docs/user/cookbook/dynamic-configuration/01_Basics/04_config.yml @@ -0,0 +1,2 @@ +template_paths: + - "file:///etc/grafana/04_assets" \ No newline at end of file diff --git a/docs/user/cookbook/dynamic-configuration/02_Templates/01_Looping.md b/docs/user/cookbook/dynamic-configuration/02_Templates/01_Looping.md new file mode 100644 index 000000000000..fbed2fb01268 --- /dev/null +++ b/docs/user/cookbook/dynamic-configuration/02_Templates/01_Looping.md @@ -0,0 +1,42 @@ +# 01 Basics of Templating + +The templating is based on the excellent [gomplate](https://docs.gomplate.ca/) library. Currently using a custom fork to allow loading gomplate as a library in addition to some new commands. This will NOT try to cover the full range of gomplate, would recommend reading the documentation for full knowledge. + +`docker run -v ${PWD}/:/etc/grafana grafana/agentctl:latest template-parse file:///etc/grafana/01_config.yml` + +## Looping + +[agent-1.yml](01_assets/agent-1.yml) + +```yaml +server: + http_listen_port: 12345 + log_level: debug +metrics: + wal_directory: /tmp/grafana-agent-normal + global: + scrape_interval: 60s + remote_write: + - url: https://prometheus-us-central1.grafana.net/api/prom/push + basic_auth: + username: 12345 + password: secretpassword + configs: + - name: default + {{ range slice "apple" "banana" "pear" }} + - name: {{ . }} + {{ end }} +``` + +The templating engine uses directives that are wrapped in `{{ command }}`, in the above the dynamic configuration engine will loop over the three values, and those values can be accessed by `{{ . }}` which means current value. + +## Final + +[final.yml](01_assets/final.yml) + +The final.yml contains 4 prometheus configs + +- default +- apple +- banana +- pear \ No newline at end of file diff --git a/docs/user/cookbook/dynamic-configuration/02_Templates/01_assets/agent-1.yml b/docs/user/cookbook/dynamic-configuration/02_Templates/01_assets/agent-1.yml new file mode 100644 index 000000000000..f7b060112cf5 --- /dev/null +++ b/docs/user/cookbook/dynamic-configuration/02_Templates/01_assets/agent-1.yml @@ -0,0 +1,17 @@ +server: + http_listen_port: 12345 + log_level: debug +metrics: + wal_directory: /tmp/grafana-agent-normal + global: + scrape_interval: 60s + remote_write: + - url: https://prometheus-us-central1.grafana.net/api/prom/push + basic_auth: + username: 12345 + password: secretpassword + configs: + - name: default + {{ range slice "apple" "banana" "pear" }} + - name: {{ . }} + {{ end }} \ No newline at end of file diff --git a/docs/user/cookbook/dynamic-configuration/02_Templates/01_assets/final.yml b/docs/user/cookbook/dynamic-configuration/02_Templates/01_assets/final.yml new file mode 100644 index 000000000000..0dcd0a9597aa --- /dev/null +++ b/docs/user/cookbook/dynamic-configuration/02_Templates/01_assets/final.yml @@ -0,0 +1,285 @@ +server: + http_listen_network: tcp + http_listen_address: "" + http_listen_port: 12345 + http_listen_conn_limit: 0 + grpc_listen_network: tcp + grpc_listen_address: "" + grpc_listen_port: 9095 + grpc_listen_conn_limit: 0 + http_tls_config: + cert_file: "" + key_file: "" + client_auth_type: "" + client_ca_file: "" + cipher_suites: [] + curve_preferences: [] + min_version: 0 + max_version: 0 + prefer_server_cipher_suites: false + grpc_tls_config: + cert_file: "" + key_file: "" + client_auth_type: "" + client_ca_file: "" + cipher_suites: [] + curve_preferences: [] + min_version: 0 + max_version: 0 + prefer_server_cipher_suites: false + register_instrumentation: true + graceful_shutdown_timeout: 30s + http_server_read_timeout: 30s + http_server_write_timeout: 30s + http_server_idle_timeout: 2m0s + grpc_server_max_recv_msg_size: 4194304 + grpc_server_max_send_msg_size: 4194304 + grpc_server_max_concurrent_streams: 100 + grpc_server_max_connection_idle: 2562047h47m16.854775807s + grpc_server_max_connection_age: 2562047h47m16.854775807s + grpc_server_max_connection_age_grace: 2562047h47m16.854775807s + grpc_server_keepalive_time: 2h0m0s + grpc_server_keepalive_timeout: 20s + grpc_server_min_time_between_pings: 5m0s + grpc_server_ping_without_stream_allowed: false + log_format: logfmt + log_level: debug + log_source_ips_enabled: false + log_source_ips_header: "" + log_source_ips_regex: "" + http_path_prefix: "" +metrics: + global: + scrape_interval: 1m + scrape_timeout: 10s + evaluation_interval: 1m + remote_write: + - url: https://prometheus-us-central1.grafana.net/api/prom/push + remote_timeout: 30s + name: default-a098e3 + basic_auth: + username: "12345" + password: + follow_redirects: true + queue_config: + capacity: 2500 + max_shards: 200 + min_shards: 1 + max_samples_per_send: 500 + batch_send_deadline: 5s + min_backoff: 30ms + max_backoff: 100ms + metadata_config: + send: true + send_interval: 1m + max_samples_per_send: 500 + wal_directory: /tmp/grafana-agent-normal + wal_cleanup_age: 12h0m0s + wal_cleanup_period: 30m0s + scraping_service: + enabled: false + reshard_interval: 1m0s + reshard_timeout: 30s + cluster_reshard_event_timeout: 30s + kvstore: + store: consul + prefix: configurations/ + consul: + host: localhost:8500 + acl_token: + http_client_timeout: 20s + consistent_reads: false + watch_rate_limit: 1 + watch_burst_size: 1 + etcd: + endpoints: [] + dial_timeout: 10s + max_retries: 10 + tls_enabled: false + tls_cert_path: "" + tls_key_path: "" + tls_ca_path: "" + tls_server_name: "" + tls_insecure_skip_verify: false + username: "" + password: + multi: + primary: "" + secondary: "" + mirror_enabled: false + mirror_timeout: 2s + lifecycler: + ring: + kvstore: + store: consul + prefix: collectors/ + consul: + host: localhost:8500 + acl_token: + http_client_timeout: 20s + consistent_reads: false + watch_rate_limit: 1 + watch_burst_size: 1 + etcd: + endpoints: [] + dial_timeout: 10s + max_retries: 10 + tls_enabled: false + tls_cert_path: "" + tls_key_path: "" + tls_ca_path: "" + tls_server_name: "" + tls_insecure_skip_verify: false + username: "" + password: + multi: + primary: "" + secondary: "" + mirror_enabled: false + mirror_timeout: 2s + heartbeat_timeout: 1m0s + replication_factor: 3 + zone_awareness_enabled: false + num_tokens: 128 + heartbeat_period: 5s + observe_period: 0s + join_after: 0s + min_ready_duration: 1m0s + interface_names: + - eth0 + - en0 + final_sleep: 30s + tokens_file_path: "" + availability_zone: "" + unregister_on_shutdown: true + address: "" + port: 0 + id: 4d5f79f1dd4d + dangerous_allow_reading_files: false + scraping_service_client: + grpc_client_config: + max_recv_msg_size: 104857600 + max_send_msg_size: 16777216 + grpc_compression: "" + rate_limit: 0 + rate_limit_burst: 0 + backoff_on_ratelimits: false + backoff_config: + min_period: 100ms + max_period: 10s + max_retries: 10 + tls_enabled: false + tls_cert_path: "" + tls_key_path: "" + tls_ca_path: "" + tls_server_name: "" + tls_insecure_skip_verify: false + configs: + - name: default + remote_write: + - url: https://prometheus-us-central1.grafana.net/api/prom/push + remote_timeout: 30s + name: default-a098e3 + basic_auth: + username: "12345" + password: + follow_redirects: true + queue_config: + capacity: 2500 + max_shards: 200 + min_shards: 1 + max_samples_per_send: 500 + batch_send_deadline: 5s + min_backoff: 30ms + max_backoff: 100ms + metadata_config: + send: true + send_interval: 1m + max_samples_per_send: 500 + wal_truncate_frequency: 1h0m0s + min_wal_time: 5m0s + max_wal_time: 4h0m0s + remote_flush_deadline: 1m0s + - name: apple + remote_write: + - url: https://prometheus-us-central1.grafana.net/api/prom/push + remote_timeout: 30s + name: default-a098e3 + basic_auth: + username: "12345" + password: + follow_redirects: true + queue_config: + capacity: 2500 + max_shards: 200 + min_shards: 1 + max_samples_per_send: 500 + batch_send_deadline: 5s + min_backoff: 30ms + max_backoff: 100ms + metadata_config: + send: true + send_interval: 1m + max_samples_per_send: 500 + wal_truncate_frequency: 1h0m0s + min_wal_time: 5m0s + max_wal_time: 4h0m0s + remote_flush_deadline: 1m0s + - name: banana + remote_write: + - url: https://prometheus-us-central1.grafana.net/api/prom/push + remote_timeout: 30s + name: default-a098e3 + basic_auth: + username: "12345" + password: + follow_redirects: true + queue_config: + capacity: 2500 + max_shards: 200 + min_shards: 1 + max_samples_per_send: 500 + batch_send_deadline: 5s + min_backoff: 30ms + max_backoff: 100ms + metadata_config: + send: true + send_interval: 1m + max_samples_per_send: 500 + wal_truncate_frequency: 1h0m0s + min_wal_time: 5m0s + max_wal_time: 4h0m0s + remote_flush_deadline: 1m0s + - name: pear + remote_write: + - url: https://prometheus-us-central1.grafana.net/api/prom/push + remote_timeout: 30s + name: default-a098e3 + basic_auth: + username: "12345" + password: + follow_redirects: true + queue_config: + capacity: 2500 + max_shards: 200 + min_shards: 1 + max_samples_per_send: 500 + batch_send_deadline: 5s + min_backoff: 30ms + max_backoff: 100ms + metadata_config: + send: true + send_interval: 1m + max_samples_per_send: 500 + wal_truncate_frequency: 1h0m0s + min_wal_time: 5m0s + max_wal_time: 4h0m0s + remote_flush_deadline: 1m0s + instance_restart_backoff: 5s + instance_mode: shared +integrations: + scrape_integrations: true + integration_restart_backoff: 5s + replace_instance_label: true + use_hostname_label: true + diff --git a/docs/user/cookbook/dynamic-configuration/02_Templates/01_config.yml b/docs/user/cookbook/dynamic-configuration/02_Templates/01_config.yml new file mode 100644 index 000000000000..ab67edcade05 --- /dev/null +++ b/docs/user/cookbook/dynamic-configuration/02_Templates/01_config.yml @@ -0,0 +1,2 @@ +template_paths: + - "file:///etc/grafana/01_assets" \ No newline at end of file diff --git a/docs/user/cookbook/dynamic-configuration/02_Templates/02_Datasources.md b/docs/user/cookbook/dynamic-configuration/02_Templates/02_Datasources.md new file mode 100644 index 000000000000..77004f230ab1 --- /dev/null +++ b/docs/user/cookbook/dynamic-configuration/02_Templates/02_Datasources.md @@ -0,0 +1,50 @@ +# 02 Datasources + +Datasources are a powerful concept in gomplate. They allow you to reach out to other files, systems and resources to pull data. + +`docker run -v ${PWD}/:/etc/grafana grafana/agentctl:latest template-parse file:///etc/grafana/02_config.yml` + + +## Config + +The [config.yml](02_config.yml) adds a new field `sources`. Sources can be any number of things defined in the gomplate [datasources](https://docs.gomplate.ca/datasources/) documentation. In this example using fruit. + +```yaml +template_paths: + - "file:///etc/grafana/01_assets" +datasources: + - name: fruit + url: "file://etc/grafana/01_assets/fruit.json" +``` + +[fruit.json](02_assets/fruit.json) + +```json +["mango","peach","orange"] +``` + +## Usage + +[agent-1.yml](02_assets/agent-1.yml) + +```yaml +server: + http_listen_port: 12345 + log_level: debug +metrics: + wal_directory: /tmp/grafana-agent-normal + global: + scrape_interval: 60s + remote_write: + - url: https://prometheus-us-central1.grafana.net/api/prom/push + basic_auth: + username: 12345 + password: secretpassword + configs: + - name: default + {{ range (datasource "fruit") }} + - name: {{ . }} + {{ end }} +``` + +A Datasource is reference by name and in this case it is an array and used exactly like the looping example. \ No newline at end of file diff --git a/docs/user/cookbook/dynamic-configuration/02_Templates/02_assets/agent-1.yml b/docs/user/cookbook/dynamic-configuration/02_Templates/02_assets/agent-1.yml new file mode 100644 index 000000000000..fdae8e01771e --- /dev/null +++ b/docs/user/cookbook/dynamic-configuration/02_Templates/02_assets/agent-1.yml @@ -0,0 +1,17 @@ +server: + http_listen_port: 12345 + log_level: debug +metrics: + wal_directory: /tmp/grafana-agent-normal + global: + scrape_interval: 60s + remote_write: + - url: https://prometheus-us-central1.grafana.net/api/prom/push + basic_auth: + username: 12345 + password: secretpassword + configs: + - name: default + {{ range (datasource "fruit") }} + - name: {{ . }} + {{ end }} \ No newline at end of file diff --git a/docs/user/cookbook/dynamic-configuration/02_Templates/02_assets/final.yml b/docs/user/cookbook/dynamic-configuration/02_Templates/02_assets/final.yml new file mode 100644 index 000000000000..94dea73ceda3 --- /dev/null +++ b/docs/user/cookbook/dynamic-configuration/02_Templates/02_assets/final.yml @@ -0,0 +1,285 @@ +server: + http_listen_network: tcp + http_listen_address: "" + http_listen_port: 12345 + http_listen_conn_limit: 0 + grpc_listen_network: tcp + grpc_listen_address: "" + grpc_listen_port: 9095 + grpc_listen_conn_limit: 0 + http_tls_config: + cert_file: "" + key_file: "" + client_auth_type: "" + client_ca_file: "" + cipher_suites: [] + curve_preferences: [] + min_version: 0 + max_version: 0 + prefer_server_cipher_suites: false + grpc_tls_config: + cert_file: "" + key_file: "" + client_auth_type: "" + client_ca_file: "" + cipher_suites: [] + curve_preferences: [] + min_version: 0 + max_version: 0 + prefer_server_cipher_suites: false + register_instrumentation: true + graceful_shutdown_timeout: 30s + http_server_read_timeout: 30s + http_server_write_timeout: 30s + http_server_idle_timeout: 2m0s + grpc_server_max_recv_msg_size: 4194304 + grpc_server_max_send_msg_size: 4194304 + grpc_server_max_concurrent_streams: 100 + grpc_server_max_connection_idle: 2562047h47m16.854775807s + grpc_server_max_connection_age: 2562047h47m16.854775807s + grpc_server_max_connection_age_grace: 2562047h47m16.854775807s + grpc_server_keepalive_time: 2h0m0s + grpc_server_keepalive_timeout: 20s + grpc_server_min_time_between_pings: 5m0s + grpc_server_ping_without_stream_allowed: false + log_format: logfmt + log_level: debug + log_source_ips_enabled: false + log_source_ips_header: "" + log_source_ips_regex: "" + http_path_prefix: "" +metrics: + global: + scrape_interval: 1m + scrape_timeout: 10s + evaluation_interval: 1m + remote_write: + - url: https://prometheus-us-central1.grafana.net/api/prom/push + remote_timeout: 30s + name: default-a098e3 + basic_auth: + username: "12345" + password: + follow_redirects: true + queue_config: + capacity: 2500 + max_shards: 200 + min_shards: 1 + max_samples_per_send: 500 + batch_send_deadline: 5s + min_backoff: 30ms + max_backoff: 100ms + metadata_config: + send: true + send_interval: 1m + max_samples_per_send: 500 + wal_directory: /tmp/grafana-agent-normal + wal_cleanup_age: 12h0m0s + wal_cleanup_period: 30m0s + scraping_service: + enabled: false + reshard_interval: 1m0s + reshard_timeout: 30s + cluster_reshard_event_timeout: 30s + kvstore: + store: consul + prefix: configurations/ + consul: + host: localhost:8500 + acl_token: + http_client_timeout: 20s + consistent_reads: false + watch_rate_limit: 1 + watch_burst_size: 1 + etcd: + endpoints: [] + dial_timeout: 10s + max_retries: 10 + tls_enabled: false + tls_cert_path: "" + tls_key_path: "" + tls_ca_path: "" + tls_server_name: "" + tls_insecure_skip_verify: false + username: "" + password: + multi: + primary: "" + secondary: "" + mirror_enabled: false + mirror_timeout: 2s + lifecycler: + ring: + kvstore: + store: consul + prefix: collectors/ + consul: + host: localhost:8500 + acl_token: + http_client_timeout: 20s + consistent_reads: false + watch_rate_limit: 1 + watch_burst_size: 1 + etcd: + endpoints: [] + dial_timeout: 10s + max_retries: 10 + tls_enabled: false + tls_cert_path: "" + tls_key_path: "" + tls_ca_path: "" + tls_server_name: "" + tls_insecure_skip_verify: false + username: "" + password: + multi: + primary: "" + secondary: "" + mirror_enabled: false + mirror_timeout: 2s + heartbeat_timeout: 1m0s + replication_factor: 3 + zone_awareness_enabled: false + num_tokens: 128 + heartbeat_period: 5s + observe_period: 0s + join_after: 0s + min_ready_duration: 1m0s + interface_names: + - eth0 + - en0 + final_sleep: 30s + tokens_file_path: "" + availability_zone: "" + unregister_on_shutdown: true + address: "" + port: 0 + id: 7fdd8f46a28a + dangerous_allow_reading_files: false + scraping_service_client: + grpc_client_config: + max_recv_msg_size: 104857600 + max_send_msg_size: 16777216 + grpc_compression: "" + rate_limit: 0 + rate_limit_burst: 0 + backoff_on_ratelimits: false + backoff_config: + min_period: 100ms + max_period: 10s + max_retries: 10 + tls_enabled: false + tls_cert_path: "" + tls_key_path: "" + tls_ca_path: "" + tls_server_name: "" + tls_insecure_skip_verify: false + configs: + - name: default + remote_write: + - url: https://prometheus-us-central1.grafana.net/api/prom/push + remote_timeout: 30s + name: default-a098e3 + basic_auth: + username: "12345" + password: + follow_redirects: true + queue_config: + capacity: 2500 + max_shards: 200 + min_shards: 1 + max_samples_per_send: 500 + batch_send_deadline: 5s + min_backoff: 30ms + max_backoff: 100ms + metadata_config: + send: true + send_interval: 1m + max_samples_per_send: 500 + wal_truncate_frequency: 1h0m0s + min_wal_time: 5m0s + max_wal_time: 4h0m0s + remote_flush_deadline: 1m0s + - name: mango + remote_write: + - url: https://prometheus-us-central1.grafana.net/api/prom/push + remote_timeout: 30s + name: default-a098e3 + basic_auth: + username: "12345" + password: + follow_redirects: true + queue_config: + capacity: 2500 + max_shards: 200 + min_shards: 1 + max_samples_per_send: 500 + batch_send_deadline: 5s + min_backoff: 30ms + max_backoff: 100ms + metadata_config: + send: true + send_interval: 1m + max_samples_per_send: 500 + wal_truncate_frequency: 1h0m0s + min_wal_time: 5m0s + max_wal_time: 4h0m0s + remote_flush_deadline: 1m0s + - name: peach + remote_write: + - url: https://prometheus-us-central1.grafana.net/api/prom/push + remote_timeout: 30s + name: default-a098e3 + basic_auth: + username: "12345" + password: + follow_redirects: true + queue_config: + capacity: 2500 + max_shards: 200 + min_shards: 1 + max_samples_per_send: 500 + batch_send_deadline: 5s + min_backoff: 30ms + max_backoff: 100ms + metadata_config: + send: true + send_interval: 1m + max_samples_per_send: 500 + wal_truncate_frequency: 1h0m0s + min_wal_time: 5m0s + max_wal_time: 4h0m0s + remote_flush_deadline: 1m0s + - name: orange + remote_write: + - url: https://prometheus-us-central1.grafana.net/api/prom/push + remote_timeout: 30s + name: default-a098e3 + basic_auth: + username: "12345" + password: + follow_redirects: true + queue_config: + capacity: 2500 + max_shards: 200 + min_shards: 1 + max_samples_per_send: 500 + batch_send_deadline: 5s + min_backoff: 30ms + max_backoff: 100ms + metadata_config: + send: true + send_interval: 1m + max_samples_per_send: 500 + wal_truncate_frequency: 1h0m0s + min_wal_time: 5m0s + max_wal_time: 4h0m0s + remote_flush_deadline: 1m0s + instance_restart_backoff: 5s + instance_mode: shared +integrations: + scrape_integrations: true + integration_restart_backoff: 5s + replace_instance_label: true + use_hostname_label: true + diff --git a/docs/user/cookbook/dynamic-configuration/02_Templates/02_assets/fruit.json b/docs/user/cookbook/dynamic-configuration/02_Templates/02_assets/fruit.json new file mode 100644 index 000000000000..c8c10bbfcdeb --- /dev/null +++ b/docs/user/cookbook/dynamic-configuration/02_Templates/02_assets/fruit.json @@ -0,0 +1 @@ +["mango","peach","orange"] \ No newline at end of file diff --git a/docs/user/cookbook/dynamic-configuration/02_Templates/02_config.yml b/docs/user/cookbook/dynamic-configuration/02_Templates/02_config.yml new file mode 100644 index 000000000000..9c77d6994f1f --- /dev/null +++ b/docs/user/cookbook/dynamic-configuration/02_Templates/02_config.yml @@ -0,0 +1,5 @@ +template_paths: + - "file:///etc/grafana/02_assets" +sources: + - name: fruit + url: "file:///etc/grafana/02_assets/fruit.json" \ No newline at end of file diff --git a/docs/user/cookbook/dynamic-configuration/02_Templates/03_Datasource_and_Objects.md b/docs/user/cookbook/dynamic-configuration/02_Templates/03_Datasource_and_Objects.md new file mode 100644 index 000000000000..ba12ddd3c350 --- /dev/null +++ b/docs/user/cookbook/dynamic-configuration/02_Templates/03_Datasource_and_Objects.md @@ -0,0 +1,86 @@ +# 02 Datasources + +Datasources can also access objects. + +`docker run -v ${PWD}/:/etc/grafana grafana/agentctl:latest template-parse file:///etc/grafana/03_config.yml` + + +## Config + +The [config.yml](02_config.yml) adds a new field `sources`. Sources can be any number of things defined in the gomplate [datasources](https://docs.gomplate.ca/datasources/) documentation. In this example using fruit. + +```yaml +template_paths: + - "file:///etc/grafana/03_assets" +datasources: + - name: computers + url: "file:///etc/grafana/03_assets/computers.json" +``` + +[computers.json](03_assets/computers.json) + +```json +[ + { + "name": "webhost1", + "ip" : "192.168.1.1", + "enabled": true + }, + { + "name": "webhost2", + "ip" : "192.168.1.2", + "enabled": false + + }, + { + "name": "webhost3", + "ip" : "192.168.1.3", + "enabled": true + } +] +``` + +## Usage + +[agent-1.yml](02_assets/agent-1.yml) + +```yaml +server: + http_listen_port: 12345 + log_level: debug +metrics: + wal_directory: /tmp/grafana-agent-normal + global: + scrape_interval: 60s + remote_write: + - url: https://prometheus-us-central1.grafana.net/api/prom/push + basic_auth: + username: 12345 + password: secretpassword + configs: + - name: default + # Check for length so that if it is 0, we dont write any scrape configs + {{ if $length := len (datasource "computers") }} + {{ if gt $length 0 }} + scrape_configs: + {{ end }} + {{ end }} + {{ range (datasource "computers") }} + # Only add if the computers are enabled + # the . references our current object + {{ if eq .enabled true }} + - job_name: {{ .name }} + static_configs: + - targets: + - {{ .ip }} + {{ end }} + {{ end }} +``` + +This is a much more complex example, in the above we are doing: + +- comparisons +- creating and setting variables +- looping over objects + +The final output will only list `webhost1` and `webhost3` since `webhost2` is not enabled. \ No newline at end of file diff --git a/docs/user/cookbook/dynamic-configuration/02_Templates/03_assets/agent-1.yml b/docs/user/cookbook/dynamic-configuration/02_Templates/03_assets/agent-1.yml new file mode 100644 index 000000000000..d3f0a5beab5b --- /dev/null +++ b/docs/user/cookbook/dynamic-configuration/02_Templates/03_assets/agent-1.yml @@ -0,0 +1,30 @@ +server: + http_listen_port: 12345 + log_level: debug +metrics: + wal_directory: /tmp/grafana-agent-normal + global: + scrape_interval: 60s + remote_write: + - url: https://prometheus-us-central1.grafana.net/api/prom/push + basic_auth: + username: 12345 + password: secretpassword + configs: + - name: default + # Check for length so that if it is 0, we dont write any scrape configs + {{ if $length := len (datasource "computers") }} + {{ if gt $length 0 }} + scrape_configs: + {{ end }} + {{ end }} + {{ range (datasource "computers") }} + # Only add if the computers are enabled + # the . references our current object + {{ if eq .enabled true }} + - job_name: {{ .name }} + static_configs: + - targets: + - {{ .ip }} + {{ end }} + {{ end }} \ No newline at end of file diff --git a/docs/user/cookbook/dynamic-configuration/02_Templates/03_assets/computers.json b/docs/user/cookbook/dynamic-configuration/02_Templates/03_assets/computers.json new file mode 100644 index 000000000000..d1dc2c31ff6a --- /dev/null +++ b/docs/user/cookbook/dynamic-configuration/02_Templates/03_assets/computers.json @@ -0,0 +1,18 @@ +[ + { + "name": "webhost1", + "ip" : "192.168.1.1", + "enabled": true + }, + { + "name": "webhost2", + "ip" : "192.168.1.2", + "enabled": false + + }, + { + "name": "webhost3", + "ip" : "192.168.1.3", + "enabled": true + } +] \ No newline at end of file diff --git a/docs/user/cookbook/dynamic-configuration/02_Templates/03_assets/final.yml b/docs/user/cookbook/dynamic-configuration/02_Templates/03_assets/final.yml new file mode 100644 index 000000000000..34223781af39 --- /dev/null +++ b/docs/user/cookbook/dynamic-configuration/02_Templates/03_assets/final.yml @@ -0,0 +1,231 @@ +server: + http_listen_network: tcp + http_listen_address: "" + http_listen_port: 12345 + http_listen_conn_limit: 0 + grpc_listen_network: tcp + grpc_listen_address: "" + grpc_listen_port: 9095 + grpc_listen_conn_limit: 0 + http_tls_config: + cert_file: "" + key_file: "" + client_auth_type: "" + client_ca_file: "" + cipher_suites: [] + curve_preferences: [] + min_version: 0 + max_version: 0 + prefer_server_cipher_suites: false + grpc_tls_config: + cert_file: "" + key_file: "" + client_auth_type: "" + client_ca_file: "" + cipher_suites: [] + curve_preferences: [] + min_version: 0 + max_version: 0 + prefer_server_cipher_suites: false + register_instrumentation: true + graceful_shutdown_timeout: 30s + http_server_read_timeout: 30s + http_server_write_timeout: 30s + http_server_idle_timeout: 2m0s + grpc_server_max_recv_msg_size: 4194304 + grpc_server_max_send_msg_size: 4194304 + grpc_server_max_concurrent_streams: 100 + grpc_server_max_connection_idle: 2562047h47m16.854775807s + grpc_server_max_connection_age: 2562047h47m16.854775807s + grpc_server_max_connection_age_grace: 2562047h47m16.854775807s + grpc_server_keepalive_time: 2h0m0s + grpc_server_keepalive_timeout: 20s + grpc_server_min_time_between_pings: 5m0s + grpc_server_ping_without_stream_allowed: false + log_format: logfmt + log_level: debug + log_source_ips_enabled: false + log_source_ips_header: "" + log_source_ips_regex: "" + http_path_prefix: "" +metrics: + global: + scrape_interval: 1m + scrape_timeout: 10s + evaluation_interval: 1m + remote_write: + - url: https://prometheus-us-central1.grafana.net/api/prom/push + remote_timeout: 30s + name: default-a098e3 + basic_auth: + username: "12345" + password: + follow_redirects: true + queue_config: + capacity: 2500 + max_shards: 200 + min_shards: 1 + max_samples_per_send: 500 + batch_send_deadline: 5s + min_backoff: 30ms + max_backoff: 100ms + metadata_config: + send: true + send_interval: 1m + max_samples_per_send: 500 + wal_directory: /tmp/grafana-agent-normal + wal_cleanup_age: 12h0m0s + wal_cleanup_period: 30m0s + scraping_service: + enabled: false + reshard_interval: 1m0s + reshard_timeout: 30s + cluster_reshard_event_timeout: 30s + kvstore: + store: consul + prefix: configurations/ + consul: + host: localhost:8500 + acl_token: + http_client_timeout: 20s + consistent_reads: false + watch_rate_limit: 1 + watch_burst_size: 1 + etcd: + endpoints: [] + dial_timeout: 10s + max_retries: 10 + tls_enabled: false + tls_cert_path: "" + tls_key_path: "" + tls_ca_path: "" + tls_server_name: "" + tls_insecure_skip_verify: false + username: "" + password: + multi: + primary: "" + secondary: "" + mirror_enabled: false + mirror_timeout: 2s + lifecycler: + ring: + kvstore: + store: consul + prefix: collectors/ + consul: + host: localhost:8500 + acl_token: + http_client_timeout: 20s + consistent_reads: false + watch_rate_limit: 1 + watch_burst_size: 1 + etcd: + endpoints: [] + dial_timeout: 10s + max_retries: 10 + tls_enabled: false + tls_cert_path: "" + tls_key_path: "" + tls_ca_path: "" + tls_server_name: "" + tls_insecure_skip_verify: false + username: "" + password: + multi: + primary: "" + secondary: "" + mirror_enabled: false + mirror_timeout: 2s + heartbeat_timeout: 1m0s + replication_factor: 3 + zone_awareness_enabled: false + num_tokens: 128 + heartbeat_period: 5s + observe_period: 0s + join_after: 0s + min_ready_duration: 1m0s + interface_names: + - eth0 + - en0 + final_sleep: 30s + tokens_file_path: "" + availability_zone: "" + unregister_on_shutdown: true + address: "" + port: 0 + id: 7538ea8d493e + dangerous_allow_reading_files: false + scraping_service_client: + grpc_client_config: + max_recv_msg_size: 104857600 + max_send_msg_size: 16777216 + grpc_compression: "" + rate_limit: 0 + rate_limit_burst: 0 + backoff_on_ratelimits: false + backoff_config: + min_period: 100ms + max_period: 10s + max_retries: 10 + tls_enabled: false + tls_cert_path: "" + tls_key_path: "" + tls_ca_path: "" + tls_server_name: "" + tls_insecure_skip_verify: false + configs: + - name: default + scrape_configs: + - job_name: webhost1 + honor_timestamps: true + scrape_interval: 1m + scrape_timeout: 10s + metrics_path: /metrics + scheme: http + follow_redirects: true + static_configs: + - targets: + - 192.168.1.1 + - job_name: webhost3 + honor_timestamps: true + scrape_interval: 1m + scrape_timeout: 10s + metrics_path: /metrics + scheme: http + follow_redirects: true + static_configs: + - targets: + - 192.168.1.3 + remote_write: + - url: https://prometheus-us-central1.grafana.net/api/prom/push + remote_timeout: 30s + name: default-a098e3 + basic_auth: + username: "12345" + password: + follow_redirects: true + queue_config: + capacity: 2500 + max_shards: 200 + min_shards: 1 + max_samples_per_send: 500 + batch_send_deadline: 5s + min_backoff: 30ms + max_backoff: 100ms + metadata_config: + send: true + send_interval: 1m + max_samples_per_send: 500 + wal_truncate_frequency: 1h0m0s + min_wal_time: 5m0s + max_wal_time: 4h0m0s + remote_flush_deadline: 1m0s + instance_restart_backoff: 5s + instance_mode: shared +integrations: + scrape_integrations: true + integration_restart_backoff: 5s + replace_instance_label: true + use_hostname_label: true + diff --git a/docs/user/cookbook/dynamic-configuration/02_Templates/03_config.yml b/docs/user/cookbook/dynamic-configuration/02_Templates/03_config.yml new file mode 100644 index 000000000000..e261f94bae5f --- /dev/null +++ b/docs/user/cookbook/dynamic-configuration/02_Templates/03_config.yml @@ -0,0 +1,5 @@ +template_paths: + - "file:///etc/grafana/03_assets" +datasources: + - name: computers + url: "file:///etc/grafana/03_assets/computers.json" \ No newline at end of file diff --git a/docs/user/cookbook/dynamic-configuration/03_Advanced_Datasources/01_AWS.md b/docs/user/cookbook/dynamic-configuration/03_Advanced_Datasources/01_AWS.md new file mode 100644 index 000000000000..0d0b06e63613 --- /dev/null +++ b/docs/user/cookbook/dynamic-configuration/03_Advanced_Datasources/01_AWS.md @@ -0,0 +1,39 @@ +# 01 AWS + +The AWS datasource assumes that you have appropriate credentials and environment variables set to access AWS resources. The custom fork of gomplate adds a new command to the existing AWS commands. + +Unfortunately there is not a specific docker command but generic examples are below. + +## Looping + +[agent-1.yml](01_assets/agent-1.yml) + +```yaml +server: + http_listen_port: 12345 + log_level: debug +metrics: + wal_directory: /tmp/grafana-agent-normal + global: + scrape_interval: 60s + remote_write: + - url: https://prometheus-us-central1.grafana.net/api/prom/push + basic_auth: + username: 12345 + password: secretpassword + configs: + - name: default + scrape_configs: + {{ range $index , $value := aws.EC2Query "tag:service=webhost" -}} + - job_name: {{ $value.InstanceId }} + static_configs: + - targets: + - {{ $value.PrivateDnsName }} + {{ end -}} +``` + +The `aws.EC2Query` command is a new command added for Grafana Agent and takes a string in the [DescribeInstances](https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DescribeInstances.html) format + +## Final + +[final.yml](01_assets/final.yml) diff --git a/docs/user/cookbook/dynamic-configuration/03_Advanced_Datasources/01_assets/agent-1.yml b/docs/user/cookbook/dynamic-configuration/03_Advanced_Datasources/01_assets/agent-1.yml new file mode 100644 index 000000000000..aeeb9b165e14 --- /dev/null +++ b/docs/user/cookbook/dynamic-configuration/03_Advanced_Datasources/01_assets/agent-1.yml @@ -0,0 +1,21 @@ +server: + http_listen_port: 12345 + log_level: debug +metrics: + wal_directory: /tmp/grafana-agent-normal + global: + scrape_interval: 60s + remote_write: + - url: https://prometheus-us-central1.grafana.net/api/prom/push + basic_auth: + username: 12345 + password: secretpassword + configs: + - name: default + scrape_configs: + {{ range $index , $value := aws.EC2Query "tag:service=webhost" -}} + - job_name: {{ $value.InstanceId }} + static_configs: + - targets: + - {{ $value.PrivateDnsName }} + {{ end -}} \ No newline at end of file diff --git a/docs/user/cookbook/dynamic-configuration/03_Advanced_Datasources/01_assets/final.yml b/docs/user/cookbook/dynamic-configuration/03_Advanced_Datasources/01_assets/final.yml new file mode 100644 index 000000000000..07a4108aba2f --- /dev/null +++ b/docs/user/cookbook/dynamic-configuration/03_Advanced_Datasources/01_assets/final.yml @@ -0,0 +1,220 @@ +server: + http_listen_network: tcp + http_listen_address: "" + http_listen_port: 12345 + http_listen_conn_limit: 0 + grpc_listen_network: tcp + grpc_listen_address: "" + grpc_listen_port: 9095 + grpc_listen_conn_limit: 0 + http_tls_config: + cert_file: "" + key_file: "" + client_auth_type: "" + client_ca_file: "" + cipher_suites: [] + curve_preferences: [] + min_version: 0 + max_version: 0 + prefer_server_cipher_suites: false + grpc_tls_config: + cert_file: "" + key_file: "" + client_auth_type: "" + client_ca_file: "" + cipher_suites: [] + curve_preferences: [] + min_version: 0 + max_version: 0 + prefer_server_cipher_suites: false + register_instrumentation: true + graceful_shutdown_timeout: 30s + http_server_read_timeout: 30s + http_server_write_timeout: 30s + http_server_idle_timeout: 2m0s + grpc_server_max_recv_msg_size: 4194304 + grpc_server_max_send_msg_size: 4194304 + grpc_server_max_concurrent_streams: 100 + grpc_server_max_connection_idle: 2562047h47m16.854775807s + grpc_server_max_connection_age: 2562047h47m16.854775807s + grpc_server_max_connection_age_grace: 2562047h47m16.854775807s + grpc_server_keepalive_time: 2h0m0s + grpc_server_keepalive_timeout: 20s + grpc_server_min_time_between_pings: 5m0s + grpc_server_ping_without_stream_allowed: false + log_format: logfmt + log_level: debug + log_source_ips_enabled: false + log_source_ips_header: "" + log_source_ips_regex: "" + http_path_prefix: "" +metrics: + global: + scrape_interval: 1m + scrape_timeout: 10s + evaluation_interval: 1m + remote_write: + - url: https://prometheus-us-central1.grafana.net/api/prom/push + remote_timeout: 30s + name: default-a098e3 + basic_auth: + username: "12345" + password: + follow_redirects: true + queue_config: + capacity: 2500 + max_shards: 200 + min_shards: 1 + max_samples_per_send: 500 + batch_send_deadline: 5s + min_backoff: 30ms + max_backoff: 100ms + metadata_config: + send: true + send_interval: 1m + max_samples_per_send: 500 + wal_directory: /tmp/grafana-agent-normal + wal_cleanup_age: 12h0m0s + wal_cleanup_period: 30m0s + scraping_service: + enabled: false + reshard_interval: 1m0s + reshard_timeout: 30s + cluster_reshard_event_timeout: 30s + kvstore: + store: consul + prefix: configurations/ + consul: + host: localhost:8500 + acl_token: + http_client_timeout: 20s + consistent_reads: false + watch_rate_limit: 1 + watch_burst_size: 1 + etcd: + endpoints: [] + dial_timeout: 10s + max_retries: 10 + tls_enabled: false + tls_cert_path: "" + tls_key_path: "" + tls_ca_path: "" + tls_server_name: "" + tls_insecure_skip_verify: false + username: "" + password: + multi: + primary: "" + secondary: "" + mirror_enabled: false + mirror_timeout: 2s + lifecycler: + ring: + kvstore: + store: consul + prefix: collectors/ + consul: + host: localhost:8500 + acl_token: + http_client_timeout: 20s + consistent_reads: false + watch_rate_limit: 1 + watch_burst_size: 1 + etcd: + endpoints: [] + dial_timeout: 10s + max_retries: 10 + tls_enabled: false + tls_cert_path: "" + tls_key_path: "" + tls_ca_path: "" + tls_server_name: "" + tls_insecure_skip_verify: false + username: "" + password: + multi: + primary: "" + secondary: "" + mirror_enabled: false + mirror_timeout: 2s + heartbeat_timeout: 1m0s + replication_factor: 3 + zone_awareness_enabled: false + num_tokens: 128 + heartbeat_period: 5s + observe_period: 0s + join_after: 0s + min_ready_duration: 1m0s + interface_names: + - eth0 + - en0 + final_sleep: 30s + tokens_file_path: "" + availability_zone: "" + unregister_on_shutdown: true + address: "" + port: 0 + id: juniper.local + dangerous_allow_reading_files: false + scraping_service_client: + grpc_client_config: + max_recv_msg_size: 104857600 + max_send_msg_size: 16777216 + grpc_compression: "" + rate_limit: 0 + rate_limit_burst: 0 + backoff_on_ratelimits: false + backoff_config: + min_period: 100ms + max_period: 10s + max_retries: 10 + tls_enabled: false + tls_cert_path: "" + tls_key_path: "" + tls_ca_path: "" + tls_server_name: "" + tls_insecure_skip_verify: false + configs: + - name: default + scrape_configs: + - job_name: i-1234512345e + honor_timestamps: true + scrape_interval: 1m + scrape_timeout: 10s + metrics_path: /metrics + scheme: http + follow_redirects: true + static_configs: + - targets: + - ip-192-168-1-1.us-east-2.compute.internal + remote_write: + - url: https://prometheus-us-central1.grafana.net/api/prom/push + remote_timeout: 30s + name: default-a098e3 + basic_auth: + username: "12345" + password: + follow_redirects: true + queue_config: + capacity: 2500 + max_shards: 200 + min_shards: 1 + max_samples_per_send: 500 + batch_send_deadline: 5s + min_backoff: 30ms + max_backoff: 100ms + metadata_config: + send: true + send_interval: 1m + max_samples_per_send: 500 + wal_truncate_frequency: 1h0m0s + min_wal_time: 5m0s + max_wal_time: 4h0m0s + remote_flush_deadline: 1m0s + instance_restart_backoff: 5s + instance_mode: shared +integrations: + scrape_integrations: true + integration_restart_backoff: 5s + replace_instance_label: true + use_hostname_label: true diff --git a/docs/user/cookbook/dynamic-configuration/03_Advanced_Datasources/01_config.yml b/docs/user/cookbook/dynamic-configuration/03_Advanced_Datasources/01_config.yml new file mode 100644 index 000000000000..ab67edcade05 --- /dev/null +++ b/docs/user/cookbook/dynamic-configuration/03_Advanced_Datasources/01_config.yml @@ -0,0 +1,2 @@ +template_paths: + - "file:///etc/grafana/01_assets" \ No newline at end of file diff --git a/docs/user/cookbook/dynamic-configuration/README.md b/docs/user/cookbook/dynamic-configuration/README.md new file mode 100644 index 000000000000..1896b59638a5 --- /dev/null +++ b/docs/user/cookbook/dynamic-configuration/README.md @@ -0,0 +1,19 @@ +# Dynamic Configuration Cookbook + +The purpose of the cookbook is to guide you through common scenarios of using dynamic configuration. Each folder contains increasingly more complex use cases, but feel free to jump in wherever you feel appropriate. + +## Basics + +[Basics](01_Basics) covers +- [Structure](01_Basics/01_Structure.md) of how agent and server templates are loaded +- [Instances](01_Basics/02_Instances.md) of metrics and metrics instances are loaded +- [Integrations](01_Basics/03_Integrations.md) of how integrations are loaded +- [Logs and Traces](01_Basics/04_Logs_and_Traces.md) of how traces and logs are loaded + +[Templates](02_Templates) covers +- [Looping](02_Templates/01_Looping.md) covers basic command usage and simple loops +- [Datasource](02_Templates/02_Datasources.md) covers usage of datasource which are external datastores you can use to pull in data +- [Datasources and Objects](02_Templates/03_Datasource_and_Objects.md) covers the usage of complex json objects + +[Advanced Datasources](03_Advanced_Datasources) covers non file based datasources +- [AWS](03_Advanced_Datasources/01_AWS.md) covers querying EC2 for instances \ No newline at end of file diff --git a/go.mod b/go.mod index 8d52f9660d4b..ab3832391496 100644 --- a/go.mod +++ b/go.mod @@ -23,11 +23,15 @@ require ( github.com/gorilla/mux v1.8.0 github.com/grafana/dskit v0.0.0-20211021180445-3bd016e9d7f1 github.com/grafana/loki v1.6.2-0.20220112164614-525040a32657 - github.com/hashicorp/consul/api v1.11.0 + github.com/hairyhenderson/go-fsimpl v0.0.0-20211102185733-857ee891b38d + github.com/hairyhenderson/gomplate/v3 v3.0.0 + github.com/hashicorp/consul/api v1.12.0 github.com/hashicorp/go-cleanhttp v0.5.2 + github.com/hashicorp/go-multierror v1.1.1 github.com/infinityworks/github-exporter v0.0.0-20201016091012-831b72461034 + github.com/johannesboyne/gofakes3 v0.0.0-20210819161434-5c8dfcfe5310 github.com/jsternberg/zap-logfmt v1.2.0 - github.com/lib/pq v1.10.1 + github.com/lib/pq v1.10.2 github.com/miekg/dns v1.1.43 github.com/mitchellh/mapstructure v1.4.2 github.com/mitchellh/reflectwalk v1.0.2 @@ -95,8 +99,11 @@ require ( require ( cloud.google.com/go v0.97.0 // indirect - cloud.google.com/go/pubsub v1.5.0 // indirect + cloud.google.com/go/pubsub v1.16.0 // indirect + cloud.google.com/go/storage v1.18.2 // indirect + github.com/Azure/azure-pipeline-go v0.2.3 // indirect github.com/Azure/azure-sdk-for-go v58.2.0+incompatible // indirect + github.com/Azure/azure-storage-blob-go v0.14.0 // indirect github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1 // indirect github.com/Azure/go-autorest v14.2.0+incompatible // indirect github.com/Azure/go-autorest/autorest v0.11.21 // indirect @@ -111,12 +118,25 @@ require ( github.com/Masterminds/sprig/v3 v3.2.2 // indirect github.com/Microsoft/go-winio v0.5.1 // indirect github.com/Microsoft/hcsshim v0.9.1 // indirect + github.com/ProtonMail/go-crypto v0.0.0-20210920160938-87db9fbc61c7 // indirect + github.com/Shopify/ejson v1.3.1 // indirect github.com/StackExchange/wmi v1.2.1 // indirect + github.com/acomagu/bufpipe v1.0.3 // indirect github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751 // indirect github.com/alecthomas/units v0.0.0-20210927113745-59d0afb8317a // indirect github.com/apache/thrift v0.15.0 // indirect github.com/armon/go-metrics v0.3.9 // indirect - github.com/aws/aws-sdk-go v1.42.9 // indirect + github.com/armon/go-radix v1.0.0 // indirect + github.com/aws/aws-sdk-go v1.42.23 // indirect + github.com/aws/aws-sdk-go-v2 v1.9.2 // indirect + github.com/aws/aws-sdk-go-v2/config v1.8.3 // indirect + github.com/aws/aws-sdk-go-v2/credentials v1.4.3 // indirect + github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.6.0 // indirect + github.com/aws/aws-sdk-go-v2/internal/ini v1.2.4 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.3.2 // indirect + github.com/aws/aws-sdk-go-v2/service/sso v1.4.2 // indirect + github.com/aws/aws-sdk-go-v2/service/sts v1.7.2 // indirect + github.com/aws/smithy-go v1.8.0 // indirect github.com/beevik/ntp v0.3.0 // indirect github.com/beorn7/perks v1.0.1 // indirect github.com/bits-and-blooms/bitset v1.2.0 // indirect @@ -124,6 +144,7 @@ require ( github.com/bmatcuk/doublestar v1.2.2 // indirect github.com/buger/jsonparser v1.1.1 // indirect github.com/c2h5oh/datasize v0.0.0-20200112174442-28bbd4740fee // indirect + github.com/cenkalti/backoff/v3 v3.2.2 // indirect github.com/cenkalti/backoff/v4 v4.1.2 // indirect github.com/census-instrumentation/opencensus-proto v0.3.0 // indirect github.com/cespare/xxhash/v2 v2.1.2 // indirect @@ -150,21 +171,27 @@ require ( github.com/docker/go v1.5.1-1.0.20160303222718-d30aec9fd63c // indirect github.com/docker/go-metrics v0.0.1 // indirect github.com/docker/go-units v0.4.0 // indirect + github.com/docker/libkv v0.2.2-0.20180912205406-458977154600 // indirect github.com/dustin/go-humanize v1.0.0 // indirect + github.com/dustin/gojson v0.0.0-20160307161227-2e71ec9dd5ad // indirect github.com/eapache/go-resiliency v1.2.0 // indirect github.com/eapache/go-xerial-snappy v0.0.0-20180814174437-776d5712da21 // indirect github.com/eapache/queue v1.1.0 // indirect github.com/edsrzf/mmap-go v1.0.0 // indirect github.com/ema/qdisc v0.0.0-20200603082823-62d0308e3e00 // indirect + github.com/emirpasic/gods v1.12.0 // indirect github.com/envoyproxy/go-control-plane v0.9.10-0.20210907150352-cf90f659a021 // indirect github.com/envoyproxy/protoc-gen-validate v0.6.1 // indirect github.com/euank/go-kmsg-parser v2.0.0+incompatible // indirect github.com/evanphx/json-patch v4.9.0+incompatible // indirect - github.com/fatih/color v1.12.0 // indirect + github.com/fatih/color v1.13.0 // indirect github.com/felixge/fgprof v0.9.1 // indirect github.com/felixge/httpsnoop v1.0.2 // indirect github.com/fsnotify/fsnotify v1.5.1 // indirect github.com/fvbommel/sortorder v1.0.2 // indirect + github.com/go-git/gcfg v1.5.0 // indirect + github.com/go-git/go-billy/v5 v5.3.1 // indirect + github.com/go-git/go-git/v5 v5.4.2 // indirect github.com/go-kit/kit v0.12.0 // indirect github.com/go-ole/go-ole v1.2.6 // indirect github.com/go-resty/resty/v2 v2.1.1-0.20191201195748-d7b97669fe48 // indirect @@ -173,9 +200,10 @@ require ( github.com/go-zookeeper/zk v1.0.2 // indirect github.com/godbus/dbus v0.0.0-20190422162347-ade71ed3457e // indirect github.com/godbus/dbus/v5 v5.0.4 // indirect + github.com/gofrs/uuid v4.0.0+incompatible // indirect github.com/gogo/googleapis v1.4.1 // indirect github.com/gogo/status v1.1.0 // indirect - github.com/golang-jwt/jwt/v4 v4.0.0 // indirect + github.com/golang-jwt/jwt/v4 v4.1.0 // indirect github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect github.com/golang/snappy v0.0.4 // indirect github.com/gomodule/redigo v2.0.0+incompatible // indirect @@ -185,25 +213,37 @@ require ( github.com/google/gofuzz v1.1.0 // indirect github.com/google/pprof v0.0.0-20211008130755-947d60d73cc0 // indirect github.com/google/uuid v1.3.0 // indirect + github.com/google/wire v0.5.0 // indirect github.com/googleapis/gax-go/v2 v2.1.1 // indirect github.com/googleapis/gnostic v0.5.4 // indirect github.com/gophercloud/gophercloud v0.22.0 // indirect + github.com/gosimple/slug v1.12.0 // indirect + github.com/gosimple/unidecode v1.0.1 // indirect github.com/grobie/gomemcache v0.0.0-20201204163352-08d7c80fcac6 // indirect github.com/grpc-ecosystem/go-grpc-middleware v1.3.0 // indirect github.com/grpc-ecosystem/grpc-gateway v1.16.0 // indirect - github.com/hashicorp/errwrap v1.0.0 // indirect + github.com/hairyhenderson/toml v0.4.2-0.20210923231440-40456b8e66cf // indirect + github.com/hashicorp/errwrap v1.1.0 // indirect github.com/hashicorp/go-envparse v0.0.0-20200406174449-d9cfd743a15e // indirect github.com/hashicorp/go-hclog v0.16.2 // indirect github.com/hashicorp/go-immutable-radix v1.3.1 // indirect github.com/hashicorp/go-msgpack v0.5.5 // indirect - github.com/hashicorp/go-multierror v1.1.1 // indirect + github.com/hashicorp/go-plugin v1.4.3 // indirect + github.com/hashicorp/go-retryablehttp v0.7.0 // indirect github.com/hashicorp/go-rootcerts v1.0.2 // indirect + github.com/hashicorp/go-secure-stdlib/mlock v0.1.1 // indirect + github.com/hashicorp/go-secure-stdlib/parseutil v0.1.1 // indirect + github.com/hashicorp/go-secure-stdlib/strutil v0.1.1 // indirect github.com/hashicorp/go-sockaddr v1.0.2 // indirect github.com/hashicorp/go-uuid v1.0.2 // indirect + github.com/hashicorp/go-version v1.3.0 // indirect github.com/hashicorp/golang-lru v0.5.4 // indirect github.com/hashicorp/hcl v1.0.0 // indirect - github.com/hashicorp/memberlist v0.2.4 // indirect - github.com/hashicorp/serf v0.9.5 // indirect + github.com/hashicorp/memberlist v0.3.0 // indirect + github.com/hashicorp/serf v0.9.6 // indirect + github.com/hashicorp/vault/api v1.3.0 // indirect + github.com/hashicorp/vault/sdk v0.3.0 // indirect + github.com/hashicorp/yamux v0.0.0-20190923154419-df201c70410d // indirect github.com/hetznercloud/hcloud-go v1.32.0 // indirect github.com/hodgesds/perf-utils v0.4.0 // indirect github.com/hpcloud/tail v1.0.0 // indirect @@ -215,17 +255,20 @@ require ( github.com/influxdata/go-syslog/v3 v3.0.1-0.20201128200927-a1889d947b48 // indirect github.com/influxdata/telegraf v1.16.3 // indirect github.com/jaegertracing/jaeger v1.28.0 // indirect + github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99 // indirect github.com/jcmturner/aescts/v2 v2.0.0 // indirect github.com/jcmturner/dnsutils/v2 v2.0.0 // indirect github.com/jcmturner/gofork v1.0.0 // indirect github.com/jcmturner/gokrb5/v8 v8.4.2 // indirect github.com/jcmturner/rpc/v2 v2.0.3 // indirect github.com/jmespath/go-jmespath v0.4.0 // indirect + github.com/joho/godotenv v1.4.0 // indirect github.com/josharian/native v0.0.0-20200817173448-b6b71def0850 // indirect github.com/jpillora/backoff v1.0.0 // indirect github.com/jsimonetti/rtnetlink v0.0.0-20211022192332-93da33804786 // indirect github.com/json-iterator/go v1.1.12 // indirect github.com/karrick/godirwalk v1.16.1 // indirect + github.com/kevinburke/ssh_config v1.1.0 // indirect github.com/klauspost/compress v1.13.6 // indirect github.com/knadh/koanf v1.3.2 // indirect github.com/kolo/xmlrpc v0.0.0-20201022064351-38db28db192b // indirect @@ -236,7 +279,8 @@ require ( github.com/linode/linodego v1.1.0 // indirect github.com/lufia/iostat v1.2.1 // indirect github.com/magiconair/properties v1.8.5 // indirect - github.com/mattn/go-colorable v0.1.8 // indirect + github.com/mattn/go-colorable v0.1.9 // indirect + github.com/mattn/go-ieproxy v0.0.1 // indirect github.com/mattn/go-isatty v0.0.14 // indirect github.com/mattn/go-runewidth v0.0.9 // indirect github.com/mattn/go-xmlrpc v0.0.3 // indirect @@ -250,6 +294,7 @@ require ( github.com/mistifyio/go-zfs v2.1.2-0.20190413222219-f784269be439+incompatible // indirect github.com/mitchellh/copystructure v1.2.0 // indirect github.com/mitchellh/go-homedir v1.1.0 // indirect + github.com/mitchellh/go-testing-interface v1.0.0 // indirect github.com/moby/sys/mount v0.3.0 // indirect github.com/moby/sys/mountinfo v0.5.0 // indirect github.com/moby/term v0.0.0-20210619224110-3f7ff695adc6 // indirect @@ -286,6 +331,9 @@ require ( github.com/prometheus/exporter-toolkit v0.7.0 // indirect github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475 // indirect github.com/rs/cors v1.8.0 // indirect + github.com/rs/zerolog v1.26.1 // indirect + github.com/ryanuber/go-glob v1.0.0 // indirect + github.com/ryszard/goskiplist v0.0.0-20150312221310-2dfbae5fcf46 // indirect github.com/safchain/ethtool v0.1.0 // indirect github.com/samuel/go-zookeeper v0.0.0-20190923202752-2cc03de413da // indirect github.com/satori/go.uuid v1.2.1-0.20181028125025-b2ce2384e17b // indirect @@ -293,6 +341,8 @@ require ( github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529 // indirect github.com/seccomp/libseccomp-golang v0.9.1 // indirect github.com/sercand/kuberesolver v2.4.0+incompatible // indirect + github.com/sergi/go-diff v1.2.0 // indirect + github.com/shabbyrobe/gocovmerge v0.0.0-20190829150210-3e036491d500 // indirect github.com/shirou/gopsutil v3.21.8+incompatible // indirect github.com/shopspring/decimal v1.2.0 // indirect github.com/shurcooL/httpfs v0.0.0-20190707220628-8d4bc4ba7749 // indirect @@ -312,9 +362,11 @@ require ( github.com/tklauser/numcpus v0.3.0 // indirect github.com/tomnomnom/linkheader v0.0.0-20180905144013-02ca5825eb80 // indirect github.com/uber/jaeger-lib v2.4.1+incompatible // indirect + github.com/ugorji/go/codec v1.2.6 // indirect github.com/vishvananda/netlink v1.1.1-0.20201029203352-d40f9887b852 // indirect github.com/vishvananda/netns v0.0.0-20200728191858-db3c7e526aae // indirect github.com/weaveworks/promrus v1.2.0 // indirect + github.com/xanzy/ssh-agent v0.3.1 // indirect github.com/xdg-go/pbkdf2 v1.0.0 // indirect github.com/xdg-go/scram v1.0.2 // indirect github.com/xdg-go/stringprep v1.0.2 // indirect @@ -324,6 +376,8 @@ require ( github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415 // indirect github.com/xeipuuv/gojsonschema v1.2.0 // indirect github.com/youmark/pkcs8 v0.0.0-20181117223130-1be2e3e5546d // indirect + github.com/zealic/xignore v0.3.3 // indirect + go.etcd.io/bbolt v1.3.6 // indirect go.etcd.io/etcd v3.3.25+incompatible // indirect go.etcd.io/etcd/api/v3 v3.5.0 // indirect go.etcd.io/etcd/client/pkg/v3 v3.5.0 // indirect @@ -336,13 +390,16 @@ require ( go.uber.org/goleak v1.1.12 // indirect go4.org/intern v0.0.0-20210108033219-3eb7198706b2 // indirect go4.org/unsafe/assume-no-moving-gc v0.0.0-20201222180813-1025295fd063 // indirect - golang.org/x/crypto v0.0.0-20210921155107-089bfa567519 // indirect - golang.org/x/net v0.0.0-20211111160137-58aab5ef257a // indirect + gocloud.dev v0.24.0 // indirect + golang.org/x/crypto v0.0.0-20211215165025-cf75a172585e // indirect + golang.org/x/net v0.0.0-20211209124913-491a49abca63 // indirect golang.org/x/oauth2 v0.0.0-20211005180243-6b3c2da341f1 // indirect golang.org/x/sync v0.0.0-20210220032951-036812b2e83c // indirect - golang.org/x/term v0.0.0-20210615171337-6886f2dfbf5b // indirect + golang.org/x/term v0.0.0-20210916214954-140adaaadfaf // indirect golang.org/x/text v0.3.7 // indirect golang.org/x/time v0.0.0-20210723032227-1f47c861a9ac // indirect + golang.org/x/tools v0.1.7 // indirect + golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 // indirect gomodules.xyz/jsonpatch/v2 v2.1.0 // indirect google.golang.org/api v0.59.0 // indirect google.golang.org/appengine v1.6.7 // indirect @@ -353,7 +410,9 @@ require ( gopkg.in/inf.v0 v0.9.1 // indirect gopkg.in/ini.v1 v1.64.0 // indirect gopkg.in/mgo.v2 v2.0.0-20190816093944-a6b53ec6cb22 // indirect + gopkg.in/square/go-jose.v2 v2.6.0 // indirect gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 // indirect + gopkg.in/warnings.v0 v0.1.2 // indirect inet.af/netaddr v0.0.0-20210903134321-85fa6c94624e // indirect k8s.io/component-base v0.21.0 // indirect k8s.io/kube-openapi v0.0.0-20210305001622-591a79e4bda7 // indirect @@ -421,3 +480,9 @@ replace github.com/jaegertracing/jaeger => github.com/jaegertracing/jaeger v1.27 // Replacement necessary for windows_exporter so that we can use gokit logging and not the old prometheus logging replace github.com/leoluk/perflib_exporter v0.1.0 => github.com/grafana/perflib_exporter v0.1.1-0.20211013152516-e37e14fb8b0a + +// Required until fork merged upstream for dynamic configuration support +replace github.com/hairyhenderson/gomplate/v3 => github.com/mattdurham/gomplate/v3 v3.10.1-0.20220204190650-af65008b9bb1 + +// Required to ensure compatible hashicorp lib is loaded for dynamic configuration, this solves an ambigous import +exclude github.com/hashicorp/vault v0.10.3 diff --git a/go.sum b/go.sum index 99d13a8bfac7..e812b893daf4 100644 --- a/go.sum +++ b/go.sum @@ -1,4 +1,5 @@ bazil.org/fuse v0.0.0-20160811212531-371fbbdaa898/go.mod h1:Xbm+BRKSBEpa4q4hTSxohYNQpsxXPbPry4JJWOB3LB8= +bazil.org/fuse v0.0.0-20180421153158-65cc252bf669/go.mod h1:Xbm+BRKSBEpa4q4hTSxohYNQpsxXPbPry4JJWOB3LB8= 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.37.4/go.mod h1:NHPJ89PdicEuT9hdPXMROBD91xc5uRDxsMtSB16k7hw= @@ -15,19 +16,25 @@ cloud.google.com/go v0.53.0/go.mod h1:fp/UouUEsRkN6ryDKNW/Upv/JBKnv6WDthjR6+vze6 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.60.0/go.mod h1:yw2G51M9IfRboUH61Us8GqCeF1PzPblB823Mn2q2eAU= 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.78.0/go.mod h1:QjdrLG0uq+YwhjoVOLsS1t7TW8fs36kLs4XO5R5ECHg= cloud.google.com/go v0.79.0/go.mod h1:3bzgcEeQlzbuEAYu4mrWhKqWjmpprinYgKJLgKHnbb8= cloud.google.com/go v0.81.0/go.mod h1:mk/AM35KwGk/Nm2YSeZbxXdrNK3KZOYHmLkOqC2V6E0= +cloud.google.com/go v0.82.0/go.mod h1:vlKccHJGuFBFufnAnuB08dfEH9Y3H7dzDzRECFdC2TA= cloud.google.com/go v0.83.0/go.mod h1:Z7MJUsANfY0pYPdw0lbnivPx4/vhy/e2FEkSkF7vAVY= cloud.google.com/go v0.84.0/go.mod h1:RazrYuxIK6Kb7YrzzhPoLmCVzl7Sup4NrbKPg8KHSUM= cloud.google.com/go v0.87.0/go.mod h1:TpDYlFy7vuLzZMMZ+B6iRiELaY7z/gJPaqbMx6mlWcY= +cloud.google.com/go v0.88.0/go.mod h1:dnKwfYbP9hQhefiUvpbcAyoGSHUrOxR20JVElLiUvEY= +cloud.google.com/go v0.89.0/go.mod h1:kRX0mNRHe0e2rC6oNakvwQqzyDmg57xJ+SZU1eT2aDQ= cloud.google.com/go v0.90.0/go.mod h1:kRX0mNRHe0e2rC6oNakvwQqzyDmg57xJ+SZU1eT2aDQ= +cloud.google.com/go v0.92.2/go.mod h1:8utlLll2EF5XMAV15woO4lSbWQlk8rer9aLOfLh7+YI= +cloud.google.com/go v0.92.3/go.mod h1:8utlLll2EF5XMAV15woO4lSbWQlk8rer9aLOfLh7+YI= cloud.google.com/go v0.93.3/go.mod h1:8utlLll2EF5XMAV15woO4lSbWQlk8rer9aLOfLh7+YI= +cloud.google.com/go v0.94.0/go.mod h1:qAlAugsXlC+JWO+Bke5vCtc9ONxjQT3drlTTnAplMW4= cloud.google.com/go v0.94.1/go.mod h1:qAlAugsXlC+JWO+Bke5vCtc9ONxjQT3drlTTnAplMW4= cloud.google.com/go v0.97.0 h1:3DXvAyifywvq64LfkKaMOmkWPS1CikIQdMe2lY9vxU8= cloud.google.com/go v0.97.0/go.mod h1:GF7l59pYBVlXQIBLx3a761cZ41F9bBH3JUlihCt2Udc= @@ -43,42 +50,62 @@ cloud.google.com/go/bigtable v1.3.0/go.mod h1:z5EyKrPE8OQmeg4h5MNdKvuSnI9CCT49Ki 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/firestore v1.1.0/go.mod h1:ulACoGHTpvq5r8rxGJ4ddJZBZqakUQqClKRT5SZwBmk= +cloud.google.com/go/firestore v1.5.0/go.mod h1:c4nNYR1qdq7eaZ+jSc5fonrQN2k3M7sWATcYTiakjEo= cloud.google.com/go/firestore v1.6.0/go.mod h1:afJwI0vaXwAG54kI7A//lP/lSPDkQORQuMkv56TxEPU= +cloud.google.com/go/kms v0.1.0/go.mod h1:8Qp8PCAypHg4FdmlyW1QRAv09BGQ9Uzh7JnmIZxPk+c= cloud.google.com/go/kms v1.0.0 h1:YkIeqPXqTAlwXk3Z2/WG0d6h1tqJQjU354WftjEoP9E= +cloud.google.com/go/monitoring v0.1.0/go.mod h1:Hpm3XfzJv+UTiXzCG5Ffp0wijzHTC7Cv4eR7o3x/fEE= 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/pubsub v1.5.0 h1:9cH52jizPUVSSrSe+J16RC9wB0QI7i/cfuCm5UUCcIk= -cloud.google.com/go/pubsub v1.5.0/go.mod h1:ZEwJccE3z93Z2HWvstpri00jOg7oO4UZDtKhwDwqF0w= +cloud.google.com/go/pubsub v1.16.0 h1:N2WVmm3vmoBo8+cbBgwACB8ZKUP/YQvG2ujHx47/oXY= +cloud.google.com/go/pubsub v1.16.0/go.mod h1:6A8EfoWZ/lUvCWStKGwAWauJZSiuV0Mkmu6WilK/TxQ= +cloud.google.com/go/secretmanager v0.1.0/go.mod h1:3nGKHvnzDUVit7U0S9KAKJ4aOsO1xtwRG+7ey5LK1bM= cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw= cloud.google.com/go/storage v1.3.0/go.mod h1:9IAwXhoyBJ7z9LcAwkj0/7NnPzYaPeZxxVp3zm+5IqA= 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.16.1/go.mod h1:LaNorbty3ehnU3rEjXSNV/NRgQA0O8Y+uh6bPe5UOk4= +cloud.google.com/go/storage v1.18.2 h1:5NQw6tOn3eMm0oE8vTkfjau18kjL79FlMjy/CHTpmoY= +cloud.google.com/go/storage v1.18.2/go.mod h1:AiIj7BWXyhO5gGVmYJ+S8tbkCx3yb0IMjua8Aw4naVM= +cloud.google.com/go/trace v0.1.0/go.mod h1:wxEwsoeRVPbeSkt7ZC9nWCgmoKQRAoySN7XHW2AmI7g= code.cloudfoundry.org/bytefmt v0.0.0-20190710193110-1eb035ffe2b6/go.mod h1:wN/zk7mhREp/oviagqUXY3EwuHhWyOvAdsn5Y4CzOrc= code.cloudfoundry.org/clock v1.0.0/go.mod h1:QD9Lzhd/ux6eNQVUDVRJX/RKTigpewimNYBi7ivZKY8= collectd.org v0.3.0/go.mod h1:A/8DzQBkF6abtvrT2j/AU/4tiBgJWYyh0y/oB/4MlWE= +contrib.go.opencensus.io/exporter/aws v0.0.0-20200617204711-c478e41e60e9/go.mod h1:uu1P0UCM/6RbsMrgPa98ll8ZcHM858i/AD06a9aLRCA= contrib.go.opencensus.io/exporter/prometheus v0.4.0 h1:0QfIkj9z/iVZgK31D9H9ohjjIDApI2GOPScCKwxedbs= contrib.go.opencensus.io/exporter/prometheus v0.4.0/go.mod h1:o7cosnyfuPVK0tB8q0QmaQNhGnptITnPQB+z1+qeFB0= +contrib.go.opencensus.io/exporter/stackdriver v0.13.8/go.mod h1:huNtlWx75MwO7qMs0KrMxPZXzNNWebav1Sq/pm02JdQ= +contrib.go.opencensus.io/integrations/ocsql v0.1.7/go.mod h1:8DsSdjz3F+APR+0z0WkU1aRorQCFfRxvqjUUPMbF3fE= dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= github.com/AlekSi/pointer v1.1.0 h1:SSDMPcXD9jSl8FPy9cRzoRaMJtm9g9ggGTxecRUbQoI= github.com/AlekSi/pointer v1.1.0/go.mod h1:y7BvfRI3wXPWKXEBhU71nbnIEEZX0QTSB2Bj48UJIZE= github.com/Azure/azure-amqp-common-go/v3 v3.0.0/go.mod h1:SY08giD/XbhTz07tJdpw1SoxQXHPN30+DI3Z04SYqyg= +github.com/Azure/azure-amqp-common-go/v3 v3.1.0/go.mod h1:PBIGdzcO1teYoufTKMcGibdKaYZv4avS+O6LNIp8bq0= +github.com/Azure/azure-amqp-common-go/v3 v3.1.1/go.mod h1:YsDaPfaO9Ub2XeSKdIy2DfwuiQlHQCauHJwSqtrkECI= github.com/Azure/azure-event-hubs-go/v3 v3.2.0/go.mod h1:BPIIJNH/l/fVHYq3Rm6eg4clbrULrQ3q7+icmqHyyLc= github.com/Azure/azure-pipeline-go v0.1.8/go.mod h1:XA1kFWRVhSK+KNFiOhfv83Fv8L9achrP7OxIzeTn1Yg= github.com/Azure/azure-pipeline-go v0.1.9/go.mod h1:XA1kFWRVhSK+KNFiOhfv83Fv8L9achrP7OxIzeTn1Yg= github.com/Azure/azure-pipeline-go v0.2.1/go.mod h1:UGSo8XybXnIGZ3epmeBw7Jdz+HiUVpqIlpz/HKHylF4= github.com/Azure/azure-pipeline-go v0.2.2/go.mod h1:4rQ/NZncSvGqNkkOsNpOU1tgoNuIlp9AfUH5G1tvCHc= +github.com/Azure/azure-pipeline-go v0.2.3 h1:7U9HBg1JFK3jHl5qmo4CTZKFTVgMwdFHMVtCdfBE21U= github.com/Azure/azure-pipeline-go v0.2.3/go.mod h1:x841ezTBIMG6O3lAcl8ATHnsOPVl2bqk7S3ta6S6u4k= github.com/Azure/azure-sdk-for-go v36.2.0+incompatible h1:09cv2WoH0g6jl6m2iT+R9qcIPZKhXEL0sbmLhxP895s= github.com/Azure/azure-sdk-for-go v36.2.0+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= +github.com/Azure/azure-service-bus-go v0.10.16/go.mod h1:MlkLwGGf1ewcx5jZadn0gUEty+tTg0RaElr6bPf+QhI= github.com/Azure/azure-storage-blob-go v0.6.0/go.mod h1:oGfmITT1V6x//CswqY2gtAHND+xIP64/qL7a5QJix0Y= github.com/Azure/azure-storage-blob-go v0.8.0/go.mod h1:lPI3aLPpuLTeUwh1sViKXFxwl2B6teiRqI0deQUvsw0= github.com/Azure/azure-storage-blob-go v0.13.0/go.mod h1:pA9kNqtjUeQF2zOSu4s//nUdBD+e64lEuc4sVnuOfNs= +github.com/Azure/azure-storage-blob-go v0.14.0 h1:1BCg74AmVdYwO3dlKwtFU1V0wU2PZdREkXvAmZJRUlM= +github.com/Azure/azure-storage-blob-go v0.14.0/go.mod h1:SMqIBi+SuiQH32bvyjngEewEeXoPfKMgWlBDaYf6fck= github.com/Azure/azure-storage-queue-go v0.0.0-20181215014128-6ed74e755687/go.mod h1:K6am8mT+5iFXgingS9LUc7TmbsW6XBw3nxaRyaMyWc8= github.com/Azure/go-amqp v0.12.6/go.mod h1:qApuH6OFTSKZFmCOxccvAv5rLizBQf4v8pRmG138DPo= +github.com/Azure/go-amqp v0.13.0/go.mod h1:qj+o8xPCz9tMSbQ83Vp8boHahuRDl5mkNHyt1xlxUTs= +github.com/Azure/go-amqp v0.13.11/go.mod h1:D5ZrjQqB1dyp1A+G73xeL/kNn7D5qHJIIsNNps7YNmk= +github.com/Azure/go-amqp v0.13.12/go.mod h1:D5ZrjQqB1dyp1A+G73xeL/kNn7D5qHJIIsNNps7YNmk= github.com/Azure/go-ansiterm v0.0.0-20170929234023-d6e3b3328b78/go.mod h1:LmzpDX56iTiv29bbRTIsUNlaFfuhWRQBWjQdVyAevI8= github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1 h1:UQHMgLO+TxOElx5B5HZ4hJQsoJ/PvUvKRhJHDQXO8P8= github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1/go.mod h1:xomTg63KZ2rFqZQzSB4Vz2SUXa1BpHTVz9L5PTmPC4E= @@ -90,26 +117,35 @@ github.com/Azure/go-autorest v14.2.0+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSW github.com/Azure/go-autorest/autorest v0.9.0/go.mod h1:xyHB1BMZT0cuDHU7I0+g046+BFDTQ8rEZB0s4Yfa6bI= github.com/Azure/go-autorest/autorest v0.9.3-0.20191028180845-3492b2aff503/go.mod h1:xyHB1BMZT0cuDHU7I0+g046+BFDTQ8rEZB0s4Yfa6bI= github.com/Azure/go-autorest/autorest v0.9.3/go.mod h1:GsRuLYvwzLjjjRoWEIyMUaYq8GNUx2nRB378IPt/1p0= +github.com/Azure/go-autorest/autorest v0.11.3/go.mod h1:JFgpikqFJ/MleTTxwepExTKnFUKKszPS8UavbQYUMuw= github.com/Azure/go-autorest/autorest v0.11.9/go.mod h1:eipySxLmqSyC5s5k1CLupqet0PSENBEDP93LQ9a8QYw= github.com/Azure/go-autorest/autorest v0.11.12/go.mod h1:eipySxLmqSyC5s5k1CLupqet0PSENBEDP93LQ9a8QYw= github.com/Azure/go-autorest/autorest v0.11.17/go.mod h1:eipySxLmqSyC5s5k1CLupqet0PSENBEDP93LQ9a8QYw= +github.com/Azure/go-autorest/autorest v0.11.18/go.mod h1:dSiJPy22c3u0OtOKDNttNgqpNFY/GeWa7GH/Pz56QRA= +github.com/Azure/go-autorest/autorest v0.11.20/go.mod h1:o3tqFY+QR40VOlk+pV4d77mORO64jOXSgEnPQgLK6JY= github.com/Azure/go-autorest/autorest v0.11.21 h1:w77zY/9RnUAWcIQyDC0Fc89mCvwftR8F+zsR/OH6enk= github.com/Azure/go-autorest/autorest v0.11.21/go.mod h1:Do/yuMSW/13ayUkcVREpsMHGG+MvV81uzSCFgYPj4tM= github.com/Azure/go-autorest/autorest/adal v0.5.0/go.mod h1:8Z9fGy2MpX0PvDjB1pEgQTmVqjGhiHBW7RJJEciWzS0= github.com/Azure/go-autorest/autorest/adal v0.8.0/go.mod h1:Z6vX6WXXuyieHAXwMj0S6HY6e6wcHn37qQMBQlvY3lc= github.com/Azure/go-autorest/autorest/adal v0.8.1-0.20191028180845-3492b2aff503/go.mod h1:Z6vX6WXXuyieHAXwMj0S6HY6e6wcHn37qQMBQlvY3lc= github.com/Azure/go-autorest/autorest/adal v0.8.1/go.mod h1:ZjhuQClTqx435SRJ2iMlOxPYt3d2C/T/7TiQCVZSn3Q= +github.com/Azure/go-autorest/autorest/adal v0.9.0/go.mod h1:/c022QCutn2P7uY+/oQWWNcK9YU+MH96NgK+jErpbcg= github.com/Azure/go-autorest/autorest/adal v0.9.2/go.mod h1:/3SMAM86bP6wC9Ev35peQDUeqFZBMH07vvUOmg4z/fE= github.com/Azure/go-autorest/autorest/adal v0.9.5/go.mod h1:B7KF7jKIeC9Mct5spmyCB/A8CG/sEz1vwIRGv/bbw7A= github.com/Azure/go-autorest/autorest/adal v0.9.11/go.mod h1:nBKAnTomx8gDtl+3ZCJv2v0KACFHWTB2drffI1B68Pk= +github.com/Azure/go-autorest/autorest/adal v0.9.13/go.mod h1:W/MM4U6nLxnIskrw4UwWzlHfGjwUS50aOsc/I3yuU8M= github.com/Azure/go-autorest/autorest/adal v0.9.14/go.mod h1:W/MM4U6nLxnIskrw4UwWzlHfGjwUS50aOsc/I3yuU8M= +github.com/Azure/go-autorest/autorest/adal v0.9.15/go.mod h1:tGMin8I49Yij6AQ+rvV+Xa/zwxYQB5hmsd6DkfAx2+A= github.com/Azure/go-autorest/autorest/adal v0.9.16 h1:P8An8Z9rH1ldbOLdFpxYorgOt2sywL9V24dAwWHPuGc= github.com/Azure/go-autorest/autorest/adal v0.9.16/go.mod h1:tGMin8I49Yij6AQ+rvV+Xa/zwxYQB5hmsd6DkfAx2+A= github.com/Azure/go-autorest/autorest/azure/auth v0.4.2/go.mod h1:90gmfKdlmKgfjUpnCEpOJzsUEjrWDSLwHIG73tSXddM= github.com/Azure/go-autorest/autorest/azure/auth v0.5.3/go.mod h1:4bJZhUhcq8LB20TruwHbAQsmUs2Xh+QR7utuJpLXX3A= +github.com/Azure/go-autorest/autorest/azure/auth v0.5.8 h1:TzPg6B6fTZ0G1zBf3T54aI7p3cAT6u//TOXGPmFMOXg= github.com/Azure/go-autorest/autorest/azure/auth v0.5.8/go.mod h1:kxyKZTSfKh8OVFWPAgOgQ/frrJgeYQJPyR5fLFmXko4= github.com/Azure/go-autorest/autorest/azure/cli v0.3.1/go.mod h1:ZG5p860J94/0kI9mNJVoIoLgXcirM2gF5i2kWloofxw= github.com/Azure/go-autorest/autorest/azure/cli v0.4.2/go.mod h1:7qkJkT+j6b+hIpzMOwPChJhTqS8VbsqqgULzMNRugoM= +github.com/Azure/go-autorest/autorest/azure/cli v0.4.3 h1:DOhB+nXkF7LN0JfBGB5YtCF6QLK8mLe4psaHF7ZQEKM= +github.com/Azure/go-autorest/autorest/azure/cli v0.4.3/go.mod h1:yAQ2b6eP/CmLPnmLvxtT1ALIY3OR1oFcCqVBi8vHiTc= github.com/Azure/go-autorest/autorest/date v0.1.0/go.mod h1:plvfp3oPSKwf2DNjlBjWF/7vwR+cUD/ELuzDCXwHUVA= github.com/Azure/go-autorest/autorest/date v0.2.0/go.mod h1:vcORJHLJEh643/Ioh9+vPmf1Ij9AEBM5FuBIXLmIy0g= github.com/Azure/go-autorest/autorest/date v0.3.0 h1:7gUk1U5M/CQbp9WoqinNzJar+8KY+LPI6wiWrP/myHw= @@ -117,6 +153,7 @@ github.com/Azure/go-autorest/autorest/date v0.3.0/go.mod h1:BI0uouVdmngYNUzGWeSY github.com/Azure/go-autorest/autorest/mocks v0.1.0/go.mod h1:OTyCOPRA2IgIlWxVYxBee2F5Gr4kF2zd2J5cFRaIDN0= github.com/Azure/go-autorest/autorest/mocks v0.2.0/go.mod h1:OTyCOPRA2IgIlWxVYxBee2F5Gr4kF2zd2J5cFRaIDN0= github.com/Azure/go-autorest/autorest/mocks v0.3.0/go.mod h1:a8FDP3DYzQ4RYfVAxAN3SVSiiO77gL2j2ronKKP0syM= +github.com/Azure/go-autorest/autorest/mocks v0.4.0/go.mod h1:LTp+uSrOhSkaKrUy935gNZuuIPPVsHlr9DSOxSayd+k= github.com/Azure/go-autorest/autorest/mocks v0.4.1 h1:K0laFcLE6VLTOwNgSxaGbUcLPuGXlNkbVvq4cW4nIHk= github.com/Azure/go-autorest/autorest/mocks v0.4.1/go.mod h1:LTp+uSrOhSkaKrUy935gNZuuIPPVsHlr9DSOxSayd+k= github.com/Azure/go-autorest/autorest/to v0.3.0/go.mod h1:MgwOyqaIuKdG4TL/2ywSsIWKAfJfgHDo8ObuUk3t5sA= @@ -140,6 +177,7 @@ github.com/DATA-DOG/go-sqlmock v1.4.1 h1:ThlnYciV1iM/V0OSF/dtkqWb6xo5qITT1TJBG1M github.com/DATA-DOG/go-sqlmock v1.4.1/go.mod h1:f/Ixk793poVmq4qj/V1dPUg2JEAKC73Q5eFN3EC/SaM= github.com/DataDog/datadog-go v0.0.0-20160329135253-cc2f4770f4d6/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ= github.com/DataDog/datadog-go v3.2.0+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ= +github.com/GoogleCloudPlatform/cloudsql-proxy v1.24.0/go.mod h1:3tx938GhY4FC+E1KT/jNjDw7Z5qxAEtIiERJ2sXjnII= github.com/HdrHistogram/hdrhistogram-go v1.1.0/go.mod h1:yDgFjdqOqDEKOvasDdhWNXYg9BVp4O+o5f6V/ehm6Oo= github.com/HdrHistogram/hdrhistogram-go v1.1.2 h1:5IcZpTvzydCQeHzK4Ef/D5rrSqwxob0t8PQPMybUNFM= github.com/HdrHistogram/hdrhistogram-go v1.1.2/go.mod h1:yDgFjdqOqDEKOvasDdhWNXYg9BVp4O+o5f6V/ehm6Oo= @@ -167,6 +205,7 @@ github.com/Microsoft/go-winio v0.4.16/go.mod h1:XB6nPKklQyQ7GC9LdcBEcBl8PF76WugX github.com/Microsoft/go-winio v0.4.17-0.20210211115548-6eac466e5fa3/go.mod h1:JPGBdM1cNvN/6ISo+n8V5iA4v8pBzdOpzfwIujj1a84= github.com/Microsoft/go-winio v0.4.17-0.20210324224401-5516f17a5958/go.mod h1:JPGBdM1cNvN/6ISo+n8V5iA4v8pBzdOpzfwIujj1a84= github.com/Microsoft/go-winio v0.4.17/go.mod h1:JPGBdM1cNvN/6ISo+n8V5iA4v8pBzdOpzfwIujj1a84= +github.com/Microsoft/go-winio v0.5.0/go.mod h1:JPGBdM1cNvN/6ISo+n8V5iA4v8pBzdOpzfwIujj1a84= github.com/Microsoft/go-winio v0.5.1 h1:aPJp2QD7OOrhO5tQXqQoGSJc+DjDtWTGLOmNyAm6FgY= github.com/Microsoft/go-winio v0.5.1/go.mod h1:JPGBdM1cNvN/6ISo+n8V5iA4v8pBzdOpzfwIujj1a84= github.com/Microsoft/hcsshim v0.8.6/go.mod h1:Op3hHsoHPAvb6lceZHDtd9OkTew38wNoXnJs8iY7rUg= @@ -189,6 +228,9 @@ github.com/NYTimes/gziphandler v1.1.1/go.mod h1:n/CVRwUEOgIxrgPvAQhUUr9oeUtvrhMo github.com/Nvveen/Gotty v0.0.0-20120604004816-cd527374f1e5/go.mod h1:lmUJ/7eu/Q8D7ML55dXQrVaamCz2vxCfdQBasLZfHKk= github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= github.com/OneOfOne/xxhash v1.2.6/go.mod h1:eZbhyaAYD41SGSSsnmcpxVoRiQ/MPUTjUdIIOT9Um7Q= +github.com/ProtonMail/go-crypto v0.0.0-20210428141323-04723f9f07d7/go.mod h1:z4/9nQmJSSwwds7ejkxaJwO37dru3geImFUdJlaLzQo= +github.com/ProtonMail/go-crypto v0.0.0-20210920160938-87db9fbc61c7 h1:DSqTh6nEes/uO8BlNcGk8PzZsxY2sN9ZL//veWBdTRI= +github.com/ProtonMail/go-crypto v0.0.0-20210920160938-87db9fbc61c7/go.mod h1:z4/9nQmJSSwwds7ejkxaJwO37dru3geImFUdJlaLzQo= github.com/PuerkitoBio/purell v1.0.0/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= github.com/PuerkitoBio/purell v1.1.0/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= github.com/PuerkitoBio/purell v1.1.1/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= @@ -197,6 +239,8 @@ github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578/go.mod h1:uGdko github.com/SAP/go-hdb v0.12.0/go.mod h1:etBT+FAi1t5k3K3tf5vQTnosgYmhDkRi8jEnQqCnxF0= github.com/SAP/go-hdb v0.14.1/go.mod h1:7fdQLVC2lER3urZLjZCm0AuMQfApof92n3aylBPEkMo= github.com/SermoDigital/jose v0.0.0-20180104203859-803625baeddc/go.mod h1:ARgCUhI1MHQH+ONky/PAtmVHQrP5JlGY0F3poXOp/fA= +github.com/Shopify/ejson v1.3.1 h1:Oawj8bu0IhjvL2W4/wzHJiGRswWTZkOU4RmjJW+JQCg= +github.com/Shopify/ejson v1.3.1/go.mod h1:DBVPSSyVv9/MNElCiAX7BCPWy23HGzrOCnHLV7LWlbs= github.com/Shopify/logrus-bugsnag v0.0.0-20170309145241-6dbc35f2c30d/go.mod h1:HI8ITrYtUY+O+ZhtlqUnD8+KwNPOyugEhfP9fdUIaEQ= github.com/Shopify/logrus-bugsnag v0.0.0-20171204204709-577dee27f20d h1:UrqY+r/OJnIp5u0s1SbQ8dVfLCZJsnvazdBP5hS4iRs= github.com/Shopify/logrus-bugsnag v0.0.0-20171204204709-577dee27f20d/go.mod h1:HI8ITrYtUY+O+ZhtlqUnD8+KwNPOyugEhfP9fdUIaEQ= @@ -216,6 +260,8 @@ github.com/StackExchange/wmi v1.2.1/go.mod h1:rcmrprowKIVzvc+NUiLncP2uuArMWLCbu9 github.com/VividCortex/gohistogram v1.0.0 h1:6+hBz+qvs0JOrrNhhmR7lFxo5sINxBCGXrdtl/UvroE= github.com/VividCortex/gohistogram v1.0.0/go.mod h1:Pf5mBqqDxYaXu3hDrrU+w6nw50o/4+TcAqDqk/vUH7g= github.com/abdullin/seq v0.0.0-20160510034733-d5467c17e7af/go.mod h1:5Jv4cbFiHJMsVxt52+i0Ha45fjshj6wxYr1r19tB9bw= +github.com/acomagu/bufpipe v1.0.3 h1:fxAGrHZTgQ9w5QqVItgzwj235/uYZYgbXitB+dLupOk= +github.com/acomagu/bufpipe v1.0.3/go.mod h1:mxdxdup/WdsKVreO5GpW4+M/1CE2sMG4jeGJ2sYmHc4= github.com/aerospike/aerospike-client-go v1.27.0/go.mod h1:zj8LBEnWBDOVEIJt8LvaRvDG5ARAoa5dBeHaB472NRc= github.com/afex/hystrix-go v0.0.0-20180502004556-fa1af6a1f4f5/go.mod h1:SkGFH1ia65gfNATL8TAiHDNxPzPdmEL5uirI2Uyuz6c= github.com/agnivade/levenshtein v1.0.1/go.mod h1:CURSv5d9Uaml+FovSIICkLbAUZ9S4RqaHDIsdSBg7lM= @@ -229,6 +275,7 @@ github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRF github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho= github.com/alecthomas/units v0.0.0-20210208195552-ff826a37aa15/go.mod h1:OMCwj8VM1Kc9e19TLln2VL61YJF0x1XFtfdL4JdbSyE= +github.com/alecthomas/units v0.0.0-20210912230133-d1bdfacee922/go.mod h1:OMCwj8VM1Kc9e19TLln2VL61YJF0x1XFtfdL4JdbSyE= github.com/alecthomas/units v0.0.0-20210927113745-59d0afb8317a h1:E/8AP5dFtMhl5KPJz66Kt9G0n+7Sn41Fy1wv9/jHOrc= github.com/alecthomas/units v0.0.0-20210927113745-59d0afb8317a/go.mod h1:OMCwj8VM1Kc9e19TLln2VL61YJF0x1XFtfdL4JdbSyE= github.com/alexflint/go-filemutex v0.0.0-20171022225611-72bdc8eae2ae/go.mod h1:CgnQgUtFrFz9mxFNtED3jI5tLDjKlOM+oUF/sTk6ps0= @@ -238,6 +285,8 @@ github.com/alicebob/miniredis/v2 v2.14.3/go.mod h1:gquAfGbzn92jvtrSC69+6zZnwSODV github.com/aliyun/aliyun-oss-go-sdk v2.0.4+incompatible/go.mod h1:T/Aws4fEfogEE9v+HPhhw+CntffsBHJ8nXQCwKr0/g8= github.com/amir/raidman v0.0.0-20170415203553-1ccc43bfb9c9/go.mod h1:eliMa/PW+RDr2QLWRmLH1R1ZA4RInpmvOzDDXtaIZkc= github.com/andreyvit/diff v0.0.0-20170406064948-c7f18ee00883/go.mod h1:rCTlJbsFo29Kk6CurOXKm700vrz8f0KW0JNfpkRJY/8= +github.com/anmitsu/go-shlex v0.0.0-20161002113705-648efa622239 h1:kFOfPq6dUM1hTo4JG6LR5AXSUEsOjtdm0kw0FtQtMJA= +github.com/anmitsu/go-shlex v0.0.0-20161002113705-648efa622239/go.mod h1:2FmKhYUyUczH0OGQWaF5ceTx0UBShxjsH6f8oGKYe2c= github.com/antihax/optional v0.0.0-20180407024304-ca021399b1a6/go.mod h1:V8iCPQYkqmusNa815XgQio277wI47sdRh1dUOLdyC6Q= github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= github.com/aokoli/goutils v1.0.1/go.mod h1:SijmP0QR8LtwsmDs8Yii5Z/S4trXFGFC2oO5g9DP+DQ= @@ -258,7 +307,9 @@ github.com/armon/go-metrics v0.3.6/go.mod h1:4O98XIr/9W0sxpJ8UaYkvjk10Iff7SnFrb4 github.com/armon/go-metrics v0.3.9 h1:O2sNqxBdvq8Eq5xmzljcYzAORli6RWCvEym4cJf9m18= github.com/armon/go-metrics v0.3.9/go.mod h1:4O98XIr/9W0sxpJ8UaYkvjk10Iff7SnFrb4QAOwNTFc= github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= +github.com/armon/go-radix v1.0.0 h1:F4z6KzEeeQIMeLFa97iZU6vupzoecKdU5TX24SNppXI= github.com/armon/go-radix v1.0.0/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= +github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5 h1:0CwZNZbxp69SHPdPJAN/hZIm0C4OItdklCFmMRWYpio= github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5/go.mod h1:wHh0iHkYZB8zMSxRWpUBQtwG5a7fFgvEO+odwuTv2gs= github.com/aryann/difflib v0.0.0-20170710044230-e206f873d14a/go.mod h1:DAHtR1m6lCRdSC2Tm3DSWRPvIPr6xNKyeHdqDQSQT+A= github.com/asaskevich/govalidator v0.0.0-20180319081651-7d2e70ef918f/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY= @@ -270,7 +321,9 @@ github.com/asaskevich/govalidator v0.0.0-20200907205600-7a23bdc65eef/go.mod h1:W github.com/aws/aws-lambda-go v1.13.3/go.mod h1:4UKl9IzQMoD+QF79YdCuzCwp8VbmG4VAQwij/eHl5CU= github.com/aws/aws-sdk-go v1.15.11/go.mod h1:mFuSZ37Z9YOHbQEwBWztmVzqXrEkub65tZoCYDt7FT0= github.com/aws/aws-sdk-go v1.15.24/go.mod h1:mFuSZ37Z9YOHbQEwBWztmVzqXrEkub65tZoCYDt7FT0= +github.com/aws/aws-sdk-go v1.15.27/go.mod h1:mFuSZ37Z9YOHbQEwBWztmVzqXrEkub65tZoCYDt7FT0= github.com/aws/aws-sdk-go v1.15.78/go.mod h1:E3/ieXAlvM0XWO57iftYVDLLvQ824smPP3ATZkfNZeM= +github.com/aws/aws-sdk-go v1.17.4/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= github.com/aws/aws-sdk-go v1.17.7/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= github.com/aws/aws-sdk-go v1.25.48/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= github.com/aws/aws-sdk-go v1.27.0/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= @@ -282,30 +335,53 @@ github.com/aws/aws-sdk-go v1.34.34/go.mod h1:H7NKnBqNVzoTJpGfLrQkkD+ytBA93eiDYi/ github.com/aws/aws-sdk-go v1.35.5/go.mod h1:tlPOdRjfxPBpNIwqDj61rmsnA85v9jc0Ps9+muhnW+k= github.com/aws/aws-sdk-go v1.35.24/go.mod h1:tlPOdRjfxPBpNIwqDj61rmsnA85v9jc0Ps9+muhnW+k= github.com/aws/aws-sdk-go v1.35.31/go.mod h1:hcU610XS61/+aQV88ixoOzUoG7v3b31pl2zKMmprdro= +github.com/aws/aws-sdk-go v1.37.0/go.mod h1:hcU610XS61/+aQV88ixoOzUoG7v3b31pl2zKMmprdro= github.com/aws/aws-sdk-go v1.37.8/go.mod h1:hcU610XS61/+aQV88ixoOzUoG7v3b31pl2zKMmprdro= github.com/aws/aws-sdk-go v1.38.3/go.mod h1:hcU610XS61/+aQV88ixoOzUoG7v3b31pl2zKMmprdro= github.com/aws/aws-sdk-go v1.38.35/go.mod h1:hcU610XS61/+aQV88ixoOzUoG7v3b31pl2zKMmprdro= github.com/aws/aws-sdk-go v1.38.68/go.mod h1:hcU610XS61/+aQV88ixoOzUoG7v3b31pl2zKMmprdro= github.com/aws/aws-sdk-go v1.40.11/go.mod h1:585smgzpB/KqRA+K3y/NL/oYRqQvpNJYvLm+LY1U59Q= +github.com/aws/aws-sdk-go v1.40.34/go.mod h1:585smgzpB/KqRA+K3y/NL/oYRqQvpNJYvLm+LY1U59Q= +github.com/aws/aws-sdk-go v1.40.37/go.mod h1:585smgzpB/KqRA+K3y/NL/oYRqQvpNJYvLm+LY1U59Q= github.com/aws/aws-sdk-go v1.40.45/go.mod h1:585smgzpB/KqRA+K3y/NL/oYRqQvpNJYvLm+LY1U59Q= github.com/aws/aws-sdk-go v1.41.7/go.mod h1:585smgzpB/KqRA+K3y/NL/oYRqQvpNJYvLm+LY1U59Q= -github.com/aws/aws-sdk-go v1.42.9 h1:8ptAGgA+uC2TUbdvUeOVSfBocIZvGE2NKiLxkAcn1GA= -github.com/aws/aws-sdk-go v1.42.9/go.mod h1:585smgzpB/KqRA+K3y/NL/oYRqQvpNJYvLm+LY1U59Q= +github.com/aws/aws-sdk-go v1.42.23 h1:V0V5hqMEyVelgpu1e4gMPVCJ+KhmscdNxP/NWP1iCOA= +github.com/aws/aws-sdk-go v1.42.23/go.mod h1:gyRszuZ/icHmHAVE4gc/r+cfCmhA1AD+vqfWbgI+eHs= github.com/aws/aws-sdk-go-v2 v0.18.0/go.mod h1:JWVYvqSMppoMJC0x5wdwiImzgXTI9FuZwxzkQq9wy+g= github.com/aws/aws-sdk-go-v2 v1.7.0/go.mod h1:tb9wi5s61kTDA5qCkcDbt3KRVV74GGslQkl/DRdX/P4= +github.com/aws/aws-sdk-go-v2 v1.9.0/go.mod h1:cK/D0BBs0b/oWPIcX/Z/obahJK1TT7IPVjy53i/mX/4= github.com/aws/aws-sdk-go-v2 v1.9.1/go.mod h1:cK/D0BBs0b/oWPIcX/Z/obahJK1TT7IPVjy53i/mX/4= +github.com/aws/aws-sdk-go-v2 v1.9.2 h1:dUFQcMNZMLON4BOe273pl0filK9RqyQMhCK/6xssL6s= github.com/aws/aws-sdk-go-v2 v1.9.2/go.mod h1:cK/D0BBs0b/oWPIcX/Z/obahJK1TT7IPVjy53i/mX/4= +github.com/aws/aws-sdk-go-v2/config v1.7.0/go.mod h1:w9+nMZ7soXCe5nT46Ri354SNhXDQ6v+V5wqDjnZE+GY= +github.com/aws/aws-sdk-go-v2/config v1.8.3 h1:o5583X4qUfuRrOGOgmOcDgvr5gJVSu57NK08cWAhIDk= github.com/aws/aws-sdk-go-v2/config v1.8.3/go.mod h1:4AEiLtAb8kLs7vgw2ZV3p2VZ1+hBavOc84hqxVNpCyw= +github.com/aws/aws-sdk-go-v2/credentials v1.4.0/go.mod h1:dgGR+Qq7Wjcd4AOAW5Rf5Tnv3+x7ed6kETXyS9WCuAY= +github.com/aws/aws-sdk-go-v2/credentials v1.4.3 h1:LTdD5QhK073MpElh9umLLP97wxphkgVC/OjQaEbBwZA= github.com/aws/aws-sdk-go-v2/credentials v1.4.3/go.mod h1:FNNC6nQZQUuyhq5aE5c7ata8o9e4ECGmS4lAXC7o1mQ= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.5.0/go.mod h1:CpNzHK9VEFUCknu50kkB8z58AH2B5DvPP7ea1LHve/Y= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.6.0 h1:9tfxW/icbSu98C2pcNynm5jmDwU3/741F11688B6QnU= github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.6.0/go.mod h1:gqlclDEZp4aqJOancXK6TN24aKhT0W0Ae9MHk3wzTMM= +github.com/aws/aws-sdk-go-v2/internal/ini v1.2.2/go.mod h1:BQV0agm+JEhqR+2RT5e1XTFIDcAAV0eW6z2trp+iduw= +github.com/aws/aws-sdk-go-v2/internal/ini v1.2.4 h1:leSJ6vCqtPpTmBIgE7044B1wql1E4n//McF+mEgNrYg= github.com/aws/aws-sdk-go-v2/internal/ini v1.2.4/go.mod h1:ZcBrrI3zBKlhGFNYWvju0I3TR93I7YIgAfy82Fh4lcQ= github.com/aws/aws-sdk-go-v2/service/appconfig v1.4.2/go.mod h1:FZ3HkCe+b10uFZZkFdvf98LHW21k49W8o8J366lqVKY= github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.5.0/go.mod h1:acH3+MQoiMzozT/ivU+DbRg7Ooo2298RdRaWcOv+4vM= github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.8.1/go.mod h1:CM+19rL1+4dFWnOQKwDc7H1KwXTz+h61oUSHyhV0b3o= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.3.0/go.mod h1:R1KK+vY8AfalhG1AOu5e35pOD2SdoPKQCFLTvnxiohk= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.3.2 h1:r7jel2aa4d9Duys7wEmWqDd5ebpC9w6Kxu6wIjjp18E= github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.3.2/go.mod h1:72HRZDLMtmVQiLG2tLfQcaWLCssELvGl+Zf2WVxMmR8= +github.com/aws/aws-sdk-go-v2/service/kms v1.5.0/go.mod h1:w7JuP9Oq1IKMFQPkNe3V6s9rOssXzOVEMNEqK1L1bao= +github.com/aws/aws-sdk-go-v2/service/secretsmanager v1.6.0/go.mod h1:B+7C5UKdVq1ylkI/A6O8wcurFtaux0R1njePNPtKwoA= +github.com/aws/aws-sdk-go-v2/service/ssm v1.10.0/go.mod h1:4dXS5YNqI3SNbetQ7X7vfsMlX6ZnboJA2dulBwJx7+g= +github.com/aws/aws-sdk-go-v2/service/sso v1.4.0/go.mod h1:+1fpWnL96DL23aXPpMGbsmKe8jLTEfbjuQoA4WS1VaA= +github.com/aws/aws-sdk-go-v2/service/sso v1.4.2 h1:pZwkxZbspdqRGzddDB92bkZBoB7lg85sMRE7OqdB3V0= github.com/aws/aws-sdk-go-v2/service/sso v1.4.2/go.mod h1:NBvT9R1MEF+Ud6ApJKM0G+IkPchKS7p7c2YPKwHmBOk= +github.com/aws/aws-sdk-go-v2/service/sts v1.7.0/go.mod h1:0qcSMCyASQPN2sk/1KQLQ2Fh6yq8wm0HSDAimPhzCoM= +github.com/aws/aws-sdk-go-v2/service/sts v1.7.2 h1:ol2Y5DWqnJeKqNd8th7JWzBtqu63xpOfs1Is+n1t8/4= github.com/aws/aws-sdk-go-v2/service/sts v1.7.2/go.mod h1:8EzeIqfWt2wWT4rJVu3f21TfrhJ8AEMzVybRNSb/b4g= github.com/aws/smithy-go v1.5.0/go.mod h1:SObp3lf9smib00L/v3U2eAKG8FyQ7iLrJnQiAmR5n+E= +github.com/aws/smithy-go v1.8.0 h1:AEwwwXQZtUwP5Mz506FeXXrKBe0jA8gVM+1gEcSRooc= github.com/aws/smithy-go v1.8.0/go.mod h1:SObp3lf9smib00L/v3U2eAKG8FyQ7iLrJnQiAmR5n+E= github.com/baiyubin/aliyun-sts-go-sdk v0.0.0-20180326062324-cfa1a18b161f/go.mod h1:AuiFmCCPBSrqvVMvuqFuk0qogytodnVFVSN5CeJB8Gc= github.com/beevik/ntp v0.2.0/go.mod h1:hIHWr+l3+/clUnF44zdK+CWW7fO8dR5cIylAQ76NRpg= @@ -368,6 +444,9 @@ github.com/cenkalti/backoff v1.0.0/go.mod h1:90ReRw6GdpyfrHakVjL/QHaoyV4aDUVVkXQ github.com/cenkalti/backoff v2.0.0+incompatible/go.mod h1:90ReRw6GdpyfrHakVjL/QHaoyV4aDUVVkXQJJJ3NXXM= github.com/cenkalti/backoff v2.1.1+incompatible/go.mod h1:90ReRw6GdpyfrHakVjL/QHaoyV4aDUVVkXQJJJ3NXXM= github.com/cenkalti/backoff v2.2.1+incompatible/go.mod h1:90ReRw6GdpyfrHakVjL/QHaoyV4aDUVVkXQJJJ3NXXM= +github.com/cenkalti/backoff/v3 v3.0.0/go.mod h1:cIeZDE3IrqwwJl6VUwCN6trj1oXrTS4rc0ij+ULvLYs= +github.com/cenkalti/backoff/v3 v3.2.2 h1:cfUAAO3yvKMYKPrvhDuHSwQnhZNk/RMHKdZqKTxfm6M= +github.com/cenkalti/backoff/v3 v3.2.2/go.mod h1:cIeZDE3IrqwwJl6VUwCN6trj1oXrTS4rc0ij+ULvLYs= github.com/cenkalti/backoff/v4 v4.0.2/go.mod h1:eEew/i+1Q6OrCDZh3WiXYv3+nJwBASZ8Bog/87DQnVg= github.com/cenkalti/backoff/v4 v4.1.0/go.mod h1:scbssz8iZGpm3xbr14ovlUdkxfGXNInqkPWOWmG2CLw= github.com/cenkalti/backoff/v4 v4.1.1/go.mod h1:scbssz8iZGpm3xbr14ovlUdkxfGXNInqkPWOWmG2CLw= @@ -561,6 +640,8 @@ github.com/cortexproject/cortex v1.6.1-0.20210215155036-dfededd9f331/go.mod h1:8 github.com/cortexproject/cortex v1.7.1-0.20210224085859-66d6fb5b0d42/go.mod h1:u2dxcHInYbe45wxhLoWVdlFJyDhXewsMcxtnbq/QbH4= github.com/cortexproject/cortex v1.7.1-0.20210316085356-3fedc1108a49/go.mod h1:/DBOW8TzYBTE/U+O7Whs7i7E2eeeZl1iRVDtIqxn5kg= github.com/cortexproject/cortex v1.8.1-0.20210422151339-cf1c444e0905/go.mod h1:xxm4/CLvTmDxwE7yXwtClR4dIvkG4S09o5DygPOgc1U= +github.com/cortexproject/cortex v1.10.1-0.20211014125347-85c378182d0d h1:2KZVBpjU3NtLZ5oEB7c0TXIGKZYH6vc4pENecdbcCxw= +github.com/cortexproject/cortex v1.10.1-0.20211014125347-85c378182d0d/go.mod h1:VZ2fFzUCWcyyneToKNu+ALOpGUJIdkInXy4MOhCo/xw= github.com/cortexproject/cortex v1.11.0 h1:kx2iBVLZdu7Qjv7dbN4Ek2ax2nICsyoBL+DdEcAetOQ= github.com/cortexproject/cortex v1.11.0/go.mod h1:oAOdKib5B/IhvxrNecMJH9Wb+a0q31KaAUiv/fcDvFo= github.com/couchbase/go-couchbase v0.0.0-20180501122049-16db1f1fe037/go.mod h1:TWI8EKQMs5u5jLKW/tsb9VwauIrMIxQG1r5fMsswK5U= @@ -604,6 +685,7 @@ github.com/denisenkom/go-mssqldb v0.0.0-20180620032804-94c9c97e8c9f/go.mod h1:xN github.com/denisenkom/go-mssqldb v0.0.0-20190515213511-eb9f6a1743f3/go.mod h1:zAg7JM8CkOJ43xKXIj7eRO9kmWm/TW578qo+oDO6tuM= github.com/denisenkom/go-mssqldb v0.0.0-20190707035753-2be1aa521ff4/go.mod h1:zAg7JM8CkOJ43xKXIj7eRO9kmWm/TW578qo+oDO6tuM= github.com/denisenkom/go-mssqldb v0.0.0-20191128021309-1d7a30a10f73/go.mod h1:xbL0rPBG9cCiLr28tMa8zpbdarY27NDyej4t/EjAShU= +github.com/denisenkom/go-mssqldb v0.9.0/go.mod h1:xbL0rPBG9cCiLr28tMa8zpbdarY27NDyej4t/EjAShU= github.com/denisenkom/go-mssqldb v0.10.0/go.mod h1:xbL0rPBG9cCiLr28tMa8zpbdarY27NDyej4t/EjAShU= github.com/dennwc/varint v1.0.0 h1:kGNFFSSw8ToIy3obO/kKr8U9GZYUAxQEVuix4zfDWzE= github.com/dennwc/varint v1.0.0/go.mod h1:hnItb35rvZvJrbTALZtY/iQfDs48JKRG1RPpgziApxA= @@ -661,6 +743,8 @@ github.com/docker/go-metrics v0.0.1/go.mod h1:cG1hvH2utMXtqgqqYE9plW6lDxS3/5ayHz github.com/docker/go-units v0.3.3/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= github.com/docker/go-units v0.4.0 h1:3uh0PgVws3nIA0Q+MwDC8yjEPf9zjRfZZWXZYDct3Tw= github.com/docker/go-units v0.4.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= +github.com/docker/libkv v0.2.2-0.20180912205406-458977154600 h1:x0AMRhackzbivKKiEeSMzH6gZmbALPXCBG0ecBmRlco= +github.com/docker/libkv v0.2.2-0.20180912205406-458977154600/go.mod h1:r5hEwHwW8dr0TFBYGCarMNbrQOiwL1xoqDYZ/JqoTK0= github.com/docker/libnetwork v0.8.0-dev.2.0.20181012153825-d7b61745d166/go.mod h1:93m0aTqz6z+g32wla4l4WxTrdtvBRmVzYRkYvasA5Z8= github.com/docker/libtrust v0.0.0-20150114040149-fa567046d9b1/go.mod h1:cyGadeNEkKy96OOhEzfZl+yxihPEzKnqJwvfuSUqbZE= github.com/docker/libtrust v0.0.0-20160708172513-aabc10ec26b7 h1:UhxFibDNY/bfvqU5CAUmr9zpesgbU6SWc8/B4mflAE4= @@ -672,6 +756,8 @@ github.com/duosecurity/duo_api_golang v0.0.0-20190308151101-6c680f768e74/go.mod github.com/dustin/go-humanize v0.0.0-20171111073723-bb3d318650d4/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= github.com/dustin/go-humanize v1.0.0 h1:VSnTsYCnlFHaM2/igO1h6X3HA71jcobQuxemgkq4zYo= github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= +github.com/dustin/gojson v0.0.0-20160307161227-2e71ec9dd5ad h1:Qk76DOWdOp+GlyDKBAG3Klr9cn7N+LcYc82AZ2S7+cA= +github.com/dustin/gojson v0.0.0-20160307161227-2e71ec9dd5ad/go.mod h1:mPKfmRa823oBIgl2r20LeMSpTAteW5j7FLkc0vjmzyQ= github.com/dvsekhvalnov/jose2go v0.0.0-20170216131308-f21a8cedbbae/go.mod h1:7BvyPhdbLxMXIYTFPLsyJRFMsKmOZnQmzh6Gb+uquuM= github.com/dvyukov/go-fuzz v0.0.0-20210103155950-6a8e9d1f2415/go.mod h1:11Gm+ccJnvAhCNLlf5+cS9KjtbaD5I5zaZpFMsTHWTw= github.com/eapache/go-resiliency v1.1.0/go.mod h1:kFI+JgMyC7bLPUVY133qvEBtVayf5mFgVsvEsIPBvNs= @@ -697,6 +783,8 @@ github.com/ema/qdisc v0.0.0-20200603082823-62d0308e3e00 h1:0GHzegkDz/zSrt+Zph1Ou github.com/ema/qdisc v0.0.0-20200603082823-62d0308e3e00/go.mod h1:ix4kG2zvdUd8kEKSW0ZTr1XLks0epFpI4j745DXxlNE= github.com/emicklei/go-restful v0.0.0-20170410110728-ff4f55a20633/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs= github.com/emicklei/go-restful v2.9.5+incompatible/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs= +github.com/emirpasic/gods v1.12.0 h1:QAUIPSaCu4G+POclxeqb3F+WPpdKqFGlw36+yOzGlrg= +github.com/emirpasic/gods v1.12.0/go.mod h1:YfzfFFoVP/catgzJb4IKIqXjX78Ha8FMSDh3ymbK86o= github.com/envoyproxy/go-control-plane v0.0.0-20180919002855-2137d9196328/go.mod h1:SBwIajubJHhxtWwsL9s8ss4safvEdbitLhGGK48rN6g= github.com/envoyproxy/go-control-plane v0.6.9/go.mod h1:SBwIajubJHhxtWwsL9s8ss4safvEdbitLhGGK48rN6g= github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= @@ -721,11 +809,13 @@ github.com/evanphx/json-patch v4.5.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLi github.com/evanphx/json-patch v4.9.0+incompatible h1:kLcOMZeuLAJvL2BPWLMIj5oaZQobrkAqrL+WFZwQses= github.com/evanphx/json-patch v4.9.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= github.com/evanphx/json-patch/v5 v5.2.0/go.mod h1:G79N1coSVB93tBe7j6PhzjmR3/2VvlbKOFpnXhI9Bw4= +github.com/evanphx/json-patch/v5 v5.5.0/go.mod h1:G79N1coSVB93tBe7j6PhzjmR3/2VvlbKOFpnXhI9Bw4= 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.12.0 h1:mRhaKNwANqRgUBGKmnI5ZxEk7QXmjQeCcuYFMX2bfcc= github.com/fatih/color v1.12.0/go.mod h1:ELkj/draVOlAH/xkhN6mQ50Qd0MPOk5AAr3maGEBuJM= +github.com/fatih/color v1.13.0 h1:8LOYc1KYPPmyKMuN8QV2DNRWNbLo6LZ0iLs8+mlH53w= +github.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk= github.com/fatih/structs v0.0.0-20180123065059-ebf56d35bba7/go.mod h1:9NiDSp5zOcgEDl+j00MP/WkGVPOlPRLejGD8Ga6PJ7M= github.com/fatih/structs v1.1.0 h1:Q7juDM0QtcnhCpeyLGQKyg4TOIghuNXrkL32pHAUMxo= github.com/fatih/structs v1.1.0/go.mod h1:9NiDSp5zOcgEDl+j00MP/WkGVPOlPRLejGD8Ga6PJ7M= @@ -735,6 +825,7 @@ github.com/felixge/fgprof v0.9.1/go.mod h1:7/HK6JFtFaARhIljgP2IV8rJLIoHDoOYoUphs github.com/felixge/httpsnoop v1.0.1/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= github.com/felixge/httpsnoop v1.0.2 h1:+nS9g82KMXccJ/wp0zyRW9ZBHFETmMGtkk+2CTTrW4o= github.com/felixge/httpsnoop v1.0.2/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= +github.com/flynn/go-shlex v0.0.0-20150515145356-3f9db97f8568/go.mod h1:xEzjJPgXI435gkrCt3MPfRiAkVrwSbHsst4LCFVfpJc= github.com/fogleman/gg v1.2.1-0.20190220221249-0403632d5b90/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k= github.com/form3tech-oss/jwt-go v3.2.2+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k= github.com/form3tech-oss/jwt-go v3.2.3+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k= @@ -745,8 +836,10 @@ github.com/franela/goblin v0.0.0-20200105215937-c9ffbefa60db/go.mod h1:7dvUGVsVB github.com/franela/goblin v0.0.0-20210519012713-85d372ac71e2/go.mod h1:VzmDKDJVZI3aJmnRI9VjAn9nJ8qPPsN1fqzr9dqInIo= github.com/franela/goreq v0.0.0-20171204163338-bcd34c9993f8/go.mod h1:ZhphrRTfi2rbfLwlschooIH4+wKKDR4Pdxhh+TRoA20= github.com/frankban/quicktest v1.4.0/go.mod h1:36zfPVQyHxymz4cH7wlDmVwDrJuljRB60qkgn7rorfQ= +github.com/frankban/quicktest v1.10.0/go.mod h1:ui7WezCLWMWxVWr1GETZY3smRy0G4KWq9vcPtJmFl7Y= github.com/frankban/quicktest v1.10.2/go.mod h1:K+q6oSqb0W0Ininfk863uOk1lMy69l/P6txr3mVT54s= github.com/frankban/quicktest v1.11.3/go.mod h1:wRf/ReqHper53s+kmmSZizM8NamnL3IM0I9ntUbOk+k= +github.com/frankban/quicktest v1.13.0/go.mod h1:qLE0fzW0VuyUAJgPU19zByoIr0HtCHN/r/VLSOOIySU= github.com/frankban/quicktest v1.14.0 h1:+cqqvzZV87b4adx/5ayVOaYZ2CrvM4ejQvUdBzPPUss= github.com/frankban/quicktest v1.14.0/go.mod h1:NeW+ay9A/U67EYXNFA1nPE8e/tnQv/09mUdL/ijj8og= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= @@ -754,6 +847,7 @@ github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4 github.com/fsnotify/fsnotify v1.5.1 h1:mZcQUHVQUQWoPXXtuf9yuEXKudkV2sx1E06UadKWpgI= github.com/fsnotify/fsnotify v1.5.1/go.mod h1:T3375wBYaZdLLcVNkcVbzGHY7f1l/uK5T5Ai1i3InKU= github.com/fsouza/fake-gcs-server v1.7.0/go.mod h1:5XIRs4YvwNbNoz+1JF8j6KLAyDh7RHGAyAK3EP2EsNk= +github.com/fsouza/fake-gcs-server v1.30.1 h1:OBuje/XJiwwzGOuwEhPzZ8s2gF1vDHTZq1X+AhYEqjc= github.com/fullsailor/pkcs7 v0.0.0-20190404230743-d7302db945fa/go.mod h1:KnogPXtdwXqoenmZCw6S+25EAm2MkxbG0deNDu4cbSA= github.com/fvbommel/sortorder v1.0.2 h1:mV4o8B2hKboCdkJm+a7uX/SIpZob4JzUpc5GGnM45eo= github.com/fvbommel/sortorder v1.0.2/go.mod h1:uk88iVf1ovNn1iLfgUVU2F9o5eO30ui720w+kxuqRs0= @@ -765,11 +859,24 @@ github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeME github.com/ghodss/yaml v1.0.1-0.20190212211648-25d852aebe32/go.mod h1:GIjDIg/heH5DOkXY3YJ/wNhfHsQHoXGjl8G8amsYQ1I= github.com/gin-contrib/sse v0.1.0/go.mod h1:RHrZQHXnP2xjPF+u1gW/2HnVO7nvIa9PG3Gm+fLHvGI= github.com/gin-gonic/gin v1.5.0/go.mod h1:Nd6IXA8m5kNZdNEHMBd93KT+mdY3+bewLgRvmCsR2Do= +github.com/gin-gonic/gin v1.6.3/go.mod h1:75u5sXoLsGZoRN5Sgbi1eraJ4GU3++wFwWzhwvtwp4M= +github.com/gliderlabs/ssh v0.2.2 h1:6zsha5zo/TWhRhwqCD3+EarCAgZ2yN28ipRnGPnwkI0= +github.com/gliderlabs/ssh v0.2.2/go.mod h1:U7qILu1NlMHj9FlMhZLlkCdDnU1DBEAqr0aevW3Awn0= github.com/glinton/ping v0.1.4-0.20200311211934-5ac87da8cd96/go.mod h1:uY+1eqFUyotrQxF1wYFNtMeHp/swbYRsoGzfcPZ8x3o= github.com/globalsign/mgo v0.0.0-20180905125535-1ca0a4f7cbcb/go.mod h1:xkRDCp4j0OGD1HRkm4kmhM+pmpv3AKq5SU7GMg4oO/Q= github.com/globalsign/mgo v0.0.0-20181015135952-eeefdecb41b8/go.mod h1:xkRDCp4j0OGD1HRkm4kmhM+pmpv3AKq5SU7GMg4oO/Q= +github.com/go-asn1-ber/asn1-ber v1.3.1/go.mod h1:hEBeB/ic+5LoWskz+yKT7vGhhPYkProFKoKdwZRWMe0= github.com/go-chi/chi v4.1.0+incompatible/go.mod h1:eB3wogJHnLi3x/kFX2A+IbTBlXxmMeXJVKy9tTv1XzQ= github.com/go-chi/chi/v5 v5.0.0/go.mod h1:BBug9lr0cqtdAhsu6R4AAdvufI0/XBzAQSsUqJpoZOs= +github.com/go-git/gcfg v1.5.0 h1:Q5ViNfGF8zFgyJWPqYwA7qGFoMTEiBmdlkcfRmpIMa4= +github.com/go-git/gcfg v1.5.0/go.mod h1:5m20vg6GwYabIxaOonVkTdrILxQMpEShl1xiMF4ua+E= +github.com/go-git/go-billy/v5 v5.2.0/go.mod h1:pmpqyWchKfYfrkb/UVH4otLvyi/5gJlGI4Hb3ZqZ3W0= +github.com/go-git/go-billy/v5 v5.3.1 h1:CPiOUAzKtMRvolEKw+bG1PLRpT7D3LIs3/3ey4Aiu34= +github.com/go-git/go-billy/v5 v5.3.1/go.mod h1:pmpqyWchKfYfrkb/UVH4otLvyi/5gJlGI4Hb3ZqZ3W0= +github.com/go-git/go-git-fixtures/v4 v4.2.1 h1:n9gGL1Ct/yIw+nfsfr8s4+sbhT+Ncu2SubfXjIWgci8= +github.com/go-git/go-git-fixtures/v4 v4.2.1/go.mod h1:K8zd3kDUAykwTdDCr+I0per6Y6vMiRR/nnVTBtavnB0= +github.com/go-git/go-git/v5 v5.4.2 h1:BXyZu9t0VkbiHtqrsvdq39UDhGJTl1h55VW6CSC4aY4= +github.com/go-git/go-git/v5 v5.4.2/go.mod h1:gQ1kArt6d+n+BGd+/B/I74HwRTLhth2+zti4ihgckDc= 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= @@ -785,6 +892,7 @@ github.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vb github.com/go-kit/log v0.2.0 h1:7i2K3eKTos3Vc0enKCfnVcgHh2olr/MyfboYq7cAcFw= github.com/go-kit/log v0.2.0/go.mod h1:NwTd00d/i8cPZ3xOwwiv2PO5MOcx78fFErGNcVmBjv0= github.com/go-ldap/ldap v3.0.2+incompatible/go.mod h1:qfd9rJvER9Q0/D/Sqn1DfHRoBp40uXYvFoEVrNEPqRc= +github.com/go-ldap/ldap/v3 v3.1.10/go.mod h1:5Zun81jBTabRaI8lzN7E1JjyEl1g6zI6u9pd8luAK4Q= 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-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A= @@ -896,12 +1004,17 @@ github.com/go-openapi/validate v0.19.12/go.mod h1:Rzou8hA/CBw8donlS6WNEUQupNvUZ0 github.com/go-openapi/validate v0.19.15/go.mod h1:tbn/fdOwYHgrhPBzidZfJC2MIVvs9GA7monOmWBbeCI= github.com/go-openapi/validate v0.20.1/go.mod h1:b60iJT+xNNLfaQJUqLI7946tYiFEOuE9E4k54HpKcJ0= github.com/go-openapi/validate v0.20.2/go.mod h1:e7OJoKNgd0twXZwIn0A43tHbvIcr/rZIVCbJBpTUoY0= +github.com/go-playground/assert/v2 v2.0.1/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4= github.com/go-playground/locales v0.12.1/go.mod h1:IUMDtCfWo/w/mtMfIE/IG2K+Ey3ygWanZIBtBW0W2TM= +github.com/go-playground/locales v0.13.0/go.mod h1:taPMhCMXrRLJO55olJkUXHZBHCxTMfnGwq/HNwmWNS8= github.com/go-playground/universal-translator v0.16.0/go.mod h1:1AnU7NaIRDWWzGEKwgtJRd2xk99HeFyHw3yid4rvQIY= +github.com/go-playground/universal-translator v0.17.0/go.mod h1:UkSxE5sNxxRwHyU+Scu5vgOQjsIJAF8j9muTVoKLVtA= +github.com/go-playground/validator/v10 v10.2.0/go.mod h1:uOYAAleCW8F/7oMFd6aG0GOhaH6EGOAJShg8Id5JGkI= github.com/go-redis/redis v6.15.9+incompatible/go.mod h1:NAIEuMOZ/fxfXJIrKDQDz8wamY7mA7PouImQ2Jvg6kA= github.com/go-redis/redis/v8 v8.0.0-beta.10.0.20200905143926-df7fe4e2ce72/go.mod h1:CJP1ZIHwhosNYwIdaHPZK9vHsM3+roNBaZ7U9Of1DXc= github.com/go-redis/redis/v8 v8.2.3/go.mod h1:ysgGY09J/QeDYbu3HikWEIPCwaeOkuNoTgKayTEaEOw= github.com/go-redis/redis/v8 v8.9.0/go.mod h1:ik7vb7+gm8Izylxu6kf6wG26/t2VljgCfSQ1DM4O1uU= +github.com/go-redis/redis/v8 v8.11.4/go.mod h1:2Z2wHZXdQpCDXEGzqMockDpNyYvi2l4Pxt6RJr792+w= github.com/go-resty/resty/v2 v2.1.1-0.20191201195748-d7b97669fe48 h1:JVrqSeQfdhYRFk24TvhTZWU0q8lfCojxZQFi3Ou7+uY= github.com/go-resty/resty/v2 v2.1.1-0.20191201195748-d7b97669fe48/go.mod h1:dZGr0i9PLlaaTD4H/hoZIDjQ+r6xq8mgbRzHZf7f2J8= github.com/go-sql-driver/mysql v0.0.0-20180618115901-749ddf1598b4/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w= @@ -916,6 +1029,7 @@ github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/me github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE= github.com/go-test/deep v1.0.1/go.mod h1:wGDj63lr65AM2AQyKZd/NYHGb0R+1RLqB8NKt3aSFNA= github.com/go-test/deep v1.0.2-0.20181118220953-042da051cf31/go.mod h1:wGDj63lr65AM2AQyKZd/NYHGb0R+1RLqB8NKt3aSFNA= +github.com/go-test/deep v1.0.2/go.mod h1:wGDj63lr65AM2AQyKZd/NYHGb0R+1RLqB8NKt3aSFNA= github.com/go-test/deep v1.0.8 h1:TDsG77qcSprGbC6vTN8OuXp5g+J+b5Pcguhf7Zt61VM= github.com/go-test/deep v1.0.8/go.mod h1:5C2ZWiW0ErCdrYzpqxLbTX7MG14M9iiw8DgHncVwcsE= github.com/go-zookeeper/zk v1.0.2 h1:4mx0EYENAdX/B/rbunjlt5+4RTA/a9SMHBRuSKdGxPM= @@ -960,6 +1074,7 @@ github.com/godbus/dbus/v5 v5.0.4 h1:9349emZab16e7zQvpmsbtjc18ykshndd8y2PG3sgJbA= github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= github.com/gofrs/uuid v2.1.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM= github.com/gofrs/uuid v3.3.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM= +github.com/gofrs/uuid v4.0.0+incompatible h1:1SD/1F5pU8p29ybwgQSwpQk+mwdRrXCYuPhW6m+TnJw= github.com/gofrs/uuid v4.0.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM= github.com/gogo/googleapis v0.0.0-20180223154316-0cd9801be74a/go.mod h1:gf4bu3Q80BeJ6H1S1vYPm8/ELATdvryBaNFGgqEef3s= github.com/gogo/googleapis v1.1.0/go.mod h1:gf4bu3Q80BeJ6H1S1vYPm8/ELATdvryBaNFGgqEef3s= @@ -981,8 +1096,9 @@ github.com/gogo/status v1.0.3/go.mod h1:SavQ51ycCLnc7dGyJxp8YAmudx8xqiVrRf+6IXRs github.com/gogo/status v1.1.0 h1:+eIkrewn5q6b30y+g/BJINVVdi2xH7je5MPJ3ZPK3JA= github.com/gogo/status v1.1.0/go.mod h1:BFv9nrluPLmrS0EmGVvLaPNmRosr9KapBYd5/hpY1WM= github.com/golang-jwt/jwt v3.2.1+incompatible/go.mod h1:8pz2t5EyA70fFQQSrl6XZXzqecmYZeUEB8OUGHkxJ+I= -github.com/golang-jwt/jwt/v4 v4.0.0 h1:RAqyYixv1p7uEnocuy8P1nru5wprCh/MH2BIlW5z5/o= github.com/golang-jwt/jwt/v4 v4.0.0/go.mod h1:/xlHOz8bRuivTWchD4jCa+NbatV+wEUSzwAxVc6locg= +github.com/golang-jwt/jwt/v4 v4.1.0 h1:XUgk2Ex5veyVFVeLm0xhusUTQybEbexJXrvPNOKkSY0= +github.com/golang-jwt/jwt/v4 v4.1.0/go.mod h1:/xlHOz8bRuivTWchD4jCa+NbatV+wEUSzwAxVc6locg= github.com/golang-migrate/migrate/v4 v4.7.0/go.mod h1:Qvut3N4xKWjoH3sokBccML6WyHSnggXm/DvMMnTsQIc= github.com/golang-sql/civil v0.0.0-20190719163853-cb61b32ac6fe/go.mod h1:8vg3r2VgvsThLBIFL93Qb5yWzgyZWhEmBwUJWevAkK0= github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k= @@ -1068,14 +1184,21 @@ github.com/google/go-jsonnet v0.17.0/go.mod h1:sOcuej3UW1vpPTZOr8L7RQimqai1a57bt github.com/google/go-querystring v0.0.0-20170111101155-53e6ce116135/go.mod h1:odCYkC5MyYFN7vkCjXpyrEuKhc/BUO6wN/zVPAxq5ck= github.com/google/go-querystring v1.0.0 h1:Xkwi/a1rcvNg1PPYe5vI8GbeBY/jrVuDX5ASuANWTrk= github.com/google/go-querystring v1.0.0/go.mod h1:odCYkC5MyYFN7vkCjXpyrEuKhc/BUO6wN/zVPAxq5ck= +github.com/google/go-replayers/grpcreplay v1.1.0 h1:S5+I3zYyZ+GQz68OfbURDdt/+cSMqCK1wrvNx7WBzTE= +github.com/google/go-replayers/grpcreplay v1.1.0/go.mod h1:qzAvJ8/wi57zq7gWqaE6AwLM6miiXUQwP1S+I9icmhk= +github.com/google/go-replayers/httpreplay v1.0.0 h1:8SmT8fUYM4nueF+UnXIX8LJxNTb1vpPuknXz+yTWzL4= +github.com/google/go-replayers/httpreplay v1.0.0/go.mod h1:LJhKoTwS5Wy5Ld/peq8dFFG5OfJyHEz7ft+DsTUv25M= github.com/google/gofuzz v0.0.0-20161122191042-44d81051d367/go.mod h1:HP5RmnzzSNb993RKQDq4+1A4ia9nllfqcQFTQJedwGI= github.com/google/gofuzz v0.0.0-20170612174753-24818f796faf/go.mod h1:HP5RmnzzSNb993RKQDq4+1A4ia9nllfqcQFTQJedwGI= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/gofuzz v1.1.0 h1:Hsa8mG0dQ46ij8Sl2AYJDUv1oA9/d6Vk+3LG99Oe02g= github.com/google/gofuzz v1.1.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= +github.com/google/martian v2.1.1-0.20190517191504-25dcb96d9e51+incompatible h1:xmapqc1AyLoB+ddYT6r04bD9lIjlOqGaREovi0SzFaE= +github.com/google/martian v2.1.1-0.20190517191504-25dcb96d9e51+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.2.1 h1:d8MncMlErDFTwQGBK1xhv026j9kqhvw1Qv9IbWT1VLQ= github.com/google/martian/v3 v3.2.1/go.mod h1:oBOf6HBosgwRXnUGWUB05QECsc6uvmMiJ3+6W4l/CUk= 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= @@ -1083,25 +1206,30 @@ github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hf 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-20200507031123-427632fa3b1c/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= github.com/google/pprof v0.0.0-20200615235658-03e1cf38a040/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-20210122040257-d980be63207e/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20210226084205-cbba55b83ad5/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20210506205249-923b5ab0fc1a/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20210601050228-01bbb1931b22/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20210609004039-a478d1d731e9/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20210715191844-86eeefc3e471/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20211008130755-947d60d73cc0 h1:zHs+jv3LO743/zFGcByu2KmpbliCU2AhjcGgrdTwSG4= github.com/google/pprof v0.0.0-20211008130755-947d60d73cc0/go.mod h1:KgnwoLYCZ8IQu3XUZ8Nc/bM9CCZFOyjUNOSygVozoDg= github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= +github.com/google/subcommands v1.0.1/go.mod h1:ZjhPrFU+Olkh9WazFPsl27BQ4UPiG37m3yTrtFlrHVk= github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.2.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I= github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/wire v0.5.0 h1:I7ELFeVBr3yfPIcc8+MWvrjk+3VjbcSzoXm3JVa+jD8= +github.com/google/wire v0.5.0/go.mod h1:ngWDr9Qvq3yZA10YrxfyGELY/AFWGVpy9c1LTRi1EoU= github.com/googleapis/gax-go v2.0.2+incompatible/go.mod h1:SFVmujtThgffbyetf+mdk2eWhX2bMyUtNHzFKcPA9HY= 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= @@ -1125,8 +1253,9 @@ github.com/gophercloud/gophercloud v0.22.0/go.mod h1:wRtmUelyIIv3CSSDI47aUwbs075 github.com/gopherjs/gopherjs v0.0.0-20180825215210-0210a2f0f73c/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= github.com/gopherjs/gopherjs v0.0.0-20190430165422-3e4dfb77656c/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= -github.com/gopherjs/gopherjs v0.0.0-20191106031601-ce3c9ade29de h1:F7WD09S8QB4LrkEpka0dFPLSotH11HRpCsLIbIcJ7sU= github.com/gopherjs/gopherjs v0.0.0-20191106031601-ce3c9ade29de/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= +github.com/gopherjs/gopherjs v0.0.0-20200217142428-fce0ec30dd00 h1:l5lAOZEym3oK3SQ2HBHWsJUfbNBiTXJDeW2QDxw9AQ0= +github.com/gopherjs/gopherjs v0.0.0-20200217142428-fce0ec30dd00/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= github.com/gorilla/context v1.1.1/go.mod h1:kBGZzfjB9CEq2AlWe17Uuf7NDRt0dE0s8S51q0aT7Yg= github.com/gorilla/handlers v0.0.0-20150720190736-60c7bfde3e33/go.mod h1:Qkdc/uu4tH4g6mTK6auzZ766c4CA0Ng8+o/OAirnOIQ= github.com/gorilla/handlers v1.5.1 h1:9lRY6j8DEeeBT10CvO9hGW0gmky0BprnvDI5vfhUHH4= @@ -1141,15 +1270,24 @@ github.com/gorilla/securecookie v1.1.1/go.mod h1:ra0sb63/xPlUeL+yeDciTfxMRAA+MP+ github.com/gorilla/sessions v1.2.1/go.mod h1:dk2InVEVJ0sfLlnXv9EAgkf6ecYs/i80K/zI+bUmuGM= github.com/gorilla/websocket v0.0.0-20170926233335-4201258b820c/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= +github.com/gorilla/websocket v1.4.1/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/gorilla/websocket v1.4.2 h1:+/TMaTYc4QFitKJxsQ7Yye35DkWvkdLcvGKqM+x0Ufc= github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= +github.com/gosimple/slug v1.12.0 h1:xzuhj7G7cGtd34NXnW/yF0l+AGNfWqwgh/IXgFy7dnc= +github.com/gosimple/slug v1.12.0/go.mod h1:UiRaFH+GEilHstLUmcBgWcI42viBN7mAb818JrYOeFQ= +github.com/gosimple/unidecode v1.0.1 h1:hZzFTMMqSswvf0LBJZCZgThIZrpDHFXux9KeGmn6T/o= +github.com/gosimple/unidecode v1.0.1/go.mod h1:CP0Cr1Y1kogOtx0bJblKzsVWrqYaqfNOnHzpgWw4Awc= github.com/gotestyourself/gotestyourself v2.2.0+incompatible/go.mod h1:zZKM6oeNM8k+FRljX1mnzVYeS8wiGgQyvST1/GafPbY= github.com/grafana/dnsmasq_exporter v0.2.1-0.20211118155541-751b01d21de9 h1:/ovWD85B27b/xytKaxhP/LvXF8fxWIhEwE55mFpCQsE= github.com/grafana/dnsmasq_exporter v0.2.1-0.20211118155541-751b01d21de9/go.mod h1:Jj5TSVVJE6t8Brq/ZkUbQ1n260dilriL0tWNaHjVDUs= github.com/grafana/dskit v0.0.0-20210908150159-fcf48cb19aa4/go.mod h1:m3eHzwe5IT5eE2MI3Ena2ooU8+Hek8IiVXb9yJ1+0rs= +github.com/grafana/dskit v0.0.0-20211011144203-3a88ec0b675f h1:FvvSVEbnGeM2bUivGmsiXTi8URJyBU7TcFEEoRe5wWI= +github.com/grafana/dskit v0.0.0-20211011144203-3a88ec0b675f/go.mod h1:uPG2nyK4CtgNDmWv7qyzYcdI+S90kHHRWvHnBtEMBXM= github.com/grafana/dskit v0.0.0-20211021180445-3bd016e9d7f1 h1:Qf+/W3Tup0nO21tgJmO14WJK0yyrm4L2UJipZP+Zoow= github.com/grafana/dskit v0.0.0-20211021180445-3bd016e9d7f1/go.mod h1:uPG2nyK4CtgNDmWv7qyzYcdI+S90kHHRWvHnBtEMBXM= github.com/grafana/gocql v0.0.0-20200605141915-ba5dc39ece85/go.mod h1:crI9WX6p0IhrqB+DqIUHulRW853PaNFf7o4UprV//3I= +github.com/grafana/loki v1.6.2-0.20211021114919-0ae0d4da122d h1:vjCXyKr987ClVgPyj7fZXjvCX8B1Y51AwUaf1k6/NqI= +github.com/grafana/loki v1.6.2-0.20211021114919-0ae0d4da122d/go.mod h1:CHJv20FcRFw/N6/FJOtEdMt1zDcCJbxMoLmzpH74CVQ= github.com/grafana/loki v1.6.2-0.20220112164614-525040a32657 h1:1TSVAyuDYJdp4/195GrdrGg0ZHMB+eJye1qIgi0N8+4= github.com/grafana/loki v1.6.2-0.20220112164614-525040a32657/go.mod h1:9dAaw+bJR/qZiHZYO9ZvFhuqphGblcUEwuvGPbgZldA= github.com/grafana/mongodb_exporter v0.20.8-0.20211006135645-bef0f0239601 h1:k5VTHQsSBs/jZHWXEvjW4QAZQcoGB3QQfUN0XGA6pB4= @@ -1170,6 +1308,8 @@ github.com/grafana/statsd_exporter v0.18.1-0.20211118164740-8e806158da0b h1:eFIc github.com/grafana/statsd_exporter v0.18.1-0.20211118164740-8e806158da0b/go.mod h1:N4Z1+iSqc9rnxlT1N8Qn3l65Vzb5t4Uq0jpg8nxyhio= github.com/grafana/tail v0.0.0-20201004203643-7aa4e4a91f03 h1:fGgFrAraMB0BaPfYumu+iulfDXwHm+GFyHA4xEtBqI8= github.com/grafana/tail v0.0.0-20201004203643-7aa4e4a91f03/go.mod h1:GIMXMPB/lRAllP5rVDvcGif87ryO2hgD7tCtHMdHrho= +github.com/grafana/windows_exporter v0.15.1-0.20211019183116-592dfa92f9fd h1:jQ9JCvwdRW32X/LP3ezXT4EnJCirq9bb3l5svQs8j7k= +github.com/grafana/windows_exporter v0.15.1-0.20211019183116-592dfa92f9fd/go.mod h1:zWjLDqyEy3ZEy1LNlR6iUJJgYCoUDJTyUbrjeLUp3ZE= github.com/grafana/windows_exporter v0.15.1-0.20220202211901-871715ba0b43 h1:gb+wDKb+9r4n3QbMzfudcHDtE9lI+kKjx+98bYphqK4= github.com/grafana/windows_exporter v0.15.1-0.20220202211901-871715ba0b43/go.mod h1:zWjLDqyEy3ZEy1LNlR6iUJJgYCoUDJTyUbrjeLUp3ZE= github.com/gregjones/httpcache v0.0.0-20180305231024-9cad4c3443a7/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA= @@ -1195,6 +1335,10 @@ github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFb github.com/grpc-ecosystem/grpc-opentracing v0.0.0-20180507213350-8e809c8a8645/go.mod h1:6iZfnjpejD4L/4DwD7NryNaJyCQdzwWwH2MWhCA90Kw= github.com/hailocab/go-hostpool v0.0.0-20160125115350-e80d13ce29ed h1:5upAirOpQc1Q53c0bnx2ufif5kANL7bfZWcc6VJWJd8= github.com/hailocab/go-hostpool v0.0.0-20160125115350-e80d13ce29ed/go.mod h1:tMWxXQ9wFIaZeTI9F+hmhFiGpFmhOHzyShyFUhRm0H4= +github.com/hairyhenderson/go-fsimpl v0.0.0-20211102185733-857ee891b38d h1:9be+nFIZyC8Tz3T+gy4eK0wqCfXh/X9GeokwVz1zwpo= +github.com/hairyhenderson/go-fsimpl v0.0.0-20211102185733-857ee891b38d/go.mod h1:v6ot3ZgWfrsMmcbmEi3+sb0TXEaUhaYff/EtA+pyS2k= +github.com/hairyhenderson/toml v0.4.2-0.20210923231440-40456b8e66cf h1:I1sbT4ZbIt9i+hB1zfKw2mE8C12TuGxPiW7YmtLbPa4= +github.com/hairyhenderson/toml v0.4.2-0.20210923231440-40456b8e66cf/go.mod h1:jDHmWDKZY6MIIYltYYfW4Rs7hQ50oS4qf/6spSiZAxY= github.com/harlow/kinesis-consumer v0.3.1-0.20181230152818-2f58b136fee0/go.mod h1:dk23l2BruuUzRP8wbybQbPn3J7sZga2QHICCeaEy5rQ= github.com/hashicorp/consul v1.5.1 h1:p7tRmQ4m3ZMYkGQkuyjLXKbdU1weeumgZFqZOvw7o4c= github.com/hashicorp/consul v1.5.1/go.mod h1:QsmgXh2YA9Njv6y3/FHXqHYhsMye++3oBoAZ6SR8R8I= @@ -1205,8 +1349,9 @@ github.com/hashicorp/consul/api v1.7.0/go.mod h1:1NSuaUUkFaJzMasbfq/11wKYWSR67Xn github.com/hashicorp/consul/api v1.8.1/go.mod h1:sDjTOq0yUyv5G4h+BqSea7Fn6BU+XbolEz1952UB+mk= github.com/hashicorp/consul/api v1.9.1/go.mod h1:XjsvQN+RJGWI2TWy1/kqaE16HrR2J/FWgkYjdZQsX9M= github.com/hashicorp/consul/api v1.10.1/go.mod h1:XjsvQN+RJGWI2TWy1/kqaE16HrR2J/FWgkYjdZQsX9M= -github.com/hashicorp/consul/api v1.11.0 h1:Hw/G8TtRvOElqxVIhBzXciiSTbapq8hZ2XKZsXk5ZCE= github.com/hashicorp/consul/api v1.11.0/go.mod h1:XjsvQN+RJGWI2TWy1/kqaE16HrR2J/FWgkYjdZQsX9M= +github.com/hashicorp/consul/api v1.12.0 h1:k3y1FYv6nuKyNTqj6w9gXOx5r5CfLj/k/euUeBXj1OY= +github.com/hashicorp/consul/api v1.12.0/go.mod h1:6pVBMo0ebnYdt2S3H87XhekM/HHrUoTD2XXb/VrZVy0= github.com/hashicorp/consul/sdk v0.1.1/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8= github.com/hashicorp/consul/sdk v0.3.0/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8= github.com/hashicorp/consul/sdk v0.5.0/go.mod h1:fY08Y9z5SvJqevyZNy6WWPXiG3KwBPAvlcdx16zZ0fM= @@ -1215,8 +1360,9 @@ github.com/hashicorp/consul/sdk v0.7.0/go.mod h1:fY08Y9z5SvJqevyZNy6WWPXiG3KwBPA github.com/hashicorp/consul/sdk v0.8.0 h1:OJtKBtEjboEZvG6AOUdh4Z1Zbyu0WcxQ0qatRrZHTVU= github.com/hashicorp/consul/sdk v0.8.0/go.mod h1:GBvyrGALthsZObzUGsfgHZQDXjg4lOjagTIwIR1vPms= github.com/hashicorp/errwrap v0.0.0-20141028054710-7554cd9344ce/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= -github.com/hashicorp/errwrap v1.0.0 h1:hLrqtEDnRye3+sgx6z4qVLNuviH3MR5aQ0ykNJa/UYA= 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-bexpr v0.1.0/go.mod h1:ANbpTX1oAql27TZkKVeW8p1w8NTdnyzPe/0qqPCKohU= github.com/hashicorp/go-checkpoint v0.0.0-20171009173528-1545e56e46de/go.mod h1:xIwEieBHERyEvaeKF/TcHh1Hu+lxPM+n2vT1+g9I4m4= github.com/hashicorp/go-cleanhttp v0.5.0/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= @@ -1229,13 +1375,16 @@ github.com/hashicorp/go-envparse v0.0.0-20200406174449-d9cfd743a15e/go.mod h1:/N github.com/hashicorp/go-hclog v0.0.0-20180402200405-69ff559dc25f/go.mod h1:9bjs9uLqI8l75knNv3lV1kA55veR+WUPSiKIWcQHudI= github.com/hashicorp/go-hclog v0.0.0-20180709165350-ff2cf002a8dd/go.mod h1:9bjs9uLqI8l75knNv3lV1kA55veR+WUPSiKIWcQHudI= github.com/hashicorp/go-hclog v0.8.0/go.mod h1:5CU+agLiy3J7N7QjHK5d05KxGsuXiQLrjA0H7acj2lQ= +github.com/hashicorp/go-hclog v0.9.2/go.mod h1:5CU+agLiy3J7N7QjHK5d05KxGsuXiQLrjA0H7acj2lQ= github.com/hashicorp/go-hclog v0.12.0/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ= +github.com/hashicorp/go-hclog v0.14.1/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ= github.com/hashicorp/go-hclog v0.16.2 h1:K4ev2ib4LdQETX5cSZBG0DVLk1jwGqSPXBjdah3veNs= github.com/hashicorp/go-hclog v0.16.2/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ= github.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= github.com/hashicorp/go-immutable-radix v1.1.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-kms-wrapping/entropy v0.1.0/go.mod h1:d1g9WGtAunDNpek8jUIEJnBlbgKS1N2Q61QkHiZyR1g= github.com/hashicorp/go-memdb v0.0.0-20180223233045-1289e7fffe71/go.mod h1:kbfItVoBJwCfKXDXN4YoAXjxcFVZ7MRrJzyTX6H4giE= github.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM= github.com/hashicorp/go-msgpack v0.5.4/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM= @@ -1248,14 +1397,28 @@ github.com/hashicorp/go-multierror v1.1.1 h1:H5DkEtf6CXdFp0N0Em5UCwQpXMWke8IA0+l github.com/hashicorp/go-multierror v1.1.1/go.mod h1:iw975J/qwKPdAO1clOe2L8331t/9/fmwbPZ6JB6eMoM= github.com/hashicorp/go-plugin v0.0.0-20180331002553-e8d22c780116/go.mod h1:JSqWYsict+jzcj0+xElxyrBQRPNoiWQuddnxArJ7XHQ= github.com/hashicorp/go-plugin v1.0.1/go.mod h1:++UyYGoz3o5w9ZzAdZxtQKrWWP+iqPBn3cQptSMzBuY= +github.com/hashicorp/go-plugin v1.4.3 h1:DXmvivbWD5qdiBts9TpBC7BYL1Aia5sxbRgQB+v6UZM= +github.com/hashicorp/go-plugin v1.4.3/go.mod h1:5fGEH17QVwTTcR0zV7yhDPLLmFX9YSZ38b18Udy6vYQ= github.com/hashicorp/go-retryablehttp v0.0.0-20180531211321-3b087ef2d313/go.mod h1:fXcdFsQoipQa7mwORhKad5jmDCeSy/RCGzWA08PO0lM= github.com/hashicorp/go-retryablehttp v0.5.3/go.mod h1:9B5zBasrRhHXnJnui7y6sL7es7NDiJgTc6Er0maI1Xs= github.com/hashicorp/go-retryablehttp v0.5.4/go.mod h1:9B5zBasrRhHXnJnui7y6sL7es7NDiJgTc6Er0maI1Xs= +github.com/hashicorp/go-retryablehttp v0.6.6/go.mod h1:vAew36LZh98gCBJNLH42IQ1ER/9wtLZZ8meHqQvEYWY= +github.com/hashicorp/go-retryablehttp v0.7.0 h1:eu1EI/mbirUgP5C8hVsTNaGZreBDlYiwC1FZWkvQPQ4= +github.com/hashicorp/go-retryablehttp v0.7.0/go.mod h1:vAew36LZh98gCBJNLH42IQ1ER/9wtLZZ8meHqQvEYWY= github.com/hashicorp/go-rootcerts v0.0.0-20160503143440-6bb64b370b90/go.mod h1:o4zcYY1e0GEZI6eSEr+43QDYmuGglw1qSO6qdHUHCgg= github.com/hashicorp/go-rootcerts v1.0.0/go.mod h1:K6zTfqpRlCUIjkwsN4Z+hiSfzSTQa6eBIzfwKfwNnHU= github.com/hashicorp/go-rootcerts v1.0.1/go.mod h1:pqUvnprVnM5bf7AOirdbb01K4ccR319Vf4pU3K5EGc8= 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-secure-stdlib/base62 v0.1.1/go.mod h1:EdWO6czbmthiwZ3/PUsDV+UD1D5IRU4ActiaWGwt0Yw= +github.com/hashicorp/go-secure-stdlib/mlock v0.1.1 h1:cCRo8gK7oq6A2L6LICkUZ+/a5rLiRXFMf1Qd4xSwxTc= +github.com/hashicorp/go-secure-stdlib/mlock v0.1.1/go.mod h1:zq93CJChV6L9QTfGKtfBxKqD7BqqXx5O04A/ns2p5+I= +github.com/hashicorp/go-secure-stdlib/parseutil v0.1.1 h1:78ki3QBevHwYrVxnyVeaEz+7WtifHhauYF23es/0KlI= +github.com/hashicorp/go-secure-stdlib/parseutil v0.1.1/go.mod h1:QmrqtbKuxxSWTN3ETMPuB+VtEiBJ/A9XhoYGv8E1uD8= +github.com/hashicorp/go-secure-stdlib/password v0.1.1/go.mod h1:9hH302QllNwu1o2TGYtSk8I8kTAN0ca1EHpwhm5Mmzo= +github.com/hashicorp/go-secure-stdlib/strutil v0.1.1 h1:nd0HIW15E6FG1MsnArYaHfuw9C2zgzM8LxkG5Ty/788= +github.com/hashicorp/go-secure-stdlib/strutil v0.1.1/go.mod h1:gKOamz3EwoIoJq7mlMIRBpVTAUn8qPCrEclOKKWhD3U= +github.com/hashicorp/go-secure-stdlib/tlsutil v0.1.1/go.mod h1:l8slYwnJA26yBz+ErHpp2IRCLr0vuOMGBORIz4rRiAs= github.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU= github.com/hashicorp/go-sockaddr v1.0.2 h1:ztczhD1jLxIRjVejw8gFomI1BQZOe2WoVOu0SyteCQc= github.com/hashicorp/go-sockaddr v1.0.2/go.mod h1:rB4wwRAUzs07qva3c5SdrY/NEtAUjGlgmH/UkBUC97A= @@ -1268,6 +1431,7 @@ github.com/hashicorp/go-version v0.0.0-20170202080759-03c5bf6be031/go.mod h1:flt github.com/hashicorp/go-version v1.1.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= github.com/hashicorp/go-version v1.2.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= github.com/hashicorp/go-version v1.2.1-0.20190424083514-192140e6f3e6/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= +github.com/hashicorp/go-version v1.3.0 h1:McDWVJIU/y+u1BRV06dPaLfLCaT7fUTJLp5r04x7iNw= github.com/hashicorp/go-version v1.3.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= github.com/hashicorp/go.net v0.0.1/go.mod h1:hjKkEWcCURg++eb33jQU7oqQcI9XDCnUzHA0oac0k90= github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= @@ -1282,14 +1446,16 @@ github.com/hashicorp/hil v0.0.0-20160711231837-1e86c6b523c5/go.mod h1:KHvg/R2/dP github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64= github.com/hashicorp/mdns v1.0.0/go.mod h1:tL+uN++7HEJ6SQLQ2/p+z2pH24WQKWjBPkE0mNTz8vQ= github.com/hashicorp/mdns v1.0.1/go.mod h1:4gW7WsVCke5TE7EPeYliwHlRUyBtfCwuFwuMg2DmyNY= +github.com/hashicorp/mdns v1.0.4/go.mod h1:mtBihi+LeNXGtG8L9dX59gAEa12BDtBQSp4v/YAJqrc= github.com/hashicorp/memberlist v0.1.3/go.mod h1:ajVTdAv/9Im8oMAAj5G31PhhMCZJV2pPBoIllUwCN7I= github.com/hashicorp/memberlist v0.1.4/go.mod h1:ajVTdAv/9Im8oMAAj5G31PhhMCZJV2pPBoIllUwCN7I= github.com/hashicorp/memberlist v0.1.5/go.mod h1:ajVTdAv/9Im8oMAAj5G31PhhMCZJV2pPBoIllUwCN7I= github.com/hashicorp/memberlist v0.2.0/go.mod h1:MS2lj3INKhZjWNqd3N0m3J+Jxf3DAOnAH9VT3Sh9MUE= github.com/hashicorp/memberlist v0.2.2/go.mod h1:MS2lj3INKhZjWNqd3N0m3J+Jxf3DAOnAH9VT3Sh9MUE= github.com/hashicorp/memberlist v0.2.3/go.mod h1:MS2lj3INKhZjWNqd3N0m3J+Jxf3DAOnAH9VT3Sh9MUE= -github.com/hashicorp/memberlist v0.2.4 h1:OOhYzSvFnkFQXm1ysE8RjXTHsqSRDyP4emusC9K7DYg= github.com/hashicorp/memberlist v0.2.4/go.mod h1:MS2lj3INKhZjWNqd3N0m3J+Jxf3DAOnAH9VT3Sh9MUE= +github.com/hashicorp/memberlist v0.3.0 h1:8+567mCcFDnS5ADl7lrpxPMWiFCElyUEeW0gtj34fMA= +github.com/hashicorp/memberlist v0.3.0/go.mod h1:MS2lj3INKhZjWNqd3N0m3J+Jxf3DAOnAH9VT3Sh9MUE= github.com/hashicorp/net-rpc-msgpackrpc v0.0.0-20151116020338-a14192a58a69/go.mod h1:/z+jUGRBlwVpUZfjute9jWaF6/HuhjuFQuL1YXzVD1Q= github.com/hashicorp/raft v1.0.1-0.20190409200437-d9fe23f7d472/go.mod h1:DVSAWItjLjTOkVbSpWQ0j0kUADIvDaCtBxIcbNAQLkI= github.com/hashicorp/raft-boltdb v0.0.0-20150201200839-d1e82c1ec3f1/go.mod h1:pNv7Wc3ycL6F5oOWn+tPGo2gWD4a5X+yp/ntwdKLjRk= @@ -1298,15 +1464,22 @@ github.com/hashicorp/serf v0.8.2/go.mod h1:6hOLApaqBFA1NXqRQAsxw9QxuDEvNxSQRwA/J github.com/hashicorp/serf v0.8.5/go.mod h1:UpNcs7fFbpKIyZaUuSW6EPiH+eZC7OuyFD+wc1oal+k= github.com/hashicorp/serf v0.9.0/go.mod h1:YL0HO+FifKOW2u1ke99DGVu1zhcpZzNwrLIqBC7vbYU= github.com/hashicorp/serf v0.9.3/go.mod h1:UWDWwZeL5cuWDJdl0C6wrvrUwEqtQ4ZKBKKENpqIUyk= -github.com/hashicorp/serf v0.9.5 h1:EBWvyu9tcRszt3Bxp3KNssBMP1KuHWyO51lz9+786iM= github.com/hashicorp/serf v0.9.5/go.mod h1:UWDWwZeL5cuWDJdl0C6wrvrUwEqtQ4ZKBKKENpqIUyk= +github.com/hashicorp/serf v0.9.6 h1:uuEX1kLR6aoda1TBttmJQKDLZE1Ob7KN0NPdE7EtCDc= +github.com/hashicorp/serf v0.9.6/go.mod h1:TXZNMjZQijwlDvp+r0b63xZ45H7JmCmgg4gpTwn9UV4= github.com/hashicorp/vault v0.10.3/go.mod h1:KfSyffbKxoVyspOdlaGVjIuwLobi07qD1bAbosPMpP0= github.com/hashicorp/vault-plugin-secrets-kv v0.0.0-20190318174639-195e0e9d07f1/go.mod h1:VJHHT2SC1tAPrfENQeBhLlb5FbZoKZM+oC/ROmEftz0= github.com/hashicorp/vault/api v1.0.4/go.mod h1:gDcqh3WGcR1cpF5AJz/B1UFheUEneMoIospckxBxk6Q= +github.com/hashicorp/vault/api v1.3.0 h1:uDy39PLSvy6gtKyjOCRPizy2QdFiIYSWBR2pxCEzYL8= +github.com/hashicorp/vault/api v1.3.0/go.mod h1:EabNQLI0VWbWoGlA+oBLC8PXmR9D60aUVgQGvangFWQ= github.com/hashicorp/vault/sdk v0.1.13/go.mod h1:B+hVj7TpuQY1Y/GPbCpffmgd+tSEwvhkWnjtSYCaS2M= +github.com/hashicorp/vault/sdk v0.3.0 h1:kR3dpxNkhh/wr6ycaJYqp6AFT/i2xaftbfnwZduTKEY= +github.com/hashicorp/vault/sdk v0.3.0/go.mod h1:aZ3fNuL5VNydQk8GcLJ2TV8YCRVvyaakYkhZRoVuhj0= github.com/hashicorp/vic v1.5.1-0.20190403131502-bbfe86ec9443/go.mod h1:bEpDU35nTu0ey1EXjwNwPjI9xErAsoOCmcMb9GKvyxo= github.com/hashicorp/yamux v0.0.0-20180604194846-3520598351bb/go.mod h1:+NfK9FKeTrX5uv1uIXGdwYDTeHna2qgaIlx54MXqjAM= github.com/hashicorp/yamux v0.0.0-20181012175058-2f1d1f20f75d/go.mod h1:+NfK9FKeTrX5uv1uIXGdwYDTeHna2qgaIlx54MXqjAM= +github.com/hashicorp/yamux v0.0.0-20190923154419-df201c70410d h1:W+SIwDdl3+jXWeidYySAgzytE3piq6GumXeBjFBG67c= +github.com/hashicorp/yamux v0.0.0-20190923154419-df201c70410d/go.mod h1:+NfK9FKeTrX5uv1uIXGdwYDTeHna2qgaIlx54MXqjAM= github.com/hetznercloud/hcloud-go v1.32.0 h1:7zyN2V7hMlhm3HZdxOarmOtvzKvkcYKjM0hcwYMQZz0= github.com/hetznercloud/hcloud-go v1.32.0/go.mod h1:XX/TQub3ge0yWR2yHWmnDVIrB+MQbda1pHxkUmDlUME= github.com/hodgesds/perf-utils v0.0.8/go.mod h1:F6TfvsbtrF88i++hou29dTXlI2sfsJv+gRZDtmTJkAs= @@ -1364,6 +1537,8 @@ github.com/jackc/pgx v3.6.0+incompatible/go.mod h1:0ZGrqGqkRlliWnWB4zKnWtjbSWbGk github.com/jaegertracing/jaeger v1.27.0 h1:gcemni8e+twGuS0dUn3k/zKKalammUPK7mP+jpyM4e4= github.com/jaegertracing/jaeger v1.27.0/go.mod h1:2NUmMwXOSOIrx6gwCgBvnK59yVXzQiqBUfD4tGowl2E= github.com/jarcoal/httpmock v0.0.0-20180424175123-9c70cfe4a1da/go.mod h1:ks+b9deReOc7jgqp+e7LuFiCBH6Rm5hL32cLcEAArb4= +github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99 h1:BQSFePA1RWJOlocH6Fxy8MmwDt+yVQYULKfN0RoTN8A= +github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99/go.mod h1:1lJo3i6rXxKeerYnT8Nvf0QmHCRC1n8sfWVwXF2Frvo= github.com/jcmturner/aescts/v2 v2.0.0 h1:9YKLH6ey7H4eDBXW8khjYslgyqG2xZikXP0EQFKrle8= github.com/jcmturner/aescts/v2 v2.0.0/go.mod h1:AiaICIRyfYg35RUkr8yESTqvSy7csK90qZ5xfvvsoNs= github.com/jcmturner/dnsutils/v2 v2.0.0 h1:lltnkeZGL0wILNvrNiVCR6Ro5PGU/SeBvVO/8c/iPbo= @@ -1380,6 +1555,8 @@ github.com/jefferai/jsonx v0.0.0-20160721235117-9cc31c3135ee/go.mod h1:N0t2vlmpe github.com/jessevdk/go-flags v0.0.0-20180331124232-1c38ed7ad0cc/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= github.com/jessevdk/go-flags v1.5.0/go.mod h1:Fw0T6WPc1dYxT4mKEZRfG5kJhaTDP9pj1c2EWnYs/m4= +github.com/jhump/protoreflect v1.6.0 h1:h5jfMVslIg6l29nsMs0D8Wj17RDVdNYti0vDN/PZZoE= +github.com/jhump/protoreflect v1.6.0/go.mod h1:eaTn3RZAmMBcV0fifFvlm6VHNz3wSkYyXYWUh7ymB74= github.com/jinzhu/gorm v0.0.0-20170222002820-5409931a1bb8 h1:CZkYfurY6KGhVtlalI4QwQ6T0Cu6iuY3e0x5RLu96WE= github.com/jinzhu/gorm v0.0.0-20170222002820-5409931a1bb8/go.mod h1:Vla75njaFJ8clLU1W44h34PjIkijhjHIYnZxMqCdxqo= github.com/jinzhu/inflection v0.0.0-20170102125226-1c35d901db3d h1:jRQLvyVGL+iVtDElaEIDdKwpPqUIZJfzkNLV34htpEc= @@ -1395,8 +1572,11 @@ github.com/jmespath/go-jmespath/internal/testify v1.5.1 h1:shLQSRRSCCPj3f2gpwzGw github.com/jmespath/go-jmespath/internal/testify v1.5.1/go.mod h1:L3OGu8Wl2/fWfCI6z80xFu9LTZmf1ZRjMHUOPmWr69U= github.com/joefitzgerald/rainbow-reporter v0.1.0/go.mod h1:481CNgqmVHQZzdIbN52CupLJyoVwB10FQ/IQlF1pdL8= github.com/joeshaw/multierror v0.0.0-20140124173710-69b34d4ec901/go.mod h1:Z86h9688Y0wesXCyonoVr47MasHilkuLMqGhRZ4Hpak= -github.com/joho/godotenv v1.3.0 h1:Zjp+RcGpHhGlrMbJzXTrZZPrWj+1vfm90La1wgB6Bhc= +github.com/johannesboyne/gofakes3 v0.0.0-20210819161434-5c8dfcfe5310 h1:CwSccv4SFVzhShEoWx3W4dyiWHwvLEL3lJbw+YIrQYg= +github.com/johannesboyne/gofakes3 v0.0.0-20210819161434-5c8dfcfe5310/go.mod h1:LIAXxPvcUXwOcTIj9LSNSUpE9/eMHalTWxsP/kmWxQI= github.com/joho/godotenv v1.3.0/go.mod h1:7hK45KPybAkOC6peb+G5yklZfMxEjkZhHbwpqxOKXbg= +github.com/joho/godotenv v1.4.0 h1:3l4+N6zfMWnkbPEXKng2o2/MR5mSwTrBih4ZEkkz1lg= +github.com/joho/godotenv v1.4.0/go.mod h1:f4LDr5Voq0i2e/R5DDNOoa2zzDfwtkZa6DnEwAbqwq4= github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= github.com/jonboulle/clockwork v0.2.2/go.mod h1:Pkfl5aHPm1nk2H9h0bjmnJD/BcgbGXUBGnn1kMkgxc8= github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y= @@ -1446,12 +1626,16 @@ github.com/karrick/godirwalk v1.10.3/go.mod h1:RoGL9dQei4vP9ilrpETWE8CLOZ1kiN0Lh github.com/karrick/godirwalk v1.16.1 h1:DynhcF+bztK8gooS0+NDJFrdNZjJ3gzVzC545UNA9iw= github.com/karrick/godirwalk v1.16.1/go.mod h1:j4mkqPuvaLI8mp1DroR3P6ad7cyYd4c1qeJ3RV7ULlk= github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51/go.mod h1:CzGEWj7cYgsdH8dAjBGEr58BoE7ScuLd+fwFZ44+/x8= +github.com/kevinburke/ssh_config v0.0.0-20201106050909-4977a11b4351/go.mod h1:CT57kijsi8u/K/BOFA39wgDQJ9CxiF4nAY/ojJ6r6mM= +github.com/kevinburke/ssh_config v1.1.0 h1:pH/t1WS9NzT8go394IqZeJTMHVm6Cr6ZJ6AQ+mdNo/o= +github.com/kevinburke/ssh_config v1.1.0/go.mod h1:CT57kijsi8u/K/BOFA39wgDQJ9CxiF4nAY/ojJ6r6mM= github.com/keybase/go-crypto v0.0.0-20180614160407-5114a9a81e1b/go.mod h1:ghbZscTyKdM07+Fw3KSi0hcJm+AlEUWj8QLlPtijN/M= github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q= github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00= 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.9.5/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= +github.com/klauspost/compress v1.10.3/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= github.com/klauspost/compress v1.10.10/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= github.com/klauspost/compress v1.11.0/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= github.com/klauspost/compress v1.11.3/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= @@ -1459,6 +1643,7 @@ github.com/klauspost/compress v1.11.12/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdY github.com/klauspost/compress v1.11.13/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= github.com/klauspost/compress v1.13.1/go.mod h1:8dP1Hq4DHOhN9w426knH3Rhby4rFm6D8eO+e+Dq5Gzg= github.com/klauspost/compress v1.13.4/go.mod h1:8dP1Hq4DHOhN9w426knH3Rhby4rFm6D8eO+e+Dq5Gzg= +github.com/klauspost/compress v1.13.5/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk= github.com/klauspost/compress v1.13.6 h1:P76CopJELS0TiO2mebmnzgWaajssP/EszplttgQxcgc= github.com/klauspost/compress v1.13.6/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk= github.com/klauspost/cpuid v1.2.3/go.mod h1:Pj4uuM528wm8OyEC2QMXAi2YiTZ96dNQPGgoMS4s3ek= @@ -1500,6 +1685,7 @@ github.com/lann/ps v0.0.0-20150810152359-62de8c46ede0/go.mod h1:vmVJ0l/dxyfGW6Fm github.com/leanovate/gopter v0.2.4/go.mod h1:gNcbPWNEWRe4lm+bycKqxUYoH5uoVje5SkOJ3uoLer8= github.com/leesper/go_rng v0.0.0-20190531154944-a612b043e353/go.mod h1:N0SVk0uhy+E1PZ3C9ctsPRlvOPAFPkCNlcPBDkt0N3U= github.com/leodido/go-urn v1.1.0/go.mod h1:+cyI34gQWZcE1eQU7NVgKkkzdXDQHr1dBMtdAPozLkw= +github.com/leodido/go-urn v1.2.0/go.mod h1:+8+nEpDfqqsY+g338gtMEUOtuK+4dEMhiQEgxpxOKII= github.com/leodido/ragel-machinery v0.0.0-20181214104525-299bdde78165 h1:bCiVCRCs1Heq84lurVinUPy19keqGEe4jh5vtK37jcg= github.com/leodido/ragel-machinery v0.0.0-20181214104525-299bdde78165/go.mod h1:WZxr2/6a/Ar9bMDc2rN/LJrE/hF6bXE4LPyDSIxwAfg= github.com/lib/pq v0.0.0-20150723085316-0dad96c0b94f/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= @@ -1507,8 +1693,9 @@ github.com/lib/pq v0.0.0-20180523175426-90697d60dd84/go.mod h1:5WUZQaWbwv1U+lTRe github.com/lib/pq v1.0.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= github.com/lib/pq v1.2.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= github.com/lib/pq v1.3.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= -github.com/lib/pq v1.10.1 h1:6VXZrLU0jHBYyAqrSPa+MgPfnSvTPuMgK+k0o5kVFWo= github.com/lib/pq v1.10.1/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= +github.com/lib/pq v1.10.2 h1:AqzbZs4ZoCBp+GtejcpCpcxM3zlSMx29dXbUSeVtJb8= +github.com/lib/pq v1.10.2/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= github.com/liggitt/tabwriter v0.0.0-20181228230101-89fcab3d43de h1:9TO3cAIGXtEhnIaL+V+BEER86oLrvS+kWobKpbJuye0= github.com/liggitt/tabwriter v0.0.0-20181228230101-89fcab3d43de/go.mod h1:zAbeS9B/r2mtpb6U+EI2rYA5OAXxsYw6wTamcNW+zcE= github.com/lightstep/lightstep-tracer-common/golang/gogo v0.0.0-20190605223551-bc2310a04743/go.mod h1:qklhhLq1aX+mtWk9cPHPzaBjWImj5ULL6C7HFJtXQMM= @@ -1542,17 +1729,23 @@ github.com/mailru/easyjson v0.7.6/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJ github.com/markbates/oncer v0.0.0-20181203154359-bf2de49a0be2/go.mod h1:Ld9puTsIW75CHf65OeIOkyKbteujpZVXDpWK6YGZbxE= github.com/markbates/safe v1.0.1/go.mod h1:nAqgmRi7cY2nqMc92/bSEeQA+R4OheNU2T1kNSCBdG0= github.com/marstr/guid v1.1.0/go.mod h1:74gB1z2wpxxInTG6yaqA7KrtM0NZ+RbrcqDvYHefzho= +github.com/matryer/is v1.2.0 h1:92UTHpy8CDwaJ08GqLDzhhuixiBUUD1p3AU6PHddz4A= +github.com/matryer/is v1.2.0/go.mod h1:2fLPjFQM9rhQ15aVEtbuwhJinnOqrmgXPNdZsdwlWXA= github.com/matryer/moq v0.0.0-20190312154309-6cfb0558e1bd/go.mod h1:9ELz6aaclSIGnZBoaSLZ3NAl1VTufbOrXBPvtcy6WiQ= +github.com/mattdurham/gomplate/v3 v3.10.1-0.20220204190650-af65008b9bb1 h1:ks59H2rltT3Jepz1ea6YQsiM7/0t9lOnunQ7wMOA/hM= +github.com/mattdurham/gomplate/v3 v3.10.1-0.20220204190650-af65008b9bb1/go.mod h1:ytaz30hj1x0cltIl2cjkzI65ijBwKwitvKt+3rsWbRc= github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= github.com/mattn/go-colorable v0.1.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= 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.7/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= -github.com/mattn/go-colorable v0.1.8 h1:c1ghPdyEDarC70ftn0y+A/Ee++9zz8ljHG1b13eJ0s8= github.com/mattn/go-colorable v0.1.8/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= +github.com/mattn/go-colorable v0.1.9 h1:sqDoxXbdeALODt0DAeJCVp38ps9ZogZEAXjus69YV3U= +github.com/mattn/go-colorable v0.1.9/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= github.com/mattn/go-ieproxy v0.0.0-20190610004146-91bb50d98149/go.mod h1:31jz6HNzdxOmlERGGEc4v/dMssOfmp2p5bT/okiKFFc= github.com/mattn/go-ieproxy v0.0.0-20190702010315-6dee0af9227d/go.mod h1:31jz6HNzdxOmlERGGEc4v/dMssOfmp2p5bT/okiKFFc= github.com/mattn/go-ieproxy v0.0.0-20191113090002-7c0f6868bffe/go.mod h1:pYabZ6IHcRpFh7vIaLfK7rdcWgFEb3SFJ6/gNWuh88E= +github.com/mattn/go-ieproxy v0.0.1 h1:qiyop7gCflfhwCzGyeT0gro3sF9AIg9HU98JORTkqfI= github.com/mattn/go-ieproxy v0.0.1/go.mod h1:pYabZ6IHcRpFh7vIaLfK7rdcWgFEb3SFJ6/gNWuh88E= github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= github.com/mattn/go-isatty v0.0.4/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= @@ -2063,12 +2256,18 @@ github.com/rs/cors v1.7.0/go.mod h1:gFx+x8UowdsKA9AchylcLynDq+nNFfI8FkUZdN/jGCU= github.com/rs/cors v1.8.0 h1:P2KMzcFwrPoSjkF1WLRPsp3UMLyql8L4v9hQpVeK5so= github.com/rs/cors v1.8.0/go.mod h1:EBwu+T5AvHOcXwvZIkQFjUN6s8Czyqw12GL/Y0tUyRM= github.com/rs/xid v1.2.1/go.mod h1:+uKXf+4Djp6Md1KODXJxgGQPKngRmWyn10oCKFzNHOQ= +github.com/rs/xid v1.3.0/go.mod h1:trrq9SKmegXys3aeAKXMUTdJsYXVwGY3RLcfgqegfbg= +github.com/rs/zerolog v1.26.1 h1:/ihwxqH+4z8UxyI70wM1z9yCvkWcfz/a3mj48k/Zngc= +github.com/rs/zerolog v1.26.1/go.mod h1:/wSSJWX7lVrsOwlbyTRSOJvqRlc+WjWlfes+CiJ+tmc= github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g= github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= github.com/ryanuber/columnize v2.1.0+incompatible/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= github.com/ryanuber/go-glob v0.0.0-20170128012129-256dc444b735/go.mod h1:807d1WSdnB0XRJzKNil9Om6lcp/3a0v4qIHxIXzX/Yc= +github.com/ryanuber/go-glob v1.0.0 h1:iQh3xXAumdQ+4Ufa5b25cRpC5TYKlno6hsv6Cb3pkBk= github.com/ryanuber/go-glob v1.0.0/go.mod h1:807d1WSdnB0XRJzKNil9Om6lcp/3a0v4qIHxIXzX/Yc= +github.com/ryszard/goskiplist v0.0.0-20150312221310-2dfbae5fcf46 h1:GHRpF1pTW19a8tTFrMLUcfWwyC0pnifVo2ClaLq+hP8= +github.com/ryszard/goskiplist v0.0.0-20150312221310-2dfbae5fcf46/go.mod h1:uAQ5PCi+MFsC7HjREoAz1BU+Mq60+05gifQSsHSDG/8= github.com/safchain/ethtool v0.0.0-20190326074333-42ed695e3de8/go.mod h1:Z0q5wiBQGYcxhMZ6gUqHn6pYNLypFAvaL3UvgZLR0U4= github.com/safchain/ethtool v0.0.0-20200218184317-f459e2d13664/go.mod h1:Z0q5wiBQGYcxhMZ6gUqHn6pYNLypFAvaL3UvgZLR0U4= github.com/safchain/ethtool v0.1.0 h1:SsRnt87qssm3RltLJze6kM+4fs32twq6mZEcBxbDMVg= @@ -2094,8 +2293,12 @@ github.com/sercand/kuberesolver v2.1.0+incompatible/go.mod h1:lWF3GL0xptCB/vCiJP github.com/sercand/kuberesolver v2.4.0+incompatible h1:WE2OlRf6wjLxHwNkkFLQGaZcVLEXjMjBPjjEU5vksH8= github.com/sercand/kuberesolver v2.4.0+incompatible/go.mod h1:lWF3GL0xptCB/vCiJPl/ZshwPsX/n4Y7u0CW9E7aQIQ= github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo= -github.com/sergi/go-diff v1.1.0 h1:we8PVUC3FE2uYfodKH/nBHMSetSfHDR6scGdBi+erh0= github.com/sergi/go-diff v1.1.0/go.mod h1:STckp+ISIX8hZLjrqAeVduY0gWCT9IjLuqbuNXdaHfM= +github.com/sergi/go-diff v1.2.0 h1:XU+rvMAioB0UC3q1MFrIQy4Vo5/4VsRDQQXHsEya6xQ= +github.com/sergi/go-diff v1.2.0/go.mod h1:STckp+ISIX8hZLjrqAeVduY0gWCT9IjLuqbuNXdaHfM= +github.com/shabbyrobe/gocovmerge v0.0.0-20180507124511-f6ea450bfb63/go.mod h1:n+VKSARF5y/tS9XFSP7vWDfS+GUC5vs/YT7M5XDTUEM= +github.com/shabbyrobe/gocovmerge v0.0.0-20190829150210-3e036491d500 h1:WnNuhiq+FOY3jNj6JXFT+eLN3CQ/oPIsDPRanvwsmbI= +github.com/shabbyrobe/gocovmerge v0.0.0-20190829150210-3e036491d500/go.mod h1:+njLrG5wSeoG4Ds61rFgEzKvenR2UHbjMoDHsczxly0= github.com/shirou/gopsutil v0.0.0-20181107111621-48177ef5f880/go.mod h1:5b4v6he4MtMOwMlS0TUMTu2PcXUg8+E1lC7eC3UO/RA= github.com/shirou/gopsutil v2.20.8+incompatible/go.mod h1:5b4v6he4MtMOwMlS0TUMTu2PcXUg8+E1lC7eC3UO/RA= github.com/shirou/gopsutil v2.20.9+incompatible/go.mod h1:5b4v6he4MtMOwMlS0TUMTu2PcXUg8+E1lC7eC3UO/RA= @@ -2152,6 +2355,8 @@ github.com/soundcloud/go-runit v0.0.0-20150630195641-06ad41a06c4a/go.mod h1:LeFC github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= github.com/spaolacci/murmur3 v1.1.0/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= +github.com/spf13/afero v1.2.0/go.mod h1:9ZxEEn6pIJ8Rxe320qSDBk6AsU0r9pR7Q4OcevTdifk= +github.com/spf13/afero v1.2.1/go.mod h1:9ZxEEn6pIJ8Rxe320qSDBk6AsU0r9pR7Q4OcevTdifk= github.com/spf13/afero v1.2.2/go.mod h1:9ZxEEn6pIJ8Rxe320qSDBk6AsU0r9pR7Q4OcevTdifk= github.com/spf13/afero v1.3.3/go.mod h1:5KUK8ByomD5Ti5Artl0RtHeI5pTF7MIDuXL3yY520V4= github.com/spf13/afero v1.3.4/go.mod h1:Ai8FlHk4v/PARR026UzYexafAt9roJ7LcLMAmO6Z93I= @@ -2272,12 +2477,16 @@ github.com/uber/jaeger-lib v2.4.1+incompatible h1:td4jdvLcExb4cBISKIpHuGoVXh+dVK github.com/uber/jaeger-lib v2.4.1+incompatible/go.mod h1:ComeNDZlWwrWnDv8aPp0Ba6+uUTzImX/AauajbLI56U= github.com/ugorji/go v1.1.4/go.mod h1:uQMGLiO92mf5W77hV/PUCpI3pbzQx3CRekS0kk+RGrc= github.com/ugorji/go v1.1.7/go.mod h1:kZn38zHttfInRq0xu/PH0az30d+z6vm202qpg1oXVMw= +github.com/ugorji/go v1.2.6/go.mod h1:anCg0y61KIhDlPZmnH+so+RQbysYVyDko0IMgJv0Nn0= github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0= github.com/ugorji/go/codec v1.1.7/go.mod h1:Ax+UKWsSmolVDwsd+7N3ZtXu+yMGCf907BLYF3GoBXY= +github.com/ugorji/go/codec v1.2.6 h1:7kbGefxLoDBuYXOms4yD7223OpNMMPNPZxXk5TvFcyQ= +github.com/ugorji/go/codec v1.2.6/go.mod h1:V6TCNZ4PHqoHGFZuSG1W8nrCzzdgA2DozYxWFFpvxTw= github.com/urfave/cli v0.0.0-20171014202726-7bc6a0acffa5/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA= github.com/urfave/cli v1.20.0/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA= github.com/urfave/cli v1.22.1/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= github.com/urfave/cli v1.22.2/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= +github.com/urfave/cli v1.22.4/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= github.com/urfave/cli/v2 v2.3.0/go.mod h1:LJmUH05zAU44vOAcrfzZQKsZbVcdbOG8rtL3/XcUArI= github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= github.com/valyala/fasttemplate v1.0.1/go.mod h1:UQGH1tvbgY+Nz5t2n7tXsz52dQxojPUpymEIMZ47gx8= @@ -2315,6 +2524,9 @@ github.com/willf/bitset v1.1.11/go.mod h1:83CECat5yLh5zVOf4P1ErAgKA5UDvKtgyUABdr github.com/wvanbergen/kafka v0.0.0-20171203153745-e2edea948ddf/go.mod h1:nxx7XRXbR9ykhnC8lXqQyJS0rfvJGxKyKw/sT1YOttg= github.com/wvanbergen/kazoo-go v0.0.0-20180202103751-f72d8611297a/go.mod h1:vQQATAGxVK20DC1rRubTJbZDDhhpA4QfU02pMdPxGO4= github.com/xanzy/go-gitlab v0.15.0/go.mod h1:8zdQa/ri1dfn8eS3Ir1SyfvOKlw7WBJ8DVThkpGiXrs= +github.com/xanzy/ssh-agent v0.3.0/go.mod h1:3s9xbODqPuuhK9JV1R321M/FlMZSBvE5aY6eAcqrDh0= +github.com/xanzy/ssh-agent v0.3.1 h1:AmzO1SSWxw73zxFZPRwaMN1MohDw8UyHnmuxyceTEGo= +github.com/xanzy/ssh-agent v0.3.1/go.mod h1:QIE4lCeL7nkC25x+yA3LBIYfwCc1TFziCtG7cBAac6w= github.com/xdg-go/pbkdf2 v1.0.0 h1:Su7DPu48wXMwC3bs7MCNG+z4FhcyEuz5dlvchbq0B0c= github.com/xdg-go/pbkdf2 v1.0.0/go.mod h1:jrpuAogTd400dnrH08LKmI/xc1MbPOebTwRqcT5RDeI= github.com/xdg-go/scram v1.0.2 h1:akYIkZ28e6A96dkWNJQu3nmCzH3YfwMPQExUYDaRv7w= @@ -2352,6 +2564,8 @@ github.com/yuin/gopher-lua v0.0.0-20200816102855-ee81675732da/go.mod h1:E1AXubJB github.com/yvasiyarov/go-metrics v0.0.0-20140926110328-57bccd1ccd43/go.mod h1:aX5oPXxHm3bOH+xeAttToC8pqch2ScQN/JoXYupl6xs= github.com/yvasiyarov/gorelic v0.0.0-20141212073537-a9bba5b9ab50/go.mod h1:NUSPSUX/bi6SeDMUh6brw0nXpxHnc96TguQh0+r/ssA= github.com/yvasiyarov/newrelic_platform_go v0.0.0-20140908184405-b21fdbd4370f/go.mod h1:GlGEuHIJweS1mbCqG+7vt2nvWLzLLnRHbXz5JKd/Qbg= +github.com/zealic/xignore v0.3.3 h1:EpLXUgZY/JEzFkTc+Y/VYypzXtNz+MSOMVCGW5Q4CKQ= +github.com/zealic/xignore v0.3.3/go.mod h1:lhS8V7fuSOtJOKsvKI7WfsZE276/7AYEqokv3UiqEAU= gitlab.com/nyarla/go-crypt v0.0.0-20160106005555-d9a5dc2b789b/go.mod h1:T3BPAOm2cqquPa0MKWeNkmOM5RQsRhkrwMWonFMN7fE= go.elastic.co/apm v1.5.0/go.mod h1:OdB9sPtM6Vt7oz3VXt7+KR96i9li74qrxBGHTQygFvk= go.elastic.co/apm v1.11.0/go.mod h1:qoOSi09pnzJDh5fKnfY7bPmQgl8yl2tULdOu03xhui0= @@ -2365,6 +2579,7 @@ go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= go.etcd.io/bbolt v1.3.3/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= go.etcd.io/bbolt v1.3.5-0.20200615073812-232d8fc87f50/go.mod h1:G5EMThwa9y8QZGBClrRx5EY+Yw9kAhnjy3bSjsnlVTQ= go.etcd.io/bbolt v1.3.5/go.mod h1:G5EMThwa9y8QZGBClrRx5EY+Yw9kAhnjy3bSjsnlVTQ= +go.etcd.io/bbolt v1.3.6 h1:/ecaJf0sk1l4l6V4awd65v2C3ILy7MSj+s/x1ADCIMU= go.etcd.io/bbolt v1.3.6/go.mod h1:qXsaaIqmgQH0T+OPdb99Bf+PKfBBQVAdyD6TY9G8XM4= go.etcd.io/etcd v0.0.0-20190709142735-eb7dd97135a5/go.mod h1:N0RPWo9FXJYZQI4BTkDtQylrstIigYHeR18ONnyTufk= go.etcd.io/etcd v0.0.0-20191023171146-3cf2f69b5738/go.mod h1:dnLIgRNXwCJa5e+c6mIZCrds/GIG4ncV9HhK5PX7jPg= @@ -2404,6 +2619,7 @@ go.mongodb.org/mongo-driver v1.5.3/go.mod h1:gRXCHX4Jo7J0IJ1oDQyUxF7jfy19UfxniMS go.mongodb.org/mongo-driver v1.7.1 h1:jwqTeEM3x6L9xDXrCxN0Hbg7vdGfPBOTIkr0+/LYZDA= go.mongodb.org/mongo-driver v1.7.1/go.mod h1:Q4oFMbo1+MSNqICAdYMlC/zSTrwCogR4R8NzkI+yfU8= go.mozilla.org/pkcs7 v0.0.0-20200128120323-432b2356ecb1/go.mod h1:SNgMg+EgDFwmvSmLRTNKC5fegJjB7v23qTQ0XLGUNHk= +go.opencensus.io v0.15.0/go.mod h1:UffZAU+4sDEINUGP/B7UfBBkq4fqLu9zXAX7ke6CHW0= go.opencensus.io v0.20.1/go.mod h1:6WKK9ahsWS3RSO+PY9ZHZUfv2irvY6gN279GOPZjmmk= go.opencensus.io v0.20.2/go.mod h1:6WKK9ahsWS3RSO+PY9ZHZUfv2irvY6gN279GOPZjmmk= go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= @@ -2412,6 +2628,7 @@ 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.22.6/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E= go.opencensus.io v0.23.0 h1:gqCw0LfLxScz8irSi8exQc7fyQ0fKQU/qnC/X8+V/1M= go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E= go.opentelemetry.io/collector/model v0.30.0/go.mod h1:PcHNnM+RUl0uD8VkSn93PO78N7kQYhfqpI/eki57pl4= @@ -2471,6 +2688,8 @@ go.uber.org/zap v1.14.0/go.mod h1:zwrFLgMcdUuIBviXEYEH1YKNaOBnKXsx2IPda5bBwHM= go.uber.org/zap v1.14.1/go.mod h1:Mb2vm2krFEG5DV0W9qcHBYFtp/Wku1cvYaqPsS/WYfc= go.uber.org/zap v1.16.0/go.mod h1:MA8QOfq0BHJwdXa996Y4dYkAqRKB8/1K1QMMZVaNZjQ= go.uber.org/zap v1.17.0/go.mod h1:MXVU+bhUf/A7Xi2HNOnopQOrmycQ5Ih87HtOu4q5SSo= +go.uber.org/zap v1.18.1/go.mod h1:xg/QME4nWcxGxrpdeYfq7UvYrLh66cuVKdrbD1XF/NI= +go.uber.org/zap v1.19.0/go.mod h1:xg/QME4nWcxGxrpdeYfq7UvYrLh66cuVKdrbD1XF/NI= go.uber.org/zap v1.19.1 h1:ue41HOKd1vGURxrmeKIgELGb3jPW9DMUDGtsinblHwI= go.uber.org/zap v1.19.1/go.mod h1:j3DNczoxDZroyBnOT1L/Q79cfUMGZxlv/9dzN7SM1rI= go4.org/intern v0.0.0-20210108033219-3eb7198706b2 h1:VFTf+jjIgsldaz/Mr00VaCSswHJrI2hIjQygE/W4IMg= @@ -2478,6 +2697,8 @@ go4.org/intern v0.0.0-20210108033219-3eb7198706b2/go.mod h1:vLqJ+12kCw61iCWsPto0 go4.org/unsafe/assume-no-moving-gc v0.0.0-20201222175341-b30ae309168e/go.mod h1:FftLjUGFEDu5k8lt0ddY+HcrH/qU/0qk+H8j9/nTl3E= go4.org/unsafe/assume-no-moving-gc v0.0.0-20201222180813-1025295fd063 h1:1tk03FUNpulq2cuWpXZWj649rwJpk0d20rxWiopKRmc= go4.org/unsafe/assume-no-moving-gc v0.0.0-20201222180813-1025295fd063/go.mod h1:FftLjUGFEDu5k8lt0ddY+HcrH/qU/0qk+H8j9/nTl3E= +gocloud.dev v0.24.0 h1:cNtHD07zQQiv02OiwwDyVMuHmR7iQt2RLkzoAgz7wBs= +gocloud.dev v0.24.0/go.mod h1:uA+als++iBX5ShuG4upQo/3Zoz49iIPlYUWHV5mM8w8= golang.org/x/crypto v0.0.0-20171113213409-9f005a07e0d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20180505025534-4ec37c66abab/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20180608092829-8ac0e0d97ce4/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= @@ -2485,6 +2706,7 @@ golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnf golang.org/x/crypto v0.0.0-20181009213950-7c1a557ab941/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20181203042331-505ab145d0a9/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20190219172222-a4c6cb3142f2/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-20190320223903-b7391e95e576/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20190325154230-a5d413f7728c/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= @@ -2518,17 +2740,20 @@ golang.org/x/crypto v0.0.0-20201002170205-7f63de1d35b0/go.mod h1:LzIPMQfyMNhhGPh golang.org/x/crypto v0.0.0-20201112155050-0c6587e931a9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20201117144127-c1f2f97bffc9/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= golang.org/x/crypto v0.0.0-20201208171446-5f87f3452ae9/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= +golang.org/x/crypto v0.0.0-20201216223049-8b5274cf687f/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= golang.org/x/crypto v0.0.0-20201221181555-eec23a3978ad/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= golang.org/x/crypto v0.0.0-20210220033148-5ea612d1eb83/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= golang.org/x/crypto v0.0.0-20210314154223-e6e6c4f2bb5b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= +golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= golang.org/x/crypto v0.0.0-20210513164829-c07d793c2f9a/go.mod h1:P+XmwS30IXTQdn5tA2iutPOUgjI07+tq3H3K9MVA1s8= golang.org/x/crypto v0.0.0-20210616213533-5ff15b29337e/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +golang.org/x/crypto v0.0.0-20210711020723-a769d52b0f97/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20210817164053-32db794688a5/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20210915214749-c084706c2272/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20210920023735-84f357641f63/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.0.0-20210921155107-089bfa567519 h1:7I4JAnoQBe7ZtJcBaYHi5UtiO8tQHbUSXxL+pnGRANg= -golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +golang.org/x/crypto v0.0.0-20211215165025-cf75a172585e h1:1SzTfNOXwIS2oWiMF+6qu0OUDKb0dauo6MoDUQyu+yU= +golang.org/x/crypto v0.0.0-20211215165025-cf75a172585e/go.mod h1:P+XmwS30IXTQdn5tA2iutPOUgjI07+tq3H3K9MVA1s8= golang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20180807140117-3d87b88a115f/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= @@ -2574,7 +2799,9 @@ golang.org/x/mod v0.3.1-0.20200828183125-ce943fd02449/go.mod h1:s0Qsj1ACt9ePp/hM 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.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.5.0/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro= golang.org/x/net v0.0.0-20170114055629-f2499483f923/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20180530234432-1e491301e022/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= 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-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -2588,6 +2815,7 @@ golang.org/x/net v0.0.0-20181220203305-927f97764cc3/go.mod h1:mL1N/T3taQHkDXs73r golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190125091013-d26f9f9a57f3/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-20190310074541-c10a0554eabf/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-20190320064053-1272bf9dcd53/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190403144856-b630fd6fe46b/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= @@ -2644,7 +2872,9 @@ golang.org/x/net v0.0.0-20210224082022-3d97a244fca7/go.mod h1:m0MpNAwzfU5UDzcl9v golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc= golang.org/x/net v0.0.0-20210324051636-2c4c8ecb7826/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc= +golang.org/x/net v0.0.0-20210326060303-6b1517762897/go.mod h1:uSPa2vr4CLtc/ILN5odXGNXS6mhrKVzTaCXzk9m6W3k= golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= +golang.org/x/net v0.0.0-20210410081132-afb366fc7cd1/go.mod h1:9tjilg8BloeKEkVJvy7fQ90B1CfIiPueXVOjqfkSzI8= golang.org/x/net v0.0.0-20210428140749-89ef3d95e781/go.mod h1:OJAsFXCWl8Ukc7SiCT/9KSuxbyM7479/AVlXFRxuMCk= golang.org/x/net v0.0.0-20210503060351-7fd8e65b6420/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= @@ -2653,10 +2883,11 @@ golang.org/x/net v0.0.0-20210614182718-04defd469f4e/go.mod h1:9nx3DQGgdP8bBQD5qx golang.org/x/net v0.0.0-20210726213435-c6fcb2dbf985/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20210805182204-aaa1db679c0d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20210825183410-e898025ed96a/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20210903162142-ad29c8ab022f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20210917221730-978cfadd31cf/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20211020060615-d418f374d309/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20211111160137-58aab5ef257a h1:c83jeVQW0KGKNaKBRfelNYNHaev+qawl9yaA825s8XE= -golang.org/x/net v0.0.0-20211111160137-58aab5ef257a/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20211209124913-491a49abca63 h1:iocB37TsdFuN6IBRZ+ry36wrkoV51/tl5vOWqkcPGvY= +golang.org/x/net v0.0.0-20211209124913-491a49abca63/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/oauth2 v0.0.0-20170807180024-9a379c6b3e95/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20181106182150-f42d05182288/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= @@ -2668,6 +2899,7 @@ golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4Iltr 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-20210126194326-f9ce19ea3013/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20210210192628-66670185b0cd/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.0.0-20210220000619-9bb904979d93/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= @@ -2811,6 +3043,7 @@ golang.org/x/sys v0.0.0-20210123111255-9b0068b26619/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210216163648-f7da38b97c65/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210220050731-9a76102bfb43/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210223095934-7937bea0104d/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-20210305230114-8fe3ee5dd75b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -2823,6 +3056,7 @@ golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20210403161142-5e06dd20ab57/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210426230700-d19ff857e887/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210502180810-71e4cd670f79/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210503080704-8803ae5d1324/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210514084401-e8d321eab015/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= @@ -2837,6 +3071,7 @@ golang.org/x/sys v0.0.0-20210806184541-e5e7981a1069/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20210809222454-d867a43fc93e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210816074244-15123e1e1f71/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210823070655-63515b42dcdf/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210831042530-f4d43177bf5e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210906170528-6f6e22806c34/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210908233432-aa78b53d3365/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210917161153-d61c044b1678/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= @@ -2849,8 +3084,8 @@ golang.org/x/sys v0.0.0-20211117180635-dee7805ff2e1/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= 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 h1:9zKuko04nR4gjZ4+DNjHqRlAJqbJETHwiNKDqTfOjfE= -golang.org/x/term v0.0.0-20210615171337-6886f2dfbf5b/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= +golang.org/x/term v0.0.0-20210916214954-140adaaadfaf h1:Ihq/mm/suC88gF8WFcVwk+OV6Tq+wyA1O0E5UEvDglI= +golang.org/x/term v0.0.0-20210916214954-140adaaadfaf/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/text v0.0.0-20160726164857-2910a502d2bf/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= 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= @@ -2884,6 +3119,7 @@ golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGm golang.org/x/tools v0.0.0-20190125232054-d66bd3c5d5a6/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190206041539-40960b6deb8e/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-20190308174544-00c44ba9c14f/go.mod h1:25r3+/G6/xytQM8iWZKq3Hn0kr0rgFKPUNVEL/dr3z4= 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= @@ -2891,6 +3127,7 @@ golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3 golang.org/x/tools v0.0.0-20190329151228-23e29df326fe/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20190416151739-9c9e1878f421/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20190420181800-aa740d480789/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190422233926-fe54fb35175b/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= golang.org/x/tools v0.0.0-20190425222832-ad9eeb80039a/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= @@ -2905,6 +3142,7 @@ golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgw golang.org/x/tools v0.0.0-20190706070813-72ffa07ba3db/go.mod h1:jcCCGcm9btYwXyDqrUWc6MKQKKGJCWEQ3AfLSRIbEuI= golang.org/x/tools v0.0.0-20190813034749-528a2984e271/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20190829051458-42f498d34c4d/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-20190920225731-5eefd052ad72/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= @@ -2949,8 +3187,6 @@ golang.org/x/tools v0.0.0-20200522201501-cb1345f3a375/go.mod h1:EkVYQZoAsY45+roY golang.org/x/tools v0.0.0-20200616133436-c1934b75d054/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-20200626171337-aa94e735be7f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200706234117-b22de6825cf7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= golang.org/x/tools v0.0.0-20200721032237-77f530d86f9a/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= 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= @@ -2964,6 +3200,7 @@ golang.org/x/tools v0.0.0-20201208233053-a543418bbed2/go.mod h1:emZCQorbCU4vsT4f golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/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.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= @@ -3011,6 +3248,7 @@ google.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz513 google.golang.org/api v0.32.0/go.mod h1:/XrVsuzM0rZmrsbjJutiuftIzeuTQcEeaYcSk/mQ1dg= 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.37.0/go.mod h1:fYKFpnQN0DsDSKRVRcQSDQNtqWPfM9i+zNPxepjRCQ8= google.golang.org/api v0.39.0/go.mod h1:fYKFpnQN0DsDSKRVRcQSDQNtqWPfM9i+zNPxepjRCQ8= google.golang.org/api v0.40.0/go.mod h1:fYKFpnQN0DsDSKRVRcQSDQNtqWPfM9i+zNPxepjRCQ8= google.golang.org/api v0.41.0/go.mod h1:RkxM5lITDfTzmyKFPt+wGrCJbVfniCr2ool8kTBzRTU= @@ -3022,10 +3260,12 @@ google.golang.org/api v0.47.0/go.mod h1:Wbvgpq1HddcWVtzsVLyfLp8lDg6AA241LmgIL59t google.golang.org/api v0.48.0/go.mod h1:71Pr1vy+TAZRPkPs/xlCf5SsU8WjuAWv1Pfjbtukyy4= google.golang.org/api v0.50.0/go.mod h1:4bNT5pAuq5ji4SRZm+5QIkjny9JAyVD/3gaSihNefaw= google.golang.org/api v0.51.0/go.mod h1:t4HdrdoNgyN5cbEfm7Lum0lcLDLiise1F8qDKX00sOU= +google.golang.org/api v0.52.0/go.mod h1:Him/adpjt0sxtkWViy0b6xyKW/SD71CwdJ7HqJo7SrU= google.golang.org/api v0.54.0/go.mod h1:7C4bFFOvVDGXjfDTAsgGwDgAxRDeQ4X8NvUedIt6z3k= google.golang.org/api v0.55.0/go.mod h1:38yMfeP1kfjsl8isn0tliTjIb1rJXcQi4UXlbqivdVE= google.golang.org/api v0.56.0/go.mod h1:38yMfeP1kfjsl8isn0tliTjIb1rJXcQi4UXlbqivdVE= google.golang.org/api v0.57.0/go.mod h1:dVPlbZyBo2/OjBpmvNdpn2GRm6rPy75jyU7bmhdrMgI= +google.golang.org/api v0.58.0/go.mod h1:cAbP2FsxoGVNwtgNAmmn3y5G1TWAiVYRmg4yku3lv+E= google.golang.org/api v0.59.0 h1:fPfFO7gttlXYo2ALuD3HxJzh8vaF++4youI0BkFL6GE= google.golang.org/api v0.59.0/go.mod h1:sT2boj7M9YJxZzgeZqXogmhfmRWDtPzT31xkieUbuZU= google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= @@ -3039,6 +3279,7 @@ google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCID google.golang.org/appengine v1.6.7 h1:FZR1q0exgwxzPzp/aF+VccGrSfxfPpkBqjIIEq3ru6c= google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= google.golang.org/cloud v0.0.0-20151119220103-975617b05ea8/go.mod h1:0H1ncTHf11KCFhTc/+EFRbzSCOZx+VUbRMk55Yv5MYk= +google.golang.org/genproto v0.0.0-20170818010345-ee236bd376b0/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= google.golang.org/genproto v0.0.0-20180518175338-11a468237815/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= google.golang.org/genproto v0.0.0-20180608181217-32ee49c4dd80/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= @@ -3078,8 +3319,6 @@ google.golang.org/genproto v0.0.0-20200515170657-fc4c6c6a6587/go.mod h1:YsZOwe1m google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= google.golang.org/genproto v0.0.0-20200527145253-8367513e4ece/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA= google.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA= -google.golang.org/genproto v0.0.0-20200626011028-ee7919e894b5/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20200707001353-8e8330bf89df/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20200710124503-20a17af7bd0e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20200724131911-43cab4749ae7/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= @@ -3093,6 +3332,8 @@ google.golang.org/genproto v0.0.0-20201110150050-8816d57aaa9a/go.mod h1:FWY/as6D 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-20210126160654-44e461bb6506/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20210222152913-aa3ee6e6a81c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20210303154014-9728d6b83eeb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20210310155132-4ce2db91004e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= @@ -3101,16 +3342,20 @@ google.golang.org/genproto v0.0.0-20210319143718-93e7006c17a6/go.mod h1:FWY/as6D google.golang.org/genproto v0.0.0-20210402141018-6c239bbf2bb1/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A= google.golang.org/genproto v0.0.0-20210429181445-86c259c2b4ab/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A= google.golang.org/genproto v0.0.0-20210513213006-bf773b8c8384/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A= +google.golang.org/genproto v0.0.0-20210517163617-5e0236093d7a/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A= google.golang.org/genproto v0.0.0-20210602131652-f16073e35f0c/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= google.golang.org/genproto v0.0.0-20210604141403-392c879c8b08/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= google.golang.org/genproto v0.0.0-20210608205507-b6d2f5bf0d7d/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= google.golang.org/genproto v0.0.0-20210624195500-8bfb893ecb84/go.mod h1:SzzZ/N+nwJDaO1kznhnlzqS8ocJICar6hYhVyhi++24= google.golang.org/genproto v0.0.0-20210713002101-d411969a0d9a/go.mod h1:AxrInvYm1dci+enl5hChSFPOmmUF1+uAa/UsgNRWd7k= google.golang.org/genproto v0.0.0-20210716133855-ce7ef5c701ea/go.mod h1:AxrInvYm1dci+enl5hChSFPOmmUF1+uAa/UsgNRWd7k= +google.golang.org/genproto v0.0.0-20210721163202-f1cecdd8b78a/go.mod h1:ob2IJxKrgPT52GcgX759i1sleT07tiKowYBGbczaW48= +google.golang.org/genproto v0.0.0-20210722135532-667f2b7c528f/go.mod h1:ob2IJxKrgPT52GcgX759i1sleT07tiKowYBGbczaW48= google.golang.org/genproto v0.0.0-20210728212813-7823e685a01f/go.mod h1:ob2IJxKrgPT52GcgX759i1sleT07tiKowYBGbczaW48= google.golang.org/genproto v0.0.0-20210805201207-89edb61ffb67/go.mod h1:ob2IJxKrgPT52GcgX759i1sleT07tiKowYBGbczaW48= google.golang.org/genproto v0.0.0-20210813162853-db860fec028c/go.mod h1:cFeNkxwySK631ADgubI+/XFU/xp8FD5KIVV4rj8UC5w= google.golang.org/genproto v0.0.0-20210821163610-241b8fcbd6c8/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= +google.golang.org/genproto v0.0.0-20210825212027-de86158e7fda/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= google.golang.org/genproto v0.0.0-20210828152312-66f60bf46e71/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= google.golang.org/genproto v0.0.0-20210831024726-fe130286e0e2/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= google.golang.org/genproto v0.0.0-20210903162649-d08c68adba83/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= @@ -3118,12 +3363,14 @@ google.golang.org/genproto v0.0.0-20210909211513-a8c4777a87af/go.mod h1:eFjDcFEc google.golang.org/genproto v0.0.0-20210917145530-b395a37504d4/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= google.golang.org/genproto v0.0.0-20210924002016-3dee208752a0/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= google.golang.org/genproto v0.0.0-20211008145708-270636b82663/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20211016002631-37fc39342514/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= google.golang.org/genproto v0.0.0-20211020151524-b7c3a969101a/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= google.golang.org/genproto v0.0.0-20211112145013-271947fe86fd h1:8jqRgiTTWyKMDOM2AvhjA5dZLBSKXg1yFupPRBV/4fQ= google.golang.org/genproto v0.0.0-20211112145013-271947fe86fd/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= google.golang.org/grpc v0.0.0-20160317175043-d3ddb4469d5a/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw= google.golang.org/grpc v0.0.0-20180920234847-8997b5fa0873/go.mod h1:0JHn/cJsOMiMfNA9+DeHDlAU7KAAB5GDlYFpa9MZMio= google.golang.org/grpc v1.0.5/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw= +google.golang.org/grpc v1.8.0/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw= google.golang.org/grpc v1.12.0/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw= google.golang.org/grpc v1.14.0/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw= google.golang.org/grpc v1.17.0/go.mod h1:6QZJwpn2B+Zp71q/5VxRsJ6NXXVCE5NRUHRo+f3cWCs= @@ -3233,9 +3480,12 @@ gopkg.in/rethinkdb/rethinkdb-go.v6 v6.2.1/go.mod h1:WbjuEoo1oadwzQ4apSDU+JTvmllE gopkg.in/square/go-jose.v2 v2.2.2/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI= gopkg.in/square/go-jose.v2 v2.3.1/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI= gopkg.in/square/go-jose.v2 v2.5.1/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI= +gopkg.in/square/go-jose.v2 v2.6.0 h1:NGk74WTnPKBNUhNzQX7PYcTLUjoq7mzKk2OKbvwk2iI= +gopkg.in/square/go-jose.v2 v2.6.0/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI= gopkg.in/tomb.v1 v1.0.0-20140529071818-c131134a1947/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= +gopkg.in/warnings.v0 v0.1.2 h1:wFXVbFY8DY5/xOe1ECiWdKCzZlxgshcYVNkBHstARME= gopkg.in/warnings.v0 v0.1.2/go.mod h1:jksf8JmL6Qr/oQM2OXTHunEvvTAsrWBLb6OOjuVWRNI= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.0-20200605160147-a5ece683394c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= @@ -3315,6 +3565,8 @@ modernc.org/mathutil v1.1.1/go.mod h1:mZW8CKdRPY1v87qxC/wUdX5O1qDzXMP5TH3wjfpga6 modernc.org/memory v1.0.1/go.mod h1:NSjvC08+g3MLOpcAxQbdctcThAEX4YlJ20WWHYEhvRg= modernc.org/sqlite v1.7.4/go.mod h1:xse4RHCm8Fzw0COf5SJqAyiDrVeDwAQthAS1V/woNIA= modernc.org/tcl v1.4.1/go.mod h1:8YCvzidU9SIwkz7RZwlCWK61mhV8X9UwfkRDRp7y5e0= +nhooyr.io/websocket v1.8.6/go.mod h1:B70DZP8IakI65RVQ51MsWP/8jndNma26DVA/nFSCgW0= +nhooyr.io/websocket v1.8.7/go.mod h1:B70DZP8IakI65RVQ51MsWP/8jndNma26DVA/nFSCgW0= rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= rsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4= rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= diff --git a/pkg/config/config.go b/pkg/config/config.go index 0e9ade95ba8f..82517230233f 100644 --- a/pkg/config/config.go +++ b/pkg/config/config.go @@ -2,6 +2,7 @@ package config import ( "bytes" + "errors" "flag" "fmt" "io/ioutil" @@ -30,10 +31,12 @@ import ( var ( featRemoteConfigs = features.Feature("remote-configs") featIntegrationsNext = features.Feature("integrations-next") + featDynamicConfig = features.Feature("dynamic-config") allFeatures = []features.Feature{ featRemoteConfigs, featIntegrationsNext, + featDynamicConfig, } ) @@ -218,7 +221,7 @@ func (c *Config) RegisterFlags(f *flag.FlagSet) { func LoadFile(filename string, expandEnvVars bool, c *Config) error { buf, err := ioutil.ReadFile(filename) if err != nil { - return fmt.Errorf("error reading config file: %w", err) + return fmt.Errorf("error reading config file %w", err) } return LoadBytes(buf, expandEnvVars, c) } @@ -258,6 +261,28 @@ func LoadRemote(url string, expandEnvVars bool, c *Config) error { return LoadBytes(bb, expandEnvVars, c) } +// LoadDynamicConfiguration is used to load configuration from a variety of sources using +// dynamic loader, this is a templated approach +func LoadDynamicConfiguration(url string, expandvar bool, c *Config) error { + if expandvar { + return errors.New("expand var is not supported when using dynamic configuration, use gomplate env instead") + } + cmf, err := NewDynamicLoader() + if err != nil { + return err + } + err = cmf.LoadConfigByPath(url) + if err != nil { + return err + } + + err = cmf.ProcessConfigs(c) + if err != nil { + return fmt.Errorf("error processing config templates %w", err) + } + return nil +} + // LoadBytes unmarshals a config from a buffer. Defaults are not // applied to the file and must be done manually if LoadBytes // is called directly. @@ -301,6 +326,11 @@ func Load(fs *flag.FlagSet, args []string) (*Config, error) { if features.Enabled(fs, featRemoteConfigs) { return LoadRemote(url, expand, c) } + if features.Enabled(fs, featDynamicConfig) && !features.Enabled(fs, featIntegrationsNext) { + return fmt.Errorf("integrations-next must be enabled for dynamic configuration to work") + } else if features.Enabled(fs, featDynamicConfig) { + return LoadDynamicConfiguration(url, expand, c) + } return LoadFile(url, expand, c) }) } @@ -311,12 +341,15 @@ func load(fs *flag.FlagSet, args []string, loader func(string, bool, *Config) er var ( cfg = DefaultConfig - printVersion bool - file string - configExpandEnv bool + printVersion bool + file string + dynamicConfigPath string + configExpandEnv bool ) fs.StringVar(&file, "config.file", "", "configuration file to load") + fs.StringVar(&dynamicConfigPath, "config.dynamic-config-path", "", "dynamic configuration path that points to a single configuration file supports file:// or s3:// protocols. Must be enabled by -enable-features=dynamic-config,integrations-next") + fs.BoolVar(&printVersion, "version", false, "Print this build's version information") fs.BoolVar(&configExpandEnv, "config.expand-env", false, "Expands ${var} in config according to the values of the environment variables.") cfg.RegisterFlags(fs) @@ -331,7 +364,13 @@ func load(fs *flag.FlagSet, args []string, loader func(string, bool, *Config) er os.Exit(0) } - if file == "" { + if features.Enabled(fs, featDynamicConfig) { + if dynamicConfigPath == "" { + return nil, fmt.Errorf("-config.dynamic-config-path flag required when using dynamic configuration") + } else if err := loader(dynamicConfigPath, configExpandEnv, &cfg); err != nil { + return nil, fmt.Errorf("error loading dynamic configuration file %s: %w", dynamicConfigPath, err) + } + } else if file == "" { return nil, fmt.Errorf("-config.file flag required") } else if err := loader(file, configExpandEnv, &cfg); err != nil { return nil, fmt.Errorf("error loading config file %s: %w", file, err) @@ -349,6 +388,7 @@ func load(fs *flag.FlagSet, args []string, loader func(string, bool, *Config) er if features.Enabled(fs, featIntegrationsNext) { version = integrationsVersion2 } + if err := cfg.Integrations.setVersion(version); err != nil { return nil, fmt.Errorf("error loading config file %s: %w", file, err) } diff --git a/pkg/config/config_test.go b/pkg/config/config_test.go index 85ba384779c6..bbb838363109 100644 --- a/pkg/config/config_test.go +++ b/pkg/config/config_test.go @@ -7,10 +7,13 @@ import ( "testing" "time" + commonCfg "github.com/prometheus/common/config" + + "github.com/stretchr/testify/assert" + "github.com/grafana/agent/pkg/metrics" "github.com/grafana/agent/pkg/metrics/instance" "github.com/grafana/agent/pkg/util" - commonCfg "github.com/prometheus/common/config" "github.com/prometheus/common/model" promCfg "github.com/prometheus/prometheus/config" "github.com/prometheus/prometheus/pkg/labels" @@ -451,3 +454,9 @@ metrics: require.Equal(t, expected, c.Metrics.Global.RemoteWrite[0]) require.True(t, c.Metrics.Global.RemoteWrite[0].SendExemplars) } + +func TestLoadDynamicConfigurationExpandError(t *testing.T) { + err := LoadDynamicConfiguration("", true, nil) + assert.Error(t, err) + assert.True(t, strings.Contains(err.Error(), "expand var is not supported when using dynamic configuration, use gomplate env instead")) +} diff --git a/pkg/config/dynamicconfig.go b/pkg/config/dynamicconfig.go new file mode 100644 index 000000000000..16d2a91d0fe1 --- /dev/null +++ b/pkg/config/dynamicconfig.go @@ -0,0 +1,25 @@ +package config + +// LoaderConfig is used by dynamic configuration +type LoaderConfig struct { + // Sources is used to define sources for variables using gomplate + Sources []Datasource `yaml:"datasources"` + + // TemplatePaths is the "directory" to look for templates in, they will be found and matched to configs but various + // naming conventions. They can be S3/gcp, or file based resources. The directory structure is NOT walked. + TemplatePaths []string `yaml:"template_paths"` + + AgentFilter string `yaml:"agent_filter,omitempty"` + ServerFilter string `yaml:"server_filter,omitempty"` + MetricsFilter string `yaml:"metrics_filter,omitempty"` + MetricsInstanceFilter string `yaml:"metrics_instance_filter,omitempty"` + IntegrationsFilter string `yaml:"integrations_filter,omitempty"` + LogsFilter string `yaml:"logs_filter,omitempty"` + TracesFilter string `yaml:"traces_filter,omitempty"` +} + +// Datasource is used for gomplate and can be used for a variety of resources. +type Datasource struct { + Name string `yaml:"name"` + URL string `yaml:"url"` +} diff --git a/pkg/config/dynamicloader.go b/pkg/config/dynamicloader.go new file mode 100644 index 000000000000..20437d4e9f56 --- /dev/null +++ b/pkg/config/dynamicloader.go @@ -0,0 +1,363 @@ +package config + +import ( + "context" + "fmt" + "io/fs" + "io/ioutil" + "net/url" + "path/filepath" + "strings" + + v2 "github.com/grafana/agent/pkg/integrations/v2" + "github.com/grafana/agent/pkg/logs" + "github.com/grafana/agent/pkg/metrics" + "github.com/grafana/agent/pkg/metrics/instance" + "github.com/grafana/agent/pkg/traces" + "github.com/hairyhenderson/go-fsimpl" + "github.com/hairyhenderson/go-fsimpl/blobfs" + "github.com/hairyhenderson/go-fsimpl/filefs" + "github.com/hairyhenderson/gomplate/v3/data" + "github.com/hairyhenderson/gomplate/v3/loader" + "github.com/hashicorp/go-multierror" + "github.com/weaveworks/common/server" + "gopkg.in/yaml.v2" +) + +// DynamicLoader is used to load configs from a variety of sources and squash them together. +// This is used by the dynamic configuration feature to load configurations from a set of templates and then run them through +// gomplate producing an end result. +type DynamicLoader struct { + loader *loader.ConfigLoader + mux fsimpl.FSMux + cfg *LoaderConfig +} + +// NewDynamicLoader instantiates a new DynamicLoader. +func NewDynamicLoader() (*DynamicLoader, error) { + return &DynamicLoader{ + mux: newFSProvider(), + }, nil +} + +// LoadConfig loads an already created LoaderConfig into the DynamicLoader. +func (c *DynamicLoader) LoadConfig(cfg LoaderConfig) error { + sources := make(map[string]*data.Source) + for _, v := range cfg.Sources { + sourceURL, err := url.Parse(v.URL) + if err != nil { + return err + } + sources[v.Name] = &data.Source{ + URL: sourceURL, + Alias: v.Name, + } + } + // Set Defaults + if cfg.IntegrationsFilter == "" { + cfg.IntegrationsFilter = "integrations-*.yml" + } + if cfg.AgentFilter == "" { + cfg.AgentFilter = "agent-*.yml" + } + if cfg.ServerFilter == "" { + cfg.ServerFilter = "server-*.yml" + } + if cfg.MetricsFilter == "" { + cfg.MetricsFilter = "metrics-*.yml" + } + if cfg.MetricsInstanceFilter == "" { + cfg.MetricsInstanceFilter = "metrics_instances-*.yml" + } + if cfg.LogsFilter == "" { + cfg.LogsFilter = "logs-*.yml" + } + if cfg.TracesFilter == "" { + cfg.TracesFilter = "traces-*.yml" + } + cl := loader.NewConfigLoader(context.Background(), sources) + c.loader = cl + c.cfg = &cfg + return nil +} + +// LoadConfigByPath creates a config based on a path. +func (c *DynamicLoader) LoadConfigByPath(path string) error { + var buf []byte + var err error + switch { + case strings.HasPrefix(path, "file://"): + // It takes some work arounds to parse all windows paths as url so treating it differently now is easier + // otherwise we could parse path and then pivot + stripPath := strings.ReplaceAll(path, "file://", "") + buf, err = ioutil.ReadFile(stripPath) + if err != nil { + return err + } + case strings.HasPrefix(path, "s3://"): + blobURL, err := url.Parse(path) + if err != nil { + return err + } + buf, err = data.ReadBlob(*blobURL) + if err != nil { + return err + } + default: + return fmt.Errorf("config path must start with file:// or s3://, not %s", path) + } + + cl := &LoaderConfig{} + err = yaml.Unmarshal(buf, cl) + if err != nil { + return err + } + return c.LoadConfig(*cl) +} + +// ProcessConfigs loads the configurations in a predetermined order to handle functioning correctly. +func (c *DynamicLoader) ProcessConfigs(cfg *Config) error { + if c.cfg == nil { + return fmt.Errorf("LoadConfig or LoadConfigByPath must be called") + } + var returnErr error + + err := c.processAgent(cfg) + returnErr = errorAppend(returnErr, err) + + serverConfig, err := c.processServer() + returnErr = errorAppend(returnErr, err) + if serverConfig != nil { + cfg.Server = *serverConfig + } + + metricConfig, err := c.processMetrics() + returnErr = errorAppend(returnErr, err) + if metricConfig != nil { + cfg.Metrics = *metricConfig + } + + instancesConfigs, err := c.processMetricInstances() + returnErr = errorAppend(returnErr, err) + cfg.Metrics.Configs = append(cfg.Metrics.Configs, instancesConfigs...) + + logsCfg, err := c.processLogs() + returnErr = errorAppend(returnErr, err) + if logsCfg != nil { + cfg.Logs = logsCfg + } + + traceConfigs, err := c.processTraces() + returnErr = errorAppend(returnErr, err) + if traceConfigs != nil { + cfg.Traces = *traceConfigs + } + + integrations, err := c.processIntegrations() + returnErr = errorAppend(returnErr, err) + + cfg.Integrations.ExtraIntegrations = append(cfg.Integrations.ExtraIntegrations, integrations...) + + return returnErr +} + +func (c *DynamicLoader) processAgent(cfg *Config) error { + var returnError error + found := 0 + for _, path := range c.cfg.TemplatePaths { + filesContents, err := c.retrieveMatchingFileContents(path, c.cfg.AgentFilter, "agent") + returnError = errorAppend(returnError, err) + found = len(filesContents) + found + if len(filesContents) == 1 { + err = LoadBytes([]byte(filesContents[0]), false, cfg) + returnError = errorAppend(returnError, err) + } + } + if found > 1 { + returnError = errorAppend(returnError, fmt.Errorf("found %d agent templates; expected 0 or 1", found)) + } + // If we didnt find anything we still want to unmarshal the cfg to get defaults + if found == 0 { + _ = LoadBytes([]byte("{}"), false, cfg) + } + return returnError +} + +func (c *DynamicLoader) processServer() (*server.Config, error) { + var returnError error + found := 0 + var cfg *server.Config + for _, path := range c.cfg.TemplatePaths { + filesContents, err := c.retrieveMatchingFileContents(path, c.cfg.ServerFilter, "server") + returnError = errorAppend(returnError, err) + found = len(filesContents) + found + if len(filesContents) == 1 { + cfg = &server.Config{} + err = yaml.Unmarshal([]byte(filesContents[0]), cfg) + returnError = errorAppend(returnError, err) + } + } + if found > 1 { + returnError = errorAppend(returnError, fmt.Errorf("found %d server templates; expected 0 or 1", found)) + } + return cfg, returnError +} + +func (c *DynamicLoader) processMetrics() (*metrics.Config, error) { + var returnError error + found := 0 + var cfg *metrics.Config + for _, path := range c.cfg.TemplatePaths { + filesContents, err := c.retrieveMatchingFileContents(path, c.cfg.MetricsFilter, "metrics") + returnError = errorAppend(returnError, err) + found = len(filesContents) + found + if len(filesContents) == 1 { + cfg = &metrics.Config{} + err = yaml.Unmarshal([]byte(filesContents[0]), cfg) + returnError = errorAppend(returnError, err) + } + } + if found > 1 { + returnError = errorAppend(returnError, fmt.Errorf("found %d metrics templates; expected 0 or 1", found)) + } + return cfg, returnError +} + +func (c *DynamicLoader) processMetricInstances() ([]instance.Config, error) { + var returnError error + var configs []instance.Config + for _, path := range c.cfg.TemplatePaths { + filesContents, err := c.retrieveMatchingFileContents(path, c.cfg.MetricsInstanceFilter, "metrics instances") + returnError = errorAppend(returnError, err) + for _, c := range filesContents { + cfg := &instance.Config{} + err = yaml.Unmarshal([]byte(c), cfg) + returnError = errorAppend(returnError, err) + configs = append(configs, *cfg) + } + } + + return configs, returnError +} + +func (c *DynamicLoader) processIntegrations() ([]v2.Config, error) { + var returnError error + var configs []v2.Config + for _, path := range c.cfg.TemplatePaths { + filesContents, err := c.retrieveMatchingFileContents(path, c.cfg.IntegrationsFilter, "integrations") + returnError = errorAppend(returnError, err) + for _, c := range filesContents { + intConfigs, err := unmarshalYamlToExporters(c) + if err != nil { + returnError = errorAppend(returnError, err) + continue + } + configs = append(configs, intConfigs...) + } + } + return configs, returnError +} + +func (c *DynamicLoader) processLogs() (*logs.Config, error) { + var returnError error + found := 0 + var cfg *logs.Config + for _, path := range c.cfg.TemplatePaths { + filesContents, err := c.retrieveMatchingFileContents(path, c.cfg.LogsFilter, "logs") + returnError = errorAppend(returnError, err) + found = len(filesContents) + found + if len(filesContents) == 1 { + cfg = &logs.Config{} + err = yaml.Unmarshal([]byte(filesContents[0]), cfg) + returnError = errorAppend(returnError, err) + } + } + if found > 1 { + returnError = errorAppend(returnError, fmt.Errorf("found %d logs templates; expected 0 or 1", found)) + } + return cfg, returnError +} + +func (c *DynamicLoader) processTraces() (*traces.Config, error) { + var returnError error + found := 0 + var cfg *traces.Config + for _, path := range c.cfg.TemplatePaths { + filesContents, err := c.retrieveMatchingFileContents(path, c.cfg.TracesFilter, "traces") + returnError = errorAppend(returnError, err) + found = len(filesContents) + found + if len(filesContents) == 1 { + cfg = &traces.Config{} + err = yaml.Unmarshal([]byte(filesContents[0]), cfg) + returnError = errorAppend(returnError, err) + } + } + if found > 1 { + returnError = errorAppend(returnError, fmt.Errorf("found %d traces templates; expected 0 or 1", found)) + } + return cfg, returnError +} + +// retrieveMatchingFileContents retrieves the contents of files based on path and pattern +// the pattern is the same as used by filepath.Match. +func (c *DynamicLoader) retrieveMatchingFileContents(path, pattern, name string) ([]string, error) { + var filesContents []string + handler, err := c.mux.Lookup(path) + if err != nil { + return nil, err + } + files, err := fs.ReadDir(handler, ".") + if err != nil { + return nil, err + } + for _, f := range files { + // We don't recurse into directories, mainly due to not wanting to deal with symlinks and other oddities + // its likely we will revisit + if f.IsDir() { + continue + } + matched, err := filepath.Match(pattern, f.Name()) + if err != nil { + return nil, err + } + if matched { + contents, err := fs.ReadFile(handler, f.Name()) + if err != nil { + return nil, err + } + processedConfigString, err := c.loader.GenerateTemplate(name, string(contents)) + if err != nil { + return nil, err + } + filesContents = append(filesContents, processedConfigString) + } + } + return filesContents, nil +} + +// unmarshalYamlToExporters attempts to convert the contents of yaml string into a set of exporters and then return +// those configurations. +func unmarshalYamlToExporters(contents string) ([]v2.Config, error) { + o := &v2.SubsystemOptions{} + err := yaml.Unmarshal([]byte(contents), o) + if err != nil { + return nil, err + } + return o.Configs, nil +} + +func newFSProvider() fsimpl.FSMux { + mux := fsimpl.NewMux() + mux.Add(filefs.FS) + mux.Add(blobfs.FS) + return mux +} + +// errorAppend is a wrapper around multierror.Append that is needed since multierror will create a new error. In this case +// we only want to create a new error if newErr is not nil +func errorAppend(root error, newErr error) error { + if newErr == nil { + return root + } + return multierror.Append(root, newErr) +} diff --git a/pkg/config/dynamicloader_configs_test.go b/pkg/config/dynamicloader_configs_test.go new file mode 100644 index 000000000000..70a4318ccd22 --- /dev/null +++ b/pkg/config/dynamicloader_configs_test.go @@ -0,0 +1,328 @@ +//nolint:golint,goconst +package config + +import ( + "strings" + "testing" + + "github.com/grafana/agent/pkg/integrations/node_exporter" + + v2 "github.com/grafana/agent/pkg/integrations/v2" + "github.com/grafana/agent/pkg/integrations/windows_exporter" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" +) + +func TestConfigMaker(t *testing.T) { + configStr := `wal_directory: /tmp/wal` + tDir := generatePath(t) + writeFile(t, tDir, "metrics-1.yml", configStr) + fileFS := generateFilePath(tDir) + loaderCfg := LoaderConfig{ + Sources: nil, + TemplatePaths: []string{fileFS}, + } + cmf := generateLoader(t, loaderCfg) + configs, err := cmf.processMetrics() + require.NoError(t, err) + assert.NotNil(t, configs) + assert.Equal(t, configs.WALDir, "/tmp/wal") +} + +func TestConfigMakerWithFakeFiles(t *testing.T) { + configStr := `wal_directory: /tmp/wal` + tDir := generatePath(t) + writeFile(t, tDir, "metrics-1.yml", configStr) + writeFile(t, tDir, "fake.yml", configStr) + fileFS := generateFilePath(tDir) + loaderCfg := LoaderConfig{ + Sources: nil, + TemplatePaths: []string{fileFS}, + } + cmf := generateLoader(t, loaderCfg) + configs, err := cmf.processMetrics() + require.NoError(t, err) + assert.NotNil(t, configs) + assert.Equal(t, configs.WALDir, "/tmp/wal") +} + +func TestConfigMakerWithMultipleMetrics(t *testing.T) { + configStr := `wal_directory: /tmp/wal` + tDir := generatePath(t) + writeFile(t, tDir, "metrics-1.yml", configStr) + writeFile(t, tDir, "metrics-2.yml", configStr) + + fileFS := generateFilePath(tDir) + loaderCfg := LoaderConfig{ + Sources: nil, + TemplatePaths: []string{fileFS}, + } + cmf := generateLoader(t, loaderCfg) + _, err := cmf.processMetrics() + assert.Error(t, err) + assert.True(t, strings.Contains(err.Error(), "found 2 metrics templates; expected 0 or 1")) +} + +func TestConfigMakerWithMetricsAndInstances(t *testing.T) { + configStr := `wal_directory: /tmp/wal` + tDir := generatePath(t) + writeFile(t, tDir, "metrics-1.yml", configStr) + writeFile(t, tDir, "metrics_instances-1.yml", "name: t1") + writeFile(t, tDir, "metrics_instances-2.yml", "name: t2") + writeFile(t, tDir, "server-1.yml", ` +http_listen_port: 12345 +log_level: debug +`) + fileFS := generateFilePath(tDir) + + loaderCfg := LoaderConfig{ + Sources: nil, + TemplatePaths: []string{fileFS}, + } + cmf := generateLoader(t, loaderCfg) + cfg := &Config{} + err := cmf.ProcessConfigs(cfg) + require.NoError(t, err) + assert.Len(t, cfg.Metrics.Configs, 2) +} + +func TestConfigMakerWithExporter(t *testing.T) { + configStr := ` +windows_exporter: + enabled_collectors: one,two,three +` + tDir := generatePath(t) + writeFile(t, tDir, "integrations-1.yml", configStr) + fileFS := generateFilePath(tDir) + + loaderCfg := LoaderConfig{ + Sources: nil, + TemplatePaths: []string{fileFS}, + } + cmf := generateLoader(t, loaderCfg) + configs, err := cmf.processIntegrations() + require.NoError(t, err) + assert.Len(t, configs, 1) + wincfg, _ := configs[0].(v2.UpgradedConfig).LegacyConfig() + assert.True(t, wincfg.(*windows_exporter.Config).EnabledCollectors == "one,two,three") +} + +func TestConfigMakerWithMultipleExporter(t *testing.T) { + configStr := ` +windows_exporter: + enabled_collectors: one,two,three + instance: testinstance +node_exporter: + autoscrape: + enable: false +` + tDir := generatePath(t) + writeFile(t, tDir, "integrations-1.yml", configStr) + fileFS := generateFilePath(tDir) + + loaderCfg := LoaderConfig{ + Sources: nil, + TemplatePaths: []string{fileFS}, + } + cmf := generateLoader(t, loaderCfg) + configs, err := cmf.processIntegrations() + require.NoError(t, err) + assert.Len(t, configs, 2) + for _, cfg := range configs { + switch v := cfg.(type) { + default: + t.Errorf("unexpected type %T", v) + case v2.UpgradedConfig: + oldConfig, _ := v.LegacyConfig() + switch oc := oldConfig.(type) { + case *windows_exporter.Config: + assert.True(t, "one,two,three" == oc.EnabledCollectors) + case *node_exporter.Config: + assert.NotNil(t, v) + } + } + } +} + +func TestLoadingFromS3(t *testing.T) { + configStr := ` +windows_exporter: + enabled_collectors: one,two,three + instance: testinstance +` + u := pushFilesToFakeS3(t, "integrations-1.yml", configStr) + s3Url := "s3://mybucket/?region=us-east-1&disableSSL=true&s3ForcePathStyle=true&endpoint=" + u.Host + loaderCfg := LoaderConfig{ + Sources: nil, + TemplatePaths: []string{s3Url}, + } + cmf := generateLoader(t, loaderCfg) + cfg, err := cmf.processIntegrations() + require.NoError(t, err) + assert.Len(t, cfg, 1) + oc, _ := cfg[0].(v2.UpgradedConfig).LegacyConfig() + winCfg := oc.(*windows_exporter.Config) + assert.True(t, winCfg.EnabledCollectors == "one,two,three") +} + +func TestMultiplex(t *testing.T) { + configStr := ` +redis_exporter_configs: +- redis_addr: localhost:6379 + autoscrape: + metric_relabel_configs: + - source_labels: [__address__] + target_label: "banana" + replacement: "apple" +- redis_addr: localhost:6380 +` + tDir := generatePath(t) + writeFile(t, tDir, "integrations-1.yml", configStr) + fileFS := generateFilePath(tDir) + + loaderCfg := LoaderConfig{ + Sources: nil, + TemplatePaths: []string{fileFS}, + } + cmf := generateLoader(t, loaderCfg) + cfg := &Config{} + + err := cmf.ProcessConfigs(cfg) + require.NoError(t, err) + assert.Len(t, cfg.Integrations.ExtraIntegrations, 2) +} + +func TestAgentAddIntegrations(t *testing.T) { + configStr := ` +server: + http_listen_port: 8080 + log_level: debug +metrics: + wal_directory: /tmp/grafana-agent-normal + global: + scrape_interval: 60s + remote_write: + - url: https://www.example.com +integrations: + node_exporter: {} +` + addIntegration := ` +windows_exporter: {} +` + tDir := generatePath(t) + writeFile(t, tDir, "agent-1.yml", configStr) + writeFile(t, tDir, "integrations-windows.yml", addIntegration) + fileFS := generateFilePath(tDir) + loaderCfg := LoaderConfig{ + Sources: nil, + TemplatePaths: []string{fileFS}, + } + cmf := generateLoader(t, loaderCfg) + cfg := &Config{} + err := cmf.ProcessConfigs(cfg) + require.NoError(t, err) + // Since the normal agent uses deferred parsing this is required to load the integration from agent-1.yml + err = cfg.Integrations.setVersion(integrationsVersion2) + require.NoError(t, err) + assert.True(t, cfg.Server.HTTPListenPort == 8080) + assert.True(t, cfg.Server.LogLevel.String() == "debug") + assert.True(t, cfg.Metrics.WALDir == "/tmp/grafana-agent-normal") + assert.True(t, cfg.Metrics.Global.RemoteWrite[0].URL.String() == "https://www.example.com") + assert.False(t, cfg.Integrations.IsZero()) + // ExtraIngrations should be 1 from the integrations-windows.yml + // the node_exporter integration in the agent-1.yml is in the configV2 + assert.Len(t, cfg.Integrations.ExtraIntegrations, 1) + assert.Len(t, cfg.Integrations.configV2.Configs, 2) +} + +func TestFilterOverrides(t *testing.T) { + agentStr := ` +server: + http_listen_port: 8080 + log_level: debug +metrics: + wal_directory: /tmp/grafana-agent-normal + global: + scrape_interval: 60s + remote_write: + - url: https://www.example.com +integrations: + windows_exporter: {} +` + serverStr := ` +http_listen_port: 1111 +` + metricsStr := ` +wal_directory: /tmp/grafana-agent-normal +global: + scrape_interval: 60s + remote_write: + - url: https://www.example.com +` + metricsInstanceStr := ` +name: t1 +` + integrationStr := ` +node_exporter: {} +` + tracesStr := ` +configs: +- name: test_traces + automatic_logging: + backend: stdout + loki_name: default + spans: true +` + logsStr := ` +configs: +- name: test_logs + positions: + filename: /tmp/positions.yaml + scrape_configs: + - job_name: test + pipeline_stages: + - regex: + source: filename + expression: '\\temp\\Logs\\(?P.+?)\\' +` + tDir := generatePath(t) + writeFile(t, tDir, "a-1.yml", agentStr) + writeFile(t, tDir, "s-1.yml", serverStr) + writeFile(t, tDir, "m-1.yml", metricsStr) + writeFile(t, tDir, "mi-1.yml", metricsInstanceStr) + writeFile(t, tDir, "i-1.yml", integrationStr) + writeFile(t, tDir, "t-1.yml", tracesStr) + writeFile(t, tDir, "l-1.yml", logsStr) + fileFS := generateFilePath(tDir) + loaderCfg := LoaderConfig{ + Sources: nil, + TemplatePaths: []string{fileFS}, + AgentFilter: "a-*.yml", + ServerFilter: "s-*.yml", + MetricsFilter: "m-*.yml", + MetricsInstanceFilter: "mi-*.yml", + IntegrationsFilter: "i-*.yml", + LogsFilter: "l-*.yml", + TracesFilter: "t-*.yml", + } + cmf := generateLoader(t, loaderCfg) + cfg := &Config{} + err := cmf.ProcessConfigs(cfg) + require.NoError(t, err) + // Since the normal agent uses deferred parsing this is required to load the integration from agent-1.yml + err = cfg.Integrations.setVersion(integrationsVersion2) + require.NoError(t, err) + // Test server override + assert.True(t, cfg.Server.HTTPListenPort == 1111) + // Test metric + assert.True(t, cfg.Metrics.WALDir == "/tmp/grafana-agent-normal") + // Test Metric Instances + assert.True(t, cfg.Metrics.Configs[0].Name == "t1") + // Test Integrations + assert.Len(t, cfg.Integrations.ExtraIntegrations, 1) + assert.Len(t, cfg.Integrations.configV2.Configs, 2) + // Test Traces + assert.True(t, cfg.Traces.Configs[0].Name == "test_traces") + // Test Logs + assert.True(t, cfg.Logs.Configs[0].Name == "test_logs") +} diff --git a/pkg/config/dynamicloader_template_test.go b/pkg/config/dynamicloader_template_test.go new file mode 100644 index 000000000000..92a0d5f1ad93 --- /dev/null +++ b/pkg/config/dynamicloader_template_test.go @@ -0,0 +1,173 @@ +//nolint:golint,goconst +package config + +import ( + "bytes" + "fmt" + "io/ioutil" + "net/http/httptest" + "net/url" + "os" + "path/filepath" + "runtime" + "testing" + + "github.com/stretchr/testify/require" + + "github.com/grafana/agent/pkg/util/subset" + "gopkg.in/yaml.v2" + + _ "github.com/grafana/agent/pkg/integrations/install" + v2 "github.com/grafana/agent/pkg/integrations/v2" + "github.com/grafana/agent/pkg/integrations/windows_exporter" + "github.com/johannesboyne/gofakes3" + "github.com/johannesboyne/gofakes3/backend/s3mem" + "github.com/stretchr/testify/assert" +) + +func TestConfigMakerWithExporterWithTemplate(t *testing.T) { + configStr := ` +windows_exporter: + enabled_collectors: {{ (datasource "vars").value }} + instance: testinstance +` + tDir := generatePath(t) + writeFile(t, tDir, "vars.yaml", "value: banana") + writeFile(t, tDir, "integrations-1.yml", configStr) + fileFS := generateFilePath(tDir) + + loaderCfg := LoaderConfig{ + Sources: []Datasource{{ + Name: "vars", + URL: generateFilePath(filepath.Join(tDir, "vars.yaml")), + }}, + TemplatePaths: []string{fileFS}, + } + cmf := generateLoader(t, loaderCfg) + configs, err := cmf.processIntegrations() + require.NoError(t, err) + assert.Len(t, configs, 1) + wincfg, _ := configs[0].(v2.UpgradedConfig).LegacyConfig() + assert.True(t, wincfg.(*windows_exporter.Config).EnabledCollectors == "banana") +} + +func TestLoadingFromS3LoadingVarsLocally(t *testing.T) { + configStr := ` +windows_exporter: + enabled_collectors: {{ (datasource "vars").value }} + instance: testinstance +` + tDir := generatePath(t) + writeFile(t, tDir, "vars.yaml", "value: banana") + u := pushFilesToFakeS3(t, "integrations-1.yml", configStr) + s3Url := "s3://mybucket/?region=us-east-1&disableSSL=true&s3ForcePathStyle=true&endpoint=" + u.Host + loaderCfg := LoaderConfig{ + Sources: []Datasource{{ + Name: "vars", + URL: fmt.Sprintf("file:///%s", filepath.Join(tDir, "vars.yaml")), + }}, + TemplatePaths: []string{s3Url}, + } + cmf := generateLoader(t, loaderCfg) + cfg, err := cmf.processIntegrations() + require.NoError(t, err) + assert.Len(t, cfg, 1) + oc, _ := cfg[0].(v2.UpgradedConfig).LegacyConfig() + winCfg := oc.(*windows_exporter.Config) + assert.True(t, winCfg.EnabledCollectors == "banana") +} + +func TestLoadingFromS3LoadingVarsLocallyWithRange(t *testing.T) { + configStr := ` +windows_exporter: + enabled_collectors: banana + instance: testinstance + autoscrape: + metric_relabel_configs: {{ range (datasource "vars").value }} + - source_labels: [__address__] + target_label: {{ . }} + replacement: "{{ . }}-value" + {{ end }} +` + tDir := generatePath(t) + writeFile(t, tDir, "vars.yaml", "value: [banana,apple,pear]") + u := pushFilesToFakeS3(t, "integrations-1.yml", configStr) + + s3Url := "s3://mybucket/?region=us-east-1&disableSSL=true&s3ForcePathStyle=true&endpoint=" + u.Host + loaderCfg := LoaderConfig{ + Sources: []Datasource{{ + Name: "vars", + URL: fmt.Sprintf("file:///%s", filepath.Join(tDir, "vars.yaml")), + }}, + TemplatePaths: []string{s3Url}, + } + cmf := generateLoader(t, loaderCfg) + cfg := &Config{} + err := cmf.ProcessConfigs(cfg) + require.NoError(t, err) + assert.Len(t, cfg.Integrations.ExtraIntegrations, 1) + _ = cfg.Integrations.setVersion(integrationsVersion2) + expectBase := ` +integrations: + windows_exporter: + autoscrape: + metric_relabel_configs: + - target_label: banana + - target_label: apple + - target_label: pear +` + outBytes, err := yaml.Marshal(cfg) + require.NoError(t, err) + assert.NoError(t, subset.YAMLAssert([]byte(expectBase), outBytes)) +} + +func writeFile(t *testing.T, directory string, path string, contents string) { + fullpath := filepath.Join(directory, path) + err := ioutil.WriteFile(fullpath, []byte(contents), 0666) + require.NoError(t, err) +} + +func generateLoader(t *testing.T, lc LoaderConfig) *DynamicLoader { + cmf, err := NewDynamicLoader() + require.NoError(t, err) + err = cmf.LoadConfig(lc) + require.NoError(t, err) + return cmf +} + +func generateFilePath(directory string) string { + if runtime.GOOS == "windows" { + // The URL scheme needs an additional / on windows + return fmt.Sprintf("file:///%s", directory) + } + return fmt.Sprintf("file://%s", directory) +} + +func generatePath(t *testing.T) string { + tDir, err := os.MkdirTemp("", "*-test") + require.NoError(t, err) + t.Cleanup(func() { _ = os.RemoveAll(tDir) }) + return tDir +} + +func pushFilesToFakeS3(t *testing.T, filename string, filecontents string) *url.URL { + t.Setenv("AWS_ANON", "true") + + backend := s3mem.New() + faker := gofakes3.New(backend) + + srv := httptest.NewServer(faker.Server()) + _ = backend.CreateBucket("mybucket") + t.Cleanup(srv.Close) + _, err := backend.PutObject( + "mybucket", + filename, + map[string]string{"Content-Type": "application/yaml"}, + bytes.NewBufferString(filecontents), + int64(len(filecontents)), + ) + assert.NoError(t, err) + u, err := url.Parse(srv.URL) + assert.NoError(t, err) + return u +} diff --git a/pkg/config/integrations.go b/pkg/config/integrations.go index 9cbec36cea44..557574b83d2e 100644 --- a/pkg/config/integrations.go +++ b/pkg/config/integrations.go @@ -36,6 +36,9 @@ type VersionedIntegrations struct { configV1 *v1.ManagerConfig configV2 *v2.SubsystemOptions + + // ExtraIntegrations is used when adding any integrations NOT in the default agent configuration + ExtraIntegrations []v2.Config } var ( @@ -95,8 +98,16 @@ func (c *VersionedIntegrations) setVersion(v integrationsVersion) error { return yaml.UnmarshalStrict(c.raw, c.configV1) case integrationsVersion2: cfg := v2.DefaultSubsystemOptions + // this is needed for dynamic configuration, the unmarshal doesnt work correctly if + // this is not nil. + c.configV1 = nil c.configV2 = &cfg - return yaml.UnmarshalStrict(c.raw, c.configV2) + err := yaml.UnmarshalStrict(c.raw, c.configV2) + if err != nil { + return err + } + c.configV2.Configs = append(c.configV2.Configs, c.ExtraIntegrations...) + return nil default: panic(fmt.Sprintf("unknown integrations version %d", c.version)) } @@ -136,7 +147,7 @@ func NewIntegrations(logger log.Logger, cfg *VersionedIntegrations, globals Inte type v1Integrations struct{ *v1.Manager } -func (s *v1Integrations) ApplyConfig(cfg *VersionedIntegrations, globals IntegrationsGlobals) error { +func (s *v1Integrations) ApplyConfig(cfg *VersionedIntegrations, _ IntegrationsGlobals) error { return s.Manager.ApplyConfig(*cfg.configV1) } diff --git a/pkg/integrations/v2/controller.go b/pkg/integrations/v2/controller.go index 16f80a20245d..7ecf37fbfe18 100644 --- a/pkg/integrations/v2/controller.go +++ b/pkg/integrations/v2/controller.go @@ -11,6 +11,8 @@ import ( "strings" "sync" + "github.com/hashicorp/go-multierror" + "github.com/go-kit/log" "github.com/go-kit/log/level" "github.com/gorilla/mux" @@ -99,6 +101,23 @@ func (c *controller) UpdateController(cfg controllerConfig, globals Globals) err c.mut.Lock() defer c.mut.Unlock() + var returnError error + // Check to ensure no duplicate singleton exist + singletonCheck := make(map[string]struct{}) + for _, cfg := range cfg { + if t, ok := RegisteredType(cfg.Name()); ok && t == TypeSingleton { + // Add to the map but if we find it already exists then create an error + if _, ok := singletonCheck[cfg.Name()]; ok { + returnError = multierror.Append(returnError, fmt.Errorf("found multiple instances of singleton integration %s", cfg.Name())) + } else { + singletonCheck[cfg.Name()] = struct{}{} + } + } + } + if returnError != nil { + return returnError + } + integrationIDMap := map[integrationID]struct{}{} integrations := make([]*controlledIntegration, 0, len(cfg)) diff --git a/pkg/integrations/v2/controller_test.go b/pkg/integrations/v2/controller_test.go index ab342c821955..d9f13ad9315d 100644 --- a/pkg/integrations/v2/controller_test.go +++ b/pkg/integrations/v2/controller_test.go @@ -2,6 +2,7 @@ package integrations import ( "context" + "strings" "sync" "testing" @@ -133,6 +134,42 @@ func Test_controller_ConfigChanges(t *testing.T) { }) } +func Test_controller_SingletonCheck(t *testing.T) { + var integrationsWg sync.WaitGroup + var starts atomic.Uint64 + + mockIntegration := FuncIntegration(func(ctx context.Context) error { + integrationsWg.Done() + starts.Inc() + <-ctx.Done() + return nil + }) + c1 := mockConfig{ + NameFunc: func() string { return mockIntegrationName }, + ConfigEqualsFunc: func(Config) bool { return true }, + ApplyDefaultsFunc: func(g Globals) error { return nil }, + IdentifierFunc: func(Globals) (string, error) { + return mockIntegrationName, nil + }, + NewIntegrationFunc: func(log.Logger, Globals) (Integration, error) { + integrationsWg.Add(1) + return mockIntegration, nil + }, + } + configMap := make(map[Config]Type) + configMap[&c1] = TypeSingleton + setRegistered(t, configMap) + cfg := controllerConfig{ + c1, + c1, + } + + globals := Globals{} + _, err := newController(util.TestLogger(t), cfg, globals) + require.Error(t, err) + require.True(t, strings.Contains(err.Error(), "found multiple instances of singleton integration mock")) +} + type syncController struct { inner *controller pool *workerPool diff --git a/pkg/integrations/v2/register.go b/pkg/integrations/v2/register.go index e6148ca12e2c..06476106e482 100644 --- a/pkg/integrations/v2/register.go +++ b/pkg/integrations/v2/register.go @@ -14,9 +14,10 @@ import ( ) var ( - integrationNames = make(map[string]interface{}) // Cache of field names for uniqueness checking. - configFieldNames = make(map[reflect.Type]string) // Map of registered type to field name - integrationTypes = make(map[reflect.Type]Type) // Map of registered type to Type + integrationNames = make(map[string]interface{}) // Cache of field names for uniqueness checking. + configFieldNames = make(map[reflect.Type]string) // Map of registered type to field name + integrationTypes = make(map[reflect.Type]Type) // Map of registered type to Type + integrationTypeByName = make(map[string]Type) // Map of name to Type // Registered integrations. Registered integrations may be either a Config or // a v1.Config. v1.Configs must have a corresponding upgrader for their type. @@ -52,6 +53,7 @@ func registerIntegration(v interface{}, name string, ty Type, upgrader UpgradeFu configTy := reflect.TypeOf(v) integrationTypes[configTy] = ty + integrationTypeByName[name] = ty configFieldNames[configTy] = name upgraders[name] = upgrader } @@ -107,6 +109,7 @@ func setRegistered(t *testing.T, cc map[Config]Type) { clear := func() { integrationNames = make(map[string]interface{}) integrationTypes = make(map[reflect.Type]Type) + integrationTypeByName = make(map[string]Type) configFieldNames = make(map[reflect.Type]string) registered = registered[:0] upgraders = make(map[string]UpgradeFunc) @@ -125,22 +128,32 @@ func setRegistered(t *testing.T, cc map[Config]Type) { func Registered() []Config { res := make([]Config, 0, len(registered)) for _, r := range registered { - switch v := r.(type) { - case Config: - res = append(res, cloneValue(v).(Config)) - case v1.Config: - mut, ok := upgraders[v.Name()] - if !ok || mut == nil { - panic(fmt.Sprintf("Could not find transformer for legacy integration %T", r)) - } - res = append(res, mut(cloneValue(r).(v1.Config), common.MetricsConfig{})) - default: - panic(fmt.Sprintf("unexpected type %T", r)) - } + res = append(res, cloneConfig(r)) } return res } +// RegisteredType returns the integrations.Type for config +func RegisteredType(name string) (Type, bool) { + t, ok := integrationTypeByName[name] + return t, ok +} + +func cloneConfig(r interface{}) Config { + switch v := r.(type) { + case Config: + return cloneValue(v).(Config) + case v1.Config: + mut, ok := upgraders[v.Name()] + if !ok || mut == nil { + panic(fmt.Sprintf("Could not find transformer for legacy integration %T", r)) + } + return mut(cloneValue(r).(v1.Config), common.MetricsConfig{}) + default: + panic(fmt.Sprintf("unexpected type %T", r)) + } +} + func cloneValue(in interface{}) interface{} { return reflect.New(reflect.TypeOf(in).Elem()).Interface() }