Repository: influxdata/telegraf Branch: master Commit: 665ea76969db Files: 5868 Total size: 23.1 MB Directory structure: gitextract_d5khquh4/ ├── .circleci/ │ └── config.yml ├── .gitattributes ├── .github/ │ ├── ISSUE_TEMPLATE/ │ │ ├── BUG_REPORT.yml │ │ ├── FEATURE_REQUEST.yml │ │ └── SUPPORT.yml │ ├── PULL_REQUEST_TEMPLATE.md │ ├── dependabot.yml │ └── workflows/ │ ├── linter.yml │ ├── milestones.yml │ ├── pr-target-branch.yml │ ├── readme-linter.yml │ └── semantic.yml ├── .gitignore ├── .golangci.yml ├── .markdownlint.jsonc ├── .markdownlintignore ├── CHANGELOG-1.13.md ├── CHANGELOG.md ├── CODE_OF_CONDUCT.md ├── CONTRIBUTING.md ├── EXTERNAL_PLUGINS.md ├── LICENSE ├── Makefile ├── README.md ├── SECURITY.md ├── accumulator.go ├── agent/ │ ├── README.md │ ├── accumulator.go │ ├── accumulator_test.go │ ├── agent.go │ ├── agent_posix.go │ ├── agent_test.go │ ├── agent_windows.go │ └── testcases/ │ ├── aggregators-rerun-processors/ │ │ ├── expected.out │ │ ├── input.influx │ │ └── telegraf.conf │ ├── aggregators-skip-processors/ │ │ ├── expected.out │ │ ├── input.influx │ │ └── telegraf.conf │ ├── processor-order-appearance/ │ │ ├── expected.out │ │ ├── input.influx │ │ └── telegraf.conf │ ├── processor-order-explicit/ │ │ ├── expected.out │ │ ├── input.influx │ │ └── telegraf.conf │ ├── processor-order-mixed/ │ │ ├── expected.out │ │ ├── input.influx │ │ └── telegraf.conf │ └── processor-order-no-starlark/ │ ├── expected.out │ ├── input.influx │ └── telegraf.conf ├── aggregator.go ├── assets/ │ └── windows/ │ └── icon.icns ├── build_version.txt ├── cmd/ │ └── telegraf/ │ ├── agent.conf │ ├── cmd_config.go │ ├── cmd_plugins.go │ ├── cmd_secretstore.go │ ├── cmd_win_service.go │ ├── cmd_win_service_notwindows.go │ ├── main.go │ ├── main_test.go │ ├── main_win_test.go │ ├── pprof.go │ ├── printer.go │ ├── telegraf.go │ ├── telegraf_posix.go │ └── telegraf_windows.go ├── config/ │ ├── config.go │ ├── config_test.go │ ├── deprecation.go │ ├── deprecation_test.go │ ├── envvar.go │ ├── internal_test.go │ ├── migration.go │ ├── plugin_id.go │ ├── plugin_printer.go │ ├── plugin_selector.go │ ├── plugin_selector_test.go │ ├── secret.go │ ├── secret_protected.go │ ├── secret_test.go │ ├── secret_unprotected.go │ ├── testdata/ │ │ ├── addressbook.proto │ │ ├── azure_monitor.toml │ │ ├── default_parser.toml │ │ ├── default_parser_exec.toml │ │ ├── deprecated_field_filter.toml │ │ ├── envvar_comments.toml │ │ ├── envvar_comments_expected.toml │ │ ├── envvar_malicious.conf │ │ ├── envvar_non_string.conf │ │ ├── envvar_non_string_multiline.conf │ │ ├── envvar_valid.conf │ │ ├── envvar_valid_multiline.conf │ │ ├── filter_metricpass.toml │ │ ├── inline_table.toml │ │ ├── invalid_field.toml │ │ ├── invalid_field_in_parser_table.toml │ │ ├── invalid_field_in_parserfunc_table.toml │ │ ├── invalid_field_processor.toml │ │ ├── invalid_field_processor_in_parser.toml │ │ ├── invalid_field_processor_in_parser_table.toml │ │ ├── invalid_field_processor_in_parserfunc.toml │ │ ├── invalid_field_processor_in_parserfunc_table.toml │ │ ├── invalid_field_processor_with_parser.toml │ │ ├── invalid_field_processor_with_parserfunc.toml │ │ ├── invalid_field_with_parser.toml │ │ ├── invalid_field_with_parserfunc.toml │ │ ├── non_slice_slice.toml │ │ ├── parsers_new.toml │ │ ├── processor_order/ │ │ │ ├── multiple_processors.toml │ │ │ ├── multiple_processors_messy_order.toml │ │ │ └── multiple_processors_simple_order.toml │ │ ├── processors_with_parsers.toml │ │ ├── serializers_new.toml │ │ ├── serializers_old.toml │ │ ├── single_plugin.toml │ │ ├── single_plugin_env_vars.toml │ │ ├── single_plugin_with_comment_in_array.toml │ │ ├── single_plugin_with_separators.toml │ │ ├── slice_comment.toml │ │ ├── special_types.key │ │ ├── special_types.pem │ │ ├── special_types.toml │ │ ├── state_persistence_input_all_different.toml │ │ ├── state_persistence_input_all_same.toml │ │ ├── state_persistence_input_store_load.toml │ │ ├── state_persistence_processors.toml │ │ ├── subconfig/ │ │ │ ├── exec.conf │ │ │ ├── memcached.conf │ │ │ └── procstat.conf │ │ ├── telegraf-agent.toml │ │ ├── wrong_cert_path.toml │ │ ├── wrong_field_type.toml │ │ └── wrong_field_type2.toml │ ├── types.go │ └── types_test.go ├── docs/ │ ├── AGGREGATORS.md │ ├── AGGREGATORS_AND_PROCESSORS.md │ ├── APPARMOR.md │ ├── COMMANDS_AND_FLAGS.md │ ├── CONFIGURATION.md │ ├── CUSTOMIZATION.md │ ├── DATA_FORMATS_INPUT.md │ ├── DATA_FORMATS_OUTPUT.md │ ├── DOCKER.md │ ├── EXTERNAL_PLUGINS.md │ ├── FAQ.md │ ├── INPUTS.md │ ├── INSTALL_GUIDE.md │ ├── INTEGRATION_TESTS.md │ ├── LICENSE_OF_DEPENDENCIES.md │ ├── METRICS.md │ ├── NIGHTLIES.md │ ├── OUTPUTS.md │ ├── PARSING_DATA.md │ ├── PROCESSORS.md │ ├── PROFILING.md │ ├── QUICK_START.md │ ├── README.md │ ├── RELEASES.md │ ├── SECRETSTORES.md │ ├── SQL_DRIVERS_INPUT.md │ ├── SUPPORTED_PLATFORMS.md │ ├── TEMPLATE_PATTERN.md │ ├── TLS.md │ ├── TOML.md │ ├── WINDOWS_SERVICE.md │ ├── developers/ │ │ ├── CODE_STYLE.md │ │ ├── DEBUG.md │ │ ├── DEPRECATION.md │ │ ├── LOGGING.md │ │ ├── METRIC_FORMAT_CHANGES.md │ │ ├── PACKAGING.md │ │ ├── PROFILING.md │ │ ├── REVIEWS.md │ │ ├── SAMPLE_CONFIG.md │ │ └── STATE_PERSISTENCE.md │ ├── includes/ │ │ ├── plugin_config.md │ │ ├── secret_usage.md │ │ ├── service_input.md │ │ └── startup_error_behavior.md │ └── specs/ │ ├── README.md │ ├── template.md │ ├── tsd-001-deprecation.md │ ├── tsd-002-custom-builder.md │ ├── tsd-003-state-persistence.md │ ├── tsd-004-configuration-migration.md │ ├── tsd-005-output-buffer-strategy.md │ ├── tsd-006-startup-error-behavior.md │ ├── tsd-007-url-config-behavior.md │ ├── tsd-008-partial-write-error-handling.md │ ├── tsd-009-probe-on-startup.md │ ├── tsd-010-labels-and-selectors.md │ └── tsd-011-internal-plugin-statistics.md ├── etc/ │ └── logrotate.d/ │ └── telegraf ├── filter/ │ ├── filter.go │ ├── filter_test.go │ └── implementations.go ├── go.mod ├── go.sum ├── info.plist ├── input.go ├── internal/ │ ├── choice/ │ │ └── choice.go │ ├── clock/ │ │ ├── options.go │ │ ├── ticker.go │ │ ├── ticker_aligned_test.go │ │ ├── ticker_test.go │ │ ├── ticker_unaligned_test.go │ │ ├── timer.go │ │ └── timer_test.go │ ├── content_coding.go │ ├── content_coding_test.go │ ├── customized_no.go │ ├── customized_yes.go │ ├── docker/ │ │ ├── docker.go │ │ └── docker_test.go │ ├── env.go │ ├── errors.go │ ├── exec.go │ ├── exec_unix.go │ ├── exec_windows.go │ ├── fuzz/ │ │ └── json.go │ ├── globpath/ │ │ ├── globpath.go │ │ ├── globpath_test.go │ │ └── testdata/ │ │ ├── log1.log │ │ ├── log2.log │ │ ├── log[!.log │ │ ├── nested1/ │ │ │ └── nested2/ │ │ │ └── nested.txt │ │ └── test.conf │ ├── goplugin/ │ │ ├── noplugin.go │ │ └── plugin.go │ ├── host_endianness_be.go │ ├── host_endianness_le.go │ ├── http.go │ ├── internal.go │ ├── internal_test.go │ ├── limiter/ │ │ └── limiter.go │ ├── network.go │ ├── process/ │ │ ├── process.go │ │ ├── process_posix.go │ │ ├── process_test.go │ │ └── process_windows.go │ ├── rotate/ │ │ ├── file_writer.go │ │ └── file_writer_test.go │ ├── templating/ │ │ ├── engine.go │ │ ├── engine_test.go │ │ ├── matcher.go │ │ ├── node.go │ │ ├── template.go │ │ └── template_test.go │ └── type_conversions.go ├── logger/ │ ├── event_logger.go │ ├── event_logger_test.go │ ├── handler.go │ ├── logger.go │ ├── logger_test.go │ ├── registry.go │ ├── stdlog_redirector.go │ ├── structured_logger.go │ ├── structured_logger_test.go │ ├── text_logger.go │ └── text_logger_test.go ├── logger.go ├── metric/ │ ├── deserialize.go │ ├── init.go │ ├── metric.go │ ├── metric_test.go │ ├── series_grouper.go │ ├── series_grouper_test.go │ ├── tracking.go │ └── tracking_test.go ├── metric.go ├── migrations/ │ ├── all/ │ │ ├── all.go │ │ ├── general_common_tls.go │ │ ├── general_metricfilter.go │ │ ├── global_agent.go │ │ ├── inputs.nats_consumer.go │ │ ├── inputs_KNXListener.go │ │ ├── inputs_amqp_consumer │ │ ├── inputs_cassandra.go │ │ ├── inputs_cisco_telemetry_gnmi.go │ │ ├── inputs_cloudwatch.go │ │ ├── inputs_consul.go │ │ ├── inputs_disk.go │ │ ├── inputs_docker.go │ │ ├── inputs_elasticsearch.go │ │ ├── inputs_filecount.go │ │ ├── inputs_gnmi.go │ │ ├── inputs_http.go │ │ ├── inputs_http_listener.go │ │ ├── inputs_http_listener_v2.go │ │ ├── inputs_http_response.go │ │ ├── inputs_httpjson.go │ │ ├── inputs_icinga2.go │ │ ├── inputs_influxdb_listener.go │ │ ├── inputs_internet_speed.go │ │ ├── inputs_io.go │ │ ├── inputs_jolokia.go │ │ ├── inputs_kafka_consumer_legacy.go │ │ ├── inputs_kube_inventory.go │ │ ├── inputs_kubernetes.go │ │ ├── inputs_logparser.go │ │ ├── inputs_mqtt_consumer.go │ │ ├── inputs_nsq_consumer.go │ │ ├── inputs_ntpq.go │ │ ├── inputs_openldap.go │ │ ├── inputs_procstat.go │ │ ├── inputs_rabbitmq.go │ │ ├── inputs_sflow.go │ │ ├── inputs_smart.go │ │ ├── inputs_snmp_legacy.go │ │ ├── inputs_sqlserver.go │ │ ├── inputs_statsd.go │ │ ├── inputs_tcp_listener.go │ │ ├── inputs_udp_listener.go │ │ ├── inputs_vsphere.go │ │ ├── outputs_amqp.go │ │ ├── outputs_influxdb.go │ │ ├── outputs_kinesis.go │ │ ├── outputs_librato.go │ │ ├── outputs_mqtt.go │ │ ├── outputs_remotefile.go │ │ ├── outputs_riemann_legacy.go │ │ └── outputs_wavefront.go │ ├── common/ │ │ ├── filter_options.go │ │ ├── input_options.go │ │ └── output_options.go │ ├── general_common_tls/ │ │ ├── migration.go │ │ ├── migration_test.go │ │ └── testcases/ │ │ └── deprecated_ssl/ │ │ ├── dummy │ │ ├── expected.conf │ │ └── telegraf.conf │ ├── general_metricfilter/ │ │ ├── migration.go │ │ ├── migration_test.go │ │ └── testcases/ │ │ ├── deprecated_drop/ │ │ │ ├── expected.conf │ │ │ └── telegraf.conf │ │ ├── deprecated_fielddrop/ │ │ │ ├── expected.conf │ │ │ └── telegraf.conf │ │ ├── deprecated_fieldpass/ │ │ │ ├── expected.conf │ │ │ └── telegraf.conf │ │ ├── deprecated_pass/ │ │ │ ├── expected.conf │ │ │ └── telegraf.conf │ │ ├── merge_all_overlap/ │ │ │ ├── expected.conf │ │ │ └── telegraf.conf │ │ ├── merge_fieldexclude/ │ │ │ ├── expected.conf │ │ │ └── telegraf.conf │ │ ├── merge_fieldexclude_overlap/ │ │ │ ├── expected.conf │ │ │ └── telegraf.conf │ │ ├── merge_fieldinclude/ │ │ │ ├── expected.conf │ │ │ └── telegraf.conf │ │ └── merge_fieldinclude_overlap/ │ │ ├── expected.conf │ │ └── telegraf.conf │ ├── global_agent/ │ │ ├── migration.go │ │ ├── migration_test.go │ │ └── testcases/ │ │ ├── default.conf │ │ ├── logtarget_eventlog/ │ │ │ ├── expected.conf │ │ │ └── telegraf.conf │ │ ├── logtarget_eventlog_collision.conf │ │ ├── logtarget_eventlog_with_logfile/ │ │ │ ├── expected.conf │ │ │ └── telegraf.conf │ │ ├── logtarget_file/ │ │ │ ├── expected.conf │ │ │ └── telegraf.conf │ │ ├── logtarget_file_no_logfile/ │ │ │ ├── expected.conf │ │ │ └── telegraf.conf │ │ ├── logtarget_stderr/ │ │ │ ├── expected.conf │ │ │ └── telegraf.conf │ │ └── logtarget_stderr_with_logfile/ │ │ ├── expected.conf │ │ └── telegraf.conf │ ├── inputs_KNXListener/ │ │ ├── migration.go │ │ ├── migration_test.go │ │ └── testcases/ │ │ ├── expected.conf │ │ └── telegraf.conf │ ├── inputs_amqp_consumer/ │ │ ├── migration.go │ │ ├── migration_test.go │ │ └── testcases/ │ │ ├── deprecated_url/ │ │ │ ├── expected.conf │ │ │ └── telegraf.conf │ │ ├── deprecated_url_existing_brokers/ │ │ │ ├── expected.conf │ │ │ └── telegraf.conf │ │ └── deprecated_url_existing_brokers_duplicate/ │ │ ├── deprecated_url_existing_brokers/ │ │ │ ├── expected.conf │ │ │ └── telegraf.conf │ │ ├── expected.conf │ │ └── telegraf.conf │ ├── inputs_cassandra/ │ │ ├── migration.go │ │ ├── migration_test.go │ │ └── testcases/ │ │ ├── filter_options/ │ │ │ ├── expected.conf │ │ │ └── telegraf.conf │ │ ├── general_options/ │ │ │ ├── expected.conf │ │ │ └── telegraf.conf │ │ └── simple/ │ │ ├── expected.conf │ │ └── telegraf.conf │ ├── inputs_cisco_telemetry_gnmi/ │ │ ├── migration.go │ │ ├── migration_test.go │ │ └── testcases/ │ │ └── deprecated_alias/ │ │ ├── expected.conf │ │ └── telegraf.conf │ ├── inputs_cloudwatch/ │ │ ├── migration.go │ │ ├── migration_test.go │ │ └── testcases/ │ │ ├── multiple_cloudwatch_instances/ │ │ │ ├── expected.conf │ │ │ └── telegraf.conf │ │ ├── namespace_duplicate_in_namespaces/ │ │ │ ├── expected.conf │ │ │ └── telegraf.conf │ │ ├── namespace_merge_with_namespaces/ │ │ │ ├── expected.conf │ │ │ └── telegraf.conf │ │ └── namespace_to_namespaces/ │ │ ├── expected.conf │ │ └── telegraf.conf │ ├── inputs_consul/ │ │ ├── migration.go │ │ ├── migration_test.go │ │ └── testcases/ │ │ ├── deprecated_centre_existing/ │ │ │ ├── expected.conf │ │ │ └── telegraf.conf │ │ └── deprecated_datacentre/ │ │ ├── expected.conf │ │ └── telegraf.conf │ ├── inputs_disk/ │ │ ├── migration.go │ │ ├── migration_test.go │ │ └── testcases/ │ │ ├── deprecated_mountpoints/ │ │ │ ├── expected.conf │ │ │ └── telegraf.conf │ │ └── deprecated_mountpoints_existing/ │ │ ├── expected.conf │ │ └── telegraf.conf │ ├── inputs_docker/ │ │ ├── migration.go │ │ ├── migration_test.go │ │ └── testcases/ │ │ ├── all_deprecated_options/ │ │ │ ├── expected.conf │ │ │ └── telegraf.conf │ │ ├── conflict_resolution/ │ │ │ ├── expected.conf │ │ │ └── telegraf.conf │ │ ├── container_names_merge/ │ │ │ ├── expected.conf │ │ │ └── telegraf.conf │ │ ├── container_names_migration/ │ │ │ ├── expected.conf │ │ │ └── telegraf.conf │ │ ├── perdevice_false_migration/ │ │ │ ├── expected.conf │ │ │ └── telegraf.conf │ │ ├── perdevice_true_migration/ │ │ │ ├── expected.conf │ │ │ └── telegraf.conf │ │ ├── total_false_migration/ │ │ │ ├── expected.conf │ │ │ └── telegraf.conf │ │ └── total_true_migration/ │ │ ├── expected.conf │ │ └── telegraf.conf │ ├── inputs_elasticsearch/ │ │ ├── migration.go │ │ ├── migration_test.go │ │ └── testcases/ │ │ ├── http_timeout_to_timeout/ │ │ │ ├── expected.conf │ │ │ └── telegraf.conf │ │ ├── http_timeout_with_auth/ │ │ │ ├── expected.conf │ │ │ └── telegraf.conf │ │ ├── http_timeout_with_existing_timeout/ │ │ │ ├── expected.conf │ │ │ └── telegraf.conf │ │ ├── http_timeout_with_tls/ │ │ │ ├── expected.conf │ │ │ └── telegraf.conf │ │ └── multiple_elasticsearch_instances/ │ │ ├── expected.conf │ │ └── telegraf.conf │ ├── inputs_filecount/ │ │ ├── migration.go │ │ ├── migration_test.go │ │ └── testcases/ │ │ ├── deprecated_directory/ │ │ │ ├── expected.conf │ │ │ └── telegraf.conf │ │ ├── deprecated_directory_duplicate/ │ │ │ ├── expected.conf │ │ │ └── telegraf.conf │ │ └── deprecated_directory_existing/ │ │ ├── expected.conf │ │ └── telegraf.conf │ ├── inputs_gnmi/ │ │ ├── migration.go │ │ ├── migration_test.go │ │ └── testcases/ │ │ ├── deprecated_enable_tls/ │ │ │ ├── expected.conf │ │ │ └── telegraf.conf │ │ ├── deprecated_guess_path/ │ │ │ ├── expected.conf │ │ │ └── telegraf.conf │ │ └── deprecated_guess_path_false/ │ │ ├── expected.conf │ │ └── telegraf.conf │ ├── inputs_http/ │ │ ├── migration.go │ │ ├── migration_test.go │ │ └── testcases/ │ │ ├── deprecated_bearer_token/ │ │ │ ├── expected.conf │ │ │ └── telegraf.conf │ │ └── deprecated_bearer_token_existing/ │ │ ├── expected.conf │ │ └── telegraf.conf │ ├── inputs_http_listener/ │ │ ├── migration.go │ │ ├── migration_test.go │ │ └── testcases/ │ │ └── deprecated_alias/ │ │ ├── expected.conf │ │ └── telegraf.conf │ ├── inputs_http_listener_v2/ │ │ ├── migration.go │ │ ├── migration_test.go │ │ └── testcases/ │ │ ├── deprecated_path/ │ │ │ ├── expected.conf │ │ │ └── telegraf.conf │ │ ├── deprecated_path_duplicate/ │ │ │ ├── expected.conf │ │ │ └── telegraf.conf │ │ ├── deprecated_path_existing/ │ │ │ ├── expected.conf │ │ │ └── telegraf.conf │ │ ├── deprecated_port/ │ │ │ ├── expected.conf │ │ │ └── telegraf.conf │ │ └── deprecated_port_existing/ │ │ ├── expected.conf │ │ └── telegraf.conf │ ├── inputs_http_response/ │ │ ├── migration.go │ │ ├── migration_test.go │ │ └── testcases/ │ │ ├── deprecated_address/ │ │ │ ├── expected.conf │ │ │ └── telegraf.conf │ │ ├── deprecated_address_duplicate/ │ │ │ ├── expected.conf │ │ │ └── telegraf.conf │ │ └── deprecated_address_existing/ │ │ ├── expected.conf │ │ └── telegraf.conf │ ├── inputs_httpjson/ │ │ ├── migration.go │ │ ├── migration_test.go │ │ └── testcases/ │ │ ├── array/ │ │ │ ├── expected.conf │ │ │ ├── input.json │ │ │ ├── output.influx │ │ │ └── telegraf.conf │ │ ├── filters/ │ │ │ ├── expected.conf │ │ │ └── telegraf.conf │ │ ├── headers/ │ │ │ ├── expected.conf │ │ │ └── telegraf.conf │ │ ├── params/ │ │ │ ├── expected.conf │ │ │ └── telegraf.conf │ │ └── single/ │ │ ├── expected.conf │ │ ├── input.json │ │ ├── output.influx │ │ └── telegraf.conf │ ├── inputs_icinga2/ │ │ ├── migration.go │ │ ├── migration_test.go │ │ └── testcases/ │ │ ├── deprecated_object_type/ │ │ │ ├── expected.conf │ │ │ └── telegraf.conf │ │ ├── deprecated_object_type_duplicate/ │ │ │ ├── expected.conf │ │ │ └── telegraf.conf │ │ └── deprecated_object_type_existing/ │ │ ├── expected.conf │ │ └── telegraf.conf │ ├── inputs_influxdb_listener/ │ │ ├── migration.go │ │ ├── migration_test.go │ │ └── testcases/ │ │ └── deprecated_max_line_size/ │ │ ├── expected.conf │ │ └── telegraf.conf │ ├── inputs_internet_speed/ │ │ ├── migration.go │ │ ├── migration_test.go │ │ └── testcases/ │ │ ├── deprecated_enable_file_download/ │ │ │ ├── expected.conf │ │ │ └── telegraf.conf │ │ ├── deprecated_enable_file_download_existing/ │ │ │ ├── expected.conf │ │ │ └── telegraf.conf │ │ └── deprecated_enable_file_download_false/ │ │ ├── expected.conf │ │ └── telegraf.conf │ ├── inputs_io/ │ │ ├── migration.go │ │ ├── migration_test.go │ │ └── testcases/ │ │ ├── empty/ │ │ │ ├── expected.conf │ │ │ └── telegraf.conf │ │ └── full/ │ │ ├── expected.conf │ │ └── telegraf.conf │ ├── inputs_jolokia/ │ │ ├── README.md │ │ ├── migration.go │ │ ├── migration_test.go │ │ └── testcases/ │ │ ├── agent_default/ │ │ │ ├── expected.conf │ │ │ └── telegraf.conf │ │ ├── agent_more_complex/ │ │ │ ├── expected.conf │ │ │ └── telegraf.conf │ │ ├── agent_response_timeout/ │ │ │ ├── expected.conf │ │ │ └── telegraf.conf │ │ └── proxy_default/ │ │ ├── expected.conf │ │ └── telegraf.conf │ ├── inputs_kafka_consumer_legacy/ │ │ ├── README.md │ │ ├── migration.go │ │ └── migration_test.go │ ├── inputs_kube_inventory/ │ │ ├── migration.go │ │ ├── migration_test.go │ │ └── testcases/ │ │ ├── bearer_token_string_only/ │ │ │ ├── expected.conf │ │ │ └── telegraf.conf │ │ └── mixed_tokens/ │ │ ├── expected.conf │ │ └── telegraf.conf │ ├── inputs_kubernetes/ │ │ ├── migration.go │ │ ├── migration_test.go │ │ └── testcases/ │ │ ├── bearer_token_string_only/ │ │ │ ├── expected.conf │ │ │ └── telegraf.conf │ │ ├── default_case/ │ │ │ ├── expected.conf │ │ │ └── telegraf.conf │ │ └── mixed_tokens/ │ │ ├── expected.conf │ │ └── telegraf.conf │ ├── inputs_logparser/ │ │ ├── migration.go │ │ ├── migration_test.go │ │ └── testcases/ │ │ └── full/ │ │ ├── expected.conf │ │ └── telegraf.conf │ ├── inputs_mqtt_consumer/ │ │ ├── migration.go │ │ ├── migration_test.go │ │ └── testcases/ │ │ ├── deprecated_metric_buffer/ │ │ │ ├── expected.conf │ │ │ └── telegraf.conf │ │ └── deprecated_metric_buffer_parser/ │ │ ├── expected.conf │ │ └── telegraf.conf │ ├── inputs_nats_consumer/ │ │ ├── migration.go │ │ ├── migration_test.go │ │ └── testcases/ │ │ ├── deprecated_metric_buffer/ │ │ │ ├── expected.conf │ │ │ └── telegraf.conf │ │ └── deprecated_metric_buffer_parser/ │ │ ├── expected.conf │ │ └── telegraf.conf │ ├── inputs_nsq_consumer/ │ │ ├── migration.go │ │ ├── migration_test.go │ │ └── testcases/ │ │ ├── deprecated_server/ │ │ │ ├── expected.conf │ │ │ └── telegraf.conf │ │ ├── deprecated_server_duplicate/ │ │ │ ├── expected.conf │ │ │ └── telegraf.conf │ │ └── deprecated_server_existing/ │ │ ├── expected.conf │ │ └── telegraf.conf │ ├── inputs_ntpq/ │ │ ├── migration.go │ │ ├── migration_test.go │ │ └── testcases/ │ │ ├── deprecated_dns_lookup/ │ │ │ ├── expected.conf │ │ │ └── telegraf.conf │ │ ├── deprecated_dns_lookup_duplicate/ │ │ │ ├── expected.conf │ │ │ └── telegraf.conf │ │ ├── deprecated_dns_lookup_existing/ │ │ │ ├── expected.conf │ │ │ └── telegraf.conf │ │ └── deprecated_dns_lookup_true/ │ │ ├── expected.conf │ │ └── telegraf.conf │ ├── inputs_openldap/ │ │ ├── migration.go │ │ ├── migration_test.go │ │ └── testcases/ │ │ ├── ca_only/ │ │ │ ├── expected.conf │ │ │ └── telegraf.conf │ │ ├── mixed_config/ │ │ │ ├── expected.conf │ │ │ └── telegraf.conf │ │ └── ssl_only/ │ │ ├── expected.conf │ │ └── telegraf.conf │ ├── inputs_procstat/ │ │ ├── migration.go │ │ ├── migration_test.go │ │ └── testcases/ │ │ ├── deprecated_supervisor_unit/ │ │ │ ├── expected.conf │ │ │ └── telegraf.conf │ │ ├── deprecated_supervisor_unit merge/ │ │ │ ├── expected.conf │ │ │ └── telegraf.conf │ │ ├── deprecated_tagging_false/ │ │ │ ├── expected.conf │ │ │ └── telegraf.conf │ │ ├── deprecated_tagging_true/ │ │ │ ├── expected.conf │ │ │ └── telegraf.conf │ │ ├── deprecated_tagging_true_merge/ │ │ │ ├── expected.conf │ │ │ └── telegraf.conf │ │ └── deprecated_tagging_true_merge_overlap/ │ │ ├── expected.conf │ │ └── telegraf.conf │ ├── inputs_rabbitmq/ │ │ ├── migration.go │ │ ├── migration_test.go │ │ └── testcases/ │ │ ├── name/ │ │ │ ├── expected.conf │ │ │ └── telegraf.conf │ │ ├── name_duplicate/ │ │ │ ├── expected.conf │ │ │ └── telegraf.conf │ │ ├── queues/ │ │ │ ├── expected.conf │ │ │ └── telegraf.conf │ │ ├── queues_duplicate/ │ │ │ ├── expected.conf │ │ │ └── telegraf.conf │ │ └── queues_existing/ │ │ ├── expected.conf │ │ └── telegraf.conf │ ├── inputs_sflow/ │ │ ├── migration.go │ │ ├── migration_test.go │ │ └── testcases/ │ │ ├── filters/ │ │ │ ├── expected.conf │ │ │ └── telegraf.conf │ │ ├── minimal/ │ │ │ ├── expected.conf │ │ │ └── telegraf.conf │ │ └── read_buffer_size/ │ │ ├── expected.conf │ │ └── telegraf.conf │ ├── inputs_smart/ │ │ ├── migration.go │ │ ├── migration_test.go │ │ └── testcases/ │ │ └── standard/ │ │ ├── expected.conf │ │ └── telegraf.conf │ ├── inputs_snmp_legacy/ │ │ ├── migration.go │ │ └── migration_test.go │ ├── inputs_sqlserver/ │ │ ├── migration.go │ │ ├── migration_test.go │ │ └── testcases/ │ │ ├── azuredb_false/ │ │ │ ├── expected.conf │ │ │ └── telegraf.conf │ │ ├── azuredb_true/ │ │ │ ├── expected.conf │ │ │ └── telegraf.conf │ │ ├── both_deprecated/ │ │ │ ├── expected.conf │ │ │ └── telegraf.conf │ │ ├── existing_database_type/ │ │ │ ├── expected.conf │ │ │ └── telegraf.conf │ │ ├── query_version_1/ │ │ │ ├── expected.conf │ │ │ └── telegraf.conf │ │ └── query_version_2/ │ │ ├── expected.conf │ │ └── telegraf.conf │ ├── inputs_statsd/ │ │ ├── migration.go │ │ ├── migration_test.go │ │ └── testcases/ │ │ ├── deprecated_parse_data_dog_tags/ │ │ │ ├── expected.conf │ │ │ └── telegraf.conf │ │ ├── deprecated_parse_data_dog_tags_false/ │ │ │ ├── expected.conf │ │ │ └── telegraf.conf │ │ └── deprecated_udp_packet_size/ │ │ ├── expected.conf │ │ └── telegraf.conf │ ├── inputs_tcp_listener/ │ │ ├── README.md │ │ ├── migration.go │ │ ├── migration_test.go │ │ └── testcases/ │ │ ├── allow_pending_messages/ │ │ │ ├── expected.conf │ │ │ └── telegraf.conf │ │ ├── parser/ │ │ │ ├── expected.conf │ │ │ └── telegraf.conf │ │ └── simple/ │ │ ├── expected.conf │ │ └── telegraf.conf │ ├── inputs_udp_listener/ │ │ ├── README.md │ │ ├── migration.go │ │ ├── migration_test.go │ │ └── testcases/ │ │ ├── all_deprecated_messages/ │ │ │ ├── expected.conf │ │ │ └── telegraf.conf │ │ ├── allow_pending_messages/ │ │ │ ├── expected.conf │ │ │ └── telegraf.conf │ │ ├── parser/ │ │ │ ├── expected.conf │ │ │ └── telegraf.conf │ │ └── simple/ │ │ ├── expected.conf │ │ └── telegraf.conf │ ├── inputs_vsphere/ │ │ ├── migration.go │ │ ├── migration_test.go │ │ └── testcases/ │ │ └── deprecated_force_discover_on_init/ │ │ ├── expected.conf │ │ └── telegraf.conf │ ├── outputs_amqp/ │ │ ├── migration.go │ │ ├── migration_test.go │ │ └── testcases/ │ │ └── minimal/ │ │ ├── expected.conf │ │ └── telegraf.conf │ ├── outputs_influxdb/ │ │ ├── migration.go │ │ ├── migration_test.go │ │ └── testcases/ │ │ ├── convert_url/ │ │ │ ├── expected.conf │ │ │ └── telegraf.conf │ │ ├── deprecated_precision/ │ │ │ ├── expected.conf │ │ │ └── telegraf.conf │ │ ├── merge_url/ │ │ │ ├── expected.conf │ │ │ └── telegraf.conf │ │ ├── merge_url_overlap/ │ │ │ ├── expected.conf │ │ │ └── telegraf.conf │ │ └── url_and_precision/ │ │ ├── expected.conf │ │ └── telegraf.conf │ ├── outputs_kinesis/ │ │ ├── migration.go │ │ ├── migration_test.go │ │ └── testcases/ │ │ ├── only_randomkey_set/ │ │ │ ├── expected.conf │ │ │ └── telegraf.conf │ │ ├── randomkey_not_set/ │ │ │ ├── expected.conf │ │ │ └── telegraf.conf │ │ └── randomkey_set/ │ │ ├── expected.conf │ │ └── telegraf.conf │ ├── outputs_librato/ │ │ ├── migration.go │ │ ├── migration_test.go │ │ └── testcases/ │ │ └── simple/ │ │ ├── expected.conf │ │ └── telegraf.conf │ ├── outputs_mqtt/ │ │ ├── migration.go │ │ ├── migration_test.go │ │ └── testcases/ │ │ ├── deprecated_topic_prefix/ │ │ │ ├── expected.conf │ │ │ └── telegraf.conf │ │ ├── deprecated_topic_prefix_duplicate/ │ │ │ ├── expected.conf │ │ │ └── telegraf.conf │ │ ├── deprecated_topic_prefix_duplicate_slash/ │ │ │ ├── expected.conf │ │ │ └── telegraf.conf │ │ └── deprecated_topic_prefix_existing/ │ │ ├── expected.conf │ │ └── telegraf.conf │ ├── outputs_remotefile/ │ │ ├── migration.go │ │ ├── migration_test.go │ │ └── testcases/ │ │ └── simple/ │ │ ├── expected.conf │ │ └── telegraf.conf │ ├── outputs_riemann_legacy/ │ │ ├── README.md │ │ ├── migration.go │ │ ├── migration_test.go │ │ └── testcases/ │ │ ├── general_options/ │ │ │ ├── expected.conf │ │ │ └── telegraf.conf │ │ └── simple/ │ │ ├── expected.conf │ │ └── telegraf.conf │ ├── outputs_wavefront/ │ │ ├── migration.go │ │ ├── migration_test.go │ │ └── testcases/ │ │ └── host_port/ │ │ ├── expected.conf │ │ └── telegraf.conf │ ├── registry.go │ └── utils.go ├── models/ │ ├── buffer.go │ ├── buffer_disk.go │ ├── buffer_disk_test.go │ ├── buffer_mem.go │ ├── buffer_mem_test.go │ ├── buffer_suite_test.go │ ├── common.go │ ├── filter.go │ ├── filter_test.go │ ├── makemetric.go │ ├── running_aggregator.go │ ├── running_aggregator_test.go │ ├── running_input.go │ ├── running_input_test.go │ ├── running_output.go │ ├── running_output_test.go │ ├── running_parsers.go │ ├── running_processor.go │ ├── running_processor_test.go │ └── running_serializer.go ├── output.go ├── parser.go ├── persister/ │ └── persister.go ├── plugin.go ├── plugins/ │ ├── aggregators/ │ │ ├── all/ │ │ │ ├── all.go │ │ │ ├── basicstats.go │ │ │ ├── derivative.go │ │ │ ├── final.go │ │ │ ├── histogram.go │ │ │ ├── merge.go │ │ │ ├── minmax.go │ │ │ ├── quantile.go │ │ │ ├── starlark.go │ │ │ └── valuecounter.go │ │ ├── basicstats/ │ │ │ ├── README.md │ │ │ ├── basicstats.go │ │ │ ├── basicstats_test.go │ │ │ └── sample.conf │ │ ├── deprecations.go │ │ ├── derivative/ │ │ │ ├── README.md │ │ │ ├── derivative.go │ │ │ ├── derivative_test.go │ │ │ └── sample.conf │ │ ├── final/ │ │ │ ├── README.md │ │ │ ├── final.go │ │ │ ├── final_test.go │ │ │ └── sample.conf │ │ ├── histogram/ │ │ │ ├── README.md │ │ │ ├── histogram.go │ │ │ ├── histogram_test.go │ │ │ └── sample.conf │ │ ├── merge/ │ │ │ ├── README.md │ │ │ ├── merge.go │ │ │ ├── merge_test.go │ │ │ └── sample.conf │ │ ├── minmax/ │ │ │ ├── README.md │ │ │ ├── minmax.go │ │ │ ├── minmax_test.go │ │ │ └── sample.conf │ │ ├── quantile/ │ │ │ ├── README.md │ │ │ ├── algorithms.go │ │ │ ├── quantile.go │ │ │ ├── quantile_test.go │ │ │ └── sample.conf │ │ ├── registry.go │ │ ├── starlark/ │ │ │ ├── README.md │ │ │ ├── sample.conf │ │ │ ├── starlark.go │ │ │ ├── starlark_test.go │ │ │ └── testdata/ │ │ │ ├── merge.star │ │ │ └── min_max.star │ │ └── valuecounter/ │ │ ├── README.md │ │ ├── sample.conf │ │ ├── valuecounter.go │ │ └── valuecounter_test.go │ ├── all_test.go │ ├── common/ │ │ ├── adx/ │ │ │ ├── adx.go │ │ │ └── adx_test.go │ │ ├── auth/ │ │ │ ├── basic_auth.go │ │ │ └── basic_auth_test.go │ │ ├── aws/ │ │ │ └── credentials.go │ │ ├── cookie/ │ │ │ ├── cookie.go │ │ │ └── cookie_test.go │ │ ├── docker/ │ │ │ └── stats_helpers.go │ │ ├── encoding/ │ │ │ ├── decoder.go │ │ │ ├── decoder_reader.go │ │ │ └── decoder_test.go │ │ ├── gcp/ │ │ │ └── auth.go │ │ ├── http/ │ │ │ ├── client.conf │ │ │ ├── client.conf.in │ │ │ ├── config.go │ │ │ ├── transport.conf │ │ │ └── transport.conf.in │ │ ├── jolokia2/ │ │ │ ├── client.go │ │ │ ├── client_test.go │ │ │ ├── gatherer.go │ │ │ ├── gatherer_test.go │ │ │ ├── metric.go │ │ │ └── point_builder.go │ │ ├── kafka/ │ │ │ ├── config.go │ │ │ ├── config_test.go │ │ │ ├── logger.go │ │ │ ├── sasl.go │ │ │ ├── sasl_aws_iam_msk.go │ │ │ ├── sasl_oauth_file.go │ │ │ └── scram_client.go │ │ ├── logrus/ │ │ │ └── hook.go │ │ ├── mqtt/ │ │ │ ├── mqtt.go │ │ │ ├── mqtt_logger.go │ │ │ ├── mqtt_test.go │ │ │ ├── mqtt_v3.go │ │ │ └── mqtt_v5.go │ │ ├── oauth/ │ │ │ └── config.go │ │ ├── opcua/ │ │ │ ├── client.go │ │ │ ├── client_test.go │ │ │ ├── errors.go │ │ │ ├── errors_test.go │ │ │ ├── input/ │ │ │ │ ├── input_client.go │ │ │ │ └── input_client_test.go │ │ │ ├── logger.go │ │ │ ├── opcua_util.go │ │ │ └── opcua_util_test.go │ │ ├── parallel/ │ │ │ ├── ordered.go │ │ │ ├── parallel.go │ │ │ ├── parallel_test.go │ │ │ └── unordered.go │ │ ├── postgresql/ │ │ │ ├── config.go │ │ │ ├── config_test.go │ │ │ └── service.go │ │ ├── proxy/ │ │ │ ├── connect.go │ │ │ ├── dialer.go │ │ │ ├── proxy.conf │ │ │ ├── proxy.go │ │ │ ├── socks5.go │ │ │ └── socks5_test.go │ │ ├── psutil/ │ │ │ ├── mock_ps.go │ │ │ └── ps.go │ │ ├── ratelimiter/ │ │ │ ├── config.go │ │ │ ├── limiters.go │ │ │ ├── limiters_test.go │ │ │ ├── serializers.go │ │ │ └── serializers_test.go │ │ ├── shim/ │ │ │ ├── README.md │ │ │ ├── config.go │ │ │ ├── config_test.go │ │ │ ├── example/ │ │ │ │ └── cmd/ │ │ │ │ ├── main.go │ │ │ │ └── plugin.conf │ │ │ ├── goshim.go │ │ │ ├── goshim_test.go │ │ │ ├── input.go │ │ │ ├── input_test.go │ │ │ ├── output.go │ │ │ ├── output_test.go │ │ │ ├── processor.go │ │ │ ├── processor_test.go │ │ │ └── testdata/ │ │ │ ├── plugin.conf │ │ │ ├── processor.conf │ │ │ └── special.conf │ │ ├── slog/ │ │ │ └── adapter.go │ │ ├── snmp/ │ │ │ ├── config.go │ │ │ ├── field.go │ │ │ ├── field_test.go │ │ │ ├── logger.go │ │ │ ├── mib_loader.go │ │ │ ├── mib_loader_test.go │ │ │ ├── table.go │ │ │ ├── table_test.go │ │ │ ├── testdata/ │ │ │ │ ├── gosmi/ │ │ │ │ │ ├── bridgeMib │ │ │ │ │ ├── bridgeMibImports │ │ │ │ │ ├── foo │ │ │ │ │ ├── fooImports │ │ │ │ │ ├── ifPhysAddress │ │ │ │ │ ├── ifPhysAddressImports │ │ │ │ │ ├── server │ │ │ │ │ ├── serverImports │ │ │ │ │ ├── tableBuild │ │ │ │ │ ├── tableMib │ │ │ │ │ ├── tableMibImports │ │ │ │ │ ├── tcpMib │ │ │ │ │ └── tcpMibImports │ │ │ │ ├── loadMibsFromPath/ │ │ │ │ │ ├── linkTarget/ │ │ │ │ │ │ └── emptyFile │ │ │ │ │ └── root/ │ │ │ │ │ └── dirOne/ │ │ │ │ │ └── dirTwo/ │ │ │ │ │ └── empty │ │ │ │ └── mibs/ │ │ │ │ └── testmib │ │ │ ├── translator.go │ │ │ ├── translator_gosmi.go │ │ │ ├── translator_gosmi_test.go │ │ │ ├── translator_netsnmp.go │ │ │ ├── translator_netsnmp_mocks_generate.go │ │ │ ├── translator_netsnmp_mocks_test.go │ │ │ ├── translator_netsnmp_test.go │ │ │ ├── wrapper.go │ │ │ └── wrapper_test.go │ │ ├── socket/ │ │ │ ├── datagram.go │ │ │ ├── socket.conf │ │ │ ├── socket.go │ │ │ ├── socket_test.go │ │ │ ├── splitter.conf │ │ │ ├── splitters.go │ │ │ └── stream.go │ │ ├── starlark/ │ │ │ ├── builtins.go │ │ │ ├── field_dict.go │ │ │ ├── logging.go │ │ │ ├── metric.go │ │ │ ├── starlark.go │ │ │ └── tag_dict.go │ │ ├── tls/ │ │ │ ├── client.conf │ │ │ ├── common.go │ │ │ ├── config.go │ │ │ ├── config_test.go │ │ │ └── utils.go │ │ └── yangmodel/ │ │ └── decoder.go │ ├── inputs/ │ │ ├── activemq/ │ │ │ ├── README.md │ │ │ ├── activemq.go │ │ │ ├── activemq_test.go │ │ │ └── sample.conf │ │ ├── aerospike/ │ │ │ ├── README.md │ │ │ ├── aerospike.go │ │ │ ├── aerospike_test.go │ │ │ ├── sample.conf │ │ │ └── sample.conf.in │ │ ├── aliyuncms/ │ │ │ ├── README.md │ │ │ ├── aliyuncms.go │ │ │ ├── aliyuncms_test.go │ │ │ ├── discovery.go │ │ │ └── sample.conf │ │ ├── all/ │ │ │ ├── activemq.go │ │ │ ├── aerospike.go │ │ │ ├── aliyuncms.go │ │ │ ├── all.go │ │ │ ├── amd_rocm_smi.go │ │ │ ├── amqp_consumer.go │ │ │ ├── apache.go │ │ │ ├── apcupsd.go │ │ │ ├── aurora.go │ │ │ ├── azure_monitor.go │ │ │ ├── azure_storage_queue.go │ │ │ ├── bcache.go │ │ │ ├── beanstalkd.go │ │ │ ├── beat.go │ │ │ ├── bind.go │ │ │ ├── bond.go │ │ │ ├── burrow.go │ │ │ ├── ceph.go │ │ │ ├── cgroup.go │ │ │ ├── chrony.go │ │ │ ├── cisco_telemetry_mdt.go │ │ │ ├── clickhouse.go │ │ │ ├── cloud_pubsub.go │ │ │ ├── cloud_pubsub_push.go │ │ │ ├── cloudwatch.go │ │ │ ├── cloudwatch_metric_streams.go │ │ │ ├── conntrack.go │ │ │ ├── consul.go │ │ │ ├── consul_agent.go │ │ │ ├── couchbase.go │ │ │ ├── couchdb.go │ │ │ ├── cpu.go │ │ │ ├── csgo.go │ │ │ ├── ctrlx_datalayer.go │ │ │ ├── dcos.go │ │ │ ├── directory_monitor.go │ │ │ ├── disk.go │ │ │ ├── diskio.go │ │ │ ├── disque.go │ │ │ ├── dmcache.go │ │ │ ├── dns_query.go │ │ │ ├── docker.go │ │ │ ├── docker_log.go │ │ │ ├── dovecot.go │ │ │ ├── dpdk.go │ │ │ ├── ecs.go │ │ │ ├── elasticsearch.go │ │ │ ├── elasticsearch_query.go │ │ │ ├── ethtool.go │ │ │ ├── eventhub_consumer.go │ │ │ ├── exec.go │ │ │ ├── execd.go │ │ │ ├── fail2ban.go │ │ │ ├── fibaro.go │ │ │ ├── file.go │ │ │ ├── filecount.go │ │ │ ├── filestat.go │ │ │ ├── fireboard.go │ │ │ ├── firehose.go │ │ │ ├── fluentd.go │ │ │ ├── fritzbox.go │ │ │ ├── github.go │ │ │ ├── gnmi.go │ │ │ ├── google_cloud_storage.go │ │ │ ├── graylog.go │ │ │ ├── haproxy.go │ │ │ ├── hddtemp.go │ │ │ ├── http.go │ │ │ ├── http_listener_v2.go │ │ │ ├── http_response.go │ │ │ ├── huebridge.go │ │ │ ├── hugepages.go │ │ │ ├── icinga2.go │ │ │ ├── infiniband.go │ │ │ ├── influxdb.go │ │ │ ├── influxdb_listener.go │ │ │ ├── influxdb_v2_listener.go │ │ │ ├── intel_baseband.go │ │ │ ├── intel_dlb.go │ │ │ ├── intel_pmt.go │ │ │ ├── intel_pmu.go │ │ │ ├── intel_powerstat.go │ │ │ ├── intel_rdt.go │ │ │ ├── internal.go │ │ │ ├── internet_speed.go │ │ │ ├── interrupts.go │ │ │ ├── ipmi_sensor.go │ │ │ ├── ipset.go │ │ │ ├── iptables.go │ │ │ ├── ipvs.go │ │ │ ├── jenkins.go │ │ │ ├── jolokia2_agent.go │ │ │ ├── jolokia2_proxy.go │ │ │ ├── jti_openconfig_telemetry.go │ │ │ ├── kafka_consumer.go │ │ │ ├── kapacitor.go │ │ │ ├── kernel.go │ │ │ ├── kernel_vmstat.go │ │ │ ├── kibana.go │ │ │ ├── kinesis_consumer.go │ │ │ ├── knx_listener.go │ │ │ ├── kube_inventory.go │ │ │ ├── kubernetes.go │ │ │ ├── lanz.go │ │ │ ├── ldap.go │ │ │ ├── leofs.go │ │ │ ├── libvirt.go │ │ │ ├── linux_cpu.go │ │ │ ├── linux_sysctl_fs.go │ │ │ ├── logql.go │ │ │ ├── logstash.go │ │ │ ├── lustre2.go │ │ │ ├── lvm.go │ │ │ ├── mailchimp.go │ │ │ ├── marklogic.go │ │ │ ├── mavlink.go │ │ │ ├── mcrouter.go │ │ │ ├── mdstat.go │ │ │ ├── mem.go │ │ │ ├── memcached.go │ │ │ ├── mesos.go │ │ │ ├── minecraft.go │ │ │ ├── mock.go │ │ │ ├── modbus.go │ │ │ ├── mongodb.go │ │ │ ├── monit.go │ │ │ ├── mqtt_consumer.go │ │ │ ├── multifile.go │ │ │ ├── mysql.go │ │ │ ├── nats.go │ │ │ ├── nats_consumer.go │ │ │ ├── neoom_beaam.go │ │ │ ├── neptune_apex.go │ │ │ ├── net.go │ │ │ ├── net_response.go │ │ │ ├── netflow.go │ │ │ ├── netstat.go │ │ │ ├── nfsclient.go │ │ │ ├── nftables.go │ │ │ ├── nginx.go │ │ │ ├── nginx_plus.go │ │ │ ├── nginx_plus_api.go │ │ │ ├── nginx_sts.go │ │ │ ├── nginx_upstream_check.go │ │ │ ├── nginx_vts.go │ │ │ ├── nomad.go │ │ │ ├── nsd.go │ │ │ ├── nsdp.go │ │ │ ├── nsq.go │ │ │ ├── nsq_consumer.go │ │ │ ├── nstat.go │ │ │ ├── ntpq.go │ │ │ ├── nvidia_smi.go │ │ │ ├── opcua.go │ │ │ ├── opcua_listener.go │ │ │ ├── openldap.go │ │ │ ├── openntpd.go │ │ │ ├── opensearch_query.go │ │ │ ├── opensmtpd.go │ │ │ ├── openstack.go │ │ │ ├── opentelemetry.go │ │ │ ├── openweathermap.go │ │ │ ├── p4runtime.go │ │ │ ├── passenger.go │ │ │ ├── pf.go │ │ │ ├── pgbouncer.go │ │ │ ├── phpfpm.go │ │ │ ├── ping.go │ │ │ ├── postfix.go │ │ │ ├── postgresql.go │ │ │ ├── postgresql_extensible.go │ │ │ ├── powerdns.go │ │ │ ├── powerdns_recursor.go │ │ │ ├── processes.go │ │ │ ├── procstat.go │ │ │ ├── prometheus.go │ │ │ ├── promql.go │ │ │ ├── proxmox.go │ │ │ ├── puppetagent.go │ │ │ ├── rabbitmq.go │ │ │ ├── radius.go │ │ │ ├── raindrops.go │ │ │ ├── ras.go │ │ │ ├── ravendb.go │ │ │ ├── redfish.go │ │ │ ├── redis.go │ │ │ ├── redis_sentinel.go │ │ │ ├── rethinkdb.go │ │ │ ├── riak.go │ │ │ ├── riemann_listener.go │ │ │ ├── s7comm.go │ │ │ ├── salesforce.go │ │ │ ├── sensors.go │ │ │ ├── sflow.go │ │ │ ├── sip.go │ │ │ ├── slab.go │ │ │ ├── slurm.go │ │ │ ├── smart.go │ │ │ ├── smartctl.go │ │ │ ├── snmp.go │ │ │ ├── snmp_trap.go │ │ │ ├── socket_listener.go │ │ │ ├── socketstat.go │ │ │ ├── solr.go │ │ │ ├── sql.go │ │ │ ├── sqlserver.go │ │ │ ├── stackdriver.go │ │ │ ├── statsd.go │ │ │ ├── supervisor.go │ │ │ ├── suricata.go │ │ │ ├── swap.go │ │ │ ├── synproxy.go │ │ │ ├── syslog.go │ │ │ ├── sysstat.go │ │ │ ├── system.go │ │ │ ├── systemd_units.go │ │ │ ├── tacacs.go │ │ │ ├── tail.go │ │ │ ├── teamspeak.go │ │ │ ├── temp.go │ │ │ ├── tengine.go │ │ │ ├── timex.go │ │ │ ├── tomcat.go │ │ │ ├── trig.go │ │ │ ├── turbostat.go │ │ │ ├── twemproxy.go │ │ │ ├── unbound.go │ │ │ ├── upsd.go │ │ │ ├── uwsgi.go │ │ │ ├── varnish.go │ │ │ ├── vault.go │ │ │ ├── vsphere.go │ │ │ ├── webhooks.go │ │ │ ├── whois.go │ │ │ ├── win_eventlog.go │ │ │ ├── win_perf_counters.go │ │ │ ├── win_services.go │ │ │ ├── win_wmi.go │ │ │ ├── wireguard.go │ │ │ ├── wireless.go │ │ │ ├── x509_cert.go │ │ │ ├── xtremio.go │ │ │ ├── zfs.go │ │ │ ├── zipkin.go │ │ │ └── zookeeper.go │ │ ├── amd_rocm_smi/ │ │ │ ├── README.md │ │ │ ├── amd_rocm_smi.go │ │ │ ├── amd_rocm_smi_test.go │ │ │ ├── sample.conf │ │ │ └── testdata/ │ │ │ ├── mi100_rocm571.json │ │ │ ├── mi100_rocm602.json │ │ │ ├── rx6700xt_rocm430.json │ │ │ ├── rx6700xt_rocm571.json │ │ │ ├── rx6700xt_rocm602.json │ │ │ ├── rx6700xt_rocm612.json │ │ │ ├── vega-10-XT.json │ │ │ └── vega-20-WKS-GL-XE.json │ │ ├── amqp_consumer/ │ │ │ ├── README.md │ │ │ ├── amqp_consumer.go │ │ │ ├── amqp_consumer_test.go │ │ │ └── sample.conf │ │ ├── apache/ │ │ │ ├── README.md │ │ │ ├── apache.go │ │ │ ├── apache_test.go │ │ │ └── sample.conf │ │ ├── apcupsd/ │ │ │ ├── README.md │ │ │ ├── apcupsd.go │ │ │ ├── apcupsd_test.go │ │ │ └── sample.conf │ │ ├── aurora/ │ │ │ ├── README.md │ │ │ ├── aurora.go │ │ │ ├── aurora_test.go │ │ │ └── sample.conf │ │ ├── azure_monitor/ │ │ │ ├── README.md │ │ │ ├── azure_monitor.go │ │ │ ├── azure_monitor_test.go │ │ │ ├── sample.conf │ │ │ └── testdata/ │ │ │ ├── json/ │ │ │ │ ├── azure_metric_definitions_responses.json │ │ │ │ ├── azure_metrics_responses.json │ │ │ │ └── azure_resources_response.json │ │ │ └── toml/ │ │ │ ├── gather_success.toml │ │ │ ├── gather_success_cloud_option_china.toml │ │ │ ├── gather_success_cloud_option_government.toml │ │ │ ├── gather_success_cloud_option_public.toml │ │ │ ├── init_all_target_types.toml │ │ │ ├── init_bad_credentials.toml │ │ │ ├── init_no_client_id.toml │ │ │ ├── init_no_client_secret.toml │ │ │ ├── init_no_subscription_id.toml │ │ │ ├── init_no_targets.toml │ │ │ ├── init_no_tenant_id.toml │ │ │ ├── init_resource_group_target_no_resource_found.toml │ │ │ ├── init_resource_group_target_with_invalid_aggregation.toml │ │ │ ├── init_resource_group_target_with_invalid_metric.toml │ │ │ ├── init_resource_group_target_with_invalid_resource_group.toml │ │ │ ├── init_resource_group_target_with_invalid_resource_type.toml │ │ │ ├── init_resource_group_target_with_resource_without_resource_type.toml │ │ │ ├── init_resource_group_target_without_resource_group.toml │ │ │ ├── init_resource_group_target_without_resources.toml │ │ │ ├── init_resource_group_targets_only.toml │ │ │ ├── init_resource_target_with_invalid_aggregation.toml │ │ │ ├── init_resource_target_with_invalid_metric.toml │ │ │ ├── init_resource_target_with_invalid_resource_id.toml │ │ │ ├── init_resource_target_without_resource_id.toml │ │ │ ├── init_resource_targets_only.toml │ │ │ ├── init_subscription_target_no_resource_found.toml │ │ │ ├── init_subscription_target_with_invalid_aggregation.toml │ │ │ ├── init_subscription_target_with_invalid_metric.toml │ │ │ ├── init_subscription_target_with_invalid_resource_type.toml │ │ │ ├── init_subscription_target_without_resource_type.toml │ │ │ └── init_subscription_targets_only.toml │ │ ├── azure_storage_queue/ │ │ │ ├── README.md │ │ │ ├── azure_storage_queue.go │ │ │ ├── azure_storage_queue_test.go │ │ │ └── sample.conf │ │ ├── bcache/ │ │ │ ├── README.md │ │ │ ├── bcache.go │ │ │ ├── bcache_notlinux.go │ │ │ ├── bcache_test.go │ │ │ └── sample.conf │ │ ├── beanstalkd/ │ │ │ ├── README.md │ │ │ ├── beanstalkd.go │ │ │ ├── beanstalkd_test.go │ │ │ └── sample.conf │ │ ├── beat/ │ │ │ ├── README.md │ │ │ ├── beat.go │ │ │ ├── beat6_info.json │ │ │ ├── beat6_stats.json │ │ │ ├── beat_test.go │ │ │ └── sample.conf │ │ ├── bind/ │ │ │ ├── README.md │ │ │ ├── bind.go │ │ │ ├── bind_test.go │ │ │ ├── json_stats.go │ │ │ ├── sample.conf │ │ │ ├── testdata/ │ │ │ │ ├── json/ │ │ │ │ │ └── v1/ │ │ │ │ │ ├── mem │ │ │ │ │ ├── net │ │ │ │ │ └── server │ │ │ │ └── xml/ │ │ │ │ ├── v2 │ │ │ │ └── v3/ │ │ │ │ ├── mem │ │ │ │ ├── net │ │ │ │ └── server │ │ │ ├── xml_stats_v2.go │ │ │ └── xml_stats_v3.go │ │ ├── bond/ │ │ │ ├── README.md │ │ │ ├── bond.go │ │ │ ├── bond_test.go │ │ │ └── sample.conf │ │ ├── burrow/ │ │ │ ├── README.md │ │ │ ├── burrow.go │ │ │ ├── burrow_test.go │ │ │ ├── sample.conf │ │ │ └── testdata/ │ │ │ ├── error.json │ │ │ ├── v3_kafka.json │ │ │ ├── v3_kafka_clustername1_consumer.json │ │ │ ├── v3_kafka_clustername1_consumer_group1_lag.json │ │ │ ├── v3_kafka_clustername1_topic.json │ │ │ └── v3_kafka_clustername1_topic_topicA.json │ │ ├── ceph/ │ │ │ ├── README.md │ │ │ ├── ceph.go │ │ │ ├── ceph_test.go │ │ │ └── sample.conf │ │ ├── cgroup/ │ │ │ ├── README.md │ │ │ ├── cgroup.go │ │ │ ├── cgroup_linux.go │ │ │ ├── cgroup_notlinux.go │ │ │ ├── cgroup_test.go │ │ │ ├── cgroupv2_test.go │ │ │ ├── sample.conf │ │ │ └── testdata/ │ │ │ ├── backslash/ │ │ │ │ └── machine-qemu-1-ubuntu/ │ │ │ │ └── cpu.stat │ │ │ ├── blkio/ │ │ │ │ ├── blkio.io_serviced │ │ │ │ └── blkio.throttle.io_serviced │ │ │ ├── broken/ │ │ │ │ ├── malformed.file │ │ │ │ └── memory.limit_in_bytes │ │ │ ├── cpu/ │ │ │ │ ├── cpu.cfs_quota_us │ │ │ │ ├── cpu.stat │ │ │ │ └── cpuacct.usage_percpu │ │ │ ├── memory/ │ │ │ │ ├── group_1/ │ │ │ │ │ ├── group_1_1/ │ │ │ │ │ │ ├── memory.limit_in_bytes │ │ │ │ │ │ └── memory.stat │ │ │ │ │ ├── group_1_2/ │ │ │ │ │ │ ├── memory.limit_in_bytes │ │ │ │ │ │ └── memory.stat │ │ │ │ │ ├── memory.kmem.limit_in_bytes │ │ │ │ │ ├── memory.kmem.max_usage_in_bytes │ │ │ │ │ ├── memory.limit_in_bytes │ │ │ │ │ └── memory.stat │ │ │ │ ├── group_2/ │ │ │ │ │ ├── group_1_1/ │ │ │ │ │ │ ├── memory.limit_in_bytes │ │ │ │ │ │ └── memory.stat │ │ │ │ │ ├── memory.limit_in_bytes │ │ │ │ │ └── memory.stat │ │ │ │ ├── memory.empty │ │ │ │ ├── memory.kmem.limit_in_bytes │ │ │ │ ├── memory.limit_in_bytes │ │ │ │ ├── memory.max_usage_in_bytes │ │ │ │ ├── memory.numa_stat │ │ │ │ ├── memory.stat │ │ │ │ ├── memory.usage_in_bytes │ │ │ │ ├── memory.use_hierarchy │ │ │ │ └── notify_on_release │ │ │ └── v2/ │ │ │ ├── cpu.idle │ │ │ ├── cpu.max │ │ │ ├── cpu.max.burst │ │ │ ├── cpu.pressure │ │ │ ├── cpu.stat │ │ │ ├── cpu.weight │ │ │ ├── cpu.weight.nice │ │ │ ├── cpuset.cpus │ │ │ ├── cpuset.cpus.effective │ │ │ ├── cpuset.cpus.partition │ │ │ ├── cpuset.mems │ │ │ ├── cpuset.mems.effective │ │ │ ├── hugetlb.1GB.current │ │ │ ├── hugetlb.1GB.events │ │ │ ├── hugetlb.1GB.events.local │ │ │ ├── hugetlb.1GB.max │ │ │ ├── hugetlb.1GB.numa_stat │ │ │ ├── hugetlb.1GB.rsvd.current │ │ │ ├── hugetlb.1GB.rsvd.max │ │ │ ├── hugetlb.2MB.current │ │ │ ├── hugetlb.2MB.events │ │ │ ├── hugetlb.2MB.events.local │ │ │ ├── hugetlb.2MB.max │ │ │ ├── hugetlb.2MB.numa_stat │ │ │ ├── hugetlb.2MB.rsvd.current │ │ │ ├── hugetlb.2MB.rsvd.max │ │ │ ├── io.bfq.weight │ │ │ ├── io.max │ │ │ ├── io.pressure │ │ │ ├── io.stat │ │ │ ├── memory.current │ │ │ ├── memory.events │ │ │ ├── memory.events.local │ │ │ ├── memory.high │ │ │ ├── memory.low │ │ │ ├── memory.max │ │ │ ├── memory.min │ │ │ ├── memory.numa_stat │ │ │ ├── memory.oom.group │ │ │ ├── memory.peak │ │ │ ├── memory.pressure │ │ │ ├── memory.reclaim │ │ │ ├── memory.stat │ │ │ ├── memory.swap.current │ │ │ ├── memory.swap.events │ │ │ ├── memory.swap.high │ │ │ ├── memory.swap.max │ │ │ ├── pids.current │ │ │ ├── pids.events │ │ │ ├── pids.max │ │ │ └── pids.peak │ │ ├── chrony/ │ │ │ ├── README.md │ │ │ ├── chrony.go │ │ │ ├── chrony_test.go │ │ │ ├── sample.conf │ │ │ └── testdata/ │ │ │ ├── chrony.conf │ │ │ └── start.sh │ │ ├── cisco_telemetry_mdt/ │ │ │ ├── README.md │ │ │ ├── cisco_telemetry_mdt.go │ │ │ ├── cisco_telemetry_mdt_test.go │ │ │ ├── cisco_telemetry_util.go │ │ │ ├── sample.conf │ │ │ └── testdata/ │ │ │ └── microburst │ │ ├── clickhouse/ │ │ │ ├── README.md │ │ │ ├── clickhouse.go │ │ │ ├── clickhouse_test.go │ │ │ ├── dev/ │ │ │ │ ├── dhparam.pem │ │ │ │ ├── docker-compose.yml │ │ │ │ ├── init_schema.sql │ │ │ │ ├── mysql_port.xml │ │ │ │ ├── part_log.xml │ │ │ │ ├── telegraf.conf │ │ │ │ ├── telegraf_ssl.conf │ │ │ │ ├── test_dictionary.xml │ │ │ │ ├── text_log.xml │ │ │ │ ├── tls_settings.xml │ │ │ │ └── zookeeper.xml │ │ │ └── sample.conf │ │ ├── cloud_pubsub/ │ │ │ ├── README.md │ │ │ ├── cloud_pubsub.go │ │ │ ├── cloud_pubsub_test.go │ │ │ ├── sample.conf │ │ │ ├── subscription_gcp.go │ │ │ └── subscription_stub_test.go │ │ ├── cloud_pubsub_push/ │ │ │ ├── README.md │ │ │ ├── cloud_pubsub_push.go │ │ │ ├── cloud_pubsub_push_test.go │ │ │ └── sample.conf │ │ ├── cloudwatch/ │ │ │ ├── README.md │ │ │ ├── cloudwatch.go │ │ │ ├── cloudwatch_test.go │ │ │ ├── sample.conf │ │ │ └── utils.go │ │ ├── cloudwatch_metric_streams/ │ │ │ ├── README.md │ │ │ ├── cloudwatch_metric_streams.go │ │ │ ├── cloudwatch_metric_streams_test.go │ │ │ ├── sample.conf │ │ │ └── testdata/ │ │ │ ├── record.json │ │ │ └── records.json │ │ ├── conntrack/ │ │ │ ├── README.md │ │ │ ├── conntrack.go │ │ │ ├── conntrack_notlinux.go │ │ │ ├── conntrack_test.go │ │ │ └── sample.conf │ │ ├── consul/ │ │ │ ├── README.md │ │ │ ├── consul.go │ │ │ ├── consul_test.go │ │ │ └── sample.conf │ │ ├── consul_agent/ │ │ │ ├── README.md │ │ │ ├── consul_agent.go │ │ │ ├── consul_agent_test.go │ │ │ ├── consul_structs.go │ │ │ ├── sample.conf │ │ │ └── testdata/ │ │ │ └── response_key_metrics.json │ │ ├── couchbase/ │ │ │ ├── README.md │ │ │ ├── couchbase.go │ │ │ ├── couchbase_data.go │ │ │ ├── couchbase_test.go │ │ │ ├── sample.conf │ │ │ └── testdata/ │ │ │ ├── bucket_response.json │ │ │ ├── bucket_stats_response.json │ │ │ ├── bucket_stats_response_with_missing.json │ │ │ ├── node_bucket_stats_response.json │ │ │ ├── pools_default_response.json │ │ │ ├── pools_response.json │ │ │ └── settings_autofailover.json │ │ ├── couchdb/ │ │ │ ├── README.md │ │ │ ├── couchdb.go │ │ │ ├── couchdb_test.go │ │ │ ├── dev/ │ │ │ │ └── telegraf.conf │ │ │ └── sample.conf │ │ ├── cpu/ │ │ │ ├── README.md │ │ │ ├── cpu.go │ │ │ ├── cpu_test.go │ │ │ └── sample.conf │ │ ├── csgo/ │ │ │ ├── README.md │ │ │ ├── csgo.go │ │ │ ├── csgo_test.go │ │ │ └── sample.conf │ │ ├── ctrlx_datalayer/ │ │ │ ├── README.md │ │ │ ├── ctrlx_datalayer.go │ │ │ ├── ctrlx_datalayer_payload_types.go │ │ │ ├── ctrlx_datalayer_subscription.go │ │ │ ├── ctrlx_datalayer_subscription_test.go │ │ │ ├── ctrlx_datalayer_test.go │ │ │ └── sample.conf │ │ ├── dcos/ │ │ │ ├── README.md │ │ │ ├── client.go │ │ │ ├── client_test.go │ │ │ ├── creds.go │ │ │ ├── dcos.go │ │ │ ├── dcos_test.go │ │ │ └── sample.conf │ │ ├── deprecations.go │ │ ├── directory_monitor/ │ │ │ ├── README.md │ │ │ ├── directory_monitor.go │ │ │ ├── directory_monitor_test.go │ │ │ └── sample.conf │ │ ├── disk/ │ │ │ ├── README.md │ │ │ ├── disk.go │ │ │ ├── disk_test.go │ │ │ ├── sample.conf │ │ │ └── testdata/ │ │ │ ├── issue_10297/ │ │ │ │ ├── proc/ │ │ │ │ │ └── 1/ │ │ │ │ │ └── mountinfo │ │ │ │ └── sys/ │ │ │ │ └── block/ │ │ │ │ ├── sda1/ │ │ │ │ │ └── dm/ │ │ │ │ │ └── name │ │ │ │ └── sdb/ │ │ │ │ └── dm/ │ │ │ │ └── name │ │ │ └── success/ │ │ │ └── proc/ │ │ │ └── 1/ │ │ │ └── mountinfo │ │ ├── diskio/ │ │ │ ├── README.md │ │ │ ├── diskio.go │ │ │ ├── diskio_linux.go │ │ │ ├── diskio_linux_test.go │ │ │ ├── diskio_other.go │ │ │ ├── diskio_test.go │ │ │ ├── sample.conf │ │ │ └── testdata/ │ │ │ ├── udev.txt │ │ │ └── uevent │ │ ├── disque/ │ │ │ ├── README.md │ │ │ ├── disque.go │ │ │ ├── disque_test.go │ │ │ └── sample.conf │ │ ├── dmcache/ │ │ │ ├── README.md │ │ │ ├── dmcache.go │ │ │ ├── dmcache_linux.go │ │ │ ├── dmcache_linux_test.go │ │ │ ├── dmcache_notlinux.go │ │ │ └── sample.conf │ │ ├── dns_query/ │ │ │ ├── README.md │ │ │ ├── dns_query.go │ │ │ ├── dns_query_test.go │ │ │ └── sample.conf │ │ ├── docker/ │ │ │ ├── README.md │ │ │ ├── client.go │ │ │ ├── docker.go │ │ │ ├── docker_test.go │ │ │ ├── docker_testdata.go │ │ │ ├── errors.go │ │ │ └── sample.conf │ │ ├── docker_log/ │ │ │ ├── README.md │ │ │ ├── client.go │ │ │ ├── docker_log.go │ │ │ ├── docker_log_test.go │ │ │ └── sample.conf │ │ ├── dovecot/ │ │ │ ├── README.md │ │ │ ├── dovecot.go │ │ │ ├── dovecot_test.go │ │ │ ├── sample.conf │ │ │ └── testdata/ │ │ │ └── dovecot.conf │ │ ├── dpdk/ │ │ │ ├── README.md │ │ │ ├── dpdk.go │ │ │ ├── dpdk_cmds.go │ │ │ ├── dpdk_cmds_test.go │ │ │ ├── dpdk_connector.go │ │ │ ├── dpdk_connector_test.go │ │ │ ├── dpdk_notlinux.go │ │ │ ├── dpdk_test.go │ │ │ ├── dpdk_utils.go │ │ │ ├── dpdk_utils_test.go │ │ │ ├── mocks/ │ │ │ │ └── conn.go │ │ │ └── sample.conf │ │ ├── ecs/ │ │ │ ├── README.md │ │ │ ├── cgroupv2_test.go │ │ │ ├── client.go │ │ │ ├── client_test.go │ │ │ ├── ecs.go │ │ │ ├── ecs_test.go │ │ │ ├── sample.conf │ │ │ ├── stats.go │ │ │ ├── stats_test.go │ │ │ ├── testdata/ │ │ │ │ ├── cgroupv2/ │ │ │ │ │ ├── meta.json │ │ │ │ │ ├── meta.out │ │ │ │ │ ├── stats.json │ │ │ │ │ └── stats.out │ │ │ │ ├── metadata.golden │ │ │ │ └── stats.golden │ │ │ ├── types.go │ │ │ └── types_test.go │ │ ├── elasticsearch/ │ │ │ ├── README.md │ │ │ ├── elasticsearch.go │ │ │ ├── elasticsearch_test.go │ │ │ ├── sample.conf │ │ │ └── testdata_test.go │ │ ├── elasticsearch_query/ │ │ │ ├── README.md │ │ │ ├── aggregation_parser.go │ │ │ ├── aggregation_query.go │ │ │ ├── elasticsearch_query.go │ │ │ ├── elasticsearch_query_test.go │ │ │ ├── sample.conf │ │ │ └── testdata/ │ │ │ └── nginx_logs │ │ ├── ethtool/ │ │ │ ├── README.md │ │ │ ├── ethtool.go │ │ │ ├── ethtool_linux.go │ │ │ ├── ethtool_notlinux.go │ │ │ ├── ethtool_test.go │ │ │ ├── namespace_linux.go │ │ │ └── sample.conf │ │ ├── eventhub_consumer/ │ │ │ ├── README.md │ │ │ ├── eventhub_consumer.go │ │ │ └── sample.conf │ │ ├── example/ │ │ │ ├── README.md │ │ │ ├── example.go │ │ │ ├── example_test.go │ │ │ └── sample.conf │ │ ├── exec/ │ │ │ ├── README.md │ │ │ ├── dev/ │ │ │ │ └── telegraf.conf │ │ │ ├── exec.go │ │ │ ├── exec_test.go │ │ │ ├── run_notwindows.go │ │ │ ├── run_windows.go │ │ │ └── sample.conf │ │ ├── execd/ │ │ │ ├── README.md │ │ │ ├── examples/ │ │ │ │ ├── count.go │ │ │ │ ├── count.py │ │ │ │ ├── count.rb │ │ │ │ └── count.sh │ │ │ ├── execd.go │ │ │ ├── execd_posix.go │ │ │ ├── execd_test.go │ │ │ ├── execd_windows.go │ │ │ ├── sample.conf │ │ │ └── shim/ │ │ │ ├── README.md │ │ │ ├── example/ │ │ │ │ └── cmd/ │ │ │ │ ├── main.go │ │ │ │ └── plugin.conf │ │ │ ├── goshim.go │ │ │ ├── goshim_posix.go │ │ │ ├── goshim_windows.go │ │ │ ├── input.go │ │ │ ├── shim_posix_test.go │ │ │ ├── shim_test.go │ │ │ └── testdata/ │ │ │ └── plugin.conf │ │ ├── fail2ban/ │ │ │ ├── README.md │ │ │ ├── fail2ban.go │ │ │ ├── fail2ban_test.go │ │ │ └── sample.conf │ │ ├── fibaro/ │ │ │ ├── README.md │ │ │ ├── fibaro.go │ │ │ ├── fibaro_test.go │ │ │ ├── hc2/ │ │ │ │ ├── parser.go │ │ │ │ └── types.go │ │ │ ├── hc3/ │ │ │ │ ├── parser.go │ │ │ │ └── types.go │ │ │ ├── sample.conf │ │ │ └── testdata/ │ │ │ ├── device_hc2.json │ │ │ ├── device_hc3.json │ │ │ ├── rooms.json │ │ │ └── sections.json │ │ ├── file/ │ │ │ ├── README.md │ │ │ ├── dev/ │ │ │ │ ├── docker-compose.yml │ │ │ │ ├── telegraf.conf │ │ │ │ └── testfiles/ │ │ │ │ ├── grok_a.log │ │ │ │ └── json_a.log │ │ │ ├── file.go │ │ │ ├── file_test.go │ │ │ ├── sample.conf │ │ │ └── testdata/ │ │ │ ├── csv_behavior_input.csv │ │ │ ├── mtr-utf-16be.csv │ │ │ ├── mtr-utf-16le.csv │ │ │ └── mtr-utf-8.csv │ │ ├── filecount/ │ │ │ ├── README.md │ │ │ ├── filecount.go │ │ │ ├── filecount_test.go │ │ │ ├── filesystem_helpers.go │ │ │ ├── filesystem_helpers_notwindows_test.go │ │ │ ├── filesystem_helpers_test.go │ │ │ ├── sample.conf │ │ │ └── testdata/ │ │ │ ├── bar │ │ │ ├── baz │ │ │ ├── foo │ │ │ ├── qux │ │ │ └── subdir/ │ │ │ ├── nested2/ │ │ │ │ └── qux │ │ │ ├── quux │ │ │ └── quuz │ │ ├── filestat/ │ │ │ ├── README.md │ │ │ ├── filestat.go │ │ │ ├── filestat_test.go │ │ │ ├── sample.conf │ │ │ └── testdata/ │ │ │ ├── log1.log │ │ │ ├── log2.log │ │ │ └── test.conf │ │ ├── fireboard/ │ │ │ ├── README.md │ │ │ ├── fireboard.go │ │ │ ├── fireboard_test.go │ │ │ └── sample.conf │ │ ├── firehose/ │ │ │ ├── README.md │ │ │ ├── firehose.go │ │ │ ├── firehose_request_test.go │ │ │ ├── firehose_test.go │ │ │ ├── message.go │ │ │ ├── sample.conf │ │ │ └── testcases/ │ │ │ └── common-attributes/ │ │ │ ├── body.json │ │ │ ├── expected.out │ │ │ ├── headers.json │ │ │ └── telegraf.conf │ │ ├── fluentd/ │ │ │ ├── README.md │ │ │ ├── fluentd.go │ │ │ ├── fluentd_test.go │ │ │ └── sample.conf │ │ ├── fritzbox/ │ │ │ ├── README.md │ │ │ ├── fritzbox.go │ │ │ ├── fritzbox_test.go │ │ │ ├── sample.conf │ │ │ └── testdata/ │ │ │ ├── conf/ │ │ │ │ ├── invalid_collect.conf │ │ │ │ ├── invalid_urls.conf │ │ │ │ └── valid.conf │ │ │ └── testcases/ │ │ │ ├── device/ │ │ │ │ ├── expected.out │ │ │ │ ├── mock/ │ │ │ │ │ ├── deviceinfo/ │ │ │ │ │ │ └── response.xml │ │ │ │ │ ├── dummySCPD.xml │ │ │ │ │ └── tr64desc.xml │ │ │ │ └── telegraf.conf │ │ │ ├── dsl/ │ │ │ │ ├── expected.out │ │ │ │ ├── mock/ │ │ │ │ │ ├── dummySCPD.xml │ │ │ │ │ ├── tr64desc.xml │ │ │ │ │ └── wandslifconfig/ │ │ │ │ │ └── response.xml │ │ │ │ └── telegraf.conf │ │ │ ├── hosts/ │ │ │ │ ├── expected.out │ │ │ │ ├── mock/ │ │ │ │ │ ├── dummySCPD.xml │ │ │ │ │ ├── hosts/ │ │ │ │ │ │ └── response.xml │ │ │ │ │ ├── meshlist.json │ │ │ │ │ └── tr64desc.xml │ │ │ │ └── telegraf.conf │ │ │ ├── ppp/ │ │ │ │ ├── expected.out │ │ │ │ ├── mock/ │ │ │ │ │ ├── dummySCPD.xml │ │ │ │ │ ├── tr64desc.xml │ │ │ │ │ └── wanpppconn/ │ │ │ │ │ └── response.xml │ │ │ │ └── telegraf.conf │ │ │ ├── wan/ │ │ │ │ ├── expected.out │ │ │ │ ├── mock/ │ │ │ │ │ ├── WANCommonIFC1/ │ │ │ │ │ │ └── response.xml │ │ │ │ │ ├── dummySCPD.xml │ │ │ │ │ ├── igddesc.xml │ │ │ │ │ ├── tr64desc.xml │ │ │ │ │ └── wancommonifconfig/ │ │ │ │ │ └── response.xml │ │ │ │ └── telegraf.conf │ │ │ └── wlan/ │ │ │ ├── expected.out │ │ │ ├── mock/ │ │ │ │ ├── dummySCPD.xml │ │ │ │ ├── tr64desc.xml │ │ │ │ └── wlanconfig/ │ │ │ │ └── response.xml │ │ │ └── telegraf.conf │ │ ├── github/ │ │ │ ├── README.md │ │ │ ├── github.go │ │ │ ├── github_test.go │ │ │ └── sample.conf │ │ ├── gnmi/ │ │ │ ├── README.md │ │ │ ├── extensions/ │ │ │ │ └── jnpr_gnmi_extention/ │ │ │ │ └── GnmiJuniperTelemetryHeaderExtension.pb.go │ │ │ ├── gnmi.go │ │ │ ├── gnmi_test.go │ │ │ ├── handler.go │ │ │ ├── path.go │ │ │ ├── sample.conf │ │ │ ├── sample.conf.in │ │ │ ├── tag_store.go │ │ │ ├── testcases/ │ │ │ │ ├── canonical_field_names/ │ │ │ │ │ ├── expected.out │ │ │ │ │ ├── responses.json │ │ │ │ │ └── telegraf.conf │ │ │ │ ├── canonical_field_names_trim/ │ │ │ │ │ ├── expected.out │ │ │ │ │ ├── responses.json │ │ │ │ │ └── telegraf.conf │ │ │ │ ├── issue_11011/ │ │ │ │ │ ├── expected.out │ │ │ │ │ ├── responses.json │ │ │ │ │ └── telegraf.conf │ │ │ │ ├── issue_11778/ │ │ │ │ │ ├── expected.out │ │ │ │ │ ├── responses.json │ │ │ │ │ └── telegraf.conf │ │ │ │ ├── issue_12831/ │ │ │ │ │ ├── expected.out │ │ │ │ │ ├── responses.json │ │ │ │ │ └── telegraf.conf │ │ │ │ ├── issue_12931/ │ │ │ │ │ ├── expected.out │ │ │ │ │ ├── responses.json │ │ │ │ │ └── telegraf.conf │ │ │ │ ├── issue_13052/ │ │ │ │ │ ├── expected.out │ │ │ │ │ ├── responses.json │ │ │ │ │ └── telegraf.conf │ │ │ │ ├── issue_13512/ │ │ │ │ │ ├── expected.out │ │ │ │ │ ├── responses.json │ │ │ │ │ └── telegraf.conf │ │ │ │ ├── issue_14044/ │ │ │ │ │ ├── expected.out │ │ │ │ │ ├── responses.json │ │ │ │ │ └── telegraf.conf │ │ │ │ ├── issue_14063/ │ │ │ │ │ ├── expected.out │ │ │ │ │ ├── responses.json │ │ │ │ │ └── telegraf.conf │ │ │ │ ├── issue_14530/ │ │ │ │ │ ├── expected.out │ │ │ │ │ ├── responses.json │ │ │ │ │ └── telegraf.conf │ │ │ │ ├── issue_14833/ │ │ │ │ │ ├── expected.out │ │ │ │ │ ├── responses.json │ │ │ │ │ └── telegraf.conf │ │ │ │ ├── issue_14946/ │ │ │ │ │ ├── expected.out │ │ │ │ │ ├── responses.json │ │ │ │ │ └── telegraf.conf │ │ │ │ ├── issue_14946_canonical_field_names/ │ │ │ │ │ ├── expected.out │ │ │ │ │ ├── responses.json │ │ │ │ │ └── telegraf.conf │ │ │ │ ├── issue_15046/ │ │ │ │ │ ├── expected.out │ │ │ │ │ ├── models/ │ │ │ │ │ │ ├── LICENSE │ │ │ │ │ │ ├── README.md │ │ │ │ │ │ ├── openconfig-alarm-types.yang │ │ │ │ │ │ ├── openconfig-extensions.yang │ │ │ │ │ │ ├── openconfig-platform-psu.yang │ │ │ │ │ │ ├── openconfig-platform-types.yang │ │ │ │ │ │ ├── openconfig-platform.yang │ │ │ │ │ │ └── openconfig-types.yang │ │ │ │ │ ├── responses.json │ │ │ │ │ └── telegraf.conf │ │ │ │ ├── issue_15546/ │ │ │ │ │ ├── expected.out │ │ │ │ │ ├── responses.json │ │ │ │ │ └── telegraf.conf │ │ │ │ ├── issue_16476/ │ │ │ │ │ ├── expected.out │ │ │ │ │ ├── responses.json │ │ │ │ │ └── telegraf.conf │ │ │ │ ├── issue_16515/ │ │ │ │ │ ├── expected.out │ │ │ │ │ ├── responses.json │ │ │ │ │ └── telegraf.conf │ │ │ │ ├── issue_17154/ │ │ │ │ │ ├── expected.out │ │ │ │ │ ├── responses.json │ │ │ │ │ └── telegraf.conf │ │ │ │ ├── issue_17279/ │ │ │ │ │ ├── expected.out │ │ │ │ │ ├── responses.json │ │ │ │ │ └── telegraf.conf │ │ │ │ ├── issue_17412/ │ │ │ │ │ ├── expected.out │ │ │ │ │ ├── responses.json │ │ │ │ │ └── telegraf.conf │ │ │ │ ├── issue_17622/ │ │ │ │ │ ├── expected.out │ │ │ │ │ ├── responses.json │ │ │ │ │ └── telegraf.conf │ │ │ │ ├── tagging_name_based/ │ │ │ │ │ ├── expected.out │ │ │ │ │ ├── responses.json │ │ │ │ │ └── telegraf.conf │ │ │ │ └── tagging_subinterfaces/ │ │ │ │ ├── expected.out │ │ │ │ ├── responses.json │ │ │ │ └── telegraf.conf │ │ │ └── update_fields.go │ │ ├── google_cloud_storage/ │ │ │ ├── README.md │ │ │ ├── google_cloud_storage.go │ │ │ ├── google_cloud_storage_test.go │ │ │ ├── sample.conf │ │ │ └── testdata/ │ │ │ ├── file_listing.json │ │ │ ├── first_file.json │ │ │ ├── first_file_listing.json │ │ │ ├── fourth_file.json │ │ │ ├── fourth_file_listing.json │ │ │ ├── second_file.json │ │ │ ├── second_file_listing.json │ │ │ ├── single_file_list.json │ │ │ ├── single_object_not_found.json │ │ │ ├── third_file.json │ │ │ └── third_file_listing.json │ │ ├── graylog/ │ │ │ ├── README.md │ │ │ ├── graylog.go │ │ │ ├── graylog_test.go │ │ │ └── sample.conf │ │ ├── haproxy/ │ │ │ ├── README.md │ │ │ ├── haproxy.go │ │ │ ├── haproxy_test.go │ │ │ ├── sample.conf │ │ │ └── testdata/ │ │ │ └── sample_output.csv │ │ ├── hddtemp/ │ │ │ ├── README.md │ │ │ ├── go-hddtemp/ │ │ │ │ ├── LICENSE │ │ │ │ ├── hddtemp.go │ │ │ │ └── hddtemp_test.go │ │ │ ├── hddtemp.go │ │ │ ├── hddtemp_test.go │ │ │ └── sample.conf │ │ ├── http/ │ │ │ ├── README.md │ │ │ ├── http.go │ │ │ ├── http_internal_test.go │ │ │ ├── http_test.go │ │ │ ├── sample.conf │ │ │ └── sample.conf.in │ │ ├── http_listener_v2/ │ │ │ ├── README.md │ │ │ ├── http_listener_v2.go │ │ │ ├── http_listener_v2_test.go │ │ │ ├── sample.conf │ │ │ └── testdata/ │ │ │ └── huge_metric │ │ ├── http_response/ │ │ │ ├── README.md │ │ │ ├── http_response.go │ │ │ ├── http_response_test.go │ │ │ └── sample.conf │ │ ├── huebridge/ │ │ │ ├── README.md │ │ │ ├── bridge.go │ │ │ ├── huebridge.go │ │ │ ├── huebridge_test.go │ │ │ ├── sample.conf │ │ │ └── testdata/ │ │ │ ├── conf/ │ │ │ │ └── huebridge.conf │ │ │ └── metrics/ │ │ │ └── huebridge.txt │ │ ├── hugepages/ │ │ │ ├── README.md │ │ │ ├── hugepages.go │ │ │ ├── hugepages_notlinux.go │ │ │ ├── hugepages_test.go │ │ │ ├── sample.conf │ │ │ └── testdata/ │ │ │ ├── invalid/ │ │ │ │ ├── 1/ │ │ │ │ │ ├── anode3/ │ │ │ │ │ │ └── dir_lock │ │ │ │ │ ├── node0/ │ │ │ │ │ │ └── hugepages/ │ │ │ │ │ │ ├── hugepages-1048576kB/ │ │ │ │ │ │ │ ├── free_hugepages/ │ │ │ │ │ │ │ │ └── dir_lock │ │ │ │ │ │ │ └── nry_hugepages │ │ │ │ │ │ ├── hugepages-2048kB │ │ │ │ │ │ ├── hugepages-aaaa1048576kB/ │ │ │ │ │ │ │ └── free_hugepages │ │ │ │ │ │ └── hugepages1048576kB/ │ │ │ │ │ │ └── free_hugepages │ │ │ │ │ ├── node1 │ │ │ │ │ └── node4b/ │ │ │ │ │ └── dir_lock │ │ │ │ ├── 2/ │ │ │ │ │ └── node1/ │ │ │ │ │ └── hugepages/ │ │ │ │ │ └── hugepages-1048576kB/ │ │ │ │ │ └── nr_hugepages │ │ │ │ └── meminfo │ │ │ └── valid/ │ │ │ ├── meminfo │ │ │ ├── mm/ │ │ │ │ └── hugepages/ │ │ │ │ ├── hugepages-1048576kB/ │ │ │ │ │ ├── free_hugepages │ │ │ │ │ ├── nr_hugepages │ │ │ │ │ ├── nr_hugepages_mempolicy │ │ │ │ │ ├── nr_overcommit_hugepages │ │ │ │ │ ├── resv_hugepages │ │ │ │ │ └── surplus_hugepages │ │ │ │ └── hugepages-2048kB/ │ │ │ │ ├── free_hugepages │ │ │ │ ├── nr_hugepages │ │ │ │ ├── nr_hugepages_mempolicy │ │ │ │ ├── nr_overcommit_hugepages │ │ │ │ ├── resv_hugepages │ │ │ │ └── surplus_hugepages │ │ │ └── node/ │ │ │ ├── node0/ │ │ │ │ └── hugepages/ │ │ │ │ ├── hugepages-1048576kB/ │ │ │ │ │ ├── free_hugepages │ │ │ │ │ ├── nr_hugepages │ │ │ │ │ └── surplus_hugepages │ │ │ │ └── hugepages-2048kB/ │ │ │ │ ├── free_hugepages │ │ │ │ ├── nr_hugepages │ │ │ │ └── surplus_hugepages │ │ │ └── node1/ │ │ │ └── hugepages/ │ │ │ ├── hugepages-1048576kB/ │ │ │ │ ├── free_hugepages │ │ │ │ ├── nr_hugepages │ │ │ │ └── surplus_hugepages │ │ │ └── hugepages-2048kB/ │ │ │ ├── free_hugepages │ │ │ ├── nr_hugepages │ │ │ └── surplus_hugepages │ │ ├── icinga2/ │ │ │ ├── README.md │ │ │ ├── icinga2.go │ │ │ ├── icinga2_test.go │ │ │ └── sample.conf │ │ ├── infiniband/ │ │ │ ├── README.md │ │ │ ├── infiniband.go │ │ │ ├── infiniband_linux.go │ │ │ ├── infiniband_notlinux.go │ │ │ ├── infiniband_test.go │ │ │ └── sample.conf │ │ ├── influxdb/ │ │ │ ├── README.md │ │ │ ├── influxdb.go │ │ │ ├── influxdb_test.go │ │ │ ├── sample.conf │ │ │ ├── testdata/ │ │ │ │ ├── cloud1.influx │ │ │ │ ├── cloud1.json │ │ │ │ ├── influx_return.json │ │ │ │ └── influx_return2.json │ │ │ └── types.go │ │ ├── influxdb_listener/ │ │ │ ├── README.md │ │ │ ├── influxdb_listener.go │ │ │ ├── influxdb_listener_benchmark_test.go │ │ │ ├── influxdb_listener_test.go │ │ │ ├── sample.conf │ │ │ └── testdata/ │ │ │ └── huge_metric │ │ ├── influxdb_v2_listener/ │ │ │ ├── README.md │ │ │ ├── influxdb_v2_listener.go │ │ │ ├── influxdb_v2_listener_benchmark_test.go │ │ │ ├── influxdb_v2_listener_test.go │ │ │ ├── sample.conf │ │ │ └── testdata/ │ │ │ └── huge_metric │ │ ├── intel_baseband/ │ │ │ ├── README.md │ │ │ ├── intel_baseband.go │ │ │ ├── intel_baseband_notamd64linux.go │ │ │ ├── intel_baseband_test.go │ │ │ ├── log_connector.go │ │ │ ├── log_connector_test.go │ │ │ ├── mocks/ │ │ │ │ └── conn.go │ │ │ ├── sample.conf │ │ │ ├── sock_connector.go │ │ │ ├── sock_connector_test.go │ │ │ ├── testdata/ │ │ │ │ └── logfiles/ │ │ │ │ ├── empty.log │ │ │ │ └── example.log │ │ │ ├── utils.go │ │ │ └── utils_test.go │ │ ├── intel_dlb/ │ │ │ ├── README.md │ │ │ ├── intel_dlb.go │ │ │ ├── intel_dlb_notlinux.go │ │ │ ├── intel_dlb_test.go │ │ │ ├── ras_reader.go │ │ │ ├── ras_reader_mock.go │ │ │ └── sample.conf │ │ ├── intel_pmt/ │ │ │ ├── README.md │ │ │ ├── filtering.go │ │ │ ├── filtering_test.go │ │ │ ├── intel_pmt.go │ │ │ ├── intel_pmt_notamd64linux.go │ │ │ ├── intel_pmt_test.go │ │ │ ├── sample.conf │ │ │ ├── tags_extraction.go │ │ │ ├── tags_extraction_test.go │ │ │ ├── xml_parser.go │ │ │ └── xml_parser_test.go │ │ ├── intel_pmu/ │ │ │ ├── README.md │ │ │ ├── activators.go │ │ │ ├── activators_test.go │ │ │ ├── config.go │ │ │ ├── config_test.go │ │ │ ├── intel_pmu.go │ │ │ ├── intel_pmu_notamd64linux.go │ │ │ ├── intel_pmu_test.go │ │ │ ├── mocks.go │ │ │ ├── reader.go │ │ │ ├── reader_test.go │ │ │ ├── resolver.go │ │ │ ├── resolver_test.go │ │ │ └── sample.conf │ │ ├── intel_powerstat/ │ │ │ ├── README.md │ │ │ ├── fetcher.go │ │ │ ├── intel_powerstat.go │ │ │ ├── intel_powerstat_notlinux.go │ │ │ ├── intel_powerstat_test.go │ │ │ ├── metrics.go │ │ │ ├── metrics_test.go │ │ │ ├── options.go │ │ │ ├── options_test.go │ │ │ ├── sample.conf │ │ │ └── testdata/ │ │ │ ├── aperfmperf_flag_not_found/ │ │ │ │ └── cpuinfo │ │ │ ├── cpu_model_missing/ │ │ │ │ └── cpuinfo │ │ │ ├── cpuinfo │ │ │ ├── dts_flag_not_found/ │ │ │ │ └── cpuinfo │ │ │ ├── model_not_supported/ │ │ │ │ └── cpuinfo │ │ │ ├── msr_flag_not_found/ │ │ │ │ └── cpuinfo │ │ │ ├── sapphirerapids_core.json │ │ │ └── vendor_not_supported/ │ │ │ └── cpuinfo │ │ ├── intel_rdt/ │ │ │ ├── README.md │ │ │ ├── intel_rdt.go │ │ │ ├── intel_rdt_test.go │ │ │ ├── intel_rdt_windows.go │ │ │ ├── processes.go │ │ │ ├── publisher.go │ │ │ ├── publisher_test.go │ │ │ └── sample.conf │ │ ├── internal/ │ │ │ ├── README.md │ │ │ ├── internal.go │ │ │ ├── internal_test.go │ │ │ └── sample.conf │ │ ├── internet_speed/ │ │ │ ├── README.md │ │ │ ├── internet_speed.go │ │ │ ├── internet_speed_test.go │ │ │ └── sample.conf │ │ ├── interrupts/ │ │ │ ├── README.md │ │ │ ├── interrupts.go │ │ │ ├── interrupts_test.go │ │ │ └── sample.conf │ │ ├── ipmi_sensor/ │ │ │ ├── README.md │ │ │ ├── connection.go │ │ │ ├── connection_test.go │ │ │ ├── ipmi_sensor.go │ │ │ ├── ipmi_sensor_test.go │ │ │ └── sample.conf │ │ ├── ipset/ │ │ │ ├── README.md │ │ │ ├── ipset.go │ │ │ ├── ipset_entries.go │ │ │ ├── ipset_entries_test.go │ │ │ ├── ipset_test.go │ │ │ └── sample.conf │ │ ├── iptables/ │ │ │ ├── README.md │ │ │ ├── iptables.go │ │ │ ├── iptables_notlinux.go │ │ │ ├── iptables_test.go │ │ │ └── sample.conf │ │ ├── ipvs/ │ │ │ ├── README.md │ │ │ ├── ipvs.go │ │ │ ├── ipvs_notlinux.go │ │ │ └── sample.conf │ │ ├── jenkins/ │ │ │ ├── README.md │ │ │ ├── client.go │ │ │ ├── jenkins.go │ │ │ ├── jenkins_test.go │ │ │ └── sample.conf │ │ ├── jolokia2_agent/ │ │ │ ├── README.md │ │ │ ├── examples/ │ │ │ │ ├── activemq.conf │ │ │ │ ├── bitbucket.conf │ │ │ │ ├── cassandra.conf │ │ │ │ ├── hadoop-hdfs.conf │ │ │ │ ├── java.conf │ │ │ │ ├── jboss.conf │ │ │ │ ├── kafka-connect.conf │ │ │ │ ├── kafka.conf │ │ │ │ ├── tomcat.conf │ │ │ │ ├── weblogic.conf │ │ │ │ └── zookeeper.conf │ │ │ ├── jolokia2_agent.go │ │ │ ├── jolokia2_agent_test.go │ │ │ ├── sample.conf │ │ │ └── testdata/ │ │ │ └── response.json │ │ ├── jolokia2_proxy/ │ │ │ ├── README.md │ │ │ ├── jolokia2_proxy.go │ │ │ ├── jolokia2_proxy_test.go │ │ │ └── sample.conf │ │ ├── jti_openconfig_telemetry/ │ │ │ ├── README.md │ │ │ ├── auth/ │ │ │ │ ├── authentication_service.pb.go │ │ │ │ ├── authentication_service.proto │ │ │ │ └── authentication_service_grpc.pb.go │ │ │ ├── collection.go │ │ │ ├── gen.go │ │ │ ├── jti_openconfig_telemetry.go │ │ │ ├── jti_openconfig_telemetry_test.go │ │ │ ├── oc/ │ │ │ │ ├── oc.pb.go │ │ │ │ ├── oc.proto │ │ │ │ └── oc_grpc.pb.go │ │ │ └── sample.conf │ │ ├── kafka_consumer/ │ │ │ ├── README.md │ │ │ ├── kafka_consumer.go │ │ │ ├── kafka_consumer_test.go │ │ │ └── sample.conf │ │ ├── kapacitor/ │ │ │ ├── README.md │ │ │ ├── kapacitor.go │ │ │ ├── kapacitor_test.go │ │ │ ├── sample.conf │ │ │ └── testdata/ │ │ │ └── kapacitor_return.json │ │ ├── kernel/ │ │ │ ├── README.md │ │ │ ├── kernel.go │ │ │ ├── kernel_notlinux.go │ │ │ ├── kernel_test.go │ │ │ ├── psi.go │ │ │ ├── psi_test.go │ │ │ ├── sample.conf │ │ │ └── testdata/ │ │ │ ├── entropy_stat_file_full │ │ │ ├── entropy_stat_file_invalid │ │ │ ├── entropy_stat_file_partial │ │ │ ├── ksm/ │ │ │ │ ├── invalid/ │ │ │ │ │ ├── full_scans │ │ │ │ │ ├── max_page_sharing │ │ │ │ │ ├── merge_across_nodes │ │ │ │ │ ├── pages_shared │ │ │ │ │ ├── pages_sharing │ │ │ │ │ ├── pages_to_scan │ │ │ │ │ ├── pages_unshared │ │ │ │ │ ├── pages_volatile │ │ │ │ │ ├── run │ │ │ │ │ ├── sleep_millisecs │ │ │ │ │ ├── stable_node_chains │ │ │ │ │ ├── stable_node_chains_prune_millisecs │ │ │ │ │ ├── stable_node_dups │ │ │ │ │ └── use_zero_pages │ │ │ │ ├── missing/ │ │ │ │ │ ├── full_scans │ │ │ │ │ ├── max_page_sharing │ │ │ │ │ ├── merge_across_nodes │ │ │ │ │ ├── pages_shared │ │ │ │ │ ├── pages_sharing │ │ │ │ │ ├── pages_to_scan │ │ │ │ │ ├── pages_unshared │ │ │ │ │ ├── pages_volatile │ │ │ │ │ ├── sleep_millisecs │ │ │ │ │ ├── stable_node_chains │ │ │ │ │ ├── stable_node_chains_prune_millisecs │ │ │ │ │ ├── stable_node_dups │ │ │ │ │ └── use_zero_pages │ │ │ │ └── valid/ │ │ │ │ ├── full_scans │ │ │ │ ├── max_page_sharing │ │ │ │ ├── merge_across_nodes │ │ │ │ ├── pages_shared │ │ │ │ ├── pages_sharing │ │ │ │ ├── pages_to_scan │ │ │ │ ├── pages_unshared │ │ │ │ ├── pages_volatile │ │ │ │ ├── run │ │ │ │ ├── sleep_millisecs │ │ │ │ ├── stable_node_chains │ │ │ │ ├── stable_node_chains_prune_millisecs │ │ │ │ ├── stable_node_dups │ │ │ │ └── use_zero_pages │ │ │ ├── pressure/ │ │ │ │ ├── cpu │ │ │ │ ├── io │ │ │ │ └── memory │ │ │ ├── stat_file_full │ │ │ ├── stat_file_invalid │ │ │ ├── stat_file_invalid2 │ │ │ └── stat_file_partial │ │ ├── kernel_vmstat/ │ │ │ ├── README.md │ │ │ ├── kernel_vmstat.go │ │ │ ├── kernel_vmstat_notlinux.go │ │ │ ├── kernel_vmstat_test.go │ │ │ └── sample.conf │ │ ├── kibana/ │ │ │ ├── README.md │ │ │ ├── kibana.go │ │ │ ├── kibana_test.go │ │ │ ├── sample.conf │ │ │ ├── test_environment/ │ │ │ │ ├── basic_kibana_telegraf.conf │ │ │ │ ├── docker-compose.yml │ │ │ │ └── run_test_env.sh │ │ │ ├── testdata_test6_3.go │ │ │ ├── testdata_test6_5.go │ │ │ └── testdata_test8_15.go │ │ ├── kinesis_consumer/ │ │ │ ├── README.md │ │ │ ├── consumer.go │ │ │ ├── encoding.go │ │ │ ├── kinesis_consumer.go │ │ │ ├── kinesis_consumer_test.go │ │ │ ├── logging.go │ │ │ ├── sample.conf │ │ │ └── store.go │ │ ├── knx_listener/ │ │ │ ├── README.md │ │ │ ├── knx_dummy_interface.go │ │ │ ├── knx_listener.go │ │ │ ├── knx_listener_test.go │ │ │ └── sample.conf │ │ ├── kube_inventory/ │ │ │ ├── README.md │ │ │ ├── certificate.go │ │ │ ├── client.go │ │ │ ├── client_test.go │ │ │ ├── daemonset.go │ │ │ ├── daemonset_test.go │ │ │ ├── deployment.go │ │ │ ├── deployment_test.go │ │ │ ├── endpoint.go │ │ │ ├── endpoint_test.go │ │ │ ├── ingress.go │ │ │ ├── ingress_test.go │ │ │ ├── kube_inventory.go │ │ │ ├── node.go │ │ │ ├── node_test.go │ │ │ ├── persistentvolume.go │ │ │ ├── persistentvolume_test.go │ │ │ ├── persistentvolumeclaim.go │ │ │ ├── persistentvolumeclaim_test.go │ │ │ ├── pod.go │ │ │ ├── pod_test.go │ │ │ ├── resourcequotas.go │ │ │ ├── resourcequotas_test.go │ │ │ ├── sample.conf │ │ │ ├── service.go │ │ │ ├── service_test.go │ │ │ ├── statefulset.go │ │ │ └── statefulset_test.go │ │ ├── kubernetes/ │ │ │ ├── README.md │ │ │ ├── kubernetes.go │ │ │ ├── kubernetes_metrics.go │ │ │ ├── kubernetes_pods.go │ │ │ ├── kubernetes_test.go │ │ │ └── sample.conf │ │ ├── lanz/ │ │ │ ├── README.md │ │ │ ├── lanz.go │ │ │ ├── lanz_test.go │ │ │ └── sample.conf │ │ ├── ldap/ │ │ │ ├── 389ds.go │ │ │ ├── README.md │ │ │ ├── ldap.go │ │ │ ├── ldap_test.go │ │ │ ├── openldap.go │ │ │ ├── sample.conf │ │ │ └── sample.conf.in │ │ ├── leofs/ │ │ │ ├── README.md │ │ │ ├── leofs.go │ │ │ ├── leofs_test.go │ │ │ └── sample.conf │ │ ├── libvirt/ │ │ │ ├── README.md │ │ │ ├── libvirt.go │ │ │ ├── libvirt_metric_format.go │ │ │ ├── libvirt_test.go │ │ │ ├── libvirt_utils.go │ │ │ ├── libvirt_utils_mock.go │ │ │ └── sample.conf │ │ ├── linux_cpu/ │ │ │ ├── README.md │ │ │ ├── linux_cpu.go │ │ │ ├── linux_cpu_nonlinux.go │ │ │ ├── linux_cpu_test.go │ │ │ └── sample.conf │ │ ├── linux_sysctl_fs/ │ │ │ ├── README.md │ │ │ ├── linux_sysctl_fs.go │ │ │ ├── linux_sysctl_fs_test.go │ │ │ └── sample.conf │ │ ├── logql/ │ │ │ ├── README.md │ │ │ ├── client.go │ │ │ ├── logql.go │ │ │ ├── logql_test.go │ │ │ ├── query.go │ │ │ ├── response.go │ │ │ ├── sample.conf │ │ │ ├── sample.conf.in │ │ │ └── testcases/ │ │ │ ├── instant_vector/ │ │ │ │ ├── expected.out │ │ │ │ ├── expected.query │ │ │ │ ├── response_query.json │ │ │ │ └── telegraf.conf │ │ │ ├── range_matrix/ │ │ │ │ ├── expected.out │ │ │ │ ├── expected.query │ │ │ │ ├── response_query_range.json │ │ │ │ └── telegraf.conf │ │ │ └── range_stream/ │ │ │ ├── expected.out │ │ │ ├── expected.query │ │ │ ├── response_query_range.json │ │ │ └── telegraf.conf │ │ ├── logstash/ │ │ │ ├── README.md │ │ │ ├── logstash.go │ │ │ ├── logstash_test.go │ │ │ ├── sample.conf │ │ │ ├── samples_logstash5.go │ │ │ ├── samples_logstash6.go │ │ │ └── samples_logstash7.go │ │ ├── lustre2/ │ │ │ ├── README.md │ │ │ ├── lustre2.go │ │ │ ├── lustre2_notlinux.go │ │ │ ├── lustre2_test.go │ │ │ ├── sample.conf │ │ │ └── testcases/ │ │ │ ├── custom_locations/ │ │ │ │ ├── expected.out │ │ │ │ ├── host_proc/ │ │ │ │ │ └── fs/ │ │ │ │ │ └── lustre/ │ │ │ │ │ ├── mdt/ │ │ │ │ │ │ └── OST0001/ │ │ │ │ │ │ ├── exports/ │ │ │ │ │ │ │ └── 10.2.4.27@o2ib1/ │ │ │ │ │ │ │ └── stats │ │ │ │ │ │ ├── job_stats │ │ │ │ │ │ └── md_stats │ │ │ │ │ ├── obdfilter/ │ │ │ │ │ │ └── OST0001/ │ │ │ │ │ │ ├── exports/ │ │ │ │ │ │ │ └── 10.2.4.27@o2ib1/ │ │ │ │ │ │ │ └── stats │ │ │ │ │ │ ├── job_stats │ │ │ │ │ │ └── stats │ │ │ │ │ └── osd-ldiskfs/ │ │ │ │ │ └── OST0001/ │ │ │ │ │ ├── brw_stats │ │ │ │ │ └── stats │ │ │ │ └── telegraf.conf │ │ │ ├── v2.12/ │ │ │ │ ├── expected.out │ │ │ │ ├── proc/ │ │ │ │ │ └── fs/ │ │ │ │ │ └── lustre/ │ │ │ │ │ ├── mdt/ │ │ │ │ │ │ └── OST0001/ │ │ │ │ │ │ ├── exports/ │ │ │ │ │ │ │ └── 10.2.4.27@o2ib1/ │ │ │ │ │ │ │ └── stats │ │ │ │ │ │ ├── job_stats │ │ │ │ │ │ └── md_stats │ │ │ │ │ ├── obdfilter/ │ │ │ │ │ │ └── OST0001/ │ │ │ │ │ │ ├── exports/ │ │ │ │ │ │ │ └── 10.2.4.27@o2ib1/ │ │ │ │ │ │ │ └── stats │ │ │ │ │ │ ├── job_stats │ │ │ │ │ │ └── stats │ │ │ │ │ └── osd-ldiskfs/ │ │ │ │ │ └── OST0001/ │ │ │ │ │ ├── brw_stats │ │ │ │ │ └── stats │ │ │ │ ├── sys/ │ │ │ │ │ └── fs/ │ │ │ │ │ └── lustre/ │ │ │ │ │ ├── health_check │ │ │ │ │ ├── mdt/ │ │ │ │ │ │ └── fs-MDT0000/ │ │ │ │ │ │ └── eviction_count │ │ │ │ │ ├── mgs/ │ │ │ │ │ │ └── MGS/ │ │ │ │ │ │ └── eviction_count │ │ │ │ │ └── obdfilter/ │ │ │ │ │ └── fs-OST0001/ │ │ │ │ │ └── eviction_count │ │ │ │ └── telegraf.conf │ │ │ └── v2.12_no_client_stats/ │ │ │ ├── expected.out │ │ │ ├── proc/ │ │ │ │ └── fs/ │ │ │ │ └── lustre/ │ │ │ │ ├── mdt/ │ │ │ │ │ └── OST0001/ │ │ │ │ │ ├── job_stats │ │ │ │ │ └── md_stats │ │ │ │ ├── obdfilter/ │ │ │ │ │ └── OST0001/ │ │ │ │ │ ├── job_stats │ │ │ │ │ └── stats │ │ │ │ └── osd-ldiskfs/ │ │ │ │ └── OST0001/ │ │ │ │ ├── brw_stats │ │ │ │ └── stats │ │ │ ├── sys/ │ │ │ │ └── fs/ │ │ │ │ └── lustre/ │ │ │ │ ├── health_check │ │ │ │ ├── mdt/ │ │ │ │ │ └── fs-MDT0000/ │ │ │ │ │ └── eviction_count │ │ │ │ ├── mgs/ │ │ │ │ │ └── MGS/ │ │ │ │ │ └── eviction_count │ │ │ │ └── obdfilter/ │ │ │ │ └── fs-OST0001/ │ │ │ │ └── eviction_count │ │ │ └── telegraf.conf │ │ ├── lvm/ │ │ │ ├── README.md │ │ │ ├── lvm.go │ │ │ ├── lvm_test.go │ │ │ └── sample.conf │ │ ├── mailchimp/ │ │ │ ├── README.md │ │ │ ├── chimp_api.go │ │ │ ├── mailchimp.go │ │ │ ├── mailchimp_test.go │ │ │ └── sample.conf │ │ ├── marklogic/ │ │ │ ├── README.md │ │ │ ├── marklogic.go │ │ │ ├── marklogic_test.go │ │ │ └── sample.conf │ │ ├── mavlink/ │ │ │ ├── README.md │ │ │ ├── mavlink.go │ │ │ ├── mavlink_test.go │ │ │ └── sample.conf │ │ ├── mcrouter/ │ │ │ ├── README.md │ │ │ ├── mcrouter.go │ │ │ ├── mcrouter_test.go │ │ │ ├── sample.conf │ │ │ └── testdata/ │ │ │ └── mcrouter_stats │ │ ├── mdstat/ │ │ │ ├── README.md │ │ │ ├── mdstat.go │ │ │ ├── mdstat_notlinux.go │ │ │ ├── mdstat_test.go │ │ │ └── sample.conf │ │ ├── mem/ │ │ │ ├── README.md │ │ │ ├── mem.go │ │ │ ├── mem_test.go │ │ │ └── sample.conf │ │ ├── memcached/ │ │ │ ├── README.md │ │ │ ├── memcached.go │ │ │ ├── memcached_test.go │ │ │ └── sample.conf │ │ ├── mesos/ │ │ │ ├── README.md │ │ │ ├── mesos.go │ │ │ ├── mesos_test.go │ │ │ └── sample.conf │ │ ├── minecraft/ │ │ │ ├── README.md │ │ │ ├── client.go │ │ │ ├── client_test.go │ │ │ ├── minecraft.go │ │ │ ├── minecraft_test.go │ │ │ └── sample.conf │ │ ├── mock/ │ │ │ ├── README.md │ │ │ ├── mock.go │ │ │ ├── mock_test.go │ │ │ └── sample.conf │ │ ├── modbus/ │ │ │ ├── README.md │ │ │ ├── configuration.go │ │ │ ├── configuration_metric.go │ │ │ ├── configuration_metric_test.go │ │ │ ├── configuration_register.go │ │ │ ├── configuration_register_test.go │ │ │ ├── configuration_request.go │ │ │ ├── configuration_request_test.go │ │ │ ├── modbus.go │ │ │ ├── modbus_test.go │ │ │ ├── request.go │ │ │ ├── sample_general_begin.conf │ │ │ ├── sample_general_end.conf │ │ │ ├── sample_metric.conf │ │ │ ├── sample_register.conf │ │ │ ├── sample_request.conf │ │ │ ├── testcases/ │ │ │ │ ├── duplicate_fields_different_registers/ │ │ │ │ │ ├── init.err │ │ │ │ │ └── telegraf.conf │ │ │ │ ├── duplicate_fields_different_slave/ │ │ │ │ │ ├── expected.out │ │ │ │ │ └── telegraf.conf │ │ │ │ ├── duplicate_fields_different_tags/ │ │ │ │ │ ├── expected.out │ │ │ │ │ └── telegraf.conf │ │ │ │ ├── duplicate_fields_issue_12091/ │ │ │ │ │ ├── expected.out │ │ │ │ │ └── telegraf.conf │ │ │ │ ├── duplicate_fields_same_slave_and_request/ │ │ │ │ │ ├── init.err │ │ │ │ │ └── telegraf.conf │ │ │ │ ├── duplicate_fields_same_tags/ │ │ │ │ │ ├── init.err │ │ │ │ │ └── telegraf.conf │ │ │ │ ├── field_request_too_short_issue_13482/ │ │ │ │ │ ├── init.err │ │ │ │ │ └── telegraf.conf │ │ │ │ ├── metric_style_issue_16031/ │ │ │ │ │ ├── expected.out │ │ │ │ │ └── telegraf.conf │ │ │ │ └── overflow_issue_14387/ │ │ │ │ ├── expected.out │ │ │ │ └── telegraf.conf │ │ │ ├── type_conversions.go │ │ │ ├── type_conversions16.go │ │ │ ├── type_conversions32.go │ │ │ ├── type_conversions64.go │ │ │ ├── type_conversions8.go │ │ │ ├── type_conversions_bit.go │ │ │ └── type_conversions_string.go │ │ ├── mongodb/ │ │ │ ├── README.md │ │ │ ├── dev/ │ │ │ │ ├── docker-compose.yml │ │ │ │ └── telegraf.conf │ │ │ ├── mongodb.go │ │ │ ├── mongodb_data.go │ │ │ ├── mongodb_data_test.go │ │ │ ├── mongodb_server.go │ │ │ ├── mongodb_server_test.go │ │ │ ├── mongostat.go │ │ │ ├── mongostat_test.go │ │ │ ├── sample.conf │ │ │ └── sample.conf.in │ │ ├── monit/ │ │ │ ├── README.md │ │ │ ├── monit.go │ │ │ ├── monit_test.go │ │ │ ├── sample.conf │ │ │ └── testdata/ │ │ │ ├── response_invalidxml_1.xml │ │ │ ├── response_invalidxml_2.xml │ │ │ ├── response_invalidxml_3.xml │ │ │ ├── response_servicetype_0.xml │ │ │ ├── response_servicetype_1.xml │ │ │ ├── response_servicetype_2.xml │ │ │ ├── response_servicetype_3.xml │ │ │ ├── response_servicetype_4.xml │ │ │ ├── response_servicetype_5.xml │ │ │ ├── response_servicetype_6.xml │ │ │ ├── response_servicetype_7.xml │ │ │ ├── response_servicetype_8.xml │ │ │ ├── response_servicetype_8_failure.xml │ │ │ ├── response_servicetype_8_initializingmode.xml │ │ │ ├── response_servicetype_8_passivemode.xml │ │ │ └── response_servicetype_8_pendingaction.xml │ │ ├── mqtt_consumer/ │ │ │ ├── README.md │ │ │ ├── mqtt_consumer.go │ │ │ ├── mqtt_consumer_test.go │ │ │ ├── mqtt_logger.go │ │ │ ├── sample.conf │ │ │ ├── testdata/ │ │ │ │ └── mosquitto.conf │ │ │ └── topic_parser.go │ │ ├── multifile/ │ │ │ ├── README.md │ │ │ ├── multifile.go │ │ │ ├── multifile_test.go │ │ │ ├── sample.conf │ │ │ └── testdata/ │ │ │ ├── bool.txt │ │ │ ├── float.txt │ │ │ ├── int.txt │ │ │ ├── string.txt │ │ │ └── tag.txt │ │ ├── mysql/ │ │ │ ├── README.md │ │ │ ├── dev/ │ │ │ │ ├── docker-compose.yml │ │ │ │ └── telegraf.conf │ │ │ ├── mysql.go │ │ │ ├── mysql_test.go │ │ │ ├── sample.conf │ │ │ ├── v1/ │ │ │ │ └── mysql.go │ │ │ └── v2/ │ │ │ ├── convert.go │ │ │ └── convert_test.go │ │ ├── nats/ │ │ │ ├── README.md │ │ │ ├── nats.go │ │ │ ├── nats_freebsd.go │ │ │ ├── nats_test.go │ │ │ └── sample.conf │ │ ├── nats_consumer/ │ │ │ ├── README.md │ │ │ ├── nats_consumer.go │ │ │ ├── nats_consumer_test.go │ │ │ └── sample.conf │ │ ├── neoom_beaam/ │ │ │ ├── README.md │ │ │ ├── neoom_beaam.go │ │ │ ├── neoom_beaam_test.go │ │ │ ├── sample.conf │ │ │ ├── sample.conf.in │ │ │ ├── testcases/ │ │ │ │ └── small/ │ │ │ │ ├── configuration.json │ │ │ │ ├── expected.out │ │ │ │ ├── state.json │ │ │ │ ├── telegraf.conf │ │ │ │ ├── thing_22222222-bbbb-2222-bbbb-222222222222.json │ │ │ │ ├── thing_33333333-cccc-3333-cccc-333333333333.json │ │ │ │ ├── thing_44444444-dddd-4444-dddd-444444444444.json │ │ │ │ └── thing_55555555-eeee-5555-eeee-555555555555.json │ │ │ └── types.go │ │ ├── neptune_apex/ │ │ │ ├── README.md │ │ │ ├── neptune_apex.go │ │ │ ├── neptune_apex_test.go │ │ │ └── sample.conf │ │ ├── net/ │ │ │ ├── README.md │ │ │ ├── net.go │ │ │ ├── net_test.go │ │ │ ├── sample.conf │ │ │ └── testdata/ │ │ │ └── general/ │ │ │ └── sys/ │ │ │ └── class/ │ │ │ └── net/ │ │ │ ├── eth0/ │ │ │ │ └── speed │ │ │ └── eth1/ │ │ │ └── speed │ │ ├── net_response/ │ │ │ ├── README.md │ │ │ ├── net_response.go │ │ │ ├── net_response_test.go │ │ │ └── sample.conf │ │ ├── netflow/ │ │ │ ├── README.md │ │ │ ├── ipv4_options.csv │ │ │ ├── layer4_protocol_numbers.csv │ │ │ ├── mappings.go │ │ │ ├── mappings_ipfix_pen/ │ │ │ │ └── ntop-35632.csv │ │ │ ├── netflow.go │ │ │ ├── netflow_decoder.go │ │ │ ├── netflow_test.go │ │ │ ├── netflow_v5.go │ │ │ ├── sample.conf │ │ │ ├── sflow_v5.go │ │ │ ├── testcases/ │ │ │ │ ├── ipfix_example/ │ │ │ │ │ ├── expected.out │ │ │ │ │ └── telegraf.conf │ │ │ │ ├── ipfix_options/ │ │ │ │ │ ├── expected.out │ │ │ │ │ └── telegraf.conf │ │ │ │ ├── ipfix_pen_35632/ │ │ │ │ │ ├── expected.out │ │ │ │ │ └── telegraf.conf │ │ │ │ ├── issue_13305/ │ │ │ │ │ ├── expected.out │ │ │ │ │ └── telegraf.conf │ │ │ │ ├── issue_14370/ │ │ │ │ │ ├── expected.out │ │ │ │ │ └── telegraf.conf │ │ │ │ ├── netflow_mapping.csv │ │ │ │ ├── netflow_v5_example/ │ │ │ │ │ ├── expected.out │ │ │ │ │ └── telegraf.conf │ │ │ │ ├── netflow_v9_example/ │ │ │ │ │ ├── expected.out │ │ │ │ │ └── telegraf.conf │ │ │ │ ├── netflow_v9_options/ │ │ │ │ │ ├── expected.out │ │ │ │ │ └── telegraf.conf │ │ │ │ ├── sflow_issue_15375/ │ │ │ │ │ ├── expected.out │ │ │ │ │ └── telegraf.conf │ │ │ │ ├── sflow_issue_15918/ │ │ │ │ │ ├── expected.out │ │ │ │ │ └── telegraf.conf │ │ │ │ └── sflow_v5_example/ │ │ │ │ ├── expected.out │ │ │ │ └── telegraf.conf │ │ │ ├── type_conversion.go │ │ │ └── type_conversion_test.go │ │ ├── netstat/ │ │ │ ├── README.md │ │ │ ├── netstat.go │ │ │ ├── netstat_test.go │ │ │ └── sample.conf │ │ ├── nfsclient/ │ │ │ ├── README.md │ │ │ ├── nfsclient.go │ │ │ ├── nfsclient_test.go │ │ │ ├── sample.conf │ │ │ └── testdata/ │ │ │ └── mountstats │ │ ├── nftables/ │ │ │ ├── README.md │ │ │ ├── nftables.go │ │ │ ├── nftables_notlinux.go │ │ │ ├── nftables_test.go │ │ │ ├── sample.conf │ │ │ ├── testcases/ │ │ │ │ ├── bad_output/ │ │ │ │ │ ├── expected.err │ │ │ │ │ ├── table_test.json │ │ │ │ │ └── telegraf.conf │ │ │ │ ├── bad_rule_empty/ │ │ │ │ │ ├── expected.err │ │ │ │ │ ├── table_test.json │ │ │ │ │ └── telegraf.conf │ │ │ │ ├── bad_rule_list/ │ │ │ │ │ ├── expected.err │ │ │ │ │ ├── table_test.json │ │ │ │ │ └── telegraf.conf │ │ │ │ ├── bad_rule_string/ │ │ │ │ │ ├── expected.err │ │ │ │ │ ├── table_test.json │ │ │ │ │ └── telegraf.conf │ │ │ │ ├── mixed_counters/ │ │ │ │ │ ├── expected.out │ │ │ │ │ ├── table_mixed.json │ │ │ │ │ └── telegraf.conf │ │ │ │ ├── named_counter/ │ │ │ │ │ ├── expected.out │ │ │ │ │ ├── table_inet example.json │ │ │ │ │ └── telegraf.conf │ │ │ │ ├── non_existent_table/ │ │ │ │ │ ├── expected.err │ │ │ │ │ └── telegraf.conf │ │ │ │ └── valid/ │ │ │ │ ├── expected.out │ │ │ │ ├── table_test.json │ │ │ │ └── telegraf.conf │ │ │ └── types.go │ │ ├── nginx/ │ │ │ ├── README.md │ │ │ ├── nginx.go │ │ │ ├── nginx_test.go │ │ │ └── sample.conf │ │ ├── nginx_plus/ │ │ │ ├── README.md │ │ │ ├── nginx_plus.go │ │ │ ├── nginx_plus_test.go │ │ │ └── sample.conf │ │ ├── nginx_plus_api/ │ │ │ ├── README.md │ │ │ ├── nginx_plus_api.go │ │ │ ├── nginx_plus_api_metrics.go │ │ │ ├── nginx_plus_api_metrics_test.go │ │ │ ├── nginx_plus_api_types.go │ │ │ └── sample.conf │ │ ├── nginx_sts/ │ │ │ ├── README.md │ │ │ ├── nginx_sts.go │ │ │ ├── nginx_sts_test.go │ │ │ └── sample.conf │ │ ├── nginx_upstream_check/ │ │ │ ├── README.md │ │ │ ├── nginx_upstream_check.go │ │ │ ├── nginx_upstream_check_test.go │ │ │ └── sample.conf │ │ ├── nginx_vts/ │ │ │ ├── README.md │ │ │ ├── nginx_vts.go │ │ │ ├── nginx_vts_test.go │ │ │ └── sample.conf │ │ ├── nomad/ │ │ │ ├── README.md │ │ │ ├── nomad.go │ │ │ ├── nomad_metrics.go │ │ │ ├── nomad_test.go │ │ │ ├── sample.conf │ │ │ └── testdata/ │ │ │ └── response_key_metrics.json │ │ ├── nsd/ │ │ │ ├── README.md │ │ │ ├── nsd.go │ │ │ ├── nsd_test.go │ │ │ └── sample.conf │ │ ├── nsdp/ │ │ │ ├── README.md │ │ │ ├── nsdp.go │ │ │ ├── nsdp_test.go │ │ │ ├── sample.conf │ │ │ └── testdata/ │ │ │ ├── conf/ │ │ │ │ └── nsdp.conf │ │ │ └── metrics/ │ │ │ └── nsdp_device_port.txt │ │ ├── nsq/ │ │ │ ├── README.md │ │ │ ├── nsq.go │ │ │ ├── nsq_test.go │ │ │ └── sample.conf │ │ ├── nsq_consumer/ │ │ │ ├── README.md │ │ │ ├── nsq_consumer.go │ │ │ ├── nsq_consumer_test.go │ │ │ └── sample.conf │ │ ├── nstat/ │ │ │ ├── README.md │ │ │ ├── nstat.go │ │ │ ├── nstat_test.go │ │ │ └── sample.conf │ │ ├── ntpq/ │ │ │ ├── README.md │ │ │ ├── ntpq.go │ │ │ ├── ntpq_test.go │ │ │ ├── sample.conf │ │ │ └── testcases/ │ │ │ ├── bad_float_parse/ │ │ │ │ ├── expected.err │ │ │ │ ├── expected.out │ │ │ │ ├── input.txt │ │ │ │ └── telegraf.conf │ │ │ ├── bad_header/ │ │ │ │ ├── expected.out │ │ │ │ ├── input.txt │ │ │ │ └── telegraf.conf │ │ │ ├── bad_int_parse/ │ │ │ │ ├── expected.err │ │ │ │ ├── expected.out │ │ │ │ ├── input.txt │ │ │ │ └── telegraf.conf │ │ │ ├── bad_when/ │ │ │ │ ├── expected.err │ │ │ │ ├── expected.out │ │ │ │ ├── input.txt │ │ │ │ └── telegraf.conf │ │ │ ├── days/ │ │ │ │ ├── expected.out │ │ │ │ ├── input.txt │ │ │ │ └── telegraf.conf │ │ │ ├── failed/ │ │ │ │ ├── expected.err │ │ │ │ ├── input.err │ │ │ │ ├── input.txt │ │ │ │ └── telegraf.conf │ │ │ ├── hours/ │ │ │ │ ├── expected.out │ │ │ │ ├── input.txt │ │ │ │ └── telegraf.conf │ │ │ ├── issue_2386/ │ │ │ │ ├── expected.out │ │ │ │ ├── input.txt │ │ │ │ └── telegraf.conf │ │ │ ├── long_poll/ │ │ │ │ ├── expected.out │ │ │ │ ├── input.txt │ │ │ │ └── telegraf.conf │ │ │ ├── minutes/ │ │ │ │ ├── expected.out │ │ │ │ ├── input.txt │ │ │ │ └── telegraf.conf │ │ │ ├── missing_delay_column/ │ │ │ │ ├── expected.out │ │ │ │ ├── input.txt │ │ │ │ └── telegraf.conf │ │ │ ├── multi/ │ │ │ │ ├── expected.out │ │ │ │ ├── input.txt │ │ │ │ └── telegraf.conf │ │ │ ├── no_ref_id/ │ │ │ │ ├── expected.out │ │ │ │ ├── input.txt │ │ │ │ └── telegraf.conf │ │ │ ├── pool_when_headers_as_data/ │ │ │ │ ├── expected.err │ │ │ │ ├── expected.out │ │ │ │ ├── input.txt │ │ │ │ └── telegraf.conf │ │ │ ├── pool_when_minus/ │ │ │ │ ├── expected.out │ │ │ │ ├── input.txt │ │ │ │ └── telegraf.conf │ │ │ ├── servers/ │ │ │ │ ├── expected.out │ │ │ │ ├── input_serverA.txt │ │ │ │ ├── input_serverB.txt │ │ │ │ └── telegraf.conf │ │ │ ├── servers_one_fail/ │ │ │ │ ├── expected.err │ │ │ │ ├── expected.out │ │ │ │ ├── input_serverA.txt │ │ │ │ ├── input_serverB.txt │ │ │ │ ├── input_serverC.err │ │ │ │ └── telegraf.conf │ │ │ ├── single/ │ │ │ │ ├── expected.out │ │ │ │ ├── input.txt │ │ │ │ └── telegraf.conf │ │ │ ├── single_reach_count/ │ │ │ │ ├── expected.out │ │ │ │ ├── input.txt │ │ │ │ └── telegraf.conf │ │ │ ├── single_reach_decimal/ │ │ │ │ ├── expected.out │ │ │ │ ├── input.txt │ │ │ │ └── telegraf.conf │ │ │ ├── single_reach_octal/ │ │ │ │ ├── expected.out │ │ │ │ ├── input.txt │ │ │ │ └── telegraf.conf │ │ │ └── single_reach_ratio/ │ │ │ ├── expected.out │ │ │ ├── input.txt │ │ │ └── telegraf.conf │ │ ├── nvidia_smi/ │ │ │ ├── README.md │ │ │ ├── common/ │ │ │ │ └── setters.go │ │ │ ├── nvidia_smi.go │ │ │ ├── nvidia_smi_test.go │ │ │ ├── sample.conf │ │ │ ├── schema_v11/ │ │ │ │ ├── parser.go │ │ │ │ └── types.go │ │ │ ├── schema_v12/ │ │ │ │ ├── parser.go │ │ │ │ └── types.go │ │ │ └── testdata/ │ │ │ ├── a100-sxm4-v12.xml │ │ │ ├── a10g.xml │ │ │ ├── gtx-1070-ti.xml │ │ │ ├── gtx-1660-ti.xml │ │ │ ├── quadro-p2000-v12.xml │ │ │ ├── quadro-p400.xml │ │ │ ├── rtx-3060-v12.xml │ │ │ ├── rtx-3080-v12.xml │ │ │ ├── rtx-3090-v12.xml │ │ │ └── tesla-t4.xml │ │ ├── opcua/ │ │ │ ├── README.md │ │ │ ├── opcua.go │ │ │ ├── opcua_test.go │ │ │ ├── read_client.go │ │ │ └── sample.conf │ │ ├── opcua_listener/ │ │ │ ├── README.md │ │ │ ├── opcua_listener.go │ │ │ ├── opcua_listener_test.go │ │ │ ├── sample.conf │ │ │ └── subscribe_client.go │ │ ├── openldap/ │ │ │ ├── README.md │ │ │ ├── openldap.go │ │ │ ├── openldap_test.go │ │ │ └── sample.conf │ │ ├── openntpd/ │ │ │ ├── README.md │ │ │ ├── openntpd.go │ │ │ ├── openntpd_test.go │ │ │ └── sample.conf │ │ ├── opensearch_query/ │ │ │ ├── README.md │ │ │ ├── aggregation.bucket.go │ │ │ ├── aggregation.go │ │ │ ├── aggregation.metric.go │ │ │ ├── aggregation.response.go │ │ │ ├── opensearch_query.go │ │ │ ├── opensearch_query_test.go │ │ │ ├── query.go │ │ │ ├── sample.conf │ │ │ └── testdata/ │ │ │ └── nginx_logs │ │ ├── opensmtpd/ │ │ │ ├── README.md │ │ │ ├── opensmtpd.go │ │ │ ├── opensmtpd_test.go │ │ │ └── sample.conf │ │ ├── openstack/ │ │ │ ├── README.md │ │ │ ├── openstack.go │ │ │ └── sample.conf │ │ ├── opentelemetry/ │ │ │ ├── README.md │ │ │ ├── grpc_service_profile.go │ │ │ ├── grpc_services.go │ │ │ ├── logger.go │ │ │ ├── opentelemetry.go │ │ │ ├── opentelemetry_test.go │ │ │ ├── sample.conf │ │ │ ├── testcases/ │ │ │ │ └── profiles/ │ │ │ │ ├── expected.out │ │ │ │ ├── profiles.json │ │ │ │ └── telegraf.conf │ │ │ └── writer.go │ │ ├── openweathermap/ │ │ │ ├── README.md │ │ │ ├── openweathermap.go │ │ │ ├── openweathermap_test.go │ │ │ ├── sample.conf │ │ │ ├── testcases/ │ │ │ │ ├── forecast/ │ │ │ │ │ ├── expected.out │ │ │ │ │ ├── response_forecast.json │ │ │ │ │ ├── response_group.json │ │ │ │ │ └── telegraf.conf │ │ │ │ ├── rain_batch/ │ │ │ │ │ ├── expected.out │ │ │ │ │ ├── response_group.json │ │ │ │ │ └── telegraf.conf │ │ │ │ ├── snow_batch/ │ │ │ │ │ ├── expected.out │ │ │ │ │ ├── response_group.json │ │ │ │ │ └── telegraf.conf │ │ │ │ ├── weather/ │ │ │ │ │ ├── expected.out │ │ │ │ │ ├── response_group.json │ │ │ │ │ └── telegraf.conf │ │ │ │ ├── weather_batch/ │ │ │ │ │ ├── expected.out │ │ │ │ │ ├── response_forecast.json │ │ │ │ │ ├── response_group.json │ │ │ │ │ └── telegraf.conf │ │ │ │ └── weather_single/ │ │ │ │ ├── expected.out │ │ │ │ ├── response_forecast.json │ │ │ │ ├── response_weather_2643743.json │ │ │ │ ├── response_weather_524901.json │ │ │ │ ├── response_weather_703448.json │ │ │ │ └── telegraf.conf │ │ │ └── types.go │ │ ├── p4runtime/ │ │ │ ├── README.md │ │ │ ├── p4runtime.go │ │ │ ├── p4runtime_fake_client_test.go │ │ │ ├── p4runtime_test.go │ │ │ └── sample.conf │ │ ├── passenger/ │ │ │ ├── README.md │ │ │ ├── passenger.go │ │ │ ├── passenger_test.go │ │ │ └── sample.conf │ │ ├── pf/ │ │ │ ├── README.md │ │ │ ├── pf.go │ │ │ ├── pf_test.go │ │ │ └── sample.conf │ │ ├── pgbouncer/ │ │ │ ├── README.md │ │ │ ├── pgbouncer.go │ │ │ ├── pgbouncer_test.go │ │ │ └── sample.conf │ │ ├── phpfpm/ │ │ │ ├── README.md │ │ │ ├── child.go │ │ │ ├── fcgi.go │ │ │ ├── fcgi_client.go │ │ │ ├── fcgi_test.go │ │ │ ├── phpfpm.go │ │ │ ├── phpfpm_test.go │ │ │ ├── sample.conf │ │ │ └── testdata/ │ │ │ ├── expected.out │ │ │ └── phpfpm.json │ │ ├── ping/ │ │ │ ├── README.md │ │ │ ├── ping.go │ │ │ ├── ping_notwindows.go │ │ │ ├── ping_test.go │ │ │ ├── ping_windows.go │ │ │ ├── ping_windows_test.go │ │ │ └── sample.conf │ │ ├── postfix/ │ │ │ ├── README.md │ │ │ ├── postfix.go │ │ │ ├── postfix_test.go │ │ │ ├── postfix_windows.go │ │ │ ├── sample.conf │ │ │ ├── stat_ctim.go │ │ │ └── stat_ctimespec.go │ │ ├── postgresql/ │ │ │ ├── README.md │ │ │ ├── postgresql.go │ │ │ ├── postgresql_test.go │ │ │ └── sample.conf │ │ ├── postgresql_extensible/ │ │ │ ├── README.md │ │ │ ├── postgresql_extensible.go │ │ │ ├── postgresql_extensible_test.go │ │ │ ├── sample.conf │ │ │ └── testdata/ │ │ │ └── test.sql │ │ ├── powerdns/ │ │ │ ├── README.md │ │ │ ├── powerdns.go │ │ │ ├── powerdns_linux_test.go │ │ │ ├── powerdns_test.go │ │ │ └── sample.conf │ │ ├── powerdns_recursor/ │ │ │ ├── README.md │ │ │ ├── powerdns_recursor.go │ │ │ ├── powerdns_recursor_test.go │ │ │ ├── protocol_commons.go │ │ │ ├── protocol_v1.go │ │ │ ├── protocol_v2.go │ │ │ ├── protocol_v3.go │ │ │ └── sample.conf │ │ ├── processes/ │ │ │ ├── README.md │ │ │ ├── processes.go │ │ │ ├── processes_notwindows.go │ │ │ ├── processes_test.go │ │ │ ├── processes_windows.go │ │ │ └── sample.conf │ │ ├── procstat/ │ │ │ ├── README.md │ │ │ ├── filter.go │ │ │ ├── native_finder.go │ │ │ ├── native_finder_test.go │ │ │ ├── os_linux.go │ │ │ ├── os_others.go │ │ │ ├── os_windows.go │ │ │ ├── pgrep.go │ │ │ ├── process.go │ │ │ ├── procstat.go │ │ │ ├── procstat_test.go │ │ │ ├── sample.conf │ │ │ └── service_finders.go │ │ ├── prometheus/ │ │ │ ├── README.md │ │ │ ├── consul.go │ │ │ ├── http_service_discovery.go │ │ │ ├── http_service_discovery_test.go │ │ │ ├── kubernetes.go │ │ │ ├── kubernetes_test.go │ │ │ ├── prometheus.go │ │ │ ├── prometheus_test.go │ │ │ ├── sample.conf │ │ │ └── testcases/ │ │ │ └── service_discovery/ │ │ │ ├── http-services.json │ │ │ └── telegraf.conf │ │ ├── promql/ │ │ │ ├── README.md │ │ │ ├── client.go │ │ │ ├── promql.go │ │ │ ├── promql_test.go │ │ │ ├── query.go │ │ │ ├── sample.conf │ │ │ └── sample.conf.in │ │ ├── proxmox/ │ │ │ ├── README.md │ │ │ ├── proxmox.go │ │ │ ├── proxmox_test.go │ │ │ ├── sample.conf │ │ │ └── structs.go │ │ ├── puppetagent/ │ │ │ ├── README.md │ │ │ ├── last_run_summary.yaml │ │ │ ├── puppetagent.go │ │ │ ├── puppetagent_test.go │ │ │ └── sample.conf │ │ ├── rabbitmq/ │ │ │ ├── README.md │ │ │ ├── rabbitmq.go │ │ │ ├── rabbitmq_test.go │ │ │ ├── sample.conf │ │ │ └── testdata/ │ │ │ ├── set1/ │ │ │ │ ├── exchanges.json │ │ │ │ ├── federation-links.json │ │ │ │ ├── memory.json │ │ │ │ ├── nodes.json │ │ │ │ ├── overview.json │ │ │ │ └── queues.json │ │ │ └── set2/ │ │ │ ├── exchanges.json │ │ │ ├── federation-links.json │ │ │ ├── memory.json │ │ │ ├── nodes.json │ │ │ ├── overview.json │ │ │ └── queues.json │ │ ├── radius/ │ │ │ ├── README.md │ │ │ ├── radius.go │ │ │ ├── radius_test.go │ │ │ ├── sample.conf │ │ │ └── testdata/ │ │ │ ├── invalidSourceIP/ │ │ │ │ ├── clients.conf │ │ │ │ ├── mods-config/ │ │ │ │ │ └── files/ │ │ │ │ │ └── authorize │ │ │ │ └── radiusd.conf │ │ │ └── raddb/ │ │ │ ├── clients.conf │ │ │ ├── mods-config/ │ │ │ │ └── files/ │ │ │ │ └── authorize │ │ │ └── radiusd.conf │ │ ├── raindrops/ │ │ │ ├── README.md │ │ │ ├── raindrops.go │ │ │ ├── raindrops_test.go │ │ │ └── sample.conf │ │ ├── ras/ │ │ │ ├── README.md │ │ │ ├── ras.go │ │ │ ├── ras_notlinux.go │ │ │ ├── ras_test.go │ │ │ └── sample.conf │ │ ├── ravendb/ │ │ │ ├── README.md │ │ │ ├── ravendb.go │ │ │ ├── ravendb_dto.go │ │ │ ├── ravendb_test.go │ │ │ ├── sample.conf │ │ │ └── testdata/ │ │ │ ├── collections_full.json │ │ │ ├── collections_min.json │ │ │ ├── databases_full.json │ │ │ ├── databases_min.json │ │ │ ├── indexes_full.json │ │ │ ├── indexes_min.json │ │ │ ├── server_full.json │ │ │ └── server_min.json │ │ ├── redfish/ │ │ │ ├── README.md │ │ │ ├── redfish.go │ │ │ ├── redfish_test.go │ │ │ ├── sample.conf │ │ │ └── testdata/ │ │ │ ├── dell_chassis.json │ │ │ ├── dell_chassisinvalid.json │ │ │ ├── dell_power.json │ │ │ ├── dell_powerinvalid.json │ │ │ ├── dell_systems.json │ │ │ ├── dell_systemsinvalid.json │ │ │ ├── dell_thermal.json │ │ │ ├── dell_thermalinvalid.json │ │ │ ├── hp_chassis.json │ │ │ ├── hp_power.json │ │ │ ├── hp_powerinvalid.json │ │ │ ├── hp_systems.json │ │ │ ├── hp_systemsinvalid.json │ │ │ ├── hp_thermal.json │ │ │ ├── hp_thermal_ilo4.json │ │ │ └── hp_thermalinvalid.json │ │ ├── redis/ │ │ │ ├── README.md │ │ │ ├── redis.go │ │ │ ├── redis_test.go │ │ │ └── sample.conf │ │ ├── redis_sentinel/ │ │ │ ├── README.md │ │ │ ├── redis_sentinel.go │ │ │ ├── redis_sentinel_test.go │ │ │ ├── redis_sentinel_types.go │ │ │ ├── sample.conf │ │ │ └── testdata/ │ │ │ └── sentinel.info.response │ │ ├── registry.go │ │ ├── rethinkdb/ │ │ │ ├── README.md │ │ │ ├── rethinkdb.go │ │ │ ├── rethinkdb_data.go │ │ │ ├── rethinkdb_data_test.go │ │ │ ├── rethinkdb_server.go │ │ │ ├── rethinkdb_server_test.go │ │ │ ├── rethinkdb_test.go │ │ │ └── sample.conf │ │ ├── riak/ │ │ │ ├── README.md │ │ │ ├── riak.go │ │ │ ├── riak_test.go │ │ │ └── sample.conf │ │ ├── riemann_listener/ │ │ │ ├── README.md │ │ │ ├── riemann_listener.go │ │ │ ├── riemann_listener_test.go │ │ │ └── sample.conf │ │ ├── s7comm/ │ │ │ ├── README.md │ │ │ ├── s7comm.go │ │ │ ├── s7comm_test.go │ │ │ ├── sample.conf │ │ │ └── type_conversions.go │ │ ├── salesforce/ │ │ │ ├── README.md │ │ │ ├── salesforce.go │ │ │ ├── salesforce_test.go │ │ │ └── sample.conf │ │ ├── sensors/ │ │ │ ├── README.md │ │ │ ├── sample.conf │ │ │ ├── sensors.go │ │ │ ├── sensors_notlinux.go │ │ │ └── sensors_test.go │ │ ├── sflow/ │ │ │ ├── README.md │ │ │ ├── binaryio/ │ │ │ │ ├── minreader.go │ │ │ │ └── minreader_test.go │ │ │ ├── decoder_test.go │ │ │ ├── metricencoder.go │ │ │ ├── packetdecoder.go │ │ │ ├── packetdecoder_test.go │ │ │ ├── sample.conf │ │ │ ├── sflow.go │ │ │ ├── sflow_test.go │ │ │ ├── types.go │ │ │ └── types_test.go │ │ ├── sip/ │ │ │ ├── README.md │ │ │ ├── sample.conf │ │ │ ├── sample.conf.in │ │ │ ├── sip.go │ │ │ └── sip_test.go │ │ ├── slab/ │ │ │ ├── README.md │ │ │ ├── sample.conf │ │ │ ├── slab.go │ │ │ ├── slab_notlinux.go │ │ │ ├── slab_test.go │ │ │ └── testdata/ │ │ │ └── slabinfo │ │ ├── slurm/ │ │ │ ├── README.md │ │ │ ├── sample.conf │ │ │ ├── sample.conf.in │ │ │ ├── slurm.go │ │ │ ├── slurm_test.go │ │ │ └── testcases/ │ │ │ ├── gather/ │ │ │ │ ├── expected.out │ │ │ │ ├── responses/ │ │ │ │ │ ├── diag.json │ │ │ │ │ ├── jobs.json │ │ │ │ │ ├── nodes.json │ │ │ │ │ ├── partitions.json │ │ │ │ │ └── reservations.json │ │ │ │ └── telegraf.conf │ │ │ └── panic/ │ │ │ ├── responses/ │ │ │ │ ├── diag.json │ │ │ │ ├── jobs.json │ │ │ │ ├── nodes.json │ │ │ │ ├── partitions.json │ │ │ │ └── reservations.json │ │ │ └── telegraf.conf │ │ ├── smart/ │ │ │ ├── README.md │ │ │ ├── sample.conf │ │ │ ├── smart.go │ │ │ └── smart_test.go │ │ ├── smartctl/ │ │ │ ├── README.md │ │ │ ├── sample.conf │ │ │ ├── smartctl.go │ │ │ ├── smartctl_device.go │ │ │ ├── smartctl_json.go │ │ │ ├── smartctl_scan.go │ │ │ ├── smartctl_test.go │ │ │ ├── testcases_device/ │ │ │ │ ├── megaraid/ │ │ │ │ │ ├── device │ │ │ │ │ ├── deviceType │ │ │ │ │ ├── expected.out │ │ │ │ │ └── response.json │ │ │ │ ├── nvme/ │ │ │ │ │ ├── device │ │ │ │ │ ├── deviceType │ │ │ │ │ ├── expected.out │ │ │ │ │ └── response.json │ │ │ │ ├── scsi/ │ │ │ │ │ ├── device │ │ │ │ │ ├── deviceType │ │ │ │ │ ├── expected.out │ │ │ │ │ └── response.json │ │ │ │ ├── scsi_extended/ │ │ │ │ │ ├── device │ │ │ │ │ ├── deviceType │ │ │ │ │ ├── expected.out │ │ │ │ │ └── response.json │ │ │ │ └── usb/ │ │ │ │ ├── device │ │ │ │ ├── deviceType │ │ │ │ ├── expected.out │ │ │ │ └── response.json │ │ │ └── testcases_scan/ │ │ │ ├── all/ │ │ │ │ ├── expected.out │ │ │ │ ├── response.json │ │ │ │ └── telegraf.toml │ │ │ ├── exclude/ │ │ │ │ ├── expected.out │ │ │ │ ├── response.json │ │ │ │ └── telegraf.toml │ │ │ ├── include/ │ │ │ │ ├── expected.out │ │ │ │ ├── response.json │ │ │ │ └── telegraf.toml │ │ │ └── megaraid/ │ │ │ ├── expected.out │ │ │ ├── response.json │ │ │ └── telegraf.toml │ │ ├── snmp/ │ │ │ ├── README.md │ │ │ ├── sample.conf │ │ │ ├── snmp.go │ │ │ └── snmp_test.go │ │ ├── snmp_trap/ │ │ │ ├── README.md │ │ │ ├── gosmi.go │ │ │ ├── netsnmp.go │ │ │ ├── sample.conf │ │ │ ├── snmp_trap.go │ │ │ └── snmp_trap_test.go │ │ ├── socket_listener/ │ │ │ ├── README.md │ │ │ ├── sample.conf │ │ │ ├── sample.conf.in │ │ │ ├── socket_listener.go │ │ │ ├── socket_listener_test.go │ │ │ └── testcases/ │ │ │ ├── invalid_line_format/ │ │ │ │ ├── expected.err │ │ │ │ ├── expected.out │ │ │ │ ├── sequence.json │ │ │ │ └── telegraf.conf │ │ │ ├── powerdns/ │ │ │ │ ├── dnsmessage.proto │ │ │ │ ├── expected.out │ │ │ │ ├── sequence.json │ │ │ │ └── telegraf.conf │ │ │ ├── splitting_delimiter/ │ │ │ │ ├── expected.out │ │ │ │ ├── sequence.json │ │ │ │ └── telegraf.conf │ │ │ ├── splitting_fixed_length/ │ │ │ │ ├── expected.out │ │ │ │ ├── sequence.json │ │ │ │ └── telegraf.conf │ │ │ ├── splitting_newline/ │ │ │ │ ├── expected.out │ │ │ │ ├── sequence.json │ │ │ │ └── telegraf.conf │ │ │ ├── splitting_null/ │ │ │ │ ├── expected.out │ │ │ │ ├── sequence.json │ │ │ │ └── telegraf.conf │ │ │ ├── splitting_variable_length/ │ │ │ │ ├── expected.out │ │ │ │ ├── sequence.json │ │ │ │ └── telegraf.conf │ │ │ └── timeout/ │ │ │ ├── sequence.json │ │ │ └── telegraf.conf │ │ ├── socketstat/ │ │ │ ├── README.md │ │ │ ├── sample.conf │ │ │ ├── socketstat.go │ │ │ ├── socketstat_test.go │ │ │ ├── socketstat_windows.go │ │ │ └── testdata/ │ │ │ ├── tcp_no_sockets.txt │ │ │ ├── tcp_traffic.txt │ │ │ ├── udp_no_sockets.txt │ │ │ └── udp_traffic.txt │ │ ├── solr/ │ │ │ ├── README.md │ │ │ ├── api.go │ │ │ ├── sample.conf │ │ │ ├── solr.go │ │ │ ├── solr_test.go │ │ │ ├── testcases/ │ │ │ │ ├── integration-v6.result │ │ │ │ ├── integration-v7.result │ │ │ │ ├── integration-v8.result │ │ │ │ ├── integration-v9.result │ │ │ │ ├── no_core_data/ │ │ │ │ │ ├── admin/ │ │ │ │ │ │ └── cores.json │ │ │ │ │ ├── core1/ │ │ │ │ │ │ └── admin/ │ │ │ │ │ │ └── mbeans.json │ │ │ │ │ ├── expected.out │ │ │ │ │ ├── main/ │ │ │ │ │ │ └── admin/ │ │ │ │ │ │ └── mbeans.json │ │ │ │ │ └── telegraf.conf │ │ │ │ ├── v3.5/ │ │ │ │ │ ├── admin/ │ │ │ │ │ │ └── cores.json │ │ │ │ │ ├── core1/ │ │ │ │ │ │ └── admin/ │ │ │ │ │ │ └── mbeans.json │ │ │ │ │ ├── expected.out │ │ │ │ │ ├── main/ │ │ │ │ │ │ └── admin/ │ │ │ │ │ │ └── mbeans.json │ │ │ │ │ └── telegraf.conf │ │ │ │ ├── v4.3/ │ │ │ │ │ ├── admin/ │ │ │ │ │ │ └── cores.json │ │ │ │ │ ├── core1/ │ │ │ │ │ │ └── admin/ │ │ │ │ │ │ └── mbeans.json │ │ │ │ │ ├── expected.out │ │ │ │ │ ├── main/ │ │ │ │ │ │ └── admin/ │ │ │ │ │ │ └── mbeans.json │ │ │ │ │ └── telegraf.conf │ │ │ │ └── v7/ │ │ │ │ ├── admin/ │ │ │ │ │ └── cores.json │ │ │ │ ├── expected.out │ │ │ │ ├── main/ │ │ │ │ │ └── admin/ │ │ │ │ │ └── mbeans.json │ │ │ │ └── telegraf.conf │ │ │ ├── types.go │ │ │ └── util.go │ │ ├── sql/ │ │ │ ├── README.md │ │ │ ├── drivers.go │ │ │ ├── drivers_sqlite.go │ │ │ ├── sample.conf │ │ │ ├── sql.go │ │ │ ├── sql_test.go │ │ │ └── testdata/ │ │ │ ├── clickhouse/ │ │ │ │ └── expected.sql │ │ │ ├── mariadb/ │ │ │ │ └── expected.sql │ │ │ └── postgres/ │ │ │ └── expected.sql │ │ ├── sqlserver/ │ │ │ ├── README.md │ │ │ ├── azurearcsqlmiqueries.go │ │ │ ├── azurearcsqlmiqueries_test.go │ │ │ ├── azuresqldbqueries.go │ │ │ ├── azuresqldbqueries_test.go │ │ │ ├── azuresqlmanagedqueries.go │ │ │ ├── azuresqlmanagedqueries_test.go │ │ │ ├── azuresqlpoolqueries.go │ │ │ ├── azuresqlpoolqueries_test.go │ │ │ ├── azuretoken.go │ │ │ ├── connectionstring.go │ │ │ ├── sample.conf │ │ │ ├── sqlserver.go │ │ │ ├── sqlserver_test.go │ │ │ └── sqlserverqueries.go │ │ ├── stackdriver/ │ │ │ ├── README.md │ │ │ ├── sample.conf │ │ │ ├── stackdriver.go │ │ │ └── stackdriver_test.go │ │ ├── statsd/ │ │ │ ├── README.md │ │ │ ├── datadog.go │ │ │ ├── datadog_test.go │ │ │ ├── running_stats.go │ │ │ ├── running_stats_test.go │ │ │ ├── sample.conf │ │ │ ├── statsd.go │ │ │ └── statsd_test.go │ │ ├── supervisor/ │ │ │ ├── README.md │ │ │ ├── sample.conf │ │ │ ├── supervisor.go │ │ │ ├── supervisor_test.go │ │ │ └── testdata/ │ │ │ └── supervisord.conf │ │ ├── suricata/ │ │ │ ├── README.md │ │ │ ├── sample.conf │ │ │ ├── suricata.go │ │ │ ├── suricata_test.go │ │ │ └── testdata/ │ │ │ ├── test1.json │ │ │ ├── test2.json │ │ │ ├── test3.json │ │ │ └── v2/ │ │ │ ├── alert.json │ │ │ ├── dns.json │ │ │ ├── drop.json │ │ │ ├── flow.json │ │ │ ├── http.json │ │ │ └── status.json │ │ ├── swap/ │ │ │ ├── README.md │ │ │ ├── sample.conf │ │ │ ├── swap.go │ │ │ └── swap_test.go │ │ ├── synproxy/ │ │ │ ├── README.md │ │ │ ├── sample.conf │ │ │ ├── synproxy.go │ │ │ ├── synproxy_notlinux.go │ │ │ └── synproxy_test.go │ │ ├── syslog/ │ │ │ ├── README.md │ │ │ ├── sample.conf │ │ │ ├── sample.conf.in │ │ │ ├── syslog.go │ │ │ ├── syslog_test.go │ │ │ └── testcases/ │ │ │ ├── non_transparent_best_effort_tcp_1st_avg_ok/ │ │ │ │ ├── expected.out │ │ │ │ ├── input.txt │ │ │ │ └── telegraf.conf │ │ │ ├── non_transparent_best_effort_tcp_1st_min_ok_2nd_min_ok/ │ │ │ │ ├── expected.out │ │ │ │ ├── input.txt │ │ │ │ └── telegraf.conf │ │ │ ├── non_transparent_best_effort_tcptls_1st_avg_ok/ │ │ │ │ ├── expected.out │ │ │ │ ├── input.txt │ │ │ │ └── telegraf.conf │ │ │ ├── non_transparent_best_effort_tcptls_1st_min_ok_2nd_min_ok/ │ │ │ │ ├── expected.out │ │ │ │ ├── input.txt │ │ │ │ └── telegraf.conf │ │ │ ├── non_transparent_best_effort_unix/ │ │ │ │ ├── expected.out │ │ │ │ ├── input.txt │ │ │ │ └── telegraf.conf │ │ │ ├── non_transparent_best_effort_unixtls/ │ │ │ │ ├── expected.out │ │ │ │ ├── input.txt │ │ │ │ └── telegraf.conf │ │ │ ├── non_transparent_strict_tcp_1st_avg_ok/ │ │ │ │ ├── expected.out │ │ │ │ ├── input.txt │ │ │ │ └── telegraf.conf │ │ │ ├── non_transparent_strict_tcp_1st_min_ok_2nd_min_ok/ │ │ │ │ ├── expected.out │ │ │ │ ├── input.txt │ │ │ │ └── telegraf.conf │ │ │ ├── non_transparent_strict_tcptls_1st_avg_ok/ │ │ │ │ ├── expected.out │ │ │ │ ├── input.txt │ │ │ │ └── telegraf.conf │ │ │ ├── non_transparent_strict_tcptls_1st_min_ok_2nd_min_ok/ │ │ │ │ ├── expected.out │ │ │ │ ├── input.txt │ │ │ │ └── telegraf.conf │ │ │ ├── non_transparent_strict_unix/ │ │ │ │ ├── expected.out │ │ │ │ ├── input.txt │ │ │ │ └── telegraf.conf │ │ │ ├── non_transparent_strict_unixtls/ │ │ │ │ ├── expected.out │ │ │ │ ├── input.txt │ │ │ │ └── telegraf.conf │ │ │ ├── octet_counting_best_effort_tcp_1st_avg_ok/ │ │ │ │ ├── expected.out │ │ │ │ ├── input.txt │ │ │ │ └── telegraf.conf │ │ │ ├── octet_counting_best_effort_tcp_1st_max_ok/ │ │ │ │ ├── expected.out │ │ │ │ ├── input.txt │ │ │ │ └── telegraf.conf │ │ │ ├── octet_counting_best_effort_tcp_1st_min_ok/ │ │ │ │ ├── expected.out │ │ │ │ ├── input.txt │ │ │ │ └── telegraf.conf │ │ │ ├── octet_counting_best_effort_tcp_1st_min_ok_2nd_min_ok/ │ │ │ │ ├── expected.out │ │ │ │ ├── input.txt │ │ │ │ └── telegraf.conf │ │ │ ├── octet_counting_best_effort_tcp_1st_newline_ok/ │ │ │ │ ├── expected.out │ │ │ │ ├── input.txt │ │ │ │ └── telegraf.conf │ │ │ ├── octet_counting_best_effort_tcp_1st_underflow_malfunction/ │ │ │ │ ├── expected.err │ │ │ │ ├── expected.out │ │ │ │ ├── input.txt │ │ │ │ └── telegraf.conf │ │ │ ├── octet_counting_best_effort_tcp_1st_underflow_nok/ │ │ │ │ ├── expected.err │ │ │ │ ├── expected.out │ │ │ │ ├── input.txt │ │ │ │ └── telegraf.conf │ │ │ ├── octet_counting_best_effort_tcp_1st_utf8_ok/ │ │ │ │ ├── expected.out │ │ │ │ ├── input.txt │ │ │ │ └── telegraf.conf │ │ │ ├── octet_counting_best_effort_tcptls/ │ │ │ │ ├── expected.out │ │ │ │ ├── input.txt │ │ │ │ └── telegraf.conf │ │ │ ├── octet_counting_best_effort_unix/ │ │ │ │ ├── expected.out │ │ │ │ ├── input.txt │ │ │ │ └── telegraf.conf │ │ │ ├── octet_counting_best_effort_unixtls/ │ │ │ │ ├── expected.out │ │ │ │ ├── input.txt │ │ │ │ └── telegraf.conf │ │ │ ├── octet_counting_maxlength_ok/ │ │ │ │ ├── expected.out │ │ │ │ ├── input.txt │ │ │ │ └── telegraf.conf │ │ │ ├── octet_counting_strict_tcp_1st_avg_ok/ │ │ │ │ ├── expected.out │ │ │ │ ├── input.txt │ │ │ │ └── telegraf.conf │ │ │ ├── octet_counting_strict_tcp_1st_max_ok/ │ │ │ │ ├── expected.out │ │ │ │ ├── input.txt │ │ │ │ └── telegraf.conf │ │ │ ├── octet_counting_strict_tcp_1st_min_ok/ │ │ │ │ ├── expected.out │ │ │ │ ├── input.txt │ │ │ │ └── telegraf.conf │ │ │ ├── octet_counting_strict_tcp_1st_min_ok_2nd_min_ok/ │ │ │ │ ├── expected.out │ │ │ │ ├── input.txt │ │ │ │ └── telegraf.conf │ │ │ ├── octet_counting_strict_tcp_1st_newline_ok/ │ │ │ │ ├── expected.out │ │ │ │ ├── input.txt │ │ │ │ └── telegraf.conf │ │ │ ├── octet_counting_strict_tcp_1st_underflow_malfunction/ │ │ │ │ ├── expected.err │ │ │ │ ├── input.txt │ │ │ │ └── telegraf.conf │ │ │ ├── octet_counting_strict_tcp_1st_underflow_nok/ │ │ │ │ ├── expected.err │ │ │ │ ├── input.txt │ │ │ │ └── telegraf.conf │ │ │ ├── octet_counting_strict_tcp_1st_utf8_ok/ │ │ │ │ ├── expected.out │ │ │ │ ├── input.txt │ │ │ │ └── telegraf.conf │ │ │ ├── octet_counting_strict_tcptls/ │ │ │ │ ├── expected.out │ │ │ │ ├── input.txt │ │ │ │ └── telegraf.conf │ │ │ ├── octet_counting_strict_unix/ │ │ │ │ ├── expected.out │ │ │ │ ├── input.txt │ │ │ │ └── telegraf.conf │ │ │ ├── octet_counting_strict_unixtls/ │ │ │ │ ├── expected.out │ │ │ │ ├── input.txt │ │ │ │ └── telegraf.conf │ │ │ ├── rfc3164_best_effort_udp/ │ │ │ │ ├── expected.out │ │ │ │ ├── input.txt │ │ │ │ └── telegraf.conf │ │ │ ├── rfc3164_non_transparent_strict_tcp/ │ │ │ │ ├── expected.out │ │ │ │ ├── input.txt │ │ │ │ └── telegraf.conf │ │ │ ├── rfc3164_octet_counting_strict_tcp/ │ │ │ │ ├── expected.out │ │ │ │ ├── input.txt │ │ │ │ └── telegraf.conf │ │ │ ├── rfc3164_strict_udp/ │ │ │ │ ├── expected.out │ │ │ │ ├── input.txt │ │ │ │ └── telegraf.conf │ │ │ ├── rfc5424_best_effort_toolong_appname/ │ │ │ │ ├── expected.err │ │ │ │ ├── expected.out │ │ │ │ ├── input.txt │ │ │ │ └── telegraf.conf │ │ │ ├── rfc5424_best_effort_udp/ │ │ │ │ ├── expected.out │ │ │ │ ├── input.txt │ │ │ │ └── telegraf.conf │ │ │ ├── rfc5424_best_effort_udp_average/ │ │ │ │ ├── expected.out │ │ │ │ ├── input.txt │ │ │ │ └── telegraf.conf │ │ │ ├── rfc5424_best_effort_udp_max/ │ │ │ │ ├── expected.out │ │ │ │ ├── input.txt │ │ │ │ └── telegraf.conf │ │ │ ├── rfc5424_best_effort_udp_min_incomplete/ │ │ │ │ ├── expected.err │ │ │ │ ├── expected.out │ │ │ │ ├── input.txt │ │ │ │ └── telegraf.conf │ │ │ ├── rfc5424_best_effort_udp_one_per_packet/ │ │ │ │ ├── expected.out │ │ │ │ ├── input.txt │ │ │ │ └── telegraf.conf │ │ │ ├── rfc5424_best_effort_udp_trim_message/ │ │ │ │ ├── expected.out │ │ │ │ ├── input.txt │ │ │ │ └── telegraf.conf │ │ │ ├── rfc5424_long_appname/ │ │ │ │ ├── expected.out │ │ │ │ ├── input.txt │ │ │ │ └── telegraf.conf │ │ │ ├── rfc5424_strict_toolong_appname/ │ │ │ │ ├── expected.err │ │ │ │ ├── input.txt │ │ │ │ └── telegraf.conf │ │ │ ├── rfc5424_strict_udp/ │ │ │ │ ├── expected.out │ │ │ │ ├── input.txt │ │ │ │ └── telegraf.conf │ │ │ ├── rfc5424_strict_udp_average/ │ │ │ │ ├── expected.out │ │ │ │ ├── input.txt │ │ │ │ └── telegraf.conf │ │ │ ├── rfc5424_strict_udp_max/ │ │ │ │ ├── expected.out │ │ │ │ ├── input.txt │ │ │ │ └── telegraf.conf │ │ │ ├── rfc5424_strict_udp_min_incomplete/ │ │ │ │ ├── expected.err │ │ │ │ ├── input.txt │ │ │ │ └── telegraf.conf │ │ │ ├── rfc5424_strict_udp_one_per_packet/ │ │ │ │ ├── expected.out │ │ │ │ ├── input.txt │ │ │ │ └── telegraf.conf │ │ │ └── rfc5424_strict_udp_trim_message/ │ │ │ ├── expected.out │ │ │ ├── input.txt │ │ │ └── telegraf.conf │ │ ├── sysstat/ │ │ │ ├── README.md │ │ │ ├── sample.conf │ │ │ ├── sysstat.go │ │ │ ├── sysstat_interval_test.go │ │ │ ├── sysstat_notlinux.go │ │ │ └── sysstat_test.go │ │ ├── system/ │ │ │ ├── README.md │ │ │ ├── sample.conf │ │ │ ├── system.go │ │ │ └── system_test.go │ │ ├── systemd_units/ │ │ │ ├── README.md │ │ │ ├── sample.conf │ │ │ ├── systemd_units.go │ │ │ ├── systemd_units_notlinux.go │ │ │ └── systemd_units_test.go │ │ ├── tacacs/ │ │ │ ├── README.md │ │ │ ├── sample.conf │ │ │ ├── tacacs.go │ │ │ └── tacacs_test.go │ │ ├── tail/ │ │ │ ├── README.md │ │ │ ├── multiline.go │ │ │ ├── multiline_test.go │ │ │ ├── sample.conf │ │ │ ├── tail.go │ │ │ ├── tail_solaris.go │ │ │ ├── tail_test.go │ │ │ └── testdata/ │ │ │ ├── cpu-utf-16be.influx │ │ │ ├── cpu-utf-16le.influx │ │ │ ├── cpu-utf-8.influx │ │ │ ├── multiline_quoted_backticks.csv │ │ │ ├── multiline_quoted_double.csv │ │ │ ├── multiline_quoted_messed_up.csv │ │ │ ├── multiline_quoted_missing_close.csv │ │ │ ├── multiline_quoted_single.csv │ │ │ ├── test-patterns │ │ │ └── test_multiline.log │ │ ├── teamspeak/ │ │ │ ├── README.md │ │ │ ├── sample.conf │ │ │ ├── teamspeak.go │ │ │ └── teamspeak_test.go │ │ ├── temp/ │ │ │ ├── README.md │ │ │ ├── sample.conf │ │ │ ├── temp.go │ │ │ ├── temp_linux.go │ │ │ ├── temp_notlinux.go │ │ │ ├── temp_test.go │ │ │ └── testcases/ │ │ │ ├── general/ │ │ │ │ ├── expected_v1.out │ │ │ │ ├── expected_v2.out │ │ │ │ ├── sys/ │ │ │ │ │ └── class/ │ │ │ │ │ └── hwmon/ │ │ │ │ │ ├── hwmon0/ │ │ │ │ │ │ ├── name │ │ │ │ │ │ ├── temp1_alarm │ │ │ │ │ │ ├── temp1_crit │ │ │ │ │ │ ├── temp1_input │ │ │ │ │ │ ├── temp1_label │ │ │ │ │ │ ├── temp1_max │ │ │ │ │ │ ├── temp1_min │ │ │ │ │ │ ├── temp2_input │ │ │ │ │ │ ├── temp2_label │ │ │ │ │ │ ├── temp2_max │ │ │ │ │ │ ├── temp2_min │ │ │ │ │ │ ├── temp3_input │ │ │ │ │ │ ├── temp3_label │ │ │ │ │ │ ├── temp3_max │ │ │ │ │ │ └── temp3_min │ │ │ │ │ └── hwmon1/ │ │ │ │ │ ├── name │ │ │ │ │ ├── temp1_input │ │ │ │ │ ├── temp1_label │ │ │ │ │ ├── temp3_input │ │ │ │ │ ├── temp3_label │ │ │ │ │ └── uevent │ │ │ │ └── telegraf.conf │ │ │ ├── with_device_tag/ │ │ │ │ ├── expected_v1.out │ │ │ │ ├── expected_v2.out │ │ │ │ ├── sys/ │ │ │ │ │ └── class/ │ │ │ │ │ └── hwmon/ │ │ │ │ │ ├── hwmon0/ │ │ │ │ │ │ ├── name │ │ │ │ │ │ ├── temp1_alarm │ │ │ │ │ │ ├── temp1_crit │ │ │ │ │ │ ├── temp1_input │ │ │ │ │ │ ├── temp1_label │ │ │ │ │ │ ├── temp1_max │ │ │ │ │ │ ├── temp1_min │ │ │ │ │ │ ├── temp2_input │ │ │ │ │ │ ├── temp2_label │ │ │ │ │ │ ├── temp2_max │ │ │ │ │ │ ├── temp2_min │ │ │ │ │ │ ├── temp3_input │ │ │ │ │ │ ├── temp3_label │ │ │ │ │ │ ├── temp3_max │ │ │ │ │ │ ├── temp3_min │ │ │ │ │ │ └── uevent │ │ │ │ │ ├── hwmon1/ │ │ │ │ │ │ ├── name │ │ │ │ │ │ ├── temp1_alarm │ │ │ │ │ │ ├── temp1_crit │ │ │ │ │ │ ├── temp1_input │ │ │ │ │ │ ├── temp1_label │ │ │ │ │ │ ├── temp1_max │ │ │ │ │ │ ├── temp1_min │ │ │ │ │ │ ├── temp2_input │ │ │ │ │ │ ├── temp2_label │ │ │ │ │ │ ├── temp2_max │ │ │ │ │ │ ├── temp2_min │ │ │ │ │ │ ├── temp3_input │ │ │ │ │ │ ├── temp3_label │ │ │ │ │ │ ├── temp3_max │ │ │ │ │ │ ├── temp3_min │ │ │ │ │ │ └── uevent │ │ │ │ │ └── hwmon2/ │ │ │ │ │ ├── name │ │ │ │ │ ├── temp1_input │ │ │ │ │ ├── temp1_label │ │ │ │ │ ├── temp3_input │ │ │ │ │ ├── temp3_label │ │ │ │ │ └── uevent │ │ │ │ └── telegraf.conf │ │ │ └── with_name/ │ │ │ ├── expected_v1.out │ │ │ ├── expected_v2.out │ │ │ ├── sys/ │ │ │ │ └── class/ │ │ │ │ └── hwmon/ │ │ │ │ ├── hwmon0/ │ │ │ │ │ ├── name │ │ │ │ │ ├── temp1_alarm │ │ │ │ │ ├── temp1_crit │ │ │ │ │ ├── temp1_input │ │ │ │ │ ├── temp1_label │ │ │ │ │ ├── temp1_max │ │ │ │ │ ├── temp1_min │ │ │ │ │ ├── temp2_input │ │ │ │ │ ├── temp2_label │ │ │ │ │ ├── temp2_max │ │ │ │ │ ├── temp2_min │ │ │ │ │ ├── temp3_input │ │ │ │ │ ├── temp3_label │ │ │ │ │ ├── temp3_max │ │ │ │ │ ├── temp3_min │ │ │ │ │ └── uevent │ │ │ │ ├── hwmon1/ │ │ │ │ │ ├── name │ │ │ │ │ ├── temp1_alarm │ │ │ │ │ ├── temp1_crit │ │ │ │ │ ├── temp1_input │ │ │ │ │ ├── temp1_label │ │ │ │ │ ├── temp1_max │ │ │ │ │ ├── temp1_min │ │ │ │ │ ├── temp2_input │ │ │ │ │ ├── temp2_label │ │ │ │ │ ├── temp2_max │ │ │ │ │ ├── temp2_min │ │ │ │ │ ├── temp3_input │ │ │ │ │ ├── temp3_label │ │ │ │ │ ├── temp3_max │ │ │ │ │ ├── temp3_min │ │ │ │ │ └── uevent │ │ │ │ └── hwmon2/ │ │ │ │ ├── name │ │ │ │ ├── temp1_input │ │ │ │ ├── temp1_label │ │ │ │ ├── temp3_input │ │ │ │ ├── temp3_label │ │ │ │ └── uevent │ │ │ └── telegraf.conf │ │ ├── tengine/ │ │ │ ├── README.md │ │ │ ├── sample.conf │ │ │ ├── tengine.go │ │ │ └── tengine_test.go │ │ ├── timex/ │ │ │ ├── README.md │ │ │ ├── sample.conf │ │ │ ├── timex.go │ │ │ ├── timex_notlinux.go │ │ │ └── timex_test.go │ │ ├── tomcat/ │ │ │ ├── README.md │ │ │ ├── sample.conf │ │ │ ├── tomcat.go │ │ │ └── tomcat_test.go │ │ ├── trig/ │ │ │ ├── README.md │ │ │ ├── sample.conf │ │ │ ├── trig.go │ │ │ └── trig_test.go │ │ ├── turbostat/ │ │ │ ├── README.md │ │ │ ├── sample.conf │ │ │ ├── testcases/ │ │ │ │ ├── amd-r7-9700x/ │ │ │ │ │ ├── expected.out │ │ │ │ │ ├── input.txt │ │ │ │ │ └── telegraf.conf │ │ │ │ └── intel-unknown/ │ │ │ │ ├── expected.out │ │ │ │ ├── input.txt │ │ │ │ └── telegraf.conf │ │ │ ├── turbostat.go │ │ │ ├── turbostat_notamd64linux.go │ │ │ └── turbostat_test.go │ │ ├── twemproxy/ │ │ │ ├── README.md │ │ │ ├── sample.conf │ │ │ ├── twemproxy.go │ │ │ └── twemproxy_test.go │ │ ├── unbound/ │ │ │ ├── README.md │ │ │ ├── sample.conf │ │ │ ├── unbound.go │ │ │ └── unbound_test.go │ │ ├── upsd/ │ │ │ ├── README.md │ │ │ ├── sample.conf │ │ │ ├── testcases/ │ │ │ │ ├── CyberPowerSystems_CP900EPFCLCD/ │ │ │ │ │ ├── expected.out │ │ │ │ │ ├── telegraf.conf │ │ │ │ │ ├── types.dev │ │ │ │ │ └── variables.dev │ │ │ │ ├── CyberPowerSystems_CP900EPFCLCD_additional/ │ │ │ │ │ ├── expected.out │ │ │ │ │ ├── telegraf.conf │ │ │ │ │ ├── types.dev │ │ │ │ │ └── variables.dev │ │ │ │ ├── CyberPowerSystems_CP900EPFCLCD_full/ │ │ │ │ │ ├── expected.out │ │ │ │ │ ├── telegraf.conf │ │ │ │ │ ├── types.dev │ │ │ │ │ └── variables.dev │ │ │ │ ├── fake/ │ │ │ │ │ ├── expected.out │ │ │ │ │ ├── telegraf.conf │ │ │ │ │ ├── types.dev │ │ │ │ │ └── variables.dev │ │ │ │ ├── fake_force_float/ │ │ │ │ │ ├── expected.out │ │ │ │ │ ├── telegraf.conf │ │ │ │ │ ├── types.dev │ │ │ │ │ └── variables.dev │ │ │ │ └── fake_force_float_with_string/ │ │ │ │ ├── expected.out │ │ │ │ ├── telegraf.conf │ │ │ │ ├── types.dev │ │ │ │ └── variables.dev │ │ │ ├── upsd.go │ │ │ └── upsd_test.go │ │ ├── uwsgi/ │ │ │ ├── README.md │ │ │ ├── sample.conf │ │ │ ├── uwsgi.go │ │ │ └── uwsgi_test.go │ │ ├── varnish/ │ │ │ ├── README.md │ │ │ ├── sample.conf │ │ │ ├── test_data/ │ │ │ │ ├── varnish4_4.json │ │ │ │ ├── varnish6.2.1_reload.json │ │ │ │ ├── varnish6.6.json │ │ │ │ ├── varnish_types.json │ │ │ │ ├── varnish_v1_reload.txt │ │ │ │ ├── varnishadm-200.json │ │ │ │ └── varnishadm-reload.json │ │ │ ├── varnish.go │ │ │ ├── varnish_test.go │ │ │ └── varnish_windows.go │ │ ├── vault/ │ │ │ ├── README.md │ │ │ ├── sample.conf │ │ │ ├── testdata/ │ │ │ │ └── response_key_metrics.json │ │ │ ├── vault.go │ │ │ ├── vault_metrics.go │ │ │ └── vault_test.go │ │ ├── vsphere/ │ │ │ ├── README.md │ │ │ ├── client.go │ │ │ ├── endpoint.go │ │ │ ├── finder.go │ │ │ ├── sample.conf │ │ │ ├── selfhealth.go │ │ │ ├── throttled_exec.go │ │ │ ├── tscache.go │ │ │ ├── vsan.go │ │ │ ├── vsphere.go │ │ │ └── vsphere_test.go │ │ ├── webhooks/ │ │ │ ├── README.md │ │ │ ├── artifactory/ │ │ │ │ ├── README.md │ │ │ │ ├── artifactory_webhook.go │ │ │ │ ├── artifactory_webhook_mock_json_test.go │ │ │ │ ├── artifactory_webhook_models.go │ │ │ │ └── artifactory_webhook_test.go │ │ │ ├── filestack/ │ │ │ │ ├── README.md │ │ │ │ ├── filestack_webhooks.go │ │ │ │ ├── filestack_webhooks_events.go │ │ │ │ ├── filestack_webhooks_test.go │ │ │ │ └── testdata/ │ │ │ │ ├── dialog_open.json │ │ │ │ ├── upload.json │ │ │ │ └── video_conversion.json │ │ │ ├── github/ │ │ │ │ ├── README.md │ │ │ │ ├── github_webhooks.go │ │ │ │ ├── github_webhooks_mock_json_test.go │ │ │ │ ├── github_webhooks_models.go │ │ │ │ └── github_webhooks_test.go │ │ │ ├── mandrill/ │ │ │ │ ├── README.md │ │ │ │ ├── mandrill_webhooks.go │ │ │ │ ├── mandrill_webhooks_events.go │ │ │ │ ├── mandrill_webhooks_test.go │ │ │ │ └── testdata/ │ │ │ │ ├── hard_bounce_event.json │ │ │ │ └── send_event.json │ │ │ ├── papertrail/ │ │ │ │ ├── README.md │ │ │ │ ├── papertrail_test.go │ │ │ │ ├── papertrail_webhooks.go │ │ │ │ └── papertrail_webhooks_models.go │ │ │ ├── particle/ │ │ │ │ ├── README.md │ │ │ │ ├── particle_webhooks.go │ │ │ │ └── particle_webhooks_test.go │ │ │ ├── rollbar/ │ │ │ │ ├── README.md │ │ │ │ ├── rollbar_webhooks.go │ │ │ │ ├── rollbar_webhooks_events.go │ │ │ │ ├── rollbar_webhooks_events_json_test.go │ │ │ │ └── rollbar_webhooks_test.go │ │ │ ├── sample.conf │ │ │ ├── webhooks.go │ │ │ └── webhooks_test.go │ │ ├── whois/ │ │ │ ├── README.md │ │ │ ├── sample.conf │ │ │ ├── testcases/ │ │ │ │ ├── domain_typo/ │ │ │ │ │ ├── expected.err │ │ │ │ │ └── telegraf.conf │ │ │ │ ├── invalid_domain/ │ │ │ │ │ ├── expected.err │ │ │ │ │ ├── expected.out │ │ │ │ │ ├── input_invalid-domain.xyz.txt │ │ │ │ │ └── telegraf.conf │ │ │ │ ├── multiple_domains/ │ │ │ │ │ ├── expected.out │ │ │ │ │ ├── input_example.com.txt │ │ │ │ │ ├── input_test.com.txt │ │ │ │ │ └── telegraf.conf │ │ │ │ ├── valid_domain/ │ │ │ │ │ ├── expected.out │ │ │ │ │ ├── input_example.com.txt │ │ │ │ │ └── telegraf.conf │ │ │ │ └── valid_idn_domain/ │ │ │ │ ├── expected.out │ │ │ │ ├── input_münchen.de.txt │ │ │ │ ├── input_xn--mnchn-kva.de.txt │ │ │ │ └── telegraf.conf │ │ │ ├── whois.go │ │ │ └── whois_test.go │ │ ├── win_eventlog/ │ │ │ ├── README.md │ │ │ ├── event.go │ │ │ ├── sample.conf │ │ │ ├── syscall_windows.go │ │ │ ├── util.go │ │ │ ├── util_test.go │ │ │ ├── win_eventlog.go │ │ │ ├── win_eventlog_notwindows.go │ │ │ ├── win_eventlog_test.go │ │ │ └── zsyscall_windows.go │ │ ├── win_perf_counters/ │ │ │ ├── README.md │ │ │ ├── kernel32.go │ │ │ ├── pdh.go │ │ │ ├── pdh_386.go │ │ │ ├── pdh_amd64.go │ │ │ ├── pdh_arm64.go │ │ │ ├── performance_query.go │ │ │ ├── sample.conf │ │ │ ├── win_perf_counters.go │ │ │ ├── win_perf_counters_integration_test.go │ │ │ ├── win_perf_counters_notwindows.go │ │ │ └── win_perf_counters_test.go │ │ ├── win_services/ │ │ │ ├── README.md │ │ │ ├── sample.conf │ │ │ ├── win_services.go │ │ │ ├── win_services_integration_test.go │ │ │ ├── win_services_notwindows.go │ │ │ └── win_services_test.go │ │ ├── win_wmi/ │ │ │ ├── README.md │ │ │ ├── method.go │ │ │ ├── query.go │ │ │ ├── sample.conf │ │ │ ├── win_wmi.go │ │ │ ├── win_wmi_notwindows.go │ │ │ └── win_wmi_test.go │ │ ├── wireguard/ │ │ │ ├── README.md │ │ │ ├── sample.conf │ │ │ ├── wireguard.go │ │ │ └── wireguard_test.go │ │ ├── wireless/ │ │ │ ├── README.md │ │ │ ├── sample.conf │ │ │ ├── wireless.go │ │ │ ├── wireless_linux.go │ │ │ ├── wireless_notlinux.go │ │ │ └── wireless_test.go │ │ ├── x509_cert/ │ │ │ ├── README.md │ │ │ ├── java_key_store.go │ │ │ ├── java_key_store_test.go │ │ │ ├── sample.conf │ │ │ ├── wincertstore.go │ │ │ ├── wincertstore_notwindows.go │ │ │ ├── x509_cert.go │ │ │ └── x509_cert_test.go │ │ ├── xtremio/ │ │ │ ├── README.md │ │ │ ├── sample.conf │ │ │ ├── testdata/ │ │ │ │ ├── sample_bbu_response.json │ │ │ │ └── sample_get_bbu_response.json │ │ │ ├── xtremio.go │ │ │ ├── xtremio_test.go │ │ │ └── xtremio_types.go │ │ ├── zfs/ │ │ │ ├── README.md │ │ │ ├── sample.conf │ │ │ ├── testcases/ │ │ │ │ ├── freebsd/ │ │ │ │ │ ├── cache/ │ │ │ │ │ │ ├── expected.out │ │ │ │ │ │ ├── sysctl.json │ │ │ │ │ │ ├── telegraf.conf │ │ │ │ │ │ ├── zdataset.txt │ │ │ │ │ │ └── zpool.txt │ │ │ │ │ ├── cache_poolmetrics/ │ │ │ │ │ │ ├── expected.out │ │ │ │ │ │ ├── sysctl.json │ │ │ │ │ │ ├── telegraf.conf │ │ │ │ │ │ ├── zdataset.txt │ │ │ │ │ │ └── zpool.txt │ │ │ │ │ ├── dataset/ │ │ │ │ │ │ ├── expected.out │ │ │ │ │ │ ├── sysctl.json │ │ │ │ │ │ ├── telegraf.conf │ │ │ │ │ │ ├── zdataset.txt │ │ │ │ │ │ └── zpool.txt │ │ │ │ │ ├── dataset_datasetmetrics/ │ │ │ │ │ │ ├── expected.out │ │ │ │ │ │ ├── sysctl.json │ │ │ │ │ │ ├── telegraf.conf │ │ │ │ │ │ ├── zdataset.txt │ │ │ │ │ │ └── zpool.txt │ │ │ │ │ ├── freebsd14/ │ │ │ │ │ │ ├── expected.out │ │ │ │ │ │ ├── sysctl.json │ │ │ │ │ │ ├── telegraf.conf │ │ │ │ │ │ ├── uname.txt │ │ │ │ │ │ ├── zdataset.txt │ │ │ │ │ │ └── zpool.txt │ │ │ │ │ ├── freenas/ │ │ │ │ │ │ ├── expected.out │ │ │ │ │ │ ├── sysctl.json │ │ │ │ │ │ ├── telegraf.conf │ │ │ │ │ │ ├── zdataset.txt │ │ │ │ │ │ └── zpool.txt │ │ │ │ │ ├── freenas_zfetchstats/ │ │ │ │ │ │ ├── expected.out │ │ │ │ │ │ ├── sysctl.json │ │ │ │ │ │ ├── telegraf.conf │ │ │ │ │ │ ├── zdataset.txt │ │ │ │ │ │ └── zpool.txt │ │ │ │ │ ├── unavailable/ │ │ │ │ │ │ ├── expected.out │ │ │ │ │ │ ├── sysctl.json │ │ │ │ │ │ ├── telegraf.conf │ │ │ │ │ │ ├── zdataset.txt │ │ │ │ │ │ └── zpool.txt │ │ │ │ │ └── unavailable_poolmetrics/ │ │ │ │ │ ├── expected.out │ │ │ │ │ ├── sysctl.json │ │ │ │ │ ├── telegraf.conf │ │ │ │ │ ├── zdataset.txt │ │ │ │ │ └── zpool.txt │ │ │ │ └── linux/ │ │ │ │ ├── issue_17578/ │ │ │ │ │ ├── expected.out │ │ │ │ │ ├── telegraf.conf │ │ │ │ │ └── zfs/ │ │ │ │ │ ├── abdstats │ │ │ │ │ ├── arcstats │ │ │ │ │ ├── brtstats │ │ │ │ │ ├── chksum_bench │ │ │ │ │ ├── dbufstats │ │ │ │ │ ├── dmu_tx │ │ │ │ │ ├── dnodestats │ │ │ │ │ ├── fletcher_4_bench │ │ │ │ │ ├── fm │ │ │ │ │ ├── import_progress │ │ │ │ │ ├── metaslab_stats │ │ │ │ │ ├── simd │ │ │ │ │ ├── store/ │ │ │ │ │ │ ├── ddt_stats_blake3 │ │ │ │ │ │ ├── ddt_stats_edonr │ │ │ │ │ │ ├── ddt_stats_sha256 │ │ │ │ │ │ ├── ddt_stats_sha512 │ │ │ │ │ │ ├── ddt_stats_skein │ │ │ │ │ │ ├── dmu_tx_assign │ │ │ │ │ │ ├── guid │ │ │ │ │ │ ├── iostats │ │ │ │ │ │ ├── multihost │ │ │ │ │ │ ├── objset-0x10101 │ │ │ │ │ │ ├── objset-0x104de │ │ │ │ │ │ ├── objset-0x10737 │ │ │ │ │ │ ├── objset-0x10848 │ │ │ │ │ │ ├── objset-0x1098f │ │ │ │ │ │ ├── objset-0x10e73 │ │ │ │ │ │ ├── objset-0x1106c │ │ │ │ │ │ ├── objset-0x11074 │ │ │ │ │ │ ├── objset-0x11226 │ │ │ │ │ │ ├── objset-0x1132 │ │ │ │ │ │ ├── objset-0x114a6 │ │ │ │ │ │ ├── objset-0x11a19 │ │ │ │ │ │ ├── objset-0x11e5 │ │ │ │ │ │ ├── objset-0x147f │ │ │ │ │ │ ├── objset-0x185 │ │ │ │ │ │ ├── objset-0x1985 │ │ │ │ │ │ ├── objset-0x19d66 │ │ │ │ │ │ ├── objset-0x19d9 │ │ │ │ │ │ ├── objset-0x1aeb │ │ │ │ │ │ ├── objset-0x1cbde │ │ │ │ │ │ ├── objset-0x1ce10 │ │ │ │ │ │ ├── objset-0x1d28e │ │ │ │ │ │ ├── objset-0x1e8e1 │ │ │ │ │ │ ├── objset-0x1e8e6 │ │ │ │ │ │ ├── objset-0x1e8ed │ │ │ │ │ │ ├── objset-0x1e9b3 │ │ │ │ │ │ ├── objset-0x1ecad │ │ │ │ │ │ ├── objset-0x1ee0d │ │ │ │ │ │ ├── objset-0x1ee87 │ │ │ │ │ │ ├── objset-0x1f18f │ │ │ │ │ │ ├── objset-0x1f387 │ │ │ │ │ │ ├── objset-0x212b │ │ │ │ │ │ ├── objset-0x22d1c │ │ │ │ │ │ ├── objset-0x29f2 │ │ │ │ │ │ ├── objset-0x2a1c │ │ │ │ │ │ ├── objset-0x2a8 │ │ │ │ │ │ ├── objset-0x2e57 │ │ │ │ │ │ ├── objset-0x32c4 │ │ │ │ │ │ ├── objset-0x36 │ │ │ │ │ │ ├── objset-0x403 │ │ │ │ │ │ ├── objset-0x79d6 │ │ │ │ │ │ ├── objset-0x7ced │ │ │ │ │ │ ├── objset-0x92ee │ │ │ │ │ │ ├── objset-0x96 │ │ │ │ │ │ ├── objset-0x9776 │ │ │ │ │ │ ├── objset-0x9bff │ │ │ │ │ │ ├── objset-0xa67 │ │ │ │ │ │ ├── objset-0xb61 │ │ │ │ │ │ ├── objset-0xb83f5 │ │ │ │ │ │ ├── objset-0xb845b │ │ │ │ │ │ ├── objset-0xb8733 │ │ │ │ │ │ ├── objset-0xb8788 │ │ │ │ │ │ ├── objset-0xb888e │ │ │ │ │ │ ├── objset-0xbe32 │ │ │ │ │ │ ├── objset-0xc876 │ │ │ │ │ │ ├── objset-0xc8e5 │ │ │ │ │ │ ├── objset-0xc94 │ │ │ │ │ │ ├── objset-0xc9d7 │ │ │ │ │ │ ├── objset-0xcb42 │ │ │ │ │ │ ├── objset-0xcc56 │ │ │ │ │ │ ├── objset-0xcc8f │ │ │ │ │ │ ├── objset-0xcdac │ │ │ │ │ │ ├── objset-0xd34f │ │ │ │ │ │ ├── objset-0xd4b9 │ │ │ │ │ │ ├── objset-0xe09 │ │ │ │ │ │ ├── objset-0xe144f │ │ │ │ │ │ ├── objset-0xe1890 │ │ │ │ │ │ ├── objset-0xe46 │ │ │ │ │ │ ├── objset-0xe5967 │ │ │ │ │ │ ├── objset-0xe5d8d │ │ │ │ │ │ ├── objset-0xfa6 │ │ │ │ │ │ ├── reads │ │ │ │ │ │ ├── state │ │ │ │ │ │ └── txgs │ │ │ │ │ ├── vdev_mirror_stats │ │ │ │ │ ├── vdev_raidz_bench │ │ │ │ │ ├── zfetchstats │ │ │ │ │ ├── zil │ │ │ │ │ ├── zio_stats │ │ │ │ │ ├── zroot-nas/ │ │ │ │ │ │ ├── ddt_stats_blake3 │ │ │ │ │ │ ├── ddt_stats_edonr │ │ │ │ │ │ ├── ddt_stats_sha256 │ │ │ │ │ │ ├── ddt_stats_sha512 │ │ │ │ │ │ ├── ddt_stats_skein │ │ │ │ │ │ ├── dmu_tx_assign │ │ │ │ │ │ ├── guid │ │ │ │ │ │ ├── iostats │ │ │ │ │ │ ├── multihost │ │ │ │ │ │ ├── objset-0x196 │ │ │ │ │ │ ├── objset-0x19d │ │ │ │ │ │ ├── objset-0x1bb │ │ │ │ │ │ ├── objset-0x1c5 │ │ │ │ │ │ ├── objset-0x28c │ │ │ │ │ │ ├── objset-0x390 │ │ │ │ │ │ ├── objset-0x40b │ │ │ │ │ │ ├── objset-0x44da │ │ │ │ │ │ ├── objset-0x453a │ │ │ │ │ │ ├── objset-0x47ae │ │ │ │ │ │ ├── objset-0x49e │ │ │ │ │ │ ├── objset-0x523 │ │ │ │ │ │ ├── objset-0x84eb │ │ │ │ │ │ ├── objset-0x886c │ │ │ │ │ │ ├── objset-0x9f │ │ │ │ │ │ ├── reads │ │ │ │ │ │ ├── state │ │ │ │ │ │ └── txgs │ │ │ │ │ └── zstd │ │ │ │ ├── issue_17578_native_types/ │ │ │ │ │ ├── expected.out │ │ │ │ │ ├── telegraf.conf │ │ │ │ │ └── zfs/ │ │ │ │ │ ├── abdstats │ │ │ │ │ ├── arcstats │ │ │ │ │ ├── brtstats │ │ │ │ │ ├── chksum_bench │ │ │ │ │ ├── dbufstats │ │ │ │ │ ├── dmu_tx │ │ │ │ │ ├── dnodestats │ │ │ │ │ ├── fletcher_4_bench │ │ │ │ │ ├── fm │ │ │ │ │ ├── import_progress │ │ │ │ │ ├── metaslab_stats │ │ │ │ │ ├── simd │ │ │ │ │ ├── store/ │ │ │ │ │ │ ├── ddt_stats_blake3 │ │ │ │ │ │ ├── ddt_stats_edonr │ │ │ │ │ │ ├── ddt_stats_sha256 │ │ │ │ │ │ ├── ddt_stats_sha512 │ │ │ │ │ │ ├── ddt_stats_skein │ │ │ │ │ │ ├── dmu_tx_assign │ │ │ │ │ │ ├── guid │ │ │ │ │ │ ├── iostats │ │ │ │ │ │ ├── multihost │ │ │ │ │ │ ├── objset-0x10101 │ │ │ │ │ │ ├── objset-0x104de │ │ │ │ │ │ ├── objset-0x10737 │ │ │ │ │ │ ├── objset-0x10848 │ │ │ │ │ │ ├── objset-0x1098f │ │ │ │ │ │ ├── objset-0x10e73 │ │ │ │ │ │ ├── objset-0x1106c │ │ │ │ │ │ ├── objset-0x11074 │ │ │ │ │ │ ├── objset-0x11226 │ │ │ │ │ │ ├── objset-0x1132 │ │ │ │ │ │ ├── objset-0x114a6 │ │ │ │ │ │ ├── objset-0x11a19 │ │ │ │ │ │ ├── objset-0x11e5 │ │ │ │ │ │ ├── objset-0x147f │ │ │ │ │ │ ├── objset-0x185 │ │ │ │ │ │ ├── objset-0x1985 │ │ │ │ │ │ ├── objset-0x19d66 │ │ │ │ │ │ ├── objset-0x19d9 │ │ │ │ │ │ ├── objset-0x1aeb │ │ │ │ │ │ ├── objset-0x1cbde │ │ │ │ │ │ ├── objset-0x1ce10 │ │ │ │ │ │ ├── objset-0x1d28e │ │ │ │ │ │ ├── objset-0x1e8e1 │ │ │ │ │ │ ├── objset-0x1e8e6 │ │ │ │ │ │ ├── objset-0x1e8ed │ │ │ │ │ │ ├── objset-0x1e9b3 │ │ │ │ │ │ ├── objset-0x1ecad │ │ │ │ │ │ ├── objset-0x1ee0d │ │ │ │ │ │ ├── objset-0x1ee87 │ │ │ │ │ │ ├── objset-0x1f18f │ │ │ │ │ │ ├── objset-0x1f387 │ │ │ │ │ │ ├── objset-0x212b │ │ │ │ │ │ ├── objset-0x22d1c │ │ │ │ │ │ ├── objset-0x29f2 │ │ │ │ │ │ ├── objset-0x2a1c │ │ │ │ │ │ ├── objset-0x2a8 │ │ │ │ │ │ ├── objset-0x2e57 │ │ │ │ │ │ ├── objset-0x32c4 │ │ │ │ │ │ ├── objset-0x36 │ │ │ │ │ │ ├── objset-0x403 │ │ │ │ │ │ ├── objset-0x79d6 │ │ │ │ │ │ ├── objset-0x7ced │ │ │ │ │ │ ├── objset-0x92ee │ │ │ │ │ │ ├── objset-0x96 │ │ │ │ │ │ ├── objset-0x9776 │ │ │ │ │ │ ├── objset-0x9bff │ │ │ │ │ │ ├── objset-0xa67 │ │ │ │ │ │ ├── objset-0xb61 │ │ │ │ │ │ ├── objset-0xb83f5 │ │ │ │ │ │ ├── objset-0xb845b │ │ │ │ │ │ ├── objset-0xb8733 │ │ │ │ │ │ ├── objset-0xb8788 │ │ │ │ │ │ ├── objset-0xb888e │ │ │ │ │ │ ├── objset-0xbe32 │ │ │ │ │ │ ├── objset-0xc876 │ │ │ │ │ │ ├── objset-0xc8e5 │ │ │ │ │ │ ├── objset-0xc94 │ │ │ │ │ │ ├── objset-0xc9d7 │ │ │ │ │ │ ├── objset-0xcb42 │ │ │ │ │ │ ├── objset-0xcc56 │ │ │ │ │ │ ├── objset-0xcc8f │ │ │ │ │ │ ├── objset-0xcdac │ │ │ │ │ │ ├── objset-0xd34f │ │ │ │ │ │ ├── objset-0xd4b9 │ │ │ │ │ │ ├── objset-0xe09 │ │ │ │ │ │ ├── objset-0xe144f │ │ │ │ │ │ ├── objset-0xe1890 │ │ │ │ │ │ ├── objset-0xe46 │ │ │ │ │ │ ├── objset-0xe5967 │ │ │ │ │ │ ├── objset-0xe5d8d │ │ │ │ │ │ ├── objset-0xfa6 │ │ │ │ │ │ ├── reads │ │ │ │ │ │ ├── state │ │ │ │ │ │ └── txgs │ │ │ │ │ ├── vdev_mirror_stats │ │ │ │ │ ├── vdev_raidz_bench │ │ │ │ │ ├── zfetchstats │ │ │ │ │ ├── zil │ │ │ │ │ ├── zio_stats │ │ │ │ │ ├── zroot-nas/ │ │ │ │ │ │ ├── ddt_stats_blake3 │ │ │ │ │ │ ├── ddt_stats_edonr │ │ │ │ │ │ ├── ddt_stats_sha256 │ │ │ │ │ │ ├── ddt_stats_sha512 │ │ │ │ │ │ ├── ddt_stats_skein │ │ │ │ │ │ ├── dmu_tx_assign │ │ │ │ │ │ ├── guid │ │ │ │ │ │ ├── iostats │ │ │ │ │ │ ├── multihost │ │ │ │ │ │ ├── objset-0x196 │ │ │ │ │ │ ├── objset-0x19d │ │ │ │ │ │ ├── objset-0x1bb │ │ │ │ │ │ ├── objset-0x1c5 │ │ │ │ │ │ ├── objset-0x28c │ │ │ │ │ │ ├── objset-0x390 │ │ │ │ │ │ ├── objset-0x40b │ │ │ │ │ │ ├── objset-0x44da │ │ │ │ │ │ ├── objset-0x453a │ │ │ │ │ │ ├── objset-0x47ae │ │ │ │ │ │ ├── objset-0x49e │ │ │ │ │ │ ├── objset-0x523 │ │ │ │ │ │ ├── objset-0x84eb │ │ │ │ │ │ ├── objset-0x886c │ │ │ │ │ │ ├── objset-0x9f │ │ │ │ │ │ ├── reads │ │ │ │ │ │ ├── state │ │ │ │ │ │ └── txgs │ │ │ │ │ └── zstd │ │ │ │ └── issue_17952/ │ │ │ │ ├── expected.out │ │ │ │ ├── telegraf.conf │ │ │ │ └── zfs/ │ │ │ │ ├── abdstats │ │ │ │ ├── arcstats │ │ │ │ ├── brtstats │ │ │ │ ├── chksum_bench │ │ │ │ ├── dbufstats │ │ │ │ ├── dmu_tx │ │ │ │ ├── dnodestats │ │ │ │ ├── fletcher_4_bench │ │ │ │ ├── fm │ │ │ │ ├── import_progress │ │ │ │ ├── metaslab_stats │ │ │ │ ├── simd │ │ │ │ ├── store/ │ │ │ │ │ ├── ddt_stats_blake3 │ │ │ │ │ ├── ddt_stats_edonr │ │ │ │ │ ├── ddt_stats_sha256 │ │ │ │ │ ├── ddt_stats_sha512 │ │ │ │ │ ├── ddt_stats_skein │ │ │ │ │ ├── dmu_tx_assign │ │ │ │ │ ├── guid │ │ │ │ │ ├── iostats │ │ │ │ │ ├── multihost │ │ │ │ │ ├── objset-0x10101 │ │ │ │ │ ├── objset-0x104de │ │ │ │ │ ├── objset-0x10737 │ │ │ │ │ ├── objset-0x10848 │ │ │ │ │ ├── objset-0x1098f │ │ │ │ │ ├── objset-0x10e73 │ │ │ │ │ ├── objset-0x1106c │ │ │ │ │ ├── objset-0x11074 │ │ │ │ │ ├── objset-0x11226 │ │ │ │ │ ├── objset-0x1132 │ │ │ │ │ ├── objset-0x114a6 │ │ │ │ │ ├── objset-0x11a19 │ │ │ │ │ ├── objset-0x11e5 │ │ │ │ │ ├── objset-0x147f │ │ │ │ │ ├── objset-0x185 │ │ │ │ │ ├── objset-0x1985 │ │ │ │ │ ├── objset-0x19d66 │ │ │ │ │ ├── objset-0x19d9 │ │ │ │ │ ├── objset-0x1aeb │ │ │ │ │ ├── objset-0x1cbde │ │ │ │ │ ├── objset-0x1ce10 │ │ │ │ │ ├── objset-0x1d28e │ │ │ │ │ ├── objset-0x1e8e1 │ │ │ │ │ ├── objset-0x1e8e6 │ │ │ │ │ ├── objset-0x1e8ed │ │ │ │ │ ├── objset-0x1e9b3 │ │ │ │ │ ├── objset-0x1ecad │ │ │ │ │ ├── objset-0x1ee0d │ │ │ │ │ ├── objset-0x1ee87 │ │ │ │ │ ├── objset-0x1f18f │ │ │ │ │ ├── objset-0x1f387 │ │ │ │ │ ├── objset-0x212b │ │ │ │ │ ├── objset-0x22d1c │ │ │ │ │ ├── objset-0x29f2 │ │ │ │ │ ├── objset-0x2a1c │ │ │ │ │ ├── objset-0x2a8 │ │ │ │ │ ├── objset-0x2e57 │ │ │ │ │ ├── objset-0x32c4 │ │ │ │ │ ├── objset-0x36 │ │ │ │ │ ├── objset-0x403 │ │ │ │ │ ├── objset-0x79d6 │ │ │ │ │ ├── objset-0x7ced │ │ │ │ │ ├── objset-0x92ee │ │ │ │ │ ├── objset-0x96 │ │ │ │ │ ├── objset-0x9776 │ │ │ │ │ ├── objset-0x9bff │ │ │ │ │ ├── objset-0xa67 │ │ │ │ │ ├── objset-0xb61 │ │ │ │ │ ├── objset-0xb83f5 │ │ │ │ │ ├── objset-0xb845b │ │ │ │ │ ├── objset-0xb8733 │ │ │ │ │ ├── objset-0xb8788 │ │ │ │ │ ├── objset-0xb888e │ │ │ │ │ ├── objset-0xbe32 │ │ │ │ │ ├── objset-0xc876 │ │ │ │ │ ├── objset-0xc8e5 │ │ │ │ │ ├── objset-0xc94 │ │ │ │ │ ├── objset-0xc9d7 │ │ │ │ │ ├── objset-0xcb42 │ │ │ │ │ ├── objset-0xcc56 │ │ │ │ │ ├── objset-0xcc8f │ │ │ │ │ ├── objset-0xcdac │ │ │ │ │ ├── objset-0xd34f │ │ │ │ │ ├── objset-0xd4b9 │ │ │ │ │ ├── objset-0xe09 │ │ │ │ │ ├── objset-0xe144f │ │ │ │ │ ├── objset-0xe1890 │ │ │ │ │ ├── objset-0xe46 │ │ │ │ │ ├── objset-0xe5967 │ │ │ │ │ ├── objset-0xe5d8d │ │ │ │ │ ├── objset-0xfa6 │ │ │ │ │ ├── reads │ │ │ │ │ ├── state │ │ │ │ │ └── txgs │ │ │ │ ├── vdev_mirror_stats │ │ │ │ ├── vdev_raidz_bench │ │ │ │ ├── zfetchstats │ │ │ │ ├── zil │ │ │ │ ├── zio_stats │ │ │ │ ├── zroot-nas/ │ │ │ │ │ ├── ddt_stats_blake3 │ │ │ │ │ ├── ddt_stats_edonr │ │ │ │ │ ├── ddt_stats_sha256 │ │ │ │ │ ├── ddt_stats_sha512 │ │ │ │ │ ├── ddt_stats_skein │ │ │ │ │ ├── dmu_tx_assign │ │ │ │ │ ├── guid │ │ │ │ │ ├── iostats │ │ │ │ │ ├── multihost │ │ │ │ │ ├── objset-0x196 │ │ │ │ │ ├── objset-0x19d │ │ │ │ │ ├── objset-0x1bb │ │ │ │ │ ├── objset-0x1c5 │ │ │ │ │ ├── objset-0x28c │ │ │ │ │ ├── objset-0x390 │ │ │ │ │ ├── objset-0x40b │ │ │ │ │ ├── objset-0x44da │ │ │ │ │ ├── objset-0x453a │ │ │ │ │ ├── objset-0x47ae │ │ │ │ │ ├── objset-0x49e │ │ │ │ │ ├── objset-0x523 │ │ │ │ │ ├── objset-0x84eb │ │ │ │ │ ├── objset-0x886c │ │ │ │ │ ├── objset-0x9f │ │ │ │ │ ├── reads │ │ │ │ │ ├── state │ │ │ │ │ └── txgs │ │ │ │ └── zstd │ │ │ ├── zfs.go │ │ │ ├── zfs_freebsd.go │ │ │ ├── zfs_freebsd_test.go │ │ │ ├── zfs_linux.go │ │ │ ├── zfs_linux_test.go │ │ │ └── zfs_other.go │ │ ├── zipkin/ │ │ │ ├── README.md │ │ │ ├── cmd/ │ │ │ │ ├── stress_test_write/ │ │ │ │ │ └── stress_test_write.go │ │ │ │ └── thrift_serialize/ │ │ │ │ └── thrift_serialize.go │ │ │ ├── codec/ │ │ │ │ ├── codec.go │ │ │ │ ├── codec_test.go │ │ │ │ ├── jsonV1/ │ │ │ │ │ ├── jsonV1.go │ │ │ │ │ └── jsonV1_test.go │ │ │ │ └── thrift/ │ │ │ │ ├── gen-go/ │ │ │ │ │ └── zipkincore/ │ │ │ │ │ ├── GoUnusedProtection__.go │ │ │ │ │ ├── zipkinCore-consts.go │ │ │ │ │ └── zipkinCore.go │ │ │ │ ├── thrift.go │ │ │ │ └── thrift_test.go │ │ │ ├── convert.go │ │ │ ├── convert_test.go │ │ │ ├── handler.go │ │ │ ├── handler_test.go │ │ │ ├── sample.conf │ │ │ ├── testdata/ │ │ │ │ └── json/ │ │ │ │ ├── brave-tracer-example.json │ │ │ │ ├── cli_microservice.json │ │ │ │ ├── distributed_trace_sample.json │ │ │ │ └── threespans.json │ │ │ ├── trace/ │ │ │ │ └── trace.go │ │ │ ├── zipkin.go │ │ │ └── zipkin_test.go │ │ └── zookeeper/ │ │ ├── README.md │ │ ├── dev/ │ │ │ ├── docker-compose.yml │ │ │ └── telegraf.conf │ │ ├── sample.conf │ │ ├── sample.conf.in │ │ ├── zookeeper.go │ │ └── zookeeper_test.go │ ├── outputs/ │ │ ├── all/ │ │ │ ├── all.go │ │ │ ├── amon.go │ │ │ ├── amqp.go │ │ │ ├── application_insights.go │ │ │ ├── arc.go │ │ │ ├── azure_data_explorer.go │ │ │ ├── azure_monitor.go │ │ │ ├── bigquery.go │ │ │ ├── clarify.go │ │ │ ├── cloud_pubsub.go │ │ │ ├── cloudwatch.go │ │ │ ├── cloudwatch_logs.go │ │ │ ├── cratedb.go │ │ │ ├── datadog.go │ │ │ ├── discard.go │ │ │ ├── dynatrace.go │ │ │ ├── elasticsearch.go │ │ │ ├── event_hubs.go │ │ │ ├── exec.go │ │ │ ├── execd.go │ │ │ ├── file.go │ │ │ ├── graphite.go │ │ │ ├── graylog.go │ │ │ ├── groundwork.go │ │ │ ├── health.go │ │ │ ├── heartbeat.go │ │ │ ├── http.go │ │ │ ├── influxdb.go │ │ │ ├── influxdb_v2.go │ │ │ ├── influxdb_v3.go │ │ │ ├── inlong.go │ │ │ ├── instrumental.go │ │ │ ├── iotdb.go │ │ │ ├── kafka.go │ │ │ ├── kinesis.go │ │ │ ├── librato.go │ │ │ ├── logzio.go │ │ │ ├── loki.go │ │ │ ├── microsoft_fabric.go │ │ │ ├── mongodb.go │ │ │ ├── mqtt.go │ │ │ ├── nats.go │ │ │ ├── nebius_cloud_monitoring.go │ │ │ ├── newrelic.go │ │ │ ├── nsq.go │ │ │ ├── opensearch.go │ │ │ ├── opentelemetry.go │ │ │ ├── opentsdb.go │ │ │ ├── parquet.go │ │ │ ├── postgresql.go │ │ │ ├── prometheus_client.go │ │ │ ├── quix.go │ │ │ ├── redistimeseries.go │ │ │ ├── remotefile.go │ │ │ ├── riemann.go │ │ │ ├── sensu.go │ │ │ ├── signalfx.go │ │ │ ├── socket_writer.go │ │ │ ├── sql.go │ │ │ ├── stackdriver.go │ │ │ ├── stomp.go │ │ │ ├── sumologic.go │ │ │ ├── syslog.go │ │ │ ├── timestream.go │ │ │ ├── warp10.go │ │ │ ├── wavefront.go │ │ │ ├── websocket.go │ │ │ ├── yandex_cloud_monitoring.go │ │ │ └── zabbix.go │ │ ├── amon/ │ │ │ ├── README.md │ │ │ ├── amon.go │ │ │ ├── amon_test.go │ │ │ └── sample.conf │ │ ├── amqp/ │ │ │ ├── README.md │ │ │ ├── amqp.go │ │ │ ├── amqp_test.go │ │ │ ├── client.go │ │ │ └── sample.conf │ │ ├── application_insights/ │ │ │ ├── README.md │ │ │ ├── application_insights.go │ │ │ ├── application_insights_test.go │ │ │ ├── diagnostic_message_subscriber.go │ │ │ ├── mocks/ │ │ │ │ ├── diagnostics_message_listener.go │ │ │ │ ├── diagnostics_message_subscriber.go │ │ │ │ └── transmitter.go │ │ │ ├── sample.conf │ │ │ └── transmitter.go │ │ ├── arc/ │ │ │ ├── README.md │ │ │ ├── arc.go │ │ │ ├── arc_test.go │ │ │ ├── groups.go │ │ │ └── sample.conf │ │ ├── azure_data_explorer/ │ │ │ ├── README.md │ │ │ ├── azure_data_explorer.go │ │ │ ├── azure_data_explorer_test.go │ │ │ └── sample.conf │ │ ├── azure_monitor/ │ │ │ ├── README.md │ │ │ ├── azure_monitor.go │ │ │ ├── azure_monitor_test.go │ │ │ ├── sample.conf │ │ │ └── types.go │ │ ├── bigquery/ │ │ │ ├── README.md │ │ │ ├── bigquery.go │ │ │ ├── bigquery_test.go │ │ │ └── sample.conf │ │ ├── clarify/ │ │ │ ├── README.md │ │ │ ├── clarify.go │ │ │ ├── clarify_test.go │ │ │ └── sample.conf │ │ ├── cloud_pubsub/ │ │ │ ├── README.md │ │ │ ├── cloud_pubsub.go │ │ │ ├── cloud_pubsub_test.go │ │ │ ├── sample.conf │ │ │ ├── topic_gcp.go │ │ │ └── topic_stubbed.go │ │ ├── cloudwatch/ │ │ │ ├── README.md │ │ │ ├── cloudwatch.go │ │ │ ├── cloudwatch_test.go │ │ │ ├── fields.go │ │ │ └── sample.conf │ │ ├── cloudwatch_logs/ │ │ │ ├── README.md │ │ │ ├── cloudwatch_logs.go │ │ │ ├── cloudwatch_logs_test.go │ │ │ └── sample.conf │ │ ├── cratedb/ │ │ │ ├── README.md │ │ │ ├── cratedb.go │ │ │ ├── cratedb_test.go │ │ │ └── sample.conf │ │ ├── datadog/ │ │ │ ├── README.md │ │ │ ├── datadog.go │ │ │ ├── datadog_test.go │ │ │ └── sample.conf │ │ ├── deprecations.go │ │ ├── discard/ │ │ │ ├── README.md │ │ │ ├── discard.go │ │ │ └── sample.conf │ │ ├── dynatrace/ │ │ │ ├── README.md │ │ │ ├── dynatrace.go │ │ │ ├── dynatrace_test.go │ │ │ └── sample.conf │ │ ├── elasticsearch/ │ │ │ ├── README.md │ │ │ ├── elasticsearch.go │ │ │ ├── elasticsearch_test.go │ │ │ └── sample.conf │ │ ├── event_hubs/ │ │ │ ├── README.md │ │ │ ├── event_hubs.go │ │ │ ├── event_hubs_test.go │ │ │ ├── sample.conf │ │ │ └── testdata/ │ │ │ └── Config.json │ │ ├── exec/ │ │ │ ├── README.md │ │ │ ├── exec.go │ │ │ ├── exec_test.go │ │ │ └── sample.conf │ │ ├── execd/ │ │ │ ├── README.md │ │ │ ├── examples/ │ │ │ │ ├── file/ │ │ │ │ │ ├── file.sh │ │ │ │ │ └── telegraf.conf │ │ │ │ └── redis/ │ │ │ │ ├── redis_influx.rb │ │ │ │ ├── redis_json.rb │ │ │ │ └── telegraf.conf │ │ │ ├── execd.go │ │ │ ├── execd_test.go │ │ │ └── sample.conf │ │ ├── file/ │ │ │ ├── README.md │ │ │ ├── file.go │ │ │ ├── file_test.go │ │ │ └── sample.conf │ │ ├── graphite/ │ │ │ ├── README.md │ │ │ ├── graphite.go │ │ │ ├── graphite_test.go │ │ │ └── sample.conf │ │ ├── graylog/ │ │ │ ├── README.md │ │ │ ├── graylog.go │ │ │ ├── graylog_test.go │ │ │ ├── graylog_test_linux.go │ │ │ └── sample.conf │ │ ├── groundwork/ │ │ │ ├── README.md │ │ │ ├── groundwork.go │ │ │ ├── groundwork_test.go │ │ │ └── sample.conf │ │ ├── health/ │ │ │ ├── README.md │ │ │ ├── compares.go │ │ │ ├── compares_test.go │ │ │ ├── contains.go │ │ │ ├── contains_test.go │ │ │ ├── health.go │ │ │ ├── health_test.go │ │ │ └── sample.conf │ │ ├── heartbeat/ │ │ │ ├── README.md │ │ │ ├── heartbeat.go │ │ │ ├── heartbeat_test.go │ │ │ ├── logging.go │ │ │ ├── sample.conf │ │ │ ├── schema_v1.json │ │ │ ├── statistics.go │ │ │ ├── status.go │ │ │ ├── testdata/ │ │ │ │ ├── telegraf.conf │ │ │ │ └── telegraf.d/ │ │ │ │ ├── inputs.conf │ │ │ │ └── outputs.conf │ │ │ └── types.go │ │ ├── http/ │ │ │ ├── README.md │ │ │ ├── http.go │ │ │ ├── http_test.go │ │ │ ├── sample.conf │ │ │ └── sample.conf.in │ │ ├── influxdb/ │ │ │ ├── README.md │ │ │ ├── http.go │ │ │ ├── http_test.go │ │ │ ├── influxdb.go │ │ │ ├── influxdb_test.go │ │ │ ├── sample.conf │ │ │ ├── udp.go │ │ │ └── udp_test.go │ │ ├── influxdb_v2/ │ │ │ ├── README.md │ │ │ ├── batching.go │ │ │ ├── errors.go │ │ │ ├── http.go │ │ │ ├── http_test.go │ │ │ ├── influxdb_v2.go │ │ │ ├── influxdb_v2_test.go │ │ │ └── sample.conf │ │ ├── influxdb_v3/ │ │ │ ├── README.md │ │ │ ├── client.go │ │ │ ├── client_test.go │ │ │ ├── errors.go │ │ │ ├── influxdb_v3.go │ │ │ ├── influxdb_v3_test.go │ │ │ ├── sample.conf │ │ │ ├── sample.conf.in │ │ │ └── types.go │ │ ├── inlong/ │ │ │ ├── README.md │ │ │ ├── inlong.go │ │ │ ├── inlong_test.go │ │ │ └── sample.conf │ │ ├── instrumental/ │ │ │ ├── README.md │ │ │ ├── instrumental.go │ │ │ ├── instrumental_test.go │ │ │ └── sample.conf │ │ ├── iotdb/ │ │ │ ├── README.md │ │ │ ├── iotdb.go │ │ │ ├── iotdb_test.go │ │ │ └── sample.conf │ │ ├── kafka/ │ │ │ ├── README.md │ │ │ ├── kafka.go │ │ │ ├── kafka_test.go │ │ │ └── sample.conf │ │ ├── kinesis/ │ │ │ ├── README.md │ │ │ ├── kinesis.go │ │ │ ├── kinesis_test.go │ │ │ └── sample.conf │ │ ├── librato/ │ │ │ ├── README.md │ │ │ ├── librato.go │ │ │ ├── librato_test.go │ │ │ └── sample.conf │ │ ├── logzio/ │ │ │ ├── README.md │ │ │ ├── logzio.go │ │ │ ├── logzio_test.go │ │ │ └── sample.conf │ │ ├── loki/ │ │ │ ├── README.md │ │ │ ├── loki.go │ │ │ ├── loki_test.go │ │ │ ├── sample.conf │ │ │ ├── stream.go │ │ │ └── stream_test.go │ │ ├── microsoft_fabric/ │ │ │ ├── README.md │ │ │ ├── event_house.go │ │ │ ├── event_house_test.go │ │ │ ├── event_stream.go │ │ │ ├── event_stream_test.go │ │ │ ├── microsoft_fabric.go │ │ │ ├── microsoft_fabric_test.go │ │ │ └── sample.conf │ │ ├── mongodb/ │ │ │ ├── README.md │ │ │ ├── mongodb.go │ │ │ ├── mongodb_test.go │ │ │ ├── sample.conf │ │ │ └── testdata/ │ │ │ ├── auth_scram/ │ │ │ │ └── setup.js │ │ │ └── auth_x509/ │ │ │ └── setup.js │ │ ├── mqtt/ │ │ │ ├── README.md │ │ │ ├── homie.go │ │ │ ├── mqtt.go │ │ │ ├── mqtt_test.go │ │ │ ├── sample.conf │ │ │ └── testdata/ │ │ │ └── mosquitto.conf │ │ ├── nats/ │ │ │ ├── README.md │ │ │ ├── nats.go │ │ │ ├── nats_test.go │ │ │ ├── sample.conf │ │ │ └── testcases/ │ │ │ ├── js-async-pub.conf │ │ │ ├── js-config.conf │ │ │ ├── js-default.conf │ │ │ ├── js-layout-nosub.conf │ │ │ ├── js-layout.conf │ │ │ ├── js-no-stream.conf │ │ │ ├── js-subjects.conf │ │ │ ├── no-js-batch.conf │ │ │ └── no-js.conf │ │ ├── nebius_cloud_monitoring/ │ │ │ ├── README.md │ │ │ ├── nebius_cloud_monitoring.go │ │ │ ├── nebius_cloud_monitoring_test.go │ │ │ └── sample.conf │ │ ├── newrelic/ │ │ │ ├── README.md │ │ │ ├── newrelic.go │ │ │ ├── newrelic_test.go │ │ │ └── sample.conf │ │ ├── nsq/ │ │ │ ├── README.md │ │ │ ├── nsq.go │ │ │ ├── nsq_test.go │ │ │ └── sample.conf │ │ ├── opensearch/ │ │ │ ├── README.md │ │ │ ├── opensearch.go │ │ │ ├── opensearch_test.go │ │ │ ├── opensearch_v1_test.go │ │ │ ├── opensearch_v2_test.go │ │ │ ├── sample.conf │ │ │ └── template.json │ │ ├── opentelemetry/ │ │ │ ├── README.md │ │ │ ├── client_grpc.go │ │ │ ├── client_http.go │ │ │ ├── logger.go │ │ │ ├── opentelemetry.go │ │ │ ├── opentelemetry_test.go │ │ │ └── sample.conf │ │ ├── opentsdb/ │ │ │ ├── README.md │ │ │ ├── opentsdb.go │ │ │ ├── opentsdb_http.go │ │ │ ├── opentsdb_test.go │ │ │ └── sample.conf │ │ ├── parquet/ │ │ │ ├── README.md │ │ │ ├── parquet.go │ │ │ ├── parquet_test.go │ │ │ └── sample.conf │ │ ├── postgresql/ │ │ │ ├── Dockerfile │ │ │ ├── README.md │ │ │ ├── columns.go │ │ │ ├── datatype_uint8.go │ │ │ ├── datatypes.go │ │ │ ├── postgresql.go │ │ │ ├── postgresql_bench_test.go │ │ │ ├── postgresql_test.go │ │ │ ├── sample.conf │ │ │ ├── sqltemplate/ │ │ │ │ └── template.go │ │ │ ├── table_manager.go │ │ │ ├── table_manager_test.go │ │ │ ├── table_source.go │ │ │ ├── table_source_test.go │ │ │ └── utils/ │ │ │ ├── column.go │ │ │ └── utils.go │ │ ├── prometheus_client/ │ │ │ ├── README.md │ │ │ ├── prometheus_client.go │ │ │ ├── prometheus_client_test.go │ │ │ ├── prometheus_client_v1_test.go │ │ │ ├── prometheus_client_v2_test.go │ │ │ ├── sample.conf │ │ │ ├── v1/ │ │ │ │ └── collector.go │ │ │ └── v2/ │ │ │ └── collector.go │ │ ├── quix/ │ │ │ ├── README.md │ │ │ ├── config.go │ │ │ ├── quix.go │ │ │ ├── quix_test.go │ │ │ └── sample.conf │ │ ├── redistimeseries/ │ │ │ ├── README.md │ │ │ ├── redistimeseries.go │ │ │ ├── redistimeseries_test.go │ │ │ ├── sample.conf │ │ │ └── testcases/ │ │ │ ├── expire/ │ │ │ │ ├── expected.out │ │ │ │ ├── input.influx │ │ │ │ └── telegraf.conf │ │ │ ├── normal/ │ │ │ │ ├── expected.out │ │ │ │ ├── input.influx │ │ │ │ └── telegraf.conf │ │ │ ├── normal_varying_labels/ │ │ │ │ ├── expected.out │ │ │ │ ├── input.influx │ │ │ │ └── telegraf.conf │ │ │ ├── string_convert/ │ │ │ │ ├── expected.out │ │ │ │ ├── input.influx │ │ │ │ └── telegraf.conf │ │ │ └── string_drop/ │ │ │ ├── expected.out │ │ │ ├── input.influx │ │ │ └── telegraf.conf │ │ ├── registry.go │ │ ├── remotefile/ │ │ │ ├── README.md │ │ │ ├── backends.go │ │ │ ├── remotefile.go │ │ │ ├── remotefile_test.go │ │ │ └── sample.conf │ │ ├── riemann/ │ │ │ ├── README.md │ │ │ ├── riemann.go │ │ │ ├── riemann_test.go │ │ │ └── sample.conf │ │ ├── sensu/ │ │ │ ├── README.md │ │ │ ├── sample.conf │ │ │ ├── sensu.go │ │ │ └── sensu_test.go │ │ ├── signalfx/ │ │ │ ├── README.md │ │ │ ├── sample.conf │ │ │ ├── signalfx.go │ │ │ └── signalfx_test.go │ │ ├── socket_writer/ │ │ │ ├── README.md │ │ │ ├── sample.conf │ │ │ ├── socket_writer.go │ │ │ └── socket_writer_test.go │ │ ├── sql/ │ │ │ ├── README.md │ │ │ ├── sample.conf │ │ │ ├── sql.go │ │ │ ├── sql_test.go │ │ │ ├── sqlite.go │ │ │ ├── sqlite_test.go │ │ │ └── testdata/ │ │ │ ├── clickhouse/ │ │ │ │ ├── enable_stdout_log.xml │ │ │ │ ├── expected.txt │ │ │ │ └── initdb/ │ │ │ │ └── init.sql │ │ │ ├── mariadb/ │ │ │ │ ├── expected_metric_one.sql │ │ │ │ ├── expected_metric_three.sql │ │ │ │ ├── expected_metric_two.sql │ │ │ │ └── initdb/ │ │ │ │ └── script.sql │ │ │ ├── mariadb_no_timestamp/ │ │ │ │ ├── expected_metric_one.sql │ │ │ │ ├── expected_metric_three.sql │ │ │ │ ├── expected_metric_two.sql │ │ │ │ └── initdb/ │ │ │ │ └── script.sql │ │ │ └── postgres/ │ │ │ ├── expected.sql │ │ │ └── initdb/ │ │ │ └── init.sql │ │ ├── stackdriver/ │ │ │ ├── README.md │ │ │ ├── counter_cache.go │ │ │ ├── counter_cache_test.go │ │ │ ├── sample.conf │ │ │ ├── stackdriver.go │ │ │ └── stackdriver_test.go │ │ ├── stomp/ │ │ │ ├── README.md │ │ │ ├── sample.conf │ │ │ ├── stomp.go │ │ │ └── stomp_test.go │ │ ├── sumologic/ │ │ │ ├── README.md │ │ │ ├── sample.conf │ │ │ ├── sumologic.go │ │ │ └── sumologic_test.go │ │ ├── syslog/ │ │ │ ├── README.md │ │ │ ├── sample.conf │ │ │ ├── syslog.go │ │ │ ├── syslog_mapper.go │ │ │ ├── syslog_mapper_test.go │ │ │ ├── syslog_test.go │ │ │ └── testcases/ │ │ │ └── issue_16012/ │ │ │ ├── expected.out │ │ │ ├── input.influx │ │ │ └── telegraf.conf │ │ ├── timestream/ │ │ │ ├── README.md │ │ │ ├── sample.conf │ │ │ ├── timestream.go │ │ │ ├── timestream_internal_test.go │ │ │ └── timestream_test.go │ │ ├── warp10/ │ │ │ ├── README.md │ │ │ ├── sample.conf │ │ │ ├── warp10.go │ │ │ └── warp10_test.go │ │ ├── wavefront/ │ │ │ ├── README.md │ │ │ ├── sample.conf │ │ │ ├── wavefront.go │ │ │ └── wavefront_test.go │ │ ├── websocket/ │ │ │ ├── README.md │ │ │ ├── sample.conf │ │ │ ├── websocket.go │ │ │ └── websocket_test.go │ │ ├── yandex_cloud_monitoring/ │ │ │ ├── README.md │ │ │ ├── sample.conf │ │ │ ├── yandex_cloud_monitoring.go │ │ │ └── yandex_cloud_monitoring_test.go │ │ └── zabbix/ │ │ ├── README.md │ │ ├── autoregister.go │ │ ├── autoregister_test.go │ │ ├── lld.go │ │ ├── lld_test.go │ │ ├── sample.conf │ │ ├── testcases/ │ │ │ └── receive/ │ │ │ ├── expected.out │ │ │ ├── input.influx │ │ │ └── telegraf.conf │ │ ├── zabbix.go │ │ └── zabbix_test.go │ ├── parsers/ │ │ ├── EXAMPLE_README.md │ │ ├── all/ │ │ │ ├── all.go │ │ │ ├── avro.go │ │ │ ├── binary.go │ │ │ ├── collectd.go │ │ │ ├── csv.go │ │ │ ├── dropwizard.go │ │ │ ├── form_urlencoded.go │ │ │ ├── graphite.go │ │ │ ├── grok.go │ │ │ ├── influx.go │ │ │ ├── json.go │ │ │ ├── json_v2.go │ │ │ ├── logfmt.go │ │ │ ├── nagios.go │ │ │ ├── openmetrics.go │ │ │ ├── opentsdb.go │ │ │ ├── parquet.go │ │ │ ├── prometheus.go │ │ │ ├── prometheusremotewrite.go │ │ │ ├── value.go │ │ │ ├── wavefront.go │ │ │ └── xpath.go │ │ ├── avro/ │ │ │ ├── README.md │ │ │ ├── parser.go │ │ │ ├── parser_test.go │ │ │ ├── schema_registry.go │ │ │ └── testcases/ │ │ │ ├── array/ │ │ │ │ ├── expected.out │ │ │ │ ├── message.json │ │ │ │ └── telegraf.conf │ │ │ ├── bad-timestamp-format/ │ │ │ │ ├── expected.err │ │ │ │ ├── expected.out │ │ │ │ ├── message.avro │ │ │ │ └── telegraf.conf │ │ │ ├── benchmark/ │ │ │ │ ├── expected.out │ │ │ │ ├── message.json │ │ │ │ └── telegraf.conf │ │ │ ├── config-both/ │ │ │ │ ├── expected.err │ │ │ │ ├── expected.out │ │ │ │ ├── message.avro │ │ │ │ └── telegraf.conf │ │ │ ├── config-neither/ │ │ │ │ ├── expected.err │ │ │ │ ├── expected.out │ │ │ │ ├── message.avro │ │ │ │ └── telegraf.conf │ │ │ ├── enum/ │ │ │ │ ├── expected.out │ │ │ │ ├── message.json │ │ │ │ └── telegraf.conf │ │ │ ├── json-array/ │ │ │ │ ├── expected.out │ │ │ │ ├── message.json │ │ │ │ └── telegraf.conf │ │ │ ├── json-format/ │ │ │ │ ├── expected.out │ │ │ │ ├── message.json │ │ │ │ └── telegraf.conf │ │ │ ├── measurement_name_from_message/ │ │ │ │ ├── expected.out │ │ │ │ ├── message.avro │ │ │ │ └── telegraf.conf │ │ │ ├── no-timestamp-format/ │ │ │ │ ├── expected.out │ │ │ │ ├── message.avro │ │ │ │ └── telegraf.conf │ │ │ ├── supplied_timestamp/ │ │ │ │ ├── expected.out │ │ │ │ ├── message.avro │ │ │ │ └── telegraf.conf │ │ │ ├── supplied_timestamp_fields_specified/ │ │ │ │ ├── expected.out │ │ │ │ ├── message.avro │ │ │ │ └── telegraf.conf │ │ │ ├── supplied_timestamp_fields_unspecified/ │ │ │ │ ├── expected.out │ │ │ │ ├── message.avro │ │ │ │ └── telegraf.conf │ │ │ ├── union/ │ │ │ │ ├── expected.out │ │ │ │ ├── message.json │ │ │ │ └── telegraf.conf │ │ │ ├── union-any/ │ │ │ │ ├── expected.out │ │ │ │ ├── message.json │ │ │ │ └── telegraf.conf │ │ │ ├── union-array/ │ │ │ │ ├── expected.out │ │ │ │ ├── message.json │ │ │ │ └── telegraf.conf │ │ │ ├── union-nullable/ │ │ │ │ ├── expected.out │ │ │ │ ├── message.json │ │ │ │ └── telegraf.conf │ │ │ └── union-nullable-tag/ │ │ │ ├── expected.out │ │ │ ├── message.json │ │ │ └── telegraf.conf │ │ ├── binary/ │ │ │ ├── README.md │ │ │ ├── config.go │ │ │ ├── entry.go │ │ │ ├── entry_test.go │ │ │ ├── parser.go │ │ │ ├── parser_test.go │ │ │ └── testcases/ │ │ │ ├── base64_encoding/ │ │ │ │ ├── expected.out │ │ │ │ └── telegraf.conf │ │ │ ├── hex_encoding/ │ │ │ │ ├── expected.out │ │ │ │ └── telegraf.conf │ │ │ └── multiple_messages/ │ │ │ ├── expected.out │ │ │ └── telegraf.conf │ │ ├── collectd/ │ │ │ ├── README.md │ │ │ ├── parser.go │ │ │ ├── parser_test.go │ │ │ └── testdata/ │ │ │ └── authfile │ │ ├── csv/ │ │ │ ├── README.md │ │ │ ├── parser.go │ │ │ └── parser_test.go │ │ ├── deprecations.go │ │ ├── dropwizard/ │ │ │ ├── README.md │ │ │ ├── parser.go │ │ │ └── parser_test.go │ │ ├── errors.go │ │ ├── form_urlencoded/ │ │ │ ├── README.md │ │ │ ├── parser.go │ │ │ └── parser_test.go │ │ ├── graphite/ │ │ │ ├── README.md │ │ │ ├── config.go │ │ │ ├── parser.go │ │ │ └── parser_test.go │ │ ├── grok/ │ │ │ ├── README.md │ │ │ ├── influx_patterns.go │ │ │ ├── parser.go │ │ │ ├── parser_test.go │ │ │ └── testdata/ │ │ │ ├── test-patterns │ │ │ ├── test_a.log │ │ │ ├── test_b.log │ │ │ └── test_multiline.log │ │ ├── influx/ │ │ │ ├── README.md │ │ │ ├── escape.go │ │ │ ├── handler.go │ │ │ ├── influx_upstream/ │ │ │ │ ├── README.md │ │ │ │ ├── parser.go │ │ │ │ └── parser_test.go │ │ │ ├── machine.go │ │ │ ├── machine.go.rl │ │ │ ├── machine_test.go │ │ │ ├── parser.go │ │ │ └── parser_test.go │ │ ├── json/ │ │ │ ├── README.md │ │ │ ├── json_flattener.go │ │ │ ├── parser.go │ │ │ └── parser_test.go │ │ ├── json_v2/ │ │ │ ├── README.md │ │ │ ├── parser.go │ │ │ ├── parser_test.go │ │ │ └── testdata/ │ │ │ ├── 10670/ │ │ │ │ ├── expected.out │ │ │ │ ├── input.json │ │ │ │ └── telegraf.conf │ │ │ ├── array_of_objects/ │ │ │ │ ├── expected.out │ │ │ │ ├── input.json │ │ │ │ └── telegraf.conf │ │ │ ├── benchmark/ │ │ │ │ ├── benchmark.json │ │ │ │ ├── expected.out │ │ │ │ ├── input.json │ │ │ │ └── telegraf.conf │ │ │ ├── complex_nesting/ │ │ │ │ ├── expected.out │ │ │ │ ├── input.json │ │ │ │ └── telegraf.conf │ │ │ ├── fields_and_tags/ │ │ │ │ ├── expected.out │ │ │ │ ├── input.json │ │ │ │ └── telegraf.conf │ │ │ ├── fields_and_tags_complex/ │ │ │ │ ├── expected.out │ │ │ │ ├── input.json │ │ │ │ └── telegraf.conf │ │ │ ├── large_numbers/ │ │ │ │ ├── expected.out │ │ │ │ ├── input.json │ │ │ │ └── telegraf.conf │ │ │ ├── measurement_name_int/ │ │ │ │ ├── expected.out │ │ │ │ ├── input.json │ │ │ │ └── telegraf.conf │ │ │ ├── mix_field_and_object/ │ │ │ │ ├── expected.out │ │ │ │ ├── input.json │ │ │ │ └── telegraf.conf │ │ │ ├── multiple_arrays_in_object/ │ │ │ │ ├── expected.out │ │ │ │ ├── input.json │ │ │ │ └── telegraf.conf │ │ │ ├── multiple_json_input/ │ │ │ │ ├── expected.out │ │ │ │ ├── input_1.json │ │ │ │ ├── input_2.json │ │ │ │ └── telegraf.conf │ │ │ ├── multiple_timestamps/ │ │ │ │ ├── expected.out │ │ │ │ ├── input.json │ │ │ │ └── telegraf.conf │ │ │ ├── nested_and_nonnested_tags/ │ │ │ │ ├── expected.out │ │ │ │ ├── input.json │ │ │ │ └── telegraf.conf │ │ │ ├── nested_array_of_objects/ │ │ │ │ ├── expected.out │ │ │ │ ├── input.json │ │ │ │ └── telegraf.conf │ │ │ ├── nested_objects_optional/ │ │ │ │ ├── expected.out │ │ │ │ ├── nested_objects_nest.json │ │ │ │ ├── nested_objects_single.json │ │ │ │ └── telegraf.conf │ │ │ ├── nested_tags/ │ │ │ │ ├── expected.out │ │ │ │ ├── input.json │ │ │ │ └── telegraf.conf │ │ │ ├── nested_tags_complex/ │ │ │ │ ├── expected.out │ │ │ │ ├── input.json │ │ │ │ └── telegraf.conf │ │ │ ├── null/ │ │ │ │ ├── expected.out │ │ │ │ ├── input.json │ │ │ │ └── telegraf.conf │ │ │ ├── object/ │ │ │ │ ├── expected.out │ │ │ │ ├── input.json │ │ │ │ └── telegraf.conf │ │ │ ├── object_multiple/ │ │ │ │ ├── expected.out │ │ │ │ ├── input.json │ │ │ │ └── telegraf.conf │ │ │ ├── object_timestamp/ │ │ │ │ ├── expected.out │ │ │ │ ├── input.json │ │ │ │ └── telegraf.conf │ │ │ ├── optional/ │ │ │ │ ├── expected.out │ │ │ │ ├── input.json │ │ │ │ └── telegraf.conf │ │ │ ├── optional_objects/ │ │ │ │ ├── expected.out │ │ │ │ ├── input_1.json │ │ │ │ ├── input_2.json │ │ │ │ └── telegraf.conf │ │ │ ├── string_type_objects/ │ │ │ │ ├── expected.out │ │ │ │ ├── input.json │ │ │ │ └── telegraf.conf │ │ │ ├── subfieldtag_in_object/ │ │ │ │ ├── expected.out │ │ │ │ ├── input.json │ │ │ │ └── telegraf.conf │ │ │ ├── subfieldtag_in_object_2/ │ │ │ │ ├── expected.out │ │ │ │ ├── input.json │ │ │ │ └── telegraf.conf │ │ │ ├── timestamp/ │ │ │ │ ├── expected.out │ │ │ │ ├── input.json │ │ │ │ └── telegraf.conf │ │ │ ├── timestamp_ns/ │ │ │ │ ├── expected.out │ │ │ │ ├── input.json │ │ │ │ └── telegraf.conf │ │ │ ├── timestamp_rfc3339/ │ │ │ │ ├── expected.out │ │ │ │ ├── input.json │ │ │ │ └── telegraf.conf │ │ │ ├── types/ │ │ │ │ ├── expected.out │ │ │ │ ├── input.json │ │ │ │ └── telegraf.conf │ │ │ └── wrong_path/ │ │ │ ├── expected.err │ │ │ ├── expected.out │ │ │ ├── input.json │ │ │ └── telegraf.conf │ │ ├── logfmt/ │ │ │ ├── README.md │ │ │ ├── parser.go │ │ │ └── parser_test.go │ │ ├── nagios/ │ │ │ ├── README.md │ │ │ ├── parser.go │ │ │ └── parser_test.go │ │ ├── openmetrics/ │ │ │ ├── README.md │ │ │ ├── metric_v1.go │ │ │ ├── metric_v2.go │ │ │ ├── openmetrics_data_model.pb.go │ │ │ ├── openmetrics_data_model.proto │ │ │ ├── parser.go │ │ │ ├── parser_test.go │ │ │ ├── testcases/ │ │ │ │ ├── dovecot/ │ │ │ │ │ ├── expected_v1.out │ │ │ │ │ ├── expected_v2.out │ │ │ │ │ ├── input.txt │ │ │ │ │ └── telegraf.conf │ │ │ │ ├── multiple/ │ │ │ │ │ ├── expected_v1.out │ │ │ │ │ ├── expected_v2.out │ │ │ │ │ ├── input.txt │ │ │ │ │ └── telegraf.conf │ │ │ │ ├── protobuf/ │ │ │ │ │ ├── expected_v1.out │ │ │ │ │ ├── expected_v2.out │ │ │ │ │ └── telegraf.conf │ │ │ │ ├── protobuf_infolabels/ │ │ │ │ │ ├── expected_v1.out │ │ │ │ │ ├── expected_v2.out │ │ │ │ │ └── telegraf.conf │ │ │ │ ├── valid_counter/ │ │ │ │ │ ├── expected_v1.out │ │ │ │ │ ├── expected_v2.out │ │ │ │ │ ├── input.txt │ │ │ │ │ └── telegraf.conf │ │ │ │ ├── valid_gauge/ │ │ │ │ │ ├── expected_v1.out │ │ │ │ │ ├── expected_v2.out │ │ │ │ │ ├── input.txt │ │ │ │ │ └── telegraf.conf │ │ │ │ ├── valid_gaugehistogram/ │ │ │ │ │ ├── expected_v1.out │ │ │ │ │ ├── expected_v2.out │ │ │ │ │ ├── input.txt │ │ │ │ │ └── telegraf.conf │ │ │ │ ├── valid_histogram/ │ │ │ │ │ ├── expected_v1.out │ │ │ │ │ ├── expected_v2.out │ │ │ │ │ ├── input.txt │ │ │ │ │ └── telegraf.conf │ │ │ │ ├── valid_info/ │ │ │ │ │ ├── expected_v1.out │ │ │ │ │ ├── expected_v2.out │ │ │ │ │ ├── input.txt │ │ │ │ │ └── telegraf.conf │ │ │ │ ├── valid_stateset/ │ │ │ │ │ ├── expected_v1.out │ │ │ │ │ ├── expected_v2.out │ │ │ │ │ ├── input.txt │ │ │ │ │ └── telegraf.conf │ │ │ │ ├── valid_summary/ │ │ │ │ │ ├── expected_v1.out │ │ │ │ │ ├── expected_v2.out │ │ │ │ │ ├── input.txt │ │ │ │ │ └── telegraf.conf │ │ │ │ └── valid_unknown/ │ │ │ │ ├── expected_v1.out │ │ │ │ ├── expected_v2.out │ │ │ │ ├── input.txt │ │ │ │ └── telegraf.conf │ │ │ └── textparse.go │ │ ├── opentsdb/ │ │ │ ├── README.md │ │ │ ├── parser.go │ │ │ └── parser_test.go │ │ ├── parquet/ │ │ │ ├── README.md │ │ │ ├── columns.go │ │ │ ├── parser.go │ │ │ ├── parser_test.go │ │ │ └── testcases/ │ │ │ ├── benchmark/ │ │ │ │ ├── expected.out │ │ │ │ ├── generate.py │ │ │ │ ├── input.parquet │ │ │ │ └── telegraf.conf │ │ │ ├── datatypes/ │ │ │ │ ├── expected.out │ │ │ │ ├── generate.py │ │ │ │ ├── input.parquet │ │ │ │ └── telegraf.conf │ │ │ ├── dense/ │ │ │ │ ├── expected.out │ │ │ │ ├── generate.py │ │ │ │ ├── input.parquet │ │ │ │ └── telegraf.conf │ │ │ ├── empty/ │ │ │ │ ├── expected.out │ │ │ │ ├── generate.py │ │ │ │ ├── input.parquet │ │ │ │ └── telegraf.conf │ │ │ ├── multitable/ │ │ │ │ ├── expected.out │ │ │ │ ├── generate.py │ │ │ │ ├── input.parquet │ │ │ │ └── telegraf.conf │ │ │ ├── sparse/ │ │ │ │ ├── expected.out │ │ │ │ ├── generate.py │ │ │ │ ├── input.parquet │ │ │ │ └── telegraf.conf │ │ │ └── timestamp/ │ │ │ ├── expected.out │ │ │ ├── generate.py │ │ │ ├── input.parquet │ │ │ └── telegraf.conf │ │ ├── prometheus/ │ │ │ ├── README.md │ │ │ ├── common.go │ │ │ ├── metric_v1.go │ │ │ ├── metric_v2.go │ │ │ ├── parser.go │ │ │ ├── parser_test.go │ │ │ └── testcases/ │ │ │ ├── benchmark/ │ │ │ │ ├── expected_v1.out │ │ │ │ ├── expected_v2.out │ │ │ │ ├── input.txt │ │ │ │ └── telegraf.conf │ │ │ ├── default_tags/ │ │ │ │ ├── expected_v1.out │ │ │ │ ├── expected_v2.out │ │ │ │ ├── input.txt │ │ │ │ └── telegraf.conf │ │ │ ├── histogram_inf_bucket/ │ │ │ │ ├── expected_v1.out │ │ │ │ ├── expected_v2.out │ │ │ │ └── telegraf.conf │ │ │ ├── ignore_timestamp/ │ │ │ │ ├── expected_v1.out │ │ │ │ ├── expected_v2.out │ │ │ │ ├── input.txt │ │ │ │ └── telegraf.conf │ │ │ ├── metric_with_timestamp/ │ │ │ │ ├── expected_v1.out │ │ │ │ ├── expected_v2.out │ │ │ │ ├── input.txt │ │ │ │ └── telegraf.conf │ │ │ ├── protobuf/ │ │ │ │ ├── expected_v1.out │ │ │ │ ├── expected_v2.out │ │ │ │ └── telegraf.conf │ │ │ ├── valid_counter/ │ │ │ │ ├── expected_v1.out │ │ │ │ ├── expected_v2.out │ │ │ │ ├── input.txt │ │ │ │ └── telegraf.conf │ │ │ ├── valid_gauge/ │ │ │ │ ├── expected_v1.out │ │ │ │ ├── expected_v2.out │ │ │ │ ├── input.txt │ │ │ │ └── telegraf.conf │ │ │ ├── valid_histogram/ │ │ │ │ ├── expected_v1.out │ │ │ │ ├── expected_v2.out │ │ │ │ ├── input.txt │ │ │ │ └── telegraf.conf │ │ │ └── valid_summary/ │ │ │ ├── expected_v1.out │ │ │ ├── expected_v2.out │ │ │ ├── input.txt │ │ │ └── telegraf.conf │ │ ├── prometheusremotewrite/ │ │ │ ├── README.md │ │ │ ├── metric_v1.go │ │ │ ├── metric_v2.go │ │ │ ├── parser.go │ │ │ ├── parser_test.go │ │ │ └── testcases/ │ │ │ ├── benchmark/ │ │ │ │ ├── expected_v1.out │ │ │ │ ├── expected_v2.out │ │ │ │ ├── input.json │ │ │ │ └── telegraf.conf │ │ │ ├── default_tags/ │ │ │ │ ├── expected_v1.out │ │ │ │ ├── expected_v2.out │ │ │ │ ├── input.json │ │ │ │ └── telegraf.conf │ │ │ ├── float_histogram/ │ │ │ │ ├── expected_v1.out │ │ │ │ ├── expected_v2.out │ │ │ │ ├── input.json │ │ │ │ └── telegraf.conf │ │ │ ├── int_histogram/ │ │ │ │ ├── expected_v1.out │ │ │ │ ├── expected_v2.out │ │ │ │ ├── input.json │ │ │ │ └── telegraf.conf │ │ │ └── simple/ │ │ │ ├── expected_v1.out │ │ │ ├── expected_v2.out │ │ │ ├── input.json │ │ │ └── telegraf.conf │ │ ├── registry.go │ │ ├── value/ │ │ │ ├── README.md │ │ │ ├── parser.go │ │ │ └── parser_test.go │ │ ├── wavefront/ │ │ │ ├── README.md │ │ │ ├── element.go │ │ │ ├── parser.go │ │ │ ├── parser_test.go │ │ │ ├── scanner.go │ │ │ └── token.go │ │ └── xpath/ │ │ ├── README.md │ │ ├── cbor_document.go │ │ ├── json_document.go │ │ ├── msgpack_document.go │ │ ├── parser.go │ │ ├── parser_test.go │ │ ├── protocolbuffer_document.go │ │ ├── testcases/ │ │ │ ├── addressbook.conf │ │ │ ├── cbor/ │ │ │ │ ├── expected.out │ │ │ │ └── telegraf.conf │ │ │ ├── cbor_base64_encoding/ │ │ │ │ ├── expected.out │ │ │ │ └── telegraf.conf │ │ │ ├── cbor_benchmark/ │ │ │ │ ├── expected.out │ │ │ │ └── telegraf.conf │ │ │ ├── cbor_hex_encoding/ │ │ │ │ ├── expected.out │ │ │ │ └── telegraf.conf │ │ │ ├── cbor_hex_encoding_explicit/ │ │ │ │ ├── expected.out │ │ │ │ └── telegraf.conf │ │ │ ├── cbor_numeric_keys/ │ │ │ │ ├── expected.out │ │ │ │ └── telegraf.conf │ │ │ ├── earthquakes.conf │ │ │ ├── earthquakes.quakeml │ │ │ ├── field_tag_batch.conf │ │ │ ├── field_tag_batch.json │ │ │ ├── json_array_expand/ │ │ │ │ ├── expected.out │ │ │ │ ├── telegraf.conf │ │ │ │ └── test.json │ │ │ ├── json_array_expand_simple_types/ │ │ │ │ ├── expected.out │ │ │ │ ├── telegraf.conf │ │ │ │ └── test.json │ │ │ ├── json_array_simple_types/ │ │ │ │ ├── expected.out │ │ │ │ ├── telegraf.conf │ │ │ │ └── test.json │ │ │ ├── json_explicit_precedence/ │ │ │ │ ├── expected.out │ │ │ │ ├── telegraf.conf │ │ │ │ └── test.json │ │ │ ├── json_native_nonnested/ │ │ │ │ ├── expected.out │ │ │ │ ├── telegraf.conf │ │ │ │ └── test.json │ │ │ ├── json_string_representation/ │ │ │ │ ├── expected.out │ │ │ │ ├── telegraf.conf │ │ │ │ └── test.json │ │ │ ├── multisensor.xml │ │ │ ├── multisensor_explicit_basic.conf │ │ │ ├── multisensor_explicit_batch.conf │ │ │ ├── multisensor_selection_batch.conf │ │ │ ├── name_expansion/ │ │ │ │ ├── expected.out │ │ │ │ ├── telegraf.conf │ │ │ │ └── test.json │ │ │ ├── native_types_cbor/ │ │ │ │ ├── expected.out │ │ │ │ └── telegraf.conf │ │ │ ├── native_types_json/ │ │ │ │ ├── expected.out │ │ │ │ ├── telegraf.conf │ │ │ │ └── test.json │ │ │ ├── native_types_msgpack/ │ │ │ │ ├── expected.out │ │ │ │ ├── native_types_json/ │ │ │ │ │ ├── expected.out │ │ │ │ │ ├── telegraf.conf │ │ │ │ │ └── test.json │ │ │ │ ├── telegraf.conf │ │ │ │ └── test.msg │ │ │ ├── native_types_protobuf/ │ │ │ │ ├── expected.out │ │ │ │ ├── message.proto │ │ │ │ └── telegraf.conf │ │ │ ├── openweathermap_5d.json │ │ │ ├── openweathermap_5d.xml │ │ │ ├── openweathermap_json.conf │ │ │ ├── openweathermap_xml.conf │ │ │ ├── protobuf_benchmark/ │ │ │ │ ├── benchmark.proto │ │ │ │ ├── expected.out │ │ │ │ └── telegraf.conf │ │ │ ├── protobuf_issue_13715/ │ │ │ │ ├── expected.out │ │ │ │ ├── issue.proto │ │ │ │ └── telegraf.conf │ │ │ ├── protobuf_issue_15571/ │ │ │ │ ├── data.json │ │ │ │ ├── expected.out │ │ │ │ ├── port.proto │ │ │ │ ├── telegraf.conf │ │ │ │ └── telemetry_top.proto │ │ │ ├── protobuf_noskip_bytes_grpc/ │ │ │ │ ├── expected.err │ │ │ │ ├── message.proto │ │ │ │ └── telegraf.conf │ │ │ ├── protobuf_powerdns_hex/ │ │ │ │ ├── expected.out │ │ │ │ ├── powerdns_message.proto │ │ │ │ └── telegraf.conf │ │ │ ├── protobuf_skip_bytes_grpc/ │ │ │ │ ├── expected.out │ │ │ │ ├── message.proto │ │ │ │ └── telegraf.conf │ │ │ ├── protos/ │ │ │ │ ├── addressbook.proto │ │ │ │ ├── person.proto │ │ │ │ └── phonenumber.proto │ │ │ ├── string_join/ │ │ │ │ ├── expected.out │ │ │ │ ├── telegraf.conf │ │ │ │ └── test.json │ │ │ ├── time_float_exponential/ │ │ │ │ ├── expected.out │ │ │ │ ├── telegraf.conf │ │ │ │ └── test.json │ │ │ ├── time_timezone_Berlin/ │ │ │ │ ├── expected.out │ │ │ │ ├── telegraf.conf │ │ │ │ └── test.json │ │ │ ├── time_timezone_CEST/ │ │ │ │ ├── expected.out │ │ │ │ ├── telegraf.conf │ │ │ │ └── test.json │ │ │ ├── time_timezone_MST/ │ │ │ │ ├── expected.out │ │ │ │ ├── telegraf.conf │ │ │ │ └── test.json │ │ │ ├── time_timezone_utc/ │ │ │ │ ├── expected.out │ │ │ │ ├── telegraf.conf │ │ │ │ └── test.json │ │ │ ├── time_timezone_with_offset/ │ │ │ │ ├── expected.out │ │ │ │ ├── telegraf.conf │ │ │ │ └── test.json │ │ │ ├── tracker.msg │ │ │ └── tracker_msgpack.conf │ │ └── xml_document.go │ ├── processors/ │ │ ├── all/ │ │ │ ├── all.go │ │ │ ├── aws_ec2.go │ │ │ ├── batch.go │ │ │ ├── clone.go │ │ │ ├── converter.go │ │ │ ├── cumulative_sum.go │ │ │ ├── date.go │ │ │ ├── dedup.go │ │ │ ├── defaults.go │ │ │ ├── enum.go │ │ │ ├── execd.go │ │ │ ├── filepath.go │ │ │ ├── filter.go │ │ │ ├── ifname.go │ │ │ ├── lookup.go │ │ │ ├── noise.go │ │ │ ├── override.go │ │ │ ├── parser.go │ │ │ ├── pivot.go │ │ │ ├── port_name.go │ │ │ ├── printer.go │ │ │ ├── processors.go │ │ │ ├── regex.go │ │ │ ├── rename.go │ │ │ ├── reverse_dns.go │ │ │ ├── round.go │ │ │ ├── s2geo.go │ │ │ ├── scale.go │ │ │ ├── snmp_lookup.go │ │ │ ├── split.go │ │ │ ├── starlark.go │ │ │ ├── strings.go │ │ │ ├── tag_limit.go │ │ │ ├── template.go │ │ │ ├── topk.go │ │ │ └── unpivot.go │ │ ├── aws_ec2/ │ │ │ ├── README.md │ │ │ ├── ec2.go │ │ │ ├── ec2_test.go │ │ │ └── sample.conf │ │ ├── batch/ │ │ │ ├── README.md │ │ │ ├── batch.go │ │ │ ├── batch_test.go │ │ │ └── sample.conf │ │ ├── clone/ │ │ │ ├── README.md │ │ │ ├── clone.go │ │ │ ├── clone_test.go │ │ │ └── sample.conf │ │ ├── converter/ │ │ │ ├── README.md │ │ │ ├── converter.go │ │ │ ├── converter_test.go │ │ │ └── sample.conf │ │ ├── cumulative_sum/ │ │ │ ├── README.md │ │ │ ├── cumulative_sum.go │ │ │ ├── cumulative_sum_test.go │ │ │ └── sample.conf │ │ ├── date/ │ │ │ ├── README.md │ │ │ ├── date.go │ │ │ ├── date_test.go │ │ │ └── sample.conf │ │ ├── dedup/ │ │ │ ├── README.md │ │ │ ├── dedup.go │ │ │ ├── dedup_test.go │ │ │ └── sample.conf │ │ ├── defaults/ │ │ │ ├── README.md │ │ │ ├── defaults.go │ │ │ ├── defaults_test.go │ │ │ └── sample.conf │ │ ├── deprecations.go │ │ ├── enum/ │ │ │ ├── README.md │ │ │ ├── enum.go │ │ │ ├── enum_test.go │ │ │ └── sample.conf │ │ ├── execd/ │ │ │ ├── README.md │ │ │ ├── examples/ │ │ │ │ └── multiplier_line_protocol/ │ │ │ │ ├── multiplier.conf │ │ │ │ └── multiplier_line_protocol.rb │ │ │ ├── execd.go │ │ │ ├── execd_test.go │ │ │ ├── sample.conf │ │ │ └── testcases/ │ │ │ ├── dataformat-influx/ │ │ │ │ ├── expected.out │ │ │ │ ├── input.influx │ │ │ │ └── telegraf.conf │ │ │ ├── dataformat-json/ │ │ │ │ ├── expected.out │ │ │ │ ├── input.influx │ │ │ │ └── telegraf.conf │ │ │ ├── defaults/ │ │ │ │ ├── expected.out │ │ │ │ ├── input.influx │ │ │ │ └── telegraf.conf │ │ │ └── pass-through.go │ │ ├── filepath/ │ │ │ ├── README.md │ │ │ ├── filepath.go │ │ │ ├── filepath_test.go │ │ │ ├── filepath_test_helpers.go │ │ │ ├── filepath_windows_test.go │ │ │ └── sample.conf │ │ ├── filter/ │ │ │ ├── README.md │ │ │ ├── filter.go │ │ │ ├── filter_test.go │ │ │ ├── rule.go │ │ │ └── sample.conf │ │ ├── ifname/ │ │ │ ├── README.md │ │ │ ├── cache.go │ │ │ ├── cache_test.go │ │ │ ├── ifname.go │ │ │ ├── ifname_test.go │ │ │ ├── sample.conf │ │ │ ├── ttl_cache.go │ │ │ └── ttl_cache_test.go │ │ ├── lookup/ │ │ │ ├── README.md │ │ │ ├── lookup.go │ │ │ ├── lookup_test.go │ │ │ ├── sample.conf │ │ │ └── testcases/ │ │ │ ├── multiple_files_json/ │ │ │ │ ├── expected.out │ │ │ │ ├── input.influx │ │ │ │ ├── lut_hugin.json │ │ │ │ ├── lut_munin.json │ │ │ │ ├── lut_thor.json │ │ │ │ └── telegraf.conf │ │ │ ├── non_existing_tag/ │ │ │ │ ├── expected.out │ │ │ │ ├── input.influx │ │ │ │ ├── lut.json │ │ │ │ └── telegraf.conf │ │ │ ├── normal_lookup_csv_key_name_value/ │ │ │ │ ├── expected.out │ │ │ │ ├── input.influx │ │ │ │ ├── lut.csv │ │ │ │ └── telegraf.conf │ │ │ ├── normal_lookup_csv_key_values/ │ │ │ │ ├── expected.out │ │ │ │ ├── input.influx │ │ │ │ ├── lut.csv │ │ │ │ └── telegraf.conf │ │ │ └── normal_lookup_json/ │ │ │ ├── expected.out │ │ │ ├── input.influx │ │ │ ├── lut.json │ │ │ └── telegraf.conf │ │ ├── noise/ │ │ │ ├── README.md │ │ │ ├── noise.go │ │ │ ├── noise_test.go │ │ │ └── sample.conf │ │ ├── override/ │ │ │ ├── README.md │ │ │ ├── override.go │ │ │ ├── override_test.go │ │ │ └── sample.conf │ │ ├── parser/ │ │ │ ├── README.md │ │ │ ├── parser.go │ │ │ ├── parser_test.go │ │ │ └── sample.conf │ │ ├── pivot/ │ │ │ ├── README.md │ │ │ ├── pivot.go │ │ │ ├── pivot_test.go │ │ │ └── sample.conf │ │ ├── port_name/ │ │ │ ├── README.md │ │ │ ├── port_name.go │ │ │ ├── port_name_test.go │ │ │ ├── sample.conf │ │ │ ├── services_path.go │ │ │ └── services_path_notwindows.go │ │ ├── printer/ │ │ │ ├── README.md │ │ │ ├── printer.go │ │ │ ├── printer_test.go │ │ │ └── sample.conf │ │ ├── regex/ │ │ │ ├── README.md │ │ │ ├── converter.go │ │ │ ├── regex.go │ │ │ ├── regex_test.go │ │ │ └── sample.conf │ │ ├── registry.go │ │ ├── rename/ │ │ │ ├── README.md │ │ │ ├── rename.go │ │ │ ├── rename_test.go │ │ │ └── sample.conf │ │ ├── reverse_dns/ │ │ │ ├── README.md │ │ │ ├── rdnscache.go │ │ │ ├── rdnscache_test.go │ │ │ ├── reverse_dns.go │ │ │ ├── reverse_dns_test.go │ │ │ └── sample.conf │ │ ├── round/ │ │ │ ├── README.md │ │ │ ├── round.go │ │ │ ├── round_test.go │ │ │ └── sample.conf │ │ ├── s2geo/ │ │ │ ├── README.md │ │ │ ├── s2geo.go │ │ │ ├── s2geo_test.go │ │ │ └── sample.conf │ │ ├── scale/ │ │ │ ├── README.md │ │ │ ├── sample.conf │ │ │ ├── scale.go │ │ │ └── scale_test.go │ │ ├── snmp_lookup/ │ │ │ ├── README.md │ │ │ ├── backlog.go │ │ │ ├── lookup.go │ │ │ ├── lookup_test.go │ │ │ ├── sample.conf │ │ │ ├── store.go │ │ │ └── store_test.go │ │ ├── split/ │ │ │ ├── README.md │ │ │ ├── sample.conf │ │ │ ├── split.go │ │ │ ├── split_test.go │ │ │ └── testcases/ │ │ │ ├── drop_original/ │ │ │ │ ├── config.toml │ │ │ │ ├── expected.out │ │ │ │ └── input.influx │ │ │ ├── globs/ │ │ │ │ ├── config.toml │ │ │ │ ├── expected.out │ │ │ │ └── input.influx │ │ │ ├── nomatches/ │ │ │ │ ├── config.toml │ │ │ │ ├── expected.out │ │ │ │ └── input.influx │ │ │ ├── singlemetric/ │ │ │ │ ├── config.toml │ │ │ │ ├── expected.out │ │ │ │ └── input.influx │ │ │ └── tags/ │ │ │ ├── config.toml │ │ │ ├── expected.out │ │ │ └── input.influx │ │ ├── starlark/ │ │ │ ├── README.md │ │ │ ├── sample.conf │ │ │ ├── starlark.go │ │ │ ├── starlark_test.go │ │ │ └── testdata/ │ │ │ ├── compare_metrics.star │ │ │ ├── drop_fields_with_unexpected_type.star │ │ │ ├── drop_string_fields.star │ │ │ ├── fail.star │ │ │ ├── iops.star │ │ │ ├── json.star │ │ │ ├── json_nested.star │ │ │ ├── logging.star │ │ │ ├── math.star │ │ │ ├── multiple_metrics.star │ │ │ ├── multiple_metrics_with_json.star │ │ │ ├── number_logic.star │ │ │ ├── pivot.star │ │ │ ├── ratio.star │ │ │ ├── rename.star │ │ │ ├── rename_prometheus_remote_write.star │ │ │ ├── scale.star │ │ │ ├── schema_sizing.star │ │ │ ├── sparkplug.star │ │ │ ├── time_date.star │ │ │ ├── time_duration.star │ │ │ ├── time_set_timestamp.star │ │ │ ├── time_timestamp.star │ │ │ ├── time_timestamp_nanos.star │ │ │ └── value_filter.star │ │ ├── streamingprocessor.go │ │ ├── strings/ │ │ │ ├── README.md │ │ │ ├── sample.conf │ │ │ ├── strings.go │ │ │ └── strings_test.go │ │ ├── tag_limit/ │ │ │ ├── README.md │ │ │ ├── sample.conf │ │ │ ├── tag_limit.go │ │ │ └── tag_limit_test.go │ │ ├── template/ │ │ │ ├── README.md │ │ │ ├── sample.conf │ │ │ ├── template.go │ │ │ └── template_test.go │ │ ├── timestamp/ │ │ │ ├── README.md │ │ │ ├── sample.conf │ │ │ ├── timestamp.go │ │ │ └── timestamp_test.go │ │ ├── topk/ │ │ │ ├── README.md │ │ │ ├── sample.conf │ │ │ ├── topk.go │ │ │ └── topk_test.go │ │ └── unpivot/ │ │ ├── README.md │ │ ├── sample.conf │ │ ├── unpivot.go │ │ └── unpivot_test.go │ ├── secretstores/ │ │ ├── README.md │ │ ├── all/ │ │ │ ├── all.go │ │ │ ├── docker.go │ │ │ ├── googlecloud.go │ │ │ ├── http.go │ │ │ ├── jose.go │ │ │ ├── oauth2.go │ │ │ ├── os.go │ │ │ ├── systemd.go │ │ │ └── vault.go │ │ ├── deprecations.go │ │ ├── docker/ │ │ │ ├── README.md │ │ │ ├── docker.go │ │ │ ├── docker_test.go │ │ │ ├── sample.conf │ │ │ └── testdata/ │ │ │ ├── secret-file-1 │ │ │ ├── secretFile │ │ │ └── secret_file_2 │ │ ├── googlecloud/ │ │ │ ├── README.md │ │ │ ├── googlecloud.go │ │ │ ├── googlecloud_test.go │ │ │ ├── sample.conf │ │ │ └── testdata/ │ │ │ ├── cert.pem │ │ │ ├── gdch-missing-ca-cert-path.json │ │ │ ├── gdch.json │ │ │ ├── invalid-json-sa-key.json │ │ │ └── missing-type-sa-key.json │ │ ├── http/ │ │ │ ├── README.md │ │ │ ├── aes.go │ │ │ ├── aes_test.go │ │ │ ├── decryption.go │ │ │ ├── decryption_test.go │ │ │ ├── http.go │ │ │ ├── http_test.go │ │ │ ├── key_derivation.go │ │ │ ├── key_derivation_test.go │ │ │ ├── sample.conf │ │ │ ├── sample.conf.in │ │ │ └── testcases/ │ │ │ ├── aes-cbc-kdf/ │ │ │ │ ├── expected.json │ │ │ │ ├── secrets.json │ │ │ │ └── telegraf.conf │ │ │ ├── aes-cbc-key/ │ │ │ │ ├── expected.json │ │ │ │ ├── secrets.json │ │ │ │ └── telegraf.conf │ │ │ ├── mixed/ │ │ │ │ ├── expected.json │ │ │ │ ├── secrets.json │ │ │ │ └── telegraf.conf │ │ │ ├── plain-list-complex/ │ │ │ │ ├── expected.json │ │ │ │ ├── secrets.json │ │ │ │ └── telegraf.conf │ │ │ ├── plain-list-simple/ │ │ │ │ ├── expected.json │ │ │ │ ├── secrets.json │ │ │ │ └── telegraf.conf │ │ │ └── plain-no-transform/ │ │ │ ├── expected.json │ │ │ ├── secrets.json │ │ │ └── telegraf.conf │ │ ├── jose/ │ │ │ ├── README.md │ │ │ ├── jose.go │ │ │ ├── jose_test.go │ │ │ └── sample.conf │ │ ├── oauth2/ │ │ │ ├── README.md │ │ │ ├── oauth2.go │ │ │ ├── oauth2_test.go │ │ │ └── sample.conf │ │ ├── os/ │ │ │ ├── README.md │ │ │ ├── os.go │ │ │ ├── os_darwin.go │ │ │ ├── os_linux.go │ │ │ ├── os_test.go │ │ │ ├── os_unsupported.go │ │ │ ├── os_windows.go │ │ │ └── sample.conf │ │ ├── registry.go │ │ ├── systemd/ │ │ │ ├── README.md │ │ │ ├── sample.conf │ │ │ ├── systemd.go │ │ │ ├── systemd_nonlinux.go │ │ │ ├── systemd_test.go │ │ │ └── testdata/ │ │ │ ├── secret-file-1 │ │ │ ├── secretFile │ │ │ └── secret_file_2 │ │ └── vault/ │ │ ├── README.md │ │ ├── sample.conf │ │ ├── testdata/ │ │ │ └── policy.hcl │ │ ├── vault.go │ │ └── vault_test.go │ └── serializers/ │ ├── EXAMPLE_README.md │ ├── all/ │ │ ├── all.go │ │ ├── binary.go │ │ ├── carbon2.go │ │ ├── cloudevents.go │ │ ├── csv.go │ │ ├── graphite.go │ │ ├── influx.go │ │ ├── json.go │ │ ├── msgpack.go │ │ ├── nowmetric.go │ │ ├── prometheus.go │ │ ├── prometheusremotewrite.go │ │ ├── splunkmetric.go │ │ ├── template.go │ │ └── wavefront.go │ ├── binary/ │ │ ├── README.md │ │ ├── binary.go │ │ ├── binary_test.go │ │ ├── entry.go │ │ ├── entry_test.go │ │ └── type_conversions.go │ ├── carbon2/ │ │ ├── README.md │ │ ├── carbon2.go │ │ └── carbon2_test.go │ ├── cloudevents/ │ │ ├── README.md │ │ ├── cloudevents.go │ │ ├── cloudevents_test.go │ │ └── testcases/ │ │ ├── batch-events/ │ │ │ ├── expected.json │ │ │ ├── input.influx │ │ │ └── telegraf.conf │ │ ├── batch-metrics/ │ │ │ ├── expected.json │ │ │ ├── input.influx │ │ │ └── telegraf.conf │ │ ├── cloudevents-v0.3-schema.json │ │ ├── cloudevents-v1.0-schema.json │ │ ├── single/ │ │ │ ├── expected.json │ │ │ ├── input.influx │ │ │ └── telegraf.conf │ │ ├── single-multiple/ │ │ │ ├── expected.json │ │ │ ├── input.influx │ │ │ └── telegraf.conf │ │ ├── single-source-overwrite/ │ │ │ ├── expected.json │ │ │ ├── input.influx │ │ │ └── telegraf.conf │ │ └── single-sourcetag-overwrite/ │ │ ├── expected.json │ │ ├── input.influx │ │ └── telegraf.conf │ ├── csv/ │ │ ├── README.md │ │ ├── csv.go │ │ ├── csv_test.go │ │ └── testcases/ │ │ ├── basic.conf │ │ ├── basic.csv │ │ ├── header.conf │ │ ├── header.csv │ │ ├── nanoseconds.conf │ │ ├── nanoseconds.csv │ │ ├── ordered.conf │ │ ├── ordered.csv │ │ ├── ordered_not_exist.conf │ │ ├── ordered_not_exist.csv │ │ ├── ordered_with_header.conf │ │ ├── ordered_with_header.csv │ │ ├── ordered_with_header_prefix.conf │ │ ├── ordered_with_header_prefix.csv │ │ ├── prefix.conf │ │ ├── prefix.csv │ │ ├── rfc3339.conf │ │ ├── rfc3339.csv │ │ ├── semicolon.conf │ │ └── semicolon.csv │ ├── deprecations.go │ ├── graphite/ │ │ ├── README.md │ │ ├── graphite.go │ │ └── graphite_test.go │ ├── influx/ │ │ ├── README.md │ │ ├── escape.go │ │ ├── influx.go │ │ ├── influx_test.go │ │ ├── reader.go │ │ └── reader_test.go │ ├── json/ │ │ ├── README.md │ │ ├── json.go │ │ ├── json_test.go │ │ └── testcases/ │ │ ├── nested_fields_exclude.conf │ │ ├── nested_fields_include.conf │ │ ├── nested_fields_out.json │ │ ├── transformation_batch.conf │ │ ├── transformation_batch_out.json │ │ ├── transformation_single.conf │ │ └── transformation_single_out.json │ ├── msgpack/ │ │ ├── README.md │ │ ├── metric.go │ │ ├── metric_gen.go │ │ ├── metric_gen_test.go │ │ ├── metric_test.go │ │ ├── msgpack.go │ │ └── msgpack_test.go │ ├── nowmetric/ │ │ ├── README.md │ │ ├── nowmetric.go │ │ └── nowmetric_test.go │ ├── prometheus/ │ │ ├── README.md │ │ ├── collection.go │ │ ├── collection_test.go │ │ ├── convert.go │ │ ├── prometheus.go │ │ └── prometheus_test.go │ ├── prometheusremotewrite/ │ │ ├── README.md │ │ ├── prometheusremotewrite.go │ │ └── prometheusremotewrite_test.go │ ├── registry.go │ ├── splunkmetric/ │ │ ├── README.md │ │ ├── splunkmetric.go │ │ └── splunkmetric_test.go │ ├── template/ │ │ ├── README.md │ │ ├── template.go │ │ └── template_test.go │ ├── test_benchmark.go │ └── wavefront/ │ ├── README.md │ ├── replacers.go │ ├── wavefront.go │ └── wavefront_test.go ├── processor.go ├── scripts/ │ ├── check-deps.sh │ ├── check-file-changes.sh │ ├── check-plugin-changes.sh │ ├── check-plugin-doc-embedding.sh │ ├── ci.docker │ ├── deb/ │ │ ├── post-install.sh │ │ ├── post-remove.sh │ │ ├── pre-install.sh │ │ └── pre-remove.sh │ ├── init.sh │ ├── install_gotestsum.sh │ ├── install_incus.sh │ ├── installgo_linux.sh │ ├── installgo_mac.sh │ ├── installgo_windows.sh │ ├── local_circleci.sh │ ├── mac-signing.sh │ ├── make_docs.sh │ ├── rpm/ │ │ ├── post-install.sh │ │ ├── post-remove.sh │ │ └── pre-install.sh │ ├── sign-windows.sh │ ├── telegraf.service │ ├── telegraf_entry_mac │ └── windows-gen-syso.sh ├── secretstore.go ├── selfstat/ │ ├── collector.go │ ├── collector_test.go │ ├── selfstat.go │ ├── selfstat_test.go │ ├── stat.go │ └── timingStat.go ├── serializer.go ├── testutil/ │ ├── accumulator.go │ ├── capturelog.go │ ├── container.go │ ├── container_test.go │ ├── file.go │ ├── log.go │ ├── metric.go │ ├── metric_test.go │ ├── pki/ │ │ ├── cacert.pem │ │ ├── cakey.pem │ │ ├── client.pem │ │ ├── clientcert.pem │ │ ├── clientenc.pem │ │ ├── clientenckey.pem │ │ ├── clientenckey.pkcs8.pem │ │ ├── clientkey.pem │ │ ├── clientkey.pkcs8.pem │ │ ├── server.pem │ │ ├── servercert.pem │ │ ├── serverkey.pem │ │ └── tls-certs.sh │ ├── plugin_input/ │ │ ├── plugin.go │ │ └── sample.conf │ ├── socket.go │ ├── testutil.go │ ├── testutil_test.go │ └── tls.go └── tools/ ├── config_includer/ │ └── generator.go ├── custom_builder/ │ ├── README.md │ ├── config.go │ ├── main.go │ ├── main_test.go │ ├── packages.go │ └── testcases/ │ ├── issue_13592/ │ │ ├── expected.tags │ │ └── telegraf.conf │ └── issue_15627/ │ ├── expected.tags │ └── telegraf.conf ├── license_checker/ │ ├── README.md │ ├── data/ │ │ ├── spdx_mapping.json │ │ └── whitelist │ ├── main.go │ ├── package.go │ └── whitelist.go ├── package_incus_test/ │ ├── README.md │ ├── container.go │ ├── incus.go │ └── main.go ├── readme_config_includer/ │ └── generator.go ├── readme_linter/ │ ├── README.md │ ├── assert.go │ ├── main.go │ ├── plugin.go │ ├── rules.go │ └── set.go └── update_goversion/ ├── README.md ├── main.go ├── main_test.go └── testdata/ ├── godev_minor.html └── godev_patch.html ================================================ FILE CONTENTS ================================================ ================================================ FILE: .circleci/config.yml ================================================ version: 2.1 orbs: win: circleci/windows@5.0.0 aws-cli: circleci/aws-cli@3.1.1 executors: telegraf-ci: working_directory: '/go/src/github.com/influxdata/telegraf' resource_class: large docker: - image: 'quay.io/influxdb/telegraf-ci:1.25.7' environment: GOFLAGS: -p=4 mac: working_directory: '~/go/src/github.com/influxdata/telegraf' resource_class: m4pro.medium macos: xcode: 15.4.0 environment: HOMEBREW_NO_AUTO_UPDATE: 1 GOFLAGS: -p=4 commands: check-changed-files-or-halt: steps: - run: ./scripts/check-file-changes.sh test-go: parameters: os: type: string default: "linux" arch: type: string default: "amd64" gotestsum: type: string default: "gotestsum" steps: - run: ./scripts/install_gotestsum.sh << parameters.os >> << parameters.gotestsum >> - unless: condition: equal: [ "386", << parameters.arch >> ] steps: # Disable -race on Windows due to issues with CGO in the test-go-windows CI job. # See https://github.com/influxdata/telegraf/pull/17789 # - run: echo 'export RACE="-race"' >> $BASH_ENV - unless: condition: equal: [ windows, << parameters.os >> ] steps: - run: echo 'export RACE="-race"' >> $BASH_ENV # Disable CGO on Windows for the same reason as above. #- when: # condition: # equal: [ windows, << parameters.os >> ] # steps: # - run: echo 'export CGO_ENABLED=1' >> $BASH_ENV - when: condition: equal: [ darwin, << parameters.os >> ] steps: - run: echo 'export RACE="$RACE -ldflags=-extldflags=-Wl,-ld_classic"' >> $BASH_ENV - run: | GOARCH=<< parameters.arch >> ./<< parameters.gotestsum >> -- ${RACE} -short "$(./scripts/check-plugin-changes.sh)" package-build: parameters: type: type: string default: "" nightly: type: boolean default: false steps: - checkout - check-changed-files-or-halt - attach_workspace: at: '/go' - when: condition: equal: [ windows, << parameters.type >> ] steps: - run: go install github.com/josephspurrier/goversioninfo/cmd/goversioninfo@v1.4.0 - when: condition: << parameters.nightly >> steps: - run: command: 'NIGHTLY=1 make package include_packages="$(make << parameters.type >>)"' no_output_timeout: 30m - unless: condition: or: - << parameters.nightly >> steps: - run: command: 'make package include_packages="$(make << parameters.type >>)"' no_output_timeout: 30m - store_artifacts: path: './build/dist' destination: 'build/dist' - persist_to_workspace: root: './build' paths: - 'dist' jobs: lint-linux: executor: telegraf-ci steps: - checkout - run: ./scripts/make_docs.sh - check-changed-files-or-halt - run: 'make deps' - run: 'make tidy' - run: 'make check' - run: 'make check-deps' - run: name: "Install golangci-lint" command: go install github.com/golangci/golangci-lint/v2/cmd/golangci-lint@v2.7.2 - run: name: "golangci-lint/Linux" # There are only 4 vCPUs available for this executor, so use only 4 instead of the default number # (the OS may report the number of CPUs on the host instead of the number of CPUs available to the guest). command: GOGC=80 GOMEMLIMIT=6144MiB /go/bin/golangci-lint run --verbose --timeout=30m --concurrency 4 no_output_timeout: 30m lint-macos: executor: telegraf-ci steps: - checkout - check-changed-files-or-halt - run: name: "Install golangci-lint" command: go install github.com/golangci/golangci-lint/v2/cmd/golangci-lint@v2.7.2 - run: name: "golangci-lint/macOS" # There are only 4 vCPUs available for this executor, so use only 4 instead of the default number # (the OS may report the number of CPUs on the host instead of the number of CPUs available to the guest). command: GOGC=80 GOMEMLIMIT=6144MiB GOOS=darwin /go/bin/golangci-lint run --verbose --timeout=30m --concurrency 4 no_output_timeout: 30m lint-windows: executor: telegraf-ci steps: - checkout - check-changed-files-or-halt - run: name: "Install golangci-lint" command: go install github.com/golangci/golangci-lint/v2/cmd/golangci-lint@v2.7.2 - run: name: "golangci-lint/Windows" # There are only 4 vCPUs available for this executor, so use only 4 instead of the default number # (the OS may report the number of CPUs on the host instead of the number of CPUs available to the guest). command: GOGC=80 GOMEMLIMIT=6144MiB GOOS=windows /go/bin/golangci-lint run --verbose --timeout=30m --concurrency 4 no_output_timeout: 30m test-go-linux: executor: telegraf-ci steps: - checkout - check-changed-files-or-halt - test-go test-go-linux-386: executor: telegraf-ci steps: - checkout - check-changed-files-or-halt - run: 'GOARCH=386 make deps' - run: 'GOARCH=386 make tidy' - run: 'GOARCH=386 make check' - test-go: arch: "386" test-integration: machine: image: ubuntu-2204:current resource_class: large steps: - checkout - check-changed-files-or-halt - run: 'sh ./scripts/installgo_linux.sh' - run: 'make deps' - run: name: "Run integration tests" command: make test-integration environment: AZURE_EVENT_HUBS_EMULATOR_ACCEPT_EULA: yes test-go-mac: executor: mac steps: - checkout - check-changed-files-or-halt - run: 'sh ./scripts/installgo_mac.sh' - test-go: os: darwin arch: arm64 test-go-windows: executor: name: win/default shell: bash.exe size: large steps: - checkout - check-changed-files-or-halt - run: git config --system core.longpaths true - run: choco feature enable -n allowGlobalConfirmation - run: 'sh ./scripts/installgo_windows.sh' - run: choco install mingw - run: echo 'export PATH="$PATH:/c/ProgramData/mingw64/mingw64/bin"' >> $BASH_ENV - test-go: os: windows gotestsum: "gotestsum.exe" test-licenses: executor: telegraf-ci steps: - checkout - check-changed-files-or-halt - run: 'make build_tools' - run: './tools/license_checker/license_checker -whitelist ./tools/license_checker/data/whitelist' windows-package: parameters: nightly: type: boolean default: false executor: telegraf-ci steps: - package-build: type: windows nightly: << parameters.nightly >> darwin-amd64-package: parameters: nightly: type: boolean default: false executor: telegraf-ci steps: - package-build: type: darwin-amd64 nightly: << parameters.nightly >> darwin-arm64-package: parameters: nightly: type: boolean default: false executor: telegraf-ci steps: - package-build: type: darwin-arm64 nightly: << parameters.nightly >> i386-package: parameters: nightly: type: boolean default: false executor: telegraf-ci steps: - package-build: type: i386 nightly: << parameters.nightly >> ppc64le-package: parameters: nightly: type: boolean default: false executor: telegraf-ci steps: - package-build: type: ppc64le nightly: << parameters.nightly >> riscv64-package: parameters: nightly: type: boolean default: false executor: telegraf-ci steps: - package-build: type: riscv64 nightly: << parameters.nightly >> loong64-package: parameters: nightly: type: boolean default: false executor: telegraf-ci steps: - package-build: type: loong64 nightly: << parameters.nightly >> s390x-package: parameters: nightly: type: boolean default: false executor: telegraf-ci steps: - package-build: type: s390x nightly: << parameters.nightly >> armel-package: parameters: nightly: type: boolean default: false executor: telegraf-ci steps: - package-build: type: armel nightly: << parameters.nightly >> amd64-package: parameters: nightly: type: boolean default: false executor: telegraf-ci steps: - package-build: type: amd64 nightly: << parameters.nightly >> arm64-package: parameters: nightly: type: boolean default: false executor: telegraf-ci steps: - package-build: type: arm64 nightly: << parameters.nightly >> mipsel-package: parameters: nightly: type: boolean default: false executor: telegraf-ci steps: - package-build: type: mipsel nightly: << parameters.nightly >> mips-package: parameters: nightly: type: boolean default: false executor: telegraf-ci steps: - package-build: type: mips nightly: << parameters.nightly >> armhf-package: parameters: nightly: type: boolean default: false executor: telegraf-ci steps: - package-build: type: armhf nightly: << parameters.nightly >> nightly: executor: telegraf-ci steps: - attach_workspace: at: '/build' - run: command: | aws s3 sync /build/dist s3://dl.influxdata.com/telegraf/nightlies/ \ --exclude "*" \ --include "*.tar.gz" \ --include "*.deb" \ --include "*.rpm" \ --include "*.zip" \ --acl public-read release: executor: telegraf-ci steps: - attach_workspace: at: '/build' - run: command: | aws s3 sync /build/dist s3://dl.influxdata.com/telegraf/releases/ \ --exclude "*" \ --include "telegraf*.DIGESTS" \ --include "telegraf*.digests" \ --include "telegraf*.asc" \ --include "telegraf*.deb" \ --include "telegraf*.dmg" \ --include "telegraf*.rpm" \ --include "telegraf*.tar.gz" \ --include "telegraf*.zip" \ --acl public-read docker-nightly: machine: image: ubuntu-2204:current steps: - run: name: login to quay.io command: docker login --username="${QUAY_USER}" --password="${QUAY_PASS}" quay.io - run: name: clone influxdata/influxdata-docker command: git clone https://github.com/influxdata/influxdata-docker - run: name: build and push telegraf:nightly command: | cd influxdata-docker/telegraf/nightly docker build -t telegraf . docker tag telegraf quay.io/influxdb/telegraf-nightly:latest docker image ls docker push quay.io/influxdb/telegraf-nightly:latest - run: name: build and push telegraf:nightly-alpine command: | cd influxdata-docker/telegraf/nightly/alpine docker build -t telegraf-alpine . docker tag telegraf-alpine quay.io/influxdb/telegraf-nightly:alpine docker image ls docker push quay.io/influxdb/telegraf-nightly:alpine amd64-package-test-nightly: machine: image: ubuntu-2204:current steps: - checkout - attach_workspace: at: '.' - run: sh ./scripts/installgo_linux.sh - run: ./scripts/install_incus.sh - run: cd tools/package_incus_test && go build - run: sudo ./tools/package_incus_test/package_incus_test --package $(find ./dist -name "*_amd64.deb") - run: sudo ./tools/package_incus_test/package_incus_test --package $(find ./dist -name "*.x86_64.rpm") package-sign-windows: machine: image: ubuntu-2204:current resource_class: medium steps: - checkout - check-changed-files-or-halt - attach_workspace: at: '.' - run: name: "Sign Windows Executables" command: ./scripts/sign-windows.sh - persist_to_workspace: root: '.' paths: - 'dist' package-sign-mac: executor: mac working_directory: /Users/distiller/project environment: FL_OUTPUT_DIR: output FASTLANE_LANE: test shell: /bin/bash --login -o pipefail steps: - checkout - check-changed-files-or-halt - attach_workspace: at: '.' - run: command: | sh ./scripts/mac-signing.sh - persist_to_workspace: root: './build' paths: - 'dist' package-consolidate: docker: - image: alpine steps: - attach_workspace: at: '.' - run: command: | cd dist && find . -type f -name '._*' -delete - store_artifacts: path: './dist' destination: 'build/dist' - run: command: | echo "This job contains all the final artifacts." share-artifacts: executor: aws-cli/default steps: - checkout - check-changed-files-or-halt - run: command: | PR=${CIRCLE_PULL_REQUEST##*/} printf -v payload '{ "pullRequestNumber": "%s" }' "$PR" curl -X POST "https://182c7jdgog.execute-api.us-east-1.amazonaws.com/prod/shareArtifacts" --data "$payload" package-sign: circleci_ip_ranges: true docker: - image: quay.io/influxdb/rsign:latest auth: username: $QUAY_RSIGN_USERNAME password: $QUAY_RSIGN_PASSWORD steps: - add_ssh_keys: fingerprints: - 3b:c0:fe:a0:8a:93:33:69:de:22:ac:20:a6:ed:6b:e5 - attach_workspace: at: . - run: | cd dist # Generate the *.DIGESTS files. This must be done before the signing # step so that the *.DIGEST files are also signed. for target in * do sha256sum "${target}" > "${target}.DIGESTS" done for target in * do case "${target}" in # rsign is shipped on Alpine Linux which uses "busybox ash" instead # of bash. ash is somewhat more posix compliant and is missing some # extensions and niceties from bash. *.deb|*.dmg|*.rpm|*.tar.gz|*.zip|*.DIGESTS) rsign "${target}" ;; esac done for target in * do case "${target}" in *.deb|*.dmg|*.rpm|*.tar.gz|*.zip) # Print sha256 hash and target for artifacts all in one file # for use later during the release. cat "${target}.DIGESTS" >> "telegraf-${CIRCLE_TAG}.DIGESTS" ;; esac done - persist_to_workspace: root: ./ paths: - dist - store_artifacts: path: ./dist workflows: version: 2 check: when: not: equal: [ scheduled_pipeline, << pipeline.trigger_source >> ] jobs: - 'lint-linux': filters: tags: only: /.*/ - 'lint-macos': filters: tags: only: /.*/ - 'lint-windows': filters: tags: only: /.*/ - 'test-go-linux': filters: tags: only: /.*/ - 'test-go-linux-386': filters: tags: only: /.*/ - 'test-go-mac': filters: tags: # only runs on tags if you specify this filter only: /.*/ - 'test-go-windows': filters: tags: only: /.*/ - 'test-integration': filters: tags: only: /.*/ - 'windows-package': requires: - 'test-go-linux' filters: tags: only: /.*/ - 'darwin-amd64-package': requires: - 'test-go-mac' filters: tags: only: /.*/ - 'darwin-arm64-package': requires: - 'test-go-mac' filters: branches: ignore: - master tags: only: /.*/ - 'i386-package': requires: - 'test-go-linux-386' filters: branches: ignore: - master tags: only: /.*/ - 'ppc64le-package': requires: - 'test-go-linux' filters: branches: ignore: - master tags: only: /.*/ - 'riscv64-package': requires: - 'test-go-linux' filters: branches: ignore: - master tags: only: /.*/ - 'loong64-package': requires: - 'test-go-linux' filters: branches: ignore: - /.*/ tags: only: /.*/ - 's390x-package': requires: - 'test-go-linux' filters: branches: ignore: - master tags: only: /.*/ - 'armel-package': requires: - 'test-go-linux' filters: branches: ignore: - master tags: only: /.*/ - 'amd64-package': requires: - 'test-go-linux' filters: tags: only: /.*/ - 'arm64-package': requires: - 'test-go-linux' filters: branches: ignore: - master tags: only: /.*/ - 'armhf-package': requires: - 'test-go-linux' filters: branches: ignore: - master tags: only: /.*/ - 'mipsel-package': requires: - 'test-go-linux' filters: branches: ignore: - master tags: only: /.*/ - 'mips-package': requires: - 'test-go-linux' filters: branches: ignore: - master tags: only: /.*/ - 'share-artifacts': requires: - 'i386-package' - 'ppc64le-package' - 'riscv64-package' - 's390x-package' - 'armel-package' - 'amd64-package' - 'mipsel-package' - 'mips-package' - 'loong64-package' - 'darwin-amd64-package' - 'darwin-arm64-package' - 'windows-package' - 'arm64-package' - 'armhf-package' filters: branches: ignore: - master - release.* tags: ignore: /.*/ - 'package-sign-windows': requires: - 'windows-package' filters: tags: only: /.*/ branches: ignore: /.*/ - 'package-sign-mac': requires: - 'darwin-amd64-package' - 'darwin-arm64-package' filters: tags: only: /.*/ branches: ignore: /.*/ - 'package-sign': requires: - 'i386-package' - 'ppc64le-package' - 'riscv64-package' - 's390x-package' - 'armel-package' - 'amd64-package' - 'mipsel-package' - 'mips-package' - 'loong64-package' - 'arm64-package' - 'armhf-package' - 'package-sign-mac' - 'package-sign-windows' filters: tags: only: /.*/ branches: ignore: /.*/ - 'package-consolidate': requires: - 'i386-package' - 'ppc64le-package' - 's390x-package' - 'armel-package' - 'amd64-package' - 'mipsel-package' - 'mips-package' - 'arm64-package' - 'armhf-package' - 'riscv64-package' - 'loong64-package' - 'package-sign-mac' - 'package-sign-windows' - 'package-sign' filters: tags: only: /.*/ branches: ignore: /.*/ - 'release': requires: - 'package-consolidate' filters: tags: only: /.*/ branches: ignore: /.*/ nightly: when: equal: [ scheduled_pipeline, << pipeline.trigger_source >> ] jobs: - 'lint-linux' - 'lint-macos' - 'lint-windows' - 'test-go-linux' - 'test-go-linux-386' - 'test-go-mac' - 'test-go-windows' - 'test-licenses' - 'windows-package': name: 'windows-package-nightly' nightly: true requires: - 'test-go-windows' - 'darwin-amd64-package': name: 'darwin-amd64-package-nightly' nightly: true requires: - 'test-go-mac' - 'darwin-arm64-package': name: 'darwin-arm64-package-nightly' nightly: true requires: - 'test-go-mac' - 'i386-package': name: 'i386-package-nightly' nightly: true requires: - 'test-go-linux-386' - 'ppc64le-package': name: 'ppc64le-package-nightly' nightly: true requires: - 'test-go-linux' - 'riscv64-package': name: 'riscv64-package-nightly' nightly: true requires: - 'test-go-linux' - 'loong64-package': name: 'loong64-package-nightly' nightly: true requires: - 'test-go-linux' - 's390x-package': name: 's390x-package-nightly' nightly: true requires: - 'test-go-linux' - 'armel-package': name: 'armel-package-nightly' nightly: true requires: - 'test-go-linux' - 'amd64-package': name: 'amd64-package-nightly' nightly: true requires: - 'test-go-linux' - 'arm64-package': name: 'arm64-package-nightly' nightly: true requires: - 'test-go-linux' - 'armhf-package': name: 'armhf-package-nightly' nightly: true requires: - 'test-go-linux' - 'mipsel-package': name: 'mipsel-package-nightly' nightly: true requires: - 'test-go-linux' - 'mips-package': name: 'mips-package-nightly' nightly: true requires: - 'test-go-linux' - 'package-sign-windows': requires: - 'windows-package-nightly' - 'package-sign-mac': requires: - 'darwin-amd64-package-nightly' - 'darwin-arm64-package-nightly' - nightly: requires: - 'amd64-package-test-nightly' - 'arm64-package-nightly' - 'armel-package-nightly' - 'armhf-package-nightly' - 'darwin-amd64-package-nightly' - 'darwin-arm64-package-nightly' - 'i386-package-nightly' - 'mips-package-nightly' - 'mipsel-package-nightly' - 'loong64-package-nightly' - 'ppc64le-package-nightly' - 'riscv64-package-nightly' - 's390x-package-nightly' - 'windows-package-nightly' - docker-nightly: requires: - 'nightly' - amd64-package-test-nightly: requires: - 'amd64-package-nightly' ================================================ FILE: .gitattributes ================================================ CHANGELOG.md merge=union README.md merge=union go.sum merge=union plugins/inputs/all/all.go merge=union plugins/outputs/all/all.go merge=union # Always check-out / check-in files with LF line endings. * text=auto eol=lf ================================================ FILE: .github/ISSUE_TEMPLATE/BUG_REPORT.yml ================================================ name: Bug Report description: Create a bug report to help us improve labels: ["bug"] body: - type: markdown attributes: value: | Thanks for taking time to fill out this bug report! We reserve Telegraf issues for bugs for reproducible problems. Please redirect any questions about Telegraf usage to our [Community Slack](https://influxdata.com/slack) or [Community Page](https://community.influxdata.com/) we have a lot of talented community members there who could help answer your question more quickly. - type: textarea id: config attributes: label: Relevant telegraf.conf description: Place config in the toml code section. This will be automatically formatted into toml, so no need for backticks. render: toml validations: required: true - type: textarea id: logs attributes: label: Logs from Telegraf description: Please include the Telegraf logs, ideally with `--debug` used. render: text validations: required: true - type: input id: system-info attributes: label: System info description: Include Telegraf version, operating system, and other relevant details placeholder: ex. Telegraf 1.20.0, Ubuntu 20.04, Docker 20.10.8 validations: required: true - type: textarea id: docker attributes: label: Docker description: If your bug involves third party dependencies or services, it can be very helpful to provide a Dockerfile or docker-compose.yml that reproduces the environment you're testing against. validations: required: false - type: textarea id: reproduce attributes: label: Steps to reproduce description: Describe the steps to reproduce the bug. value: | 1. 2. 3. ... validations: required: true - type: textarea id: expected-behavior attributes: label: Expected behavior description: Describe what you expected to happen when you performed the above steps. validations: required: true - type: textarea id: actual-behavior attributes: label: Actual behavior description: Describe what actually happened when you performed the above steps. validations: required: true - type: textarea id: additional-info attributes: label: Additional info description: Include gist of relevant config, logs, etc. validations: required: false ================================================ FILE: .github/ISSUE_TEMPLATE/FEATURE_REQUEST.yml ================================================ name: Feature request description: Create a feature request to make Telegraf more awesome labels: ["feature request"] body: - type: markdown attributes: value: | Thanks for taking time to share with us this feature request! Please describe why you would like this feature to be added to Telegraf and how you plan to use it to make your life better. - type: textarea id: use-case attributes: label: Use Case description: Describe how you plan to use this feature. validations: required: true - type: textarea id: expected-behavior attributes: label: Expected behavior description: Describe what you expected to happen when you performed the above steps. validations: required: true - type: textarea id: actual-behavior attributes: label: Actual behavior description: Describe what actually happened when you performed the above steps. validations: required: true - type: textarea id: additional-info attributes: label: Additional info description: Include gist of relevant config, logs, etc. validations: required: false ================================================ FILE: .github/ISSUE_TEMPLATE/SUPPORT.yml ================================================ name: Support request description: Open a support request labels: ["support"] body: - type: markdown attributes: value: | WOAH, hold up. This isn't the best place for support questions. You can get a faster response on slack or forums: Please redirect any QUESTIONS about Telegraf usage to - InfluxData Slack Channel: https://www.influxdata.com/slack - InfluxData Community Site: https://community.influxdata.com Check the documentation for the related plugin including the troubleshooting section if available. https://docs.influxdata.com/telegraf https://github.com/influxdata/telegraf/tree/master/docs - type: textarea attributes: label: "Please direct all support questions to Slack or the forums. Thank you." ================================================ FILE: .github/PULL_REQUEST_TEMPLATE.md ================================================ ## Summary ## Checklist - [ ] No AI generated code was used in this PR - [ ] AI generated code used in this PR follows the [InfluxData Policy on AI-Generated Code Contributions][policy] [policy]: https://www.influxdata.com/ai-generated-code-contributions-policy ## Related issues resolves # ================================================ FILE: .github/dependabot.yml ================================================ version: 2 updates: - package-ecosystem: "github-actions" directory: "/" schedule: interval: "weekly" open-pull-requests-limit: 25 labels: - "dependencies" - package-ecosystem: "gomod" directory: "/" schedule: interval: "weekly" open-pull-requests-limit: 25 ignore: # Dependabot isn't able to update this packages that do not match the # source, so anything with a version - dependency-name: "*.v*" labels: - "dependencies" groups: aws-sdk-go-v2: applies-to: version-updates patterns: - "github.com/aws/aws-sdk-go-v2*" ================================================ FILE: .github/workflows/linter.yml ================================================ --- ################################# ################################# ## Super Linter GitHub Actions ## ################################# ################################# name: Lint Code Base # # Documentation: # https://help.github.com/en/articles/workflow-syntax-for-github-actions # ############################# # Start the job on all push # ############################# on: push: branches-ignore: [master, main] # Remove the line above to run when pushing to master pull_request: branches: [master, main] ############### # Set the Job # ############### permissions: {} jobs: build: # Name the Job permissions: contents: read # to fetch code (actions/checkout) statuses: write # to mark status of each linter run (github/super-linter) name: Lint Code Base # Set the agent to run on runs-on: ubuntu-latest ################## # Load all steps # ################## steps: ########################## # Checkout the code base # ########################## - name: Checkout Code uses: actions/checkout@v6 with: # Full git history is needed to get a proper list of changed files within `super-linter` fetch-depth: 0 ################################ # Run Linter against code base # ################################ - name: Lint Code Base uses: super-linter/super-linter@v8.5.0 env: VALIDATE_ALL_CODEBASE: false DEFAULT_BRANCH: master GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} LINTER_RULES_PATH: '.' MARKDOWN_CONFIG_FILE: .markdownlint.jsonc VALIDATE_MARKDOWN: true VALIDATE_BASH: true ================================================ FILE: .github/workflows/milestones.yml ================================================ name: Milestones on: pull_request_target: types: - closed permissions: issues: write pull-requests: write jobs: milestone_job: if: github.event.pull_request.merged == true runs-on: ubuntu-latest name: Assign milestones to PRs steps: - name: Checkout code uses: actions/checkout@v6 - name: Assign milestone to PR uses: srebhan/label-milestone-action@v1.0.2 id: assign-milestone with: repo-token: ${{ secrets.GITHUB_TOKEN }} bugfix-labels: 'fix,chore,docs,test' minor-labels: 'feat' major-labels: 'breaking change' fallback: 'minor' - name: Show milestone run: echo "Assigned milestone is ${{ steps.assign-milestone.outputs.milestone }}" ================================================ FILE: .github/workflows/pr-target-branch.yml ================================================ name: Target Branch on: pull_request: types: - opened - reopened - synchronize - edited jobs: check-target-master: name: master runs-on: ubuntu-latest steps: - name: debug run: echo Target is ${{ github.event.pull_request.base.ref }} - name: success if: github.event.pull_request.base.ref == 'master' run: exit 0 - name: error if: github.event.pull_request.base.ref != 'master' run: | echo "Pull-request is not based on master, please rebase" exit 1 ================================================ FILE: .github/workflows/readme-linter.yml ================================================ name: Lint plugin readmes on: # push: # branches-ignore: master pull_request: branches: # Names of target branches, not source branches - master jobs: run-readme-linter: runs-on: ubuntu-latest steps: - uses: actions/setup-go@v6 with: go-version: '1.25.7' - uses: actions/checkout@v6 with: fetch-depth: 0 - name: Get changed files id: changed-files uses: tj-actions/changed-files@22103cc46bda19c2b464ffe86db46df6922fd323 # v47.0.5 with: base_sha: ${{ github.event.pull_request.base.sha }} files: ./plugins/**/README.md - name: Run readme linter on changed files if: steps.changed-files.outputs.any_changed == 'true' run: go run ./tools/readme_linter ${{ steps.changed-files.outputs.all_changed_files }} ================================================ FILE: .github/workflows/semantic.yml ================================================ --- name: "Semantic PR and Commit Messages" on: pull_request: types: [opened, reopened, synchronize, edited] branches: - master jobs: semantic: uses: influxdata/validate-semantic-github-messages/.github/workflows/semantic.yml@main with: COMMITS_HISTORY: 0 ================================================ FILE: .gitignore ================================================ /.idea /build /etc/telegraf.conf /telegraf /telegraf.exe /telegraf.gz /tools/package_lxd_test/package_lxd_test /tools/license_checker/license_checker* /tools/readme_config_includer/generator /tools/readme_config_includer/generator.exe /tools/config_includer/generator /tools/config_includer/generator.exe /tools/readme_linter/readme_linter* /tools/custom_builder/custom_builder* /vendor .DS_Store process.yml /.vscode /*.toml /*.conf resource.syso versioninfo.json .uuid ================================================ FILE: .golangci.yml ================================================ version: "2" linters: # Default set of linters. # The value can be: # - `standard`: https://golangci-lint.run/docs/linters/#enabled-by-default # - `all`: enables all linters by default. # - `none`: disables all linters by default. # - `fast`: enables only linters considered as "fast" (`golangci-lint help linters --json | jq '[ .[] | select(.fast==true) ] | map(.name)'`). # Default: standard default: none # Enable specific linter. enable: - asasalint - asciicheck - bidichk - bodyclose - copyloopvar - depguard - dogsled - errcheck - errname - errorlint - gocheckcompilerdirectives - gocritic - goprintffuncname - gosec - govet - ineffassign - interfacebloat - lll - makezero - mirror - nakedret - nilerr - nolintlint - perfsprint - prealloc - predeclared - revive - sqlclosecheck - staticcheck - testifylint - tparallel - unconvert - unparam - unused - usetesting # All available settings of specific linters. settings: depguard: # Rules to apply. # # Variables: # - File Variables # Use an exclamation mark `!` to negate a variable. # Example: `!$test` matches any file that is not a go test file. # # `$all` - matches all go files # `$test` - matches all go test files # # - Package Variables # # `$gostd` - matches all of go's standard library (Pulled from `GOROOT`) # # Default (applies if no custom rules are defined): Only allow $gostd in all files. rules: # Name of a rule. main: # List of file globs that will match this list of settings to compare against. # By default, if a path is relative, it is relative to the directory where the golangci-lint command is executed. # The placeholder '${base-path}' is substituted with a path relative to the mode defined with `run.relative-path-mode`. # The placeholder '${config-path}' is substituted with a path relative to the configuration file. # Default: $all files: - '!**/agent/**' - '!**/cmd/**' - '!**/config/**' - '!**/filter/**' - '!**/internal/**' - '!**/logger/**' - '!**/metric/**' - '!**/models/**' - '!**/plugins/serializers/**' - '!**/scripts/**' - '!**/selfstat/**' - '!**/testutil/**' - '!**/tools/**' - '!**/*_test.go' # List of packages that are not allowed. # Entries can be a variable (starting with $), a string prefix, or an exact match (if ending with $). # Default: [] deny: - pkg: log desc: 'Use injected telegraf.Logger instead' errcheck: # report about assignment of errors to blank identifier: `num, _ := strconv.Atoi(numStr)`. # Such cases aren't reported by default. # Default: false check-blank: true # List of functions to exclude from checking, where each entry is a single function to exclude. # See https://github.com/kisielk/errcheck#excluding-functions for details. exclude-functions: - '(*hash/maphash.Hash).Write' - '(*hash/maphash.Hash).WriteByte' - '(*hash/maphash.Hash).WriteString' - '(*github.com/influxdata/telegraf/plugins/outputs/postgresql/sqltemplate.Template).UnmarshalText' gocritic: # Disable all checks. # Default: false disable-all: true # Which checks should be enabled in addition to default checks; can't be combined with 'disabled-checks'. # By default, list of stable checks is used (https://go-critic.com/overview#checks-overview). # To see which checks are enabled run `GL_DEBUG=gocritic golangci-lint run --enable=gocritic`. enabled-checks: # diagnostic - argOrder - badCall - badCond - badLock - badRegexp - badSorting - badSyncOnceFunc - builtinShadowDecl - caseOrder - codegenComment - commentedOutCode - deferInLoop - deprecatedComment - dupArg - dupBranchBody - dupCase - dupSubExpr - dynamicFmtString - emptyDecl - evalOrder - exitAfterDefer - externalErrorReassign - filepathJoin - flagName - mapKey - nilValReturn - offBy1 - regexpPattern - sloppyLen - sloppyReassign - sloppyTypeAssert - sortSlice - sprintfQuotedString - sqlQuery - syncMapLoadAndDelete - truncateCmp - uncheckedInlineErr - unnecessaryDefer - weakCond # performance - appendCombine - equalFold - hugeParam - indexAlloc - preferDecodeRune - preferFprint - preferStringWriter - preferWriteByte - rangeExprCopy - rangeValCopy - sliceClear - stringXbytes # Settings passed to gocritic. # The settings key is the name of a supported gocritic checker. # The list of supported checkers can be found at https://go-critic.com/overview. settings: hugeParam: # Size in bytes that makes the warning trigger. # Default: 80 sizeThreshold: 512 rangeValCopy: # Size in bytes that makes the warning trigger. # Default: 128 sizeThreshold: 512 gosec: # To select a subset of rules to run. # Available rules: https://github.com/securego/gosec#available-rules # Default: [] - means include all rules includes: - G101 # Look for hard coded credentials - G102 # Bind to all interfaces - G103 # Audit the use of unsafe block - G106 # Audit the use of ssh.InsecureIgnoreHostKey - G107 # Url provided to HTTP request as taint input - G108 # Profiling endpoint automatically exposed on /debug/pprof - G109 # Potential Integer overflow made by strconv.Atoi result conversion to int16/32 - G110 # Potential DoS vulnerability via decompression bomb - G111 # Potential directory traversal - G112 # Potential slowloris attack - G114 # Use of net/http serve function that has no support for setting timeouts - G201 # SQL query construction using format string - G202 # SQL query construction using string concatenation - G203 # Use of unescaped data in HTML templates - G301 # Poor file permissions used when creating a directory - G302 # Poor file permissions used with chmod - G303 # Creating tempfile using a predictable path - G305 # File traversal when extracting zip/tar archive - G306 # Poor file permissions used when writing to a new file - G401 # Detect the usage of MD5 or SHA1 - G403 # Ensure minimum RSA key length of 2048 bits - G404 # Insecure random number source (rand) - G405 # Detect the usage of DES or RC4 - G406 # Detect the usage of MD4 or RIPEMD160 - G501 # Import blocklist: crypto/md5 - G502 # Import blocklist: crypto/des - G503 # Import blocklist: crypto/rc4 - G505 # Import blocklist: crypto/sha1 - G506 # Import blocklist: golang.org/x/crypto/md4 - G507 # Import blocklist: golang.org/x/crypto/ripemd160 - G601 # Implicit memory aliasing of items from a range statement - G602 # Slice access out of bounds # G104, G105, G113, G204, G304, G307, G402, G504 were not enabled intentionally # TODO: review G115 when reporting false positives is fixed (https://github.com/securego/gosec/issues/1212) # To specify the configuration of rules. config: # Maximum allowed permissions mode for os.OpenFile and os.Chmod # Default: "0600" G302: "0640" # Maximum allowed permissions mode for os.WriteFile and ioutil.WriteFile # Default: "0600" G306: "0640" govet: # Settings per analyzer. settings: # Analyzer name, run `go tool vet help` to see all analyzers. printf: # Comma-separated list of print function names to check (in addition to default, see `go tool vet help printf`). # Default: [] funcs: - (github.com/influxdata/telegraf.Logger).Tracef - (github.com/influxdata/telegraf.Logger).Debugf - (github.com/influxdata/telegraf.Logger).Infof - (github.com/influxdata/telegraf.Logger).Warnf - (github.com/influxdata/telegraf.Logger).Errorf - (github.com/influxdata/telegraf.Logger).Trace - (github.com/influxdata/telegraf.Logger).Debug - (github.com/influxdata/telegraf.Logger).Info - (github.com/influxdata/telegraf.Logger).Warn - (github.com/influxdata/telegraf.Logger).Error lll: # Max line length, lines longer will be reported. # '\t' is counted as 1 character by default, and can be changed with the tab-width option. # Default: 120. line-length: 160 # Tab width in spaces. # Default: 1 tab-width: 4 nakedret: # Make an issue if func has more lines of code than this setting, and it has naked returns. # Default: 30 max-func-lines: 1 nolintlint: # Enable to require an explanation of nonzero length after each nolint directive. # Default: false require-explanation: true # Enable to require nolint directives to mention the specific linter being suppressed. # Default: false require-specific: true prealloc: # Report pre-allocation suggestions only on simple loops that have no returns/breaks/continues/gotos in them. # Default: true simple: false revive: # Sets the default severity. # See https://github.com/mgechev/revive#configuration # Default: warning severity: error # Run `GL_DEBUG=revive golangci-lint run --enable-only=revive` to see default, all available rules, and enabled rules. rules: - name: argument-limit arguments: [ 6 ] - name: atomic - name: bare-return - name: blank-imports - name: bool-literal-in-expr - name: call-to-gc - name: comment-spacings - name: confusing-naming - name: confusing-results - name: constant-logical-expr - name: context-as-argument - name: context-keys-type - name: datarace - name: deep-exit - name: defer - name: dot-imports - name: duplicated-imports - name: early-return - name: empty-block - name: empty-lines - name: enforce-map-style exclude: [ "TEST" ] arguments: - "make" - name: enforce-repeated-arg-type-style arguments: - "short" - name: enforce-slice-style arguments: - "make" - name: error-naming - name: error-return - name: error-strings - name: errorf - name: exported exclude: - "**/accumulator.go" - "**/agent/**" - "**/cmd/**" - "**/config/**" - "**/filter/**" - "**/internal/**" - "**/logger/**" - "**/logger.go" - "**/metric/**" - "**/metric.go" - "**/migrations/**" - "**/models/**" - "**/persister/**" - "**/metric.go" - "**/parser.go" - "**/plugin.go" - "**/plugins/common/**" - "**/plugins/outputs/**" - "**/plugins/parsers/**" - "**/selfstat/**" - "**/serializer.go" - "**/testutil/**" - "**/tools/**" arguments: - "check-private-receivers" - "say-repetitive-instead-of-stutters" - "check-public-interface" - "disable-checks-on-types" - name: function-result-limit arguments: [ 3 ] - name: get-return - name: identical-branches - name: if-return - name: import-alias-naming arguments: - "^[a-z][a-z0-9_]*[a-z0-9]+$" - name: import-shadowing - name: increment-decrement - name: indent-error-flow - name: max-public-structs arguments: [ 5 ] exclude: [ "TEST" ] - name: modifies-parameter - name: modifies-value-receiver - name: optimize-operands-order - name: package-comments - name: range - name: range-val-address - name: range-val-in-closure - name: receiver-naming - name: redefines-builtin-id - name: redundant-import-alias - name: string-format arguments: - - 'fmt.Errorf[0],errors.New[0]' - '/^([^A-Z]|$)/' - 'Error string must not start with a capital letter.' - - 'fmt.Errorf[0],errors.New[0]' - '/(^|[^\.!?])$/' - 'Error string must not end in punctuation.' - - 'panic' - '/^[^\n]*$/' - 'Must not contain line breaks.' - name: string-of-int - name: struct-tag - name: superfluous-else - name: time-equal - name: time-naming - name: unconditional-recursion - name: unexported-naming - name: unnecessary-stmt - name: unreachable-code - name: unused-parameter - name: unused-receiver - name: var-declaration - name: var-naming arguments: - [ ] # AllowList - [ "ID", "DB", "TS" ] # DenyList - name: waitgroup-by-value staticcheck: # SAxxxx checks in https://staticcheck.dev/docs/configuration/options/#checks # Example (to disable some checks): [ "all", "-SA1000", "-SA1001"] # Run `GL_DEBUG=staticcheck golangci-lint run --enable=staticcheck` to see all available checks and enabled by config checks. # Default: ["all", "-ST1000", "-ST1003", "-ST1016", "-ST1020", "-ST1021", "-ST1022"] checks: - all # Poorly chosen identifier. # https://staticcheck.dev/docs/checks/#ST1003 - -ST1003 # Apply De Morgan's law. # https://staticcheck.dev/docs/checks/#QF1001 - -QF1001 # Convert if/else-if chain to tagged switch. # https://staticcheck.dev/docs/checks/#QF1003 - -QF1003 # Use 'strings.ReplaceAll' instead of 'strings.Replace' with 'n == -1'. # https://staticcheck.dev/docs/checks/#QF1004 - -QF1004 # Lift 'if'+'break' into loop condition. # https://staticcheck.dev/docs/checks/#QF1006 - -QF1006 # Merge conditional assignment into variable declaration. # https://staticcheck.dev/docs/checks/#QF1007 - -QF1007 # Omit embedded fields from selector expression. # https://staticcheck.dev/docs/checks/#QF1008 - -QF1008 # Use 'time.Time.Equal' instead of '==' operator. # https://staticcheck.dev/docs/checks/#QF1009 - -QF1009 testifylint: # Disable all checkers (https://github.com/Antonboom/testifylint#checkers). # Default: false disable-all: true # Enable checkers by name enable: - blank-import - bool-compare - compares - contains - empty - encoded-compare - error-is-as - error-nil - expected-actual - float-compare - formatter - go-require - len - negative-positive - nil-compare - regexp - require-error - suite-broken-parallel - suite-dont-use-pkg - suite-extra-assert-call - suite-subtest-run - suite-thelper - useless-assert usetesting: # Enable/disable `os.TempDir()` detections. # Default: false os-temp-dir: true # Defines a set of rules to ignore issues. # It does not skip the analysis, and so does not ignore "typecheck" errors. exclusions: # Mode of the generated files analysis. # # - `strict`: sources are excluded by strictly following the Go generated file convention. # Source files that have lines matching only the following regular expression will be excluded: `^// Code generated .* DO NOT EDIT\.$` # This line must appear before the first non-comment, non-blank text in the file. # https://go.dev/s/generatedcode # - `lax`: sources are excluded if they contain lines like `autogenerated file`, `code generated`, `do not edit`, etc. # - `disable`: disable the generated files exclusion. # # Default: strict generated: lax # Excluding configuration per-path, per-linter, per-text and per-source. rules: # errcheck - path: cmd/telegraf/(main|printer|cmd_plugins).go text: "Error return value of `outputBuffer.Write` is not checked" - path: plugins/inputs/win_perf_counters/pdh.go linters: - errcheck # gosec:G101 - path: _test\.go text: "Potential hardcoded credentials" # gosec:G404 - path: _test\.go text: "Use of weak random number generator" # revive:max-public-structs - path-except: ^plugins/(aggregators|inputs|outputs|parsers|processors|serializers)/... text: "max-public-structs: you have exceeded the maximum number" # revive:var-naming - path: (.+)\.go$ text: don't use an underscore in package name # revive:var-naming - path: (.*)\.go$ text: avoid meaningless package names # revive:var-naming: Exclude mixed-caps packages in migrations, as these migrations are fixing the issues from before. - path: migrations/.*\.go$ text: don't use MixedCaps in package name # revive:var-naming: Exclude check for package names that conflict with standard library package names (e.g., "net", "json", "http", "os") - path: (.*)\.go$ text: conflict with Go standard library package names # revive:exported - path: (.+)\.go$ text: exported method .*\.(Init |SampleConfig |Gather |Start |Stop |GetState |SetState |SetParser |SetParserFunc |SetTranslator |Probe |Add |Push |Reset |Serialize |SerializeBatch |Get |Set |List |GetResolver |Apply |SetSerializer )should have comment or be unexported # EXC0001 errcheck: Almost all programs ignore errors on these functions, and in most cases it's ok - path: (.+)\.go$ text: Error return value of .((os\.)?std(out|err)\..*|.*Close.*|.*close.*|.*Flush|.*Disconnect|.*disconnect|.*Clear|os\.Remove(All)?|.*print(f|ln)?|os\.Setenv|os\.Unsetenv). is not checked # EXC0013 revive: Annoying issue about not having a comment. The rare codebase has such comments - path: (.+)\.go$ text: package comment should be of the form "(.+)... # EXC0015 revive: Annoying issue about not having a comment. The rare codebase has such comments - path: (.+)\.go$ text: should have a package comment # Which file paths to exclude: they will be analyzed, but issues from them won't be reported. # "/" will be replaced by the current OS file path separator to properly work on Windows. # Default: [] paths: - plugins/parsers/influx/machine.go* formatters: # Enable specific formatter. # Default: [] (uses standard Go formatting) enable: - gci # Formatters settings. settings: gci: # Section configuration to compare against. # Section names are case-insensitive and may contain parameters in (). # The default order of sections is `standard > default > custom > blank > dot > alias > localmodule`. # If `custom-order` is `true`, it follows the order of `sections` option. # Default: ["standard", "default"] sections: - standard # Standard section: captures all standard packages. - default # Default section: contains all imports that could not be matched to another section type. - localmodule # Local module section: contains all local packages. This section is not present unless explicitly enabled. exclusions: # Mode of the generated files analysis. # # - `strict`: sources are excluded by strictly following the Go generated file convention. # Source files that have lines matching only the following regular expression will be excluded: `^// Code generated .* DO NOT EDIT\.$` # This line must appear before the first non-comment, non-blank text in the file. # https://go.dev/s/generatedcode # - `lax`: sources are excluded if they contain lines like `autogenerated file`, `code generated`, `do not edit`, etc. # - `disable`: disable the generated files exclusion. # # Default: lax generated: lax issues: # Maximum issues count per one linter. # Set to 0 to disable. # Default: 50 max-issues-per-linter: 0 # Maximum count of issues with the same text. # Set to 0 to disable. # Default: 3 max-same-issues: 0 # Make issues output unique by line. # Default: true uniq-by-line: false # Output configuration options. output: # The formats used to render issues. formats: # Prints issues in columns representation separated by tabulations. tab: # Output path can be either `stdout`, `stderr` or path to the file to write to. # Default: stdout path: stdout # Order to use when sorting results. # Possible values: `file`, `linter`, and `severity`. # # If the severity values are inside the following list, they are ordered in this order: # 1. error # 2. warning # 3. high # 4. medium # 5. low # Either they are sorted alphabetically. # # Default: ["linter", "file"] sort-order: - file # filepath, line, and column. - linter # Show statistics per linter. # Default: true show-stats: true severity: # Set the default severity for issues. # # If severity rules are defined and the issues do not match or no severity is provided to the rule # this will be the default severity applied. # Severities should match the supported severity names of the selected out format. # - Code climate: https://docs.codeclimate.com/docs/issues#issue-severity # - Checkstyle: https://checkstyle.sourceforge.io/property_types.html#SeverityLevel # - GitHub: https://help.github.com/en/actions/reference/workflow-commands-for-github-actions#setting-an-error-message # - TeamCity: https://www.jetbrains.com/help/teamcity/service-messages.html#Inspection+Instance # # `@linter` can be used as severity value to keep the severity from linters (e.g. revive, gosec, ...) # # Default: "" default: error ================================================ FILE: .markdownlint.jsonc ================================================ { "MD013": { "code_blocks": false, "tables": false, "heading_line_length": 90 }, "MD033": { "allowed_elements": [ "br" ] } } ================================================ FILE: .markdownlintignore ================================================ .github/PULL_REQUEST_TEMPLATE.md docs/includes/* ================================================ FILE: CHANGELOG-1.13.md ================================================ # Changelog v1.13 and Earlier ## v1.13.4 [2020-02-25] ### Release Notes - Official packages now built with Go 1.13.8. ### Bug Fixes - [#6988](https://github.com/influxdata/telegraf/issues/6988): Parse NaN values from summary types in prometheus input. - [#6820](https://github.com/influxdata/telegraf/issues/6820): Fix pgbouncer input when used with newer pgbouncer versions. - [#6913](https://github.com/influxdata/telegraf/issues/6913): Support up to 8192 stats in the ethtool input. - [#7060](https://github.com/influxdata/telegraf/issues/7060): Fix perf counters collection on named instances in sqlserver input. - [#6926](https://github.com/influxdata/telegraf/issues/6926): Use add time for prometheus expiration calculation. - [#7057](https://github.com/influxdata/telegraf/issues/7057): Fix inconsistency with input error counting in internal input. - [#7063](https://github.com/influxdata/telegraf/pull/7063): Use the same timestamp per call if no time is provided in prometheus input. ## v1.13.3 [2020-02-04] ### Bug Fixes - [#5744](https://github.com/influxdata/telegraf/issues/5744): Fix kibana input with Kibana versions greater than 6.4. - [#6960](https://github.com/influxdata/telegraf/issues/6960): Fix duplicate TrackingIDs can be returned in queue consumer plugins. - [#6913](https://github.com/influxdata/telegraf/issues/6913): Support up to 4096 stats in the ethtool input. - [#6973](https://github.com/influxdata/telegraf/issues/6973): Expire metrics on query in addition to on add. ## v1.13.2 [2020-01-21] ### Bug Fixes - [#2652](https://github.com/influxdata/telegraf/issues/2652): Warn without error when processes input is started on Windows. - [#6890](https://github.com/influxdata/telegraf/issues/6890): Only parse certificate blocks in x509_cert input. - [#6883](https://github.com/influxdata/telegraf/issues/6883): Add custom attributes for all resource types in vsphere input. - [#6899](https://github.com/influxdata/telegraf/pull/6899): Fix URL agent address form with udp in snmp input. - [#6619](https://github.com/influxdata/telegraf/issues/6619): Change logic to allow recording of device fields when attributes is false. - [#6903](https://github.com/influxdata/telegraf/issues/6903): Do not add invalid timestamps to kafka messages. - [#6906](https://github.com/influxdata/telegraf/issues/6906): Fix json_strict option and set default of true. ## v1.13.1 [2020-01-08] ### Bug Fixes - [#6788](https://github.com/influxdata/telegraf/issues/6788): Fix ServerProperty query stops working on Azure after failover. - [#6803](https://github.com/influxdata/telegraf/pull/6803): Add leading period to OID in SNMP v1 generic traps. - [#6823](https://github.com/influxdata/telegraf/pull/6823): Fix missing config fields in prometheus serializer. - [#6694](https://github.com/influxdata/telegraf/issues/6694): Fix panic on connection loss with undelivered messages in mqtt_consumer. - [#6679](https://github.com/influxdata/telegraf/issues/6679): Encode query hash fields as hex strings in sqlserver input. - [#6345](https://github.com/influxdata/telegraf/issues/6345): Invalidate diskio cache if the metadata mtime has changed. - [#6800](https://github.com/influxdata/telegraf/issues/6800): Show platform not supported warning only on plugin creation. - [#6814](https://github.com/influxdata/telegraf/issues/6814): Fix rabbitmq cannot complete gather after request error. - [#6846](https://github.com/influxdata/telegraf/issues/6846): Fix /sbin/init --version executed on Telegraf startup. - [#6847](https://github.com/influxdata/telegraf/issues/6847): Use last path element as field key if path fully specified in cisco_telemetry_gnmi input. ## v1.13 [2019-12-12] ### Release Notes - Official packages built with Go 1.13.5. This affects the minimum supported version on several platforms, most notably requiring Windows 7 (2008 R2) or later. For details, check the release notes for Go [ports](https://golang.org/doc/go1.13#ports). - The `prometheus` input and `prometheus_client` output have a new mapping to and from Telegraf metrics, which can be enabled by setting `metric_version = 2`. The original mapping is deprecated. When both plugins have the same setting, passthrough metrics will be unchanged. Refer to the `prometheus` input for details about the mapping. ### New Inputs - [azure_storage_queue](/plugins/inputs/azure_storage_queue/README.md) - Contributed by @mjiderhamn - [ethtool](/plugins/inputs/ethtool/README.md) - Contributed by @philippreston - [snmp_trap](/plugins/inputs/snmp_trap/README.md) - Contributed by @influxdata - [suricata](/plugins/inputs/suricata/README.md) - Contributed by @satta - [synproxy](/plugins/inputs/synproxy/README.md) - Contributed by @rfrenayworldstream - [systemd_units](/plugins/inputs/systemd_units/README.md) - Contributed by @benschweizer ### New Processors - [clone](/plugins/processors/clone/README.md) - Contributed by @adrianlzt ### New Aggregators - [merge](/plugins/aggregators/merge/README.md) - Contributed by @influxdata ### Features - [#6326](https://github.com/influxdata/telegraf/pull/5842): Add per node memory stats to rabbitmq input. - [#6361](https://github.com/influxdata/telegraf/pull/6361): Add ability to read query from file to postgresql_extensible input. - [#5921](https://github.com/influxdata/telegraf/pull/5921): Add replication metrics to the redis input. - [#6177](https://github.com/influxdata/telegraf/pull/6177): Support NX-OS telemetry extensions in cisco_telemetry_mdt. - [#6415](https://github.com/influxdata/telegraf/pull/6415): Allow graphite parser to create Inf and NaN values. - [#6434](https://github.com/influxdata/telegraf/pull/6434): Use prefix base detection for ints in grok parser. - [#6465](https://github.com/influxdata/telegraf/pull/6465): Add more performance counter metrics to sqlserver input. - [#6476](https://github.com/influxdata/telegraf/pull/6476): Add millisecond unix time support to grok parser. - [#6473](https://github.com/influxdata/telegraf/pull/6473): Add container id as optional source tag to docker and docker_log input. - [#6504](https://github.com/influxdata/telegraf/pull/6504): Add lang parameter to OpenWeathermap input plugin. - [#6540](https://github.com/influxdata/telegraf/pull/6540): Log file open errors at debug level in tail input. - [#6553](https://github.com/influxdata/telegraf/pull/6553): Add timeout option to cloudwatch input. - [#6549](https://github.com/influxdata/telegraf/pull/6549): Support custom success codes in http input. - [#6530](https://github.com/influxdata/telegraf/pull/6530): Improve ipvs input error strings and logging. - [#6532](https://github.com/influxdata/telegraf/pull/6532): Add strict mode to JSON parser that can be disable to ignore invalid items. - [#6543](https://github.com/influxdata/telegraf/pull/6543): Add support for Kubernetes 1.16 and remove deprecated API usage. - [#6283](https://github.com/influxdata/telegraf/pull/6283): Add gathering of RabbitMQ federation link metrics. - [#6356](https://github.com/influxdata/telegraf/pull/6356): Add bearer token defaults for Kubernetes plugins. - [#5870](https://github.com/influxdata/telegraf/pull/5870): Add support for SNMP over TCP. - [#6603](https://github.com/influxdata/telegraf/pull/6603): Add support for per output flush jitter. - [#6650](https://github.com/influxdata/telegraf/pull/6650): Add a nameable file tag to file input plugin. - [#6640](https://github.com/influxdata/telegraf/pull/6640): Add Splunk MultiMetric support. - [#6680](https://github.com/influxdata/telegraf/pull/6668): Add support for sending HTTP Basic Auth in influxdb input - [#5767](https://github.com/influxdata/telegraf/pull/5767): Add ability to configure the url tag in the prometheus input. - [#5767](https://github.com/influxdata/telegraf/pull/5767): Add prometheus metric_version=2 mapping to internal metrics/line protocol. - [#6703](https://github.com/influxdata/telegraf/pull/6703): Add prometheus metric_version=2 support to prometheus_client output. - [#6660](https://github.com/influxdata/telegraf/pull/6660): Add content_encoding compression support to socket_listener. - [#6689](https://github.com/influxdata/telegraf/pull/6689): Add high resolution metrics support to CloudWatch output. - [#6716](https://github.com/influxdata/telegraf/pull/6716): Add SReclaimable and SUnreclaim to mem input. - [#6695](https://github.com/influxdata/telegraf/pull/6695): Allow multiple certificates per file in x509_cert input. - [#6686](https://github.com/influxdata/telegraf/pull/6686): Add additional tags to the x509 input. - [#6703](https://github.com/influxdata/telegraf/pull/6703): Add batch data format support to file output. - [#6688](https://github.com/influxdata/telegraf/pull/6688): Support partition assignment strategy configuration in kafka_consumer. - [#6731](https://github.com/influxdata/telegraf/pull/6731): Add node type tag to mongodb input. - [#6669](https://github.com/influxdata/telegraf/pull/6669): Add uptime_ns field to mongodb input. - [#6735](https://github.com/influxdata/telegraf/pull/6735): Support resolution of symlinks in filecount input. - [#6746](https://github.com/influxdata/telegraf/pull/6746): Set message timestamp to the metric time in kafka output. - [#6740](https://github.com/influxdata/telegraf/pull/6740): Add base64decode operation to string processor. - [#6790](https://github.com/influxdata/telegraf/pull/6790): Add option to control collecting global variables to mysql input. ### Bug Fixes - [#6484](https://github.com/influxdata/telegraf/issues/6484): Show correct default settings in mysql sample config. - [#6583](https://github.com/influxdata/telegraf/issues/6583): Use 1h or 3h rain values as appropriate in openweathermap input. - [#6573](https://github.com/influxdata/telegraf/issues/6573): Fix not a valid field error in Windows with nvidia input. - [#6614](https://github.com/influxdata/telegraf/issues/6614): Fix influxdb output serialization on connection closed. - [#6690](https://github.com/influxdata/telegraf/issues/6690): Fix ping skips remaining hosts after dns lookup error. - [#6684](https://github.com/influxdata/telegraf/issues/6684): Log mongodb oplog auth errors at debug level. - [#6705](https://github.com/influxdata/telegraf/issues/6705): Remove trailing underscore trimming from json flattener. - [#6421](https://github.com/influxdata/telegraf/issues/6421): Revert change causing cpu usage to be capped at 100 percent. - [#6523](https://github.com/influxdata/telegraf/issues/6523): Accept any media type in the prometheus input. - [#6769](https://github.com/influxdata/telegraf/issues/6769): Fix unix socket dial arguments in uwsgi input. - [#6757](https://github.com/influxdata/telegraf/issues/6757): Replace colon chars in prometheus output labels with metric_version=1. - [#6773](https://github.com/influxdata/telegraf/issues/6773): Set TrimLeadingSpace when TrimSpace is on in csv parser. ## v1.12.6 [2019-11-19] ### Bug Fixes - [#6666](https://github.com/influxdata/telegraf/issues/6666): Fix many plugin errors are logged at debug logging level. - [#6652](https://github.com/influxdata/telegraf/issues/6652): Use nanosecond precision in docker_log input. - [#6642](https://github.com/influxdata/telegraf/issues/6642): Fix interface option with method = native in ping input. - [#6680](https://github.com/influxdata/telegraf/pull/6680): Fix panic in mongodb input if shard connection pool stats are unreadable. ## v1.12.5 [2019-11-12] ### Bug Fixes - [#6576](https://github.com/influxdata/telegraf/issues/6576): Fix incorrect results in ping input plugin. - [#6610](https://github.com/influxdata/telegraf/pull/6610): Add missing character replacement to sql_instance tag. - [#6337](https://github.com/influxdata/telegraf/issues/6337): Change no metric error message to debug level in cloudwatch input. - [#6602](https://github.com/influxdata/telegraf/issues/6602): Add missing ServerProperties query to sqlserver input docs. - [#6643](https://github.com/influxdata/telegraf/pull/6643): Fix mongodb connections_total_created field loading. - [#6627](https://github.com/influxdata/telegraf/issues/6578): Fix metric creation when node is offline in jenkins input. - [#6649](https://github.com/influxdata/telegraf/issues/6615): Fix docker uptime_ns calculation when container has been restarted. - [#6647](https://github.com/influxdata/telegraf/issues/6646): Fix mysql field type conflict in conversion of gtid_mode to an integer. - [#5529](https://github.com/influxdata/telegraf/issues/5529): Fix mysql field type conflict with ssl_verify_depth and ssl_ctx_verify_depth. ## v1.12.4 [2019-10-23] ### Release Notes - Official packages built with Go 1.12.12. ### Bug Fixes - [#6521](https://github.com/influxdata/telegraf/issues/6521): Fix metric generation with ping input native method. - [#6541](https://github.com/influxdata/telegraf/issues/6541): Exclude alias tag if unset from plugin internal stats. - [#6564](https://github.com/influxdata/telegraf/issues/6564): Fix socket_mode option in powerdns_recursor input. ## v1.12.3 [2019-10-07] ### Bug Fixes - [#6445](https://github.com/influxdata/telegraf/issues/6445): Use batch serialization format in exec output. - [#6455](https://github.com/influxdata/telegraf/issues/6455): Build official packages with Go 1.12.10. - [#6464](https://github.com/influxdata/telegraf/pull/6464): Use case insensitive serial number match in smart input. - [#6469](https://github.com/influxdata/telegraf/pull/6469): Add auth header only when env var is set. - [#6468](https://github.com/influxdata/telegraf/pull/6468): Fix running multiple mysql and sqlserver plugin instances. - [#6471](https://github.com/influxdata/telegraf/issues/6471): Fix database routing on retry with exclude_database_tag. - [#6488](https://github.com/influxdata/telegraf/issues/6488): Fix logging panic in exec input with nagios data format. ## v1.12.2 [2019-09-24] ### Bug Fixes - [#6386](https://github.com/influxdata/telegraf/issues/6386): Fix detection of layout timestamps in csv and json parser. - [#6394](https://github.com/influxdata/telegraf/issues/6394): Fix parsing of BATTDATE in apcupsd input. - [#6398](https://github.com/influxdata/telegraf/issues/6398): Keep boolean values listed in json_string_fields. - [#6393](https://github.com/influxdata/telegraf/issues/6393): Disable Go plugin support in official builds. - [#6391](https://github.com/influxdata/telegraf/issues/6391): Fix path handling issues in cisco_telemetry_gnmi. ## v1.12.1 [2019-09-10] ### Bug Fixes - [#6344](https://github.com/influxdata/telegraf/issues/6344): Fix depends on GLIBC_2.14 symbol version. - [#6329](https://github.com/influxdata/telegraf/issues/6329): Fix filecount for paths with trailing slash. - [#6331](https://github.com/influxdata/telegraf/issues/6331): Convert check state to an integer in icinga2 input. - [#6354](https://github.com/influxdata/telegraf/issues/6354): Fix could not mark message delivered error in kafka_consumer. - [#6362](https://github.com/influxdata/telegraf/issues/6362): Skip collection stats when disabled in mongodb input. - [#6366](https://github.com/influxdata/telegraf/issues/6366): Fix error reading closed response body on redirect in http_response. - [#6373](https://github.com/influxdata/telegraf/issues/6373): Fix apcupsd documentation to reflect plugin. - [#6375](https://github.com/influxdata/telegraf/issues/6375): Display retry log message only when retry after is received. ## v1.12 [2019-09-03] ### Release Notes - The cluster health related fields in the elasticsearch input have been split out from the `elasticsearch_indices` measurement into the new `elasticsearch_cluster_health_indices` measurement as they were originally combined by error. ### New Inputs - [apcupsd](/plugins/inputs/apcupsd/README.md) - Contributed by @jonaz - [docker_log](/plugins/inputs/docker_log/README.md) - Contributed by @prashanthjbabu - [fireboard](/plugins/inputs/fireboard/README.md) - Contributed by @ronnocol - [logstash](/plugins/inputs/logstash/README.md) - Contributed by @lkmcs @dmitryilyin @arkady-emelyanov - [marklogic](/plugins/inputs/marklogic/README.md) - Contributed by @influxdata - [openntpd](/plugins/inputs/openntpd/README.md) - Contributed by @aromeyer - [uwsgi](/plugins/inputs/uwsgi/README.md) - Contributed by @blaggacao ### New Parsers - [form_urlencoded](/plugins/parsers/form_urlencoded/README.md) - Contributed by @byonchev ### New Processors - [date](/plugins/processors/date/README.md) - Contributed by @influxdata - [pivot](/plugins/processors/pivot/README.md) - Contributed by @influxdata - [tag_limit](/plugins/processors/tag_limit/README.md) - Contributed by @memory - [unpivot](/plugins/processors/unpivot/README.md) - Contributed by @influxdata ### New Outputs - [exec](/plugins/outputs/exec/README.md) - Contributed by @Jaeyo ### Features - [#5842](https://github.com/influxdata/telegraf/pull/5842): Improve performance of wavefront serializer. - [#5863](https://github.com/influxdata/telegraf/pull/5863): Allow regex processor to append tag values. - [#5997](https://github.com/influxdata/telegraf/pull/5997): Add starttime field to phpfpm input. - [#5998](https://github.com/influxdata/telegraf/pull/5998): Add cluster name tag to elasticsearch indices. - [#6006](https://github.com/influxdata/telegraf/pull/6006): Add support for interface field in http_response input plugin. - [#5996](https://github.com/influxdata/telegraf/pull/5996): Add container uptime_ns in docker input plugin. - [#6016](https://github.com/influxdata/telegraf/pull/6016): Add better user-facing errors for API timeouts in docker input. - [#6027](https://github.com/influxdata/telegraf/pull/6027): Add TLS mutual auth support to jti_openconfig_telemetry input. - [#6053](https://github.com/influxdata/telegraf/pull/6053): Add support for ES 7.x to elasticsearch output. - [#6062](https://github.com/influxdata/telegraf/pull/6062): Add basic auth to prometheus input plugin. - [#6064](https://github.com/influxdata/telegraf/pull/6064): Add node roles tag to elasticsearch input. - [#5572](https://github.com/influxdata/telegraf/pull/5572): Support floats in statsd percentiles. - [#6050](https://github.com/influxdata/telegraf/pull/6050): Add native Go ping method to ping input plugin. - [#6074](https://github.com/influxdata/telegraf/pull/6074): Resume from last known offset in tail inputwhen reloading Telegraf. - [#6111](https://github.com/influxdata/telegraf/pull/6111): Add improved support for Azure SQL Database to sqlserver input. - [#6079](https://github.com/influxdata/telegraf/pull/6079): Add extra attributes for NVMe devices to smart input. - [#6084](https://github.com/influxdata/telegraf/pull/6084): Add docker_devicemapper measurement to docker input plugin. - [#6122](https://github.com/influxdata/telegraf/pull/6122): Add basic auth support to elasticsearch input. - [#6102](https://github.com/influxdata/telegraf/pull/6102): Support string field glob matching in json parser. - [#6101](https://github.com/influxdata/telegraf/pull/6101): Update gjson to allow multipath syntax in json parser. - [#6144](https://github.com/influxdata/telegraf/pull/6144): Add support for collecting SQL Requests to identify waits and blocking to sqlserver input. - [#6105](https://github.com/influxdata/telegraf/pull/6105): Collect k8s endpoints, ingress, and services in kube_inventory plugin. - [#6129](https://github.com/influxdata/telegraf/pull/6129): Add support for field/tag keys to strings processor. - [#6143](https://github.com/influxdata/telegraf/pull/6143): Add certificate verification status to x509_cert input. - [#6163](https://github.com/influxdata/telegraf/pull/6163): Support percentage value parsing in redis input. - [#6024](https://github.com/influxdata/telegraf/pull/6024): Load external Go plugins from --plugin-directory. - [#6184](https://github.com/influxdata/telegraf/pull/6184): Add ability to exclude db/bucket tag from influxdb outputs. - [#6137](https://github.com/influxdata/telegraf/pull/6137): Gather per collections stats in mongodb input plugin. - [#6195](https://github.com/influxdata/telegraf/pull/6195): Add TLS & credentials configuration for nats_consumer input plugin. - [#6194](https://github.com/influxdata/telegraf/pull/6194): Add support for enterprise repos to github plugin. - [#6060](https://github.com/influxdata/telegraf/pull/6060): Add Indices stats to elasticsearch input. - [#6189](https://github.com/influxdata/telegraf/pull/6189): Add left function to string processor. - [#6049](https://github.com/influxdata/telegraf/pull/6049): Add grace period for metrics late for aggregation. - [#4435](https://github.com/influxdata/telegraf/pull/4435): Add diff and non_negative_diff to basicstats aggregator. - [#6201](https://github.com/influxdata/telegraf/pull/6201): Add device tags to smart_attributes. - [#5719](https://github.com/influxdata/telegraf/pull/5719): Collect framework_offers and allocator metrics in mesos input. - [#6216](https://github.com/influxdata/telegraf/pull/6216): Add telegraf and go version to the internal input plugin. - [#6214](https://github.com/influxdata/telegraf/pull/6214): Update the number of logical CPUs dynamically in system plugin. - [#6259](https://github.com/influxdata/telegraf/pull/6259): Add darwin (macOS) builds to the release. - [#6241](https://github.com/influxdata/telegraf/pull/6241): Add configurable timeout setting to smart input. - [#6249](https://github.com/influxdata/telegraf/pull/6249): Add memory_usage field to procstat input plugin. - [#5971](https://github.com/influxdata/telegraf/pull/5971): Add support for custom attributes to vsphere input. - [#5926](https://github.com/influxdata/telegraf/pull/5926): Add cmdstat metrics to redis input. - [#6261](https://github.com/influxdata/telegraf/pull/6261): Add content_length metric to http_response input plugin. - [#6257](https://github.com/influxdata/telegraf/pull/6257): Add database_tag option to influxdb_listener to add database from query string. - [#6246](https://github.com/influxdata/telegraf/pull/6246): Add capability to limit TLS versions and cipher suites. - [#6266](https://github.com/influxdata/telegraf/pull/6266): Add topic_tag option to mqtt_consumer. - [#6207](https://github.com/influxdata/telegraf/pull/6207): Add ability to label inputs for logging. - [#6300](https://github.com/influxdata/telegraf/pull/6300): Add TLS support to nginx_plus, nginx_plus_api and nginx_vts. ### Bug Fixes - [#5692](https://github.com/influxdata/telegraf/issues/5692): Fix sensor read error stops reporting of all sensors in temp input. - [#4356](https://github.com/influxdata/telegraf/issues/4356): Fix double pct replacement in sysstat input. - [#6004](https://github.com/influxdata/telegraf/issues/6004): Fix race in master node detection in elasticsearch input. - [#6100](https://github.com/influxdata/telegraf/issues/6100): Fix SSPI authentication not working in sqlserver input. - [#6142](https://github.com/influxdata/telegraf/issues/6142): Fix memory error panic in mqtt input. - [#6136](https://github.com/influxdata/telegraf/issues/6136): Support Kafka 2.3.0 consumer groups. - [#6232](https://github.com/influxdata/telegraf/issues/6232): Fix persistent session in mqtt_consumer. - [#6235](https://github.com/influxdata/telegraf/issues/6235): Fix finder inconsistencies in vsphere input. - [#6138](https://github.com/influxdata/telegraf/issues/6138): Fix parsing multiple metrics on the first line of tailed file. - [#2526](https://github.com/influxdata/telegraf/issues/2526): Send TERM to exec processes before sending KILL signal. - [#5326](https://github.com/influxdata/telegraf/issues/5326): Query oplog only when connected to a replica set. - [#6317](https://github.com/influxdata/telegraf/pull/6317): Use environment variables to locate Program Files on Windows. ## v1.11.5 [2019-08-27] ### Bug Fixes - [#6250](https://github.com/influxdata/telegraf/pull/6250): Update go-sql-driver/mysql driver to 1.4.1 to address auth issues. - [#6279](https://github.com/influxdata/telegraf/issues/6279): Return error status from --test if input plugins produce an error. - [#6309](https://github.com/influxdata/telegraf/issues/6309): Fix with multiple instances only last configuration is used in smart input. - [#6303](https://github.com/influxdata/telegraf/pull/6303): Build official packages with Go 1.12.9. - [#6234](https://github.com/influxdata/telegraf/issues/6234): Split out -w argument in iptables input. - [#6270](https://github.com/influxdata/telegraf/issues/6270): Add support for parked process state on Linux. - [#6287](https://github.com/influxdata/telegraf/issues/6287): Remove leading slash from rcon command. - [#6313](https://github.com/influxdata/telegraf/pull/6313): Allow jobs with dashes in the name in lustre2 input. ## v1.11.4 [2019-08-06] ### Bug Fixes - [#6200](https://github.com/influxdata/telegraf/pull/6200): Correct typo in kubernetes logsfs_available_bytes field. - [#6191](https://github.com/influxdata/telegraf/issues/6191): Skip floats that are NaN or Inf in Datadog output. - [#6209](https://github.com/influxdata/telegraf/issues/6209): Fix reload panic in socket_listener input plugin. ## v1.11.3 [2019-07-23] ### Bug Fixes - [#6054](https://github.com/influxdata/telegraf/issues/6054): Fix unable to reconnect after vCenter reboot in vsphere input. - [#6073](https://github.com/influxdata/telegraf/issues/6073): Handle unknown error in nvidia-smi output. - [#6121](https://github.com/influxdata/telegraf/pull/6121): Fix panic in statd input when processing datadog events. - [#6125](https://github.com/influxdata/telegraf/issues/6125): Treat empty array as successful parse in json parser. - [#6094](https://github.com/influxdata/telegraf/issues/6094): Add missing rcode and zonestat to bind input. - [#6114](https://github.com/influxdata/telegraf/issues/6114): Fix lustre2 input plugin config parse regression. - [#5894](https://github.com/influxdata/telegraf/issues/5894): Fix template pattern partial wildcard matching. - [#6151](https://github.com/influxdata/telegraf/issues/6151): Fix panic in github input. ## v1.11.2 [2019-07-09] ### Bug Fixes - [#6056](https://github.com/influxdata/telegraf/pull/6056): Fix source address ping flag on BSD. - [#6059](https://github.com/influxdata/telegraf/issues/6059): Fix value out of range error on 32-bit systems in bind input. - [#3573](https://github.com/influxdata/telegraf/issues/3573): Fix tail and logparser stop working after reload. - [#6077](https://github.com/influxdata/telegraf/pull/6077): Fix filecount path separator handling in Windows. - [#6075](https://github.com/influxdata/telegraf/issues/6075): Fix panic with empty datadog tag string. - [#6069](https://github.com/influxdata/telegraf/issues/6069): Apply topic filter to partition metrics in burrow input. ## v1.11.1 [2019-06-25] ### Bug Fixes - [#5980](https://github.com/influxdata/telegraf/issues/5980): Cannot set mount_points option in disk input. - [#5983](https://github.com/influxdata/telegraf/issues/5983): Omit keys when creating measurement names for GNMI telemetry. - [#5972](https://github.com/influxdata/telegraf/issues/5972): Don't consider pid of 0 when using systemd lookup in procstat. - [#5807](https://github.com/influxdata/telegraf/issues/5807): Skip 404 error reporting in nginx_plus_api input. - [#5999](https://github.com/influxdata/telegraf/issues/5999): Fix panic if pool_mode column does not exist. - [#6019](https://github.com/influxdata/telegraf/issues/6019): Add missing container_id field to docker_container_status metrics. - [#5742](https://github.com/influxdata/telegraf/issues/5742): Ignore error when utmp is missing in system input. - [#6032](https://github.com/influxdata/telegraf/issues/6032): Add device, serial_no, and wwn tags to synthetic attributes. - [#6012](https://github.com/influxdata/telegraf/issues/6012): Fix parsing of remote tcp address in statsd input. ## v1.11 [2019-06-11] ### Release Notes - The `uptime_format` field in the system input has been deprecated, use the `uptime` field instead. - The `cloudwatch` input has been updated to use a more efficient API, it now requires `GetMetricData` permissions instead of `GetMetricStatistics`. The `units` tag is not available from this API and is no longer collected. ### New Inputs - [bind](/plugins/inputs/bind/README.md) - Contributed by @dswarbrick & @danielllek - [cisco_telemetry_gnmi](/plugins/inputs/cisco_telemetry_gnmi/README.md) - Contributed by @sbyx - [cisco_telemetry_mdt](/plugins/inputs/cisco_telemetry_mdt/README.md) - Contributed by @sbyx - [ecs](/plugins/inputs/ecs/README.md) - Contributed by @rbtr - [github](/plugins/inputs/github/README.md) - Contributed by @influxdata - [openweathermap](/plugins/inputs/openweathermap/README.md) - Contributed by @regel - [powerdns_recursor](/plugins/inputs/powerdns_recursor/README.md) - Contributed by @dupondje ### New Aggregators - [final](/plugins/aggregators/final/README.md) - Contributed by @oplehto ### New Outputs - [syslog](/plugins/outputs/syslog/README.md) - Contributed by @javicrespo - [health](/plugins/outputs/health/README.md) - Contributed by @influxdata ### New Serializers - [wavefront](/plugins/serializers/wavefront/README.md) - Contributed by @puckpuck ### Features - [#5556](https://github.com/influxdata/telegraf/pull/5556): Add TTL field to ping input. - [#5569](https://github.com/influxdata/telegraf/pull/5569): Add hexadecimal string to integer conversion to converter processor. - [#5601](https://github.com/influxdata/telegraf/pull/5601): Add support for multiple line text and perfdata to nagios parser. - [#5648](https://github.com/influxdata/telegraf/pull/5648): Allow env vars ${} expansion syntax in configuration file. - [#5641](https://github.com/influxdata/telegraf/pull/5641): Add option to reset buckets on flush to histogram aggregator. - [#5664](https://github.com/influxdata/telegraf/pull/5664): Add option to use strict sanitization rules to wavefront output. - [#5697](https://github.com/influxdata/telegraf/pull/5697): Add namespace restriction to prometheus input plugin. - [#5681](https://github.com/influxdata/telegraf/pull/5681): Add cmdline tag to procstat input. - [#5704](https://github.com/influxdata/telegraf/pull/5704): Support verbose query param in ping endpoint of influxdb_listener. - [#5713](https://github.com/influxdata/telegraf/pull/5713): Enhance HTTP connection options for phpfpm input plugin. - [#5544](https://github.com/influxdata/telegraf/pull/5544): Use more efficient GetMetricData API to collect cloudwatch metrics. - [#5544](https://github.com/influxdata/telegraf/pull/5544): Allow selection of collected statistic types in cloudwatch input. - [#5757](https://github.com/influxdata/telegraf/pull/5757): Speed up interface stat collection in net input. - [#5769](https://github.com/influxdata/telegraf/pull/5769): Add pagefault data to procstat input plugin. - [#5760](https://github.com/influxdata/telegraf/pull/5760): Add option to set permissions for unix domain sockets to socket_listener. - [#5585](https://github.com/influxdata/telegraf/pull/5585): Add cli support for outputting sections of the config. - [#5770](https://github.com/influxdata/telegraf/pull/5770): Add service-display-name option for use with Windows service. - [#5778](https://github.com/influxdata/telegraf/pull/5778): Add support for log rotation. - [#5765](https://github.com/influxdata/telegraf/pull/5765): Support more drive types in smart input. - [#5829](https://github.com/influxdata/telegraf/pull/5829): Add support for HTTP basic auth to solr input. - [#5791](https://github.com/influxdata/telegraf/pull/5791): Add support for datadog events to statsd input. - [#5817](https://github.com/influxdata/telegraf/pull/5817): Allow devices option to match against devlinks. - [#5855](https://github.com/influxdata/telegraf/pull/5855): Support tags in enum processor. - [#5830](https://github.com/influxdata/telegraf/pull/5830): Add support for gzip compression to amqp plugins. - [#5831](https://github.com/influxdata/telegraf/pull/5831): Support passive queue declaration in amqp_consumer. - [#5901](https://github.com/influxdata/telegraf/pull/5901): Set user agent in stackdriver output. - [#5885](https://github.com/influxdata/telegraf/pull/5885): Extend metrics collected from Nvidia GPUs. - [#5547](https://github.com/influxdata/telegraf/pull/5547): Add file rotation support to the file output. - [#5955](https://github.com/influxdata/telegraf/pull/5955): Add source tag to hddtemp plugin. ### Bug Fixes - [#5692](https://github.com/influxdata/telegraf/pull/5692): Temperature input plugin stops working when WiFi is turned off. - [#5631](https://github.com/influxdata/telegraf/pull/5631): Create Windows service only when specified or in service manager. - [#5730](https://github.com/influxdata/telegraf/pull/5730): Don't start telegraf when stale pidfile found. - [#5477](https://github.com/influxdata/telegraf/pull/5477): Support Minecraft server 1.13 and newer in minecraft input. - [#4098](https://github.com/influxdata/telegraf/issues/4098): Fix inline table support in configuration file. - [#1598](https://github.com/influxdata/telegraf/issues/1598): Fix multi-line basic strings support in configuration file. - [#5746](https://github.com/influxdata/telegraf/issues/5746): Verify a process passed by pid_file exists in procstat input. - [#5455](https://github.com/influxdata/telegraf/issues/5455): Fix unsupported pkt type error in pgbouncer. - [#5771](https://github.com/influxdata/telegraf/pull/5771): Fix only one job per storage target reported in lustre2 input. - [#5796](https://github.com/influxdata/telegraf/issues/5796): Set default timeout of 5s in fibaro input. - [#5835](https://github.com/influxdata/telegraf/issues/5835): Fix docker input does not parse image name correctly. - [#5661](https://github.com/influxdata/telegraf/issues/5661): Fix direct exchange routing key in amqp output. - [#5819](https://github.com/influxdata/telegraf/issues/5819): Fix scale set resource id with azure_monitor output. - [#5883](https://github.com/influxdata/telegraf/issues/5883): Skip invalid power times in apex_neptune input. - [#3485](https://github.com/influxdata/telegraf/issues/3485): Fix sqlserver connection closing on error. - [#5917](https://github.com/influxdata/telegraf/issues/5917): Fix toml option name in nginx_upstream_check. - [#5920](https://github.com/influxdata/telegraf/issues/5920): Fixed datastore name mapping in vsphere input. - [#5879](https://github.com/influxdata/telegraf/issues/5879): Fix multiple SIGHUP causes Telegraf to shutdown. - [#5891](https://github.com/influxdata/telegraf/issues/5891): Fix connection leak in influxdb outputs on reload. - [#5858](https://github.com/influxdata/telegraf/issues/5858): Fix batch fails when single metric is unserializable. - [#5536](https://github.com/influxdata/telegraf/issues/5536): Log a warning on write if the metric buffer has overflowed. ## v1.10.4 [2019-05-14] ### Bug Fixes - [#5764](https://github.com/influxdata/telegraf/pull/5764): Fix race condition in the Wavefront parser. - [#5783](https://github.com/influxdata/telegraf/pull/5783): Create telegraf user in pre-install rpm scriptlet. - [#5792](https://github.com/influxdata/telegraf/pull/5792): Don't discard metrics on forbidden error in influxdb_v2 output. - [#5803](https://github.com/influxdata/telegraf/issues/5803): Fix http output cannot set Host header. - [#5619](https://github.com/influxdata/telegraf/issues/5619): Fix interval estimation in vsphere input. - [#5782](https://github.com/influxdata/telegraf/pull/5782): Skip lines with missing refid in ntpq input. - [#5755](https://github.com/influxdata/telegraf/issues/5755): Add support for hex values to ipmi_sensor input. - [#5824](https://github.com/influxdata/telegraf/issues/5824): Fix parse of unix timestamp with more than ns precision. - [#5836](https://github.com/influxdata/telegraf/issues/5836): Restore field name case in interrupts input. ## v1.10.3 [2019-04-16] ### Bug Fixes - [#5680](https://github.com/influxdata/telegraf/pull/5680): Allow colons in metric names in prometheus_client output. - [#5716](https://github.com/influxdata/telegraf/pull/5716): Set log directory attributes in rpm spec. ## v1.10.2 [2019-04-02] ### Release Notes - String fields no longer have leading and trailing quotation marks removed in the grok parser. If you are capturing quoted strings you may need to update the patterns. ### Bug Fixes - [#5612](https://github.com/influxdata/telegraf/pull/5612): Fix deadlock when Telegraf is aligning aggregators. - [#5523](https://github.com/influxdata/telegraf/issues/5523): Fix missing cluster stats in ceph input. - [#5566](https://github.com/influxdata/telegraf/pull/5566): Fix reading major and minor block devices identifiers in diskio input. - [#5607](https://github.com/influxdata/telegraf/pull/5607): Add owned directories to rpm package spec. - [#4998](https://github.com/influxdata/telegraf/issues/4998): Fix last character removed from string field in grok parser. - [#5632](https://github.com/influxdata/telegraf/pull/5632): Fix drop tracking of metrics removed with aggregator drop_original. - [#5540](https://github.com/influxdata/telegraf/pull/5540): Fix open file error handling in file output. - [#5626](https://github.com/influxdata/telegraf/issues/5626): Fix plugin name in influxdb_v2 output logging. - [#5621](https://github.com/influxdata/telegraf/issues/5621): Fix basedir check and parent dir extraction in filecount input. - [#5618](https://github.com/influxdata/telegraf/issues/5618): Listen before leaving start in statsd. - [#5595](https://github.com/influxdata/telegraf/issues/5595): Fix aggregator window alignment. - [#5637](https://github.com/influxdata/telegraf/issues/5637): Fix panic during shutdown of multiple aggregators. - [#5642](https://github.com/influxdata/telegraf/issues/5642): Fix parsing of kube config certificate-authority-data in prometheus input. - [#5636](https://github.com/influxdata/telegraf/issues/5636): Fix tags applied to wrong metric on parse error. - [#5522](https://github.com/influxdata/telegraf/issues/5522): Remove tags that would create invalid label names in prometheus output. ## v1.10.1 [2019-03-19] ### Bug Fixes - [#5448](https://github.com/influxdata/telegraf/issues/5448): Show error when TLS configuration cannot be loaded. - [#5543](https://github.com/influxdata/telegraf/pull/5543): Add Base64-encoding/decoding for Google Cloud PubSub plugins. - [#5565](https://github.com/influxdata/telegraf/issues/5565): Fix type compatibility in vsphere plugin with use_int_samples option. - [#5492](https://github.com/influxdata/telegraf/issues/5492): Fix vsphere input shows failed task in vCenter. - [#5530](https://github.com/influxdata/telegraf/issues/5530): Fix invalid measurement name and skip column in csv parser. - [#5589](https://github.com/influxdata/telegraf/issues/5589): Fix system input causing high cpu usage on Raspbian. - [#5575](https://github.com/influxdata/telegraf/issues/5575): Don't add empty healthcheck tags to consul input. ## v1.10 [2019-03-05] ### New Inputs - [cloud_pubsub](/plugins/inputs/cloud_pubsub/README.md) - Contributed by @emilymye - [cloud_pubsub_push](/plugins/inputs/cloud_pubsub_push/README.md) - Contributed by @influxdata - [kinesis_consumer](/plugins/inputs/kinesis_consumer/README.md) - Contributed by @influxdata - [kube_inventory](/plugins/inputs/kube_inventory/README.md) - Contributed by @influxdata - [neptune_apex](/plugins/inputs/neptune_apex/README.md) - Contributed by @MaxRenaud - [nginx_upstream_check](/plugins/inputs/nginx_upstream_check/README.md) - Contributed by @dmitryilyin - [multifile](/plugins/inputs/multifile/README.md) - Contributed by @martin2250 - [stackdriver](/plugins/inputs/stackdriver/README.md) - Contributed by @WuHan0608 ### New Outputs - [cloud_pubsub](/plugins/outputs/cloud_pubsub/README.md) - Contributed by @emilymye ### New Serializers - [nowmetric](/plugins/serializers/nowmetric/README.md) - Contributed by @JefMuller - [carbon2](/plugins/serializers/carbon2/README.md) - Contributed by @frankreno ### Features - [#4345](https://github.com/influxdata/telegraf/pull/4345): Allow for force gathering ES cluster stats. - [#5047](https://github.com/influxdata/telegraf/pull/5047): Add support for unix and unix_ms timestamps to csv parser. - [#5038](https://github.com/influxdata/telegraf/pull/5038): Add ability to tag metrics with topic in kafka_consumer. - [#5024](https://github.com/influxdata/telegraf/pull/5024): Add option to store cpu as a tag in interrupts input. - [#5074](https://github.com/influxdata/telegraf/pull/5074): Add support for sending a request body to http input. - [#5069](https://github.com/influxdata/telegraf/pull/5069): Add running field to procstat_lookup. - [#5116](https://github.com/influxdata/telegraf/pull/5116): Include DEVLINKS in available diskio udev properties. - [#5149](https://github.com/influxdata/telegraf/pull/5149): Add micro and nanosecond unix timestamp support to JSON parser. - [#5160](https://github.com/influxdata/telegraf/pull/5160): Add support for basic auth to couchdb input. - [#5161](https://github.com/influxdata/telegraf/pull/5161): Add support in wavefront output for the Wavefront Direct Ingestion API. - [#5168](https://github.com/influxdata/telegraf/pull/5168): Allow counting float values in valuecounter aggregator. - [#5177](https://github.com/influxdata/telegraf/pull/5177): Add log send and redo queue fields to sqlserver input. - [#5113](https://github.com/influxdata/telegraf/pull/5113): Improve scalability of vsphere input. - [#5210](https://github.com/influxdata/telegraf/pull/5210): Add read and write op per second fields to ceph input. - [#5214](https://github.com/influxdata/telegraf/pull/5214): Add configurable timeout to varnish input. - [#5273](https://github.com/influxdata/telegraf/pull/5273): Add flush_total_time_ns and additional wired tiger fields to mongodb input. - [#5295](https://github.com/influxdata/telegraf/pull/5295): Support passing bearer token directly in k8s input. - [#5294](https://github.com/influxdata/telegraf/pull/5294): Support passing bearer token directly in prometheus input. - [#5292](https://github.com/influxdata/telegraf/pull/5292): Add option to report input timestamp in prometheus output. - [#5234](https://github.com/influxdata/telegraf/pull/5234): Add Linux mipsle packages. - [#5382](https://github.com/influxdata/telegraf/pull/5382): Support unix_us and unix_ns timestamp format in csv parser. - [#5391](https://github.com/influxdata/telegraf/pull/5391): Add resource type and resource label support to stackdriver output. - [#5396](https://github.com/influxdata/telegraf/pull/5396): Add internal metric for line too long in influxdb_listener. - [#4892](https://github.com/influxdata/telegraf/pull/4892): Add option to set retain flag on messages to mqtt output. - [#5165](https://github.com/influxdata/telegraf/pull/5165): Add resource path based filtering to vsphere input. - [#5417](https://github.com/influxdata/telegraf/pull/5417): Add rcode tag and field to dns_query input. - [#5453](https://github.com/influxdata/telegraf/pull/5453): Support Azure Sovereign Environments with endpoint_url option. - [#5472](https://github.com/influxdata/telegraf/pull/5472): Support configuring a default timezone in JSON parser. - [#5482](https://github.com/influxdata/telegraf/pull/5482): Add ceph_health metrics to ceph input. - [#5488](https://github.com/influxdata/telegraf/pull/5488): Add option to disable unique timestamp adjustment in grok parser. - [#5473](https://github.com/influxdata/telegraf/pull/5473): Add mutual TLS support to prometheus_client output. - [#4308](https://github.com/influxdata/telegraf/pull/4308): Add additional metrics to rabbitmq input. - [#5388](https://github.com/influxdata/telegraf/pull/5388): Add multicast support to socket_listener input. - [#5490](https://github.com/influxdata/telegraf/pull/5490): Add tag based routing in influxdb/influxdb_v2 outputs. - [#5533](https://github.com/influxdata/telegraf/pull/5533): Allow grok parser to produce metrics with no fields. ### Bug Fixes - [#4610](https://github.com/influxdata/telegraf/pull/4610): Fix initscript removes pidfile of restarted Telegraf process. - [#5320](https://github.com/influxdata/telegraf/pull/5320): Use datacenter option spelling in consul input. - [#5316](https://github.com/influxdata/telegraf/pull/5316): Remove auth from /ping route in influxdb_listener. - [#5304](https://github.com/influxdata/telegraf/issues/5304): Fix x509_cert input stops checking certs after first error. - [#5404](https://github.com/influxdata/telegraf/issues/5404): Group stackdriver requests to send one point per timeseries. - [#5449](https://github.com/influxdata/telegraf/issues/5449): Log permission error and ignore in filecount input. - [#5497](https://github.com/influxdata/telegraf/pull/5497): Create log file in append mode. - [#5325](https://github.com/influxdata/telegraf/issues/5325): Ignore tracking for metrics added to aggregator. - [#5514](https://github.com/influxdata/telegraf/issues/5514): Fix panic when rejecting empty batch. - [#5518](https://github.com/influxdata/telegraf/pull/5518): Fix conversion from string float to integer. - [#5431](https://github.com/influxdata/telegraf/pull/5431): Sort metrics by timestamp in prometheus output. ## v1.9.5 [2019-02-26] ### Bug Fixes - [#5315](https://github.com/influxdata/telegraf/issues/5315): Skip string fields when writing to stackdriver output. - [#5364](https://github.com/influxdata/telegraf/issues/5364): Send metrics in ascending time order in stackdriver output. - [#5117](https://github.com/influxdata/telegraf/issues/5117): Use systemd in Amazon Linux 2 rpm. - [#4988](https://github.com/influxdata/telegraf/issues/4988): Set deadlock priority in sqlserver input. - [#5403](https://github.com/influxdata/telegraf/issues/5403): Remove error log when snmp6 directory does not exists with nstat input. - [#5437](https://github.com/influxdata/telegraf/issues/5437): Host not added when using custom arguments in ping plugin. - [#5438](https://github.com/influxdata/telegraf/issues/5438): Fix InfluxDB output UDP line splitting. - [#5456](https://github.com/influxdata/telegraf/issues/5456): Disable results by row in azuredb query. - [#5277](https://github.com/influxdata/telegraf/issues/5277): Add backwards compatibility fields in ceph usage and pool stats. ## v1.9.4 [2019-02-05] ### Bug Fixes - [#5334](https://github.com/influxdata/telegraf/issues/5334): Fix skip_rows and skip_columns options in csv parser. - [#5181](https://github.com/influxdata/telegraf/issues/5181): Always send basic auth in jenkins input. - [#5346](https://github.com/influxdata/telegraf/pull/5346): Build official packages with Go 1.11.5. - [#5368](https://github.com/influxdata/telegraf/issues/5368): Fix definition of multiple syslog plugins. ## v1.9.3 [2019-01-22] ### Bug Fixes - [#5261](https://github.com/influxdata/telegraf/pull/5261): Fix arithmetic overflow in sqlserver input. - [#5194](https://github.com/influxdata/telegraf/issues/5194): Fix latest metrics not sent first when output fails. - [#5285](https://github.com/influxdata/telegraf/issues/5285): Fix amqp_consumer stops consuming when it receives unparsable messages. - [#5281](https://github.com/influxdata/telegraf/issues/5281): Fix prometheus input not detecting added and removed pods. - [#5215](https://github.com/influxdata/telegraf/issues/5215): Remove userinfo from cluster tag in couchbase. - [#5298](https://github.com/influxdata/telegraf/issues/5298): Fix internal_write buffer_size not reset on timed writes. ## v1.9.2 [2019-01-08] ### Bug Fixes - [#5130](https://github.com/influxdata/telegraf/pull/5130): Increase varnishstat timeout. - [#5135](https://github.com/influxdata/telegraf/pull/5135): Remove storage calculation for non Azure managed instances and add server version. - [#5083](https://github.com/influxdata/telegraf/pull/5083): Fix error sending empty tag value in azure_monitor output. - [#5143](https://github.com/influxdata/telegraf/issues/5143): Fix panic with prometheus input plugin on shutdown. - [#4482](https://github.com/influxdata/telegraf/issues/4482): Support non-transparent framing of syslog messages. - [#5151](https://github.com/influxdata/telegraf/issues/5151): Apply global and plugin level metric modifications before filtering. - [#5167](https://github.com/influxdata/telegraf/pull/5167): Fix num_remapped_pgs field in ceph plugin. - [#5179](https://github.com/influxdata/telegraf/issues/5179): Add PDH_NO_DATA to known counter error codes in win_perf_counters. - [#5170](https://github.com/influxdata/telegraf/issues/5170): Fix amqp_consumer stops consuming on empty message. - [#4906](https://github.com/influxdata/telegraf/issues/4906): Fix multiple replace tables not working in strings processor. - [#5219](https://github.com/influxdata/telegraf/issues/5219): Allow non local udp connections in net_response. - [#5218](https://github.com/influxdata/telegraf/issues/5218): Fix toml option names in parser processor. - [#5225](https://github.com/influxdata/telegraf/issues/5225): Fix panic in docker input with bad endpoint. - [#5209](https://github.com/influxdata/telegraf/issues/5209): Fix original metric modified by aggregator filters. ## v1.9.1 [2018-12-11] ### Bug Fixes - [#5006](https://github.com/influxdata/telegraf/issues/5006): Fix boolean handling in splunkmetric serializer. - [#5046](https://github.com/influxdata/telegraf/issues/5046): Set default config values in jenkins input. - [#4664](https://github.com/influxdata/telegraf/issues/4664): Fix server connection and document stats in mongodb input. - [#5010](https://github.com/influxdata/telegraf/issues/5010): Add X-Requested-By header to graylog input. - [#5052](https://github.com/influxdata/telegraf/issues/5052): Fix metric memory not freed from the metric buffer on write. - [#3817](https://github.com/influxdata/telegraf/issues/3817): Add support for client tls certificates in postgresql inputs. - [#5082](https://github.com/influxdata/telegraf/issues/5082): Prevent panic when marking the offset in kafka_consumer. - [#5084](https://github.com/influxdata/telegraf/issues/5084): Add early metrics to aggregator and honor drop_original setting. - [#5112](https://github.com/influxdata/telegraf/pull/5112): Use -W flag on bsd variants in ping input. - [#5114](https://github.com/influxdata/telegraf/issues/5114): Allow delta metrics in wavefront parser. ## v1.9 [2018-11-20] ### Release Notes - The `http_listener` input plugin has been renamed to `influxdb_listener` and use of the original name is deprecated. The new name better describes the intended use of the plugin as a InfluxDB relay. For general purpose transfer of metrics in any format via HTTP, it is recommended to use `http_listener_v2` instead. - Input plugins are no longer limited from adding metrics when the output is writing, and new metrics will move into the metric buffer as needed. This will provide more robust degradation and recovery when writing to a slow output at high throughput. To avoid over consumption when reading from queue consumers: `kafka_consumer`, `amqp_consumer`, `mqtt_consumer`, `nats_consumer`, and `nsq_consumer` use the new option `max_undelivered_messages` to limit the number of outstanding unwritten metrics. ### New Inputs - [http_listener_v2](/plugins/inputs/http_listener_v2/README.md) - Contributed by @jul1u5 - [ipvs](/plugins/inputs/ipvs/README.md) - Contributed by @amoghe - [jenkins](/plugins/inputs/jenkins/README.md) - Contributed by @influxdata & @lpic10 - [nginx_plus_api](/plugins/inputs/nginx_plus_api/README.md) - Contributed by @Bugagazavr - [nginx_vts](/plugins/inputs/nginx_vts/README.md) - Contributed by @monder - [wireless](/plugins/inputs/wireless/README.md) - Contributed by @jamesmaidment ### New Outputs - [stackdriver](/plugins/outputs/stackdriver/README.md) - Contributed by @jamesmaidment ### Features - [#4686](https://github.com/influxdata/telegraf/pull/4686): Add replace function to strings processor. - [#4754](https://github.com/influxdata/telegraf/pull/4754): Query servers in parallel in dns_query input. - [#4753](https://github.com/influxdata/telegraf/pull/4753): Add ability to define a custom service name when installing as a Windows service. - [#4703](https://github.com/influxdata/telegraf/pull/4703): Add support for IPv6 in the ping plugin. - [#4781](https://github.com/influxdata/telegraf/pull/4781): Add new config for csv column explicit type conversion. - [#4800](https://github.com/influxdata/telegraf/pull/4800): Add an option to specify a custom datadog URL. - [#4803](https://github.com/influxdata/telegraf/pull/4803): Use non-allocating field and tag accessors in datadog output. - [#4752](https://github.com/influxdata/telegraf/pull/4752): Add per-directory file counts in the filecount input. - [#4811](https://github.com/influxdata/telegraf/pull/4811): Add windows service name lookup to procstat input. - [#4807](https://github.com/influxdata/telegraf/pull/4807): Add entity-body compression to http output. - [#4838](https://github.com/influxdata/telegraf/pull/4838): Add telegraf version to User-Agent header. - [#4864](https://github.com/influxdata/telegraf/pull/4864): Use DescribeStreamSummary in place of ListStreams in kinesis output. - [#4852](https://github.com/influxdata/telegraf/pull/4852): Add ability to specify bytes options as strings with units. - [#3903](https://github.com/influxdata/telegraf/pull/3903): Add support for TLS configuration in NSQ input. - [#4914](https://github.com/influxdata/telegraf/pull/4914): Collect additional stats in memcached input. - [#3847](https://github.com/influxdata/telegraf/pull/3847): Add wireless input plugin. - [#4934](https://github.com/influxdata/telegraf/pull/4934): Add LUN to datasource translation in vsphere input. - [#4798](https://github.com/influxdata/telegraf/pull/4798): Allow connecting to prometheus via unix socket. - [#4920](https://github.com/influxdata/telegraf/pull/4920): Add scraping for Prometheus endpoint in Kubernetes. - [#4938](https://github.com/influxdata/telegraf/pull/4938): Add per output flush_interval, metric_buffer_limit and metric_batch_size. ### Bug Fixes - [#4950](https://github.com/influxdata/telegraf/pull/4950): Remove the time_key from the field values in JSON parser. - [#3968](https://github.com/influxdata/telegraf/issues/3968): Fix input time rounding when using a custom interval. - [#4938](https://github.com/influxdata/telegraf/pull/4938): Fix potential deadlock or leaked resources on restart/reload. - [#2919](https://github.com/influxdata/telegraf/pull/2919): Fix outputs block inputs when batch size is reached. - [#4789](https://github.com/influxdata/telegraf/issues/4789): Fix potential missing datastore metrics in vSphere plugin. - [#4982](https://github.com/influxdata/telegraf/issues/4982): Log warning when wireless plugin is used on unsupported platform. - [#4965](https://github.com/influxdata/telegraf/issues/4965): Handle non-tls columns for mysql input. - [#4983](https://github.com/influxdata/telegraf/issues/4983): Fix panic in influxdb_listener when using gzip encoding. ## v1.8.3 [2018-10-30] ### Bug Fixes - [#4873](https://github.com/influxdata/telegraf/pull/4873): Add DN attributes as tags in x509_cert input to avoid series overwrite. - [#4921](https://github.com/influxdata/telegraf/issues/4921): Prevent connection leak by closing unused connections in amqp output. - [#4904](https://github.com/influxdata/telegraf/issues/4904): Use default partition key when tag does not exist in kinesis output. - [#4901](https://github.com/influxdata/telegraf/pull/4901): Log the correct error in jti_openconfig. - [#4937](https://github.com/influxdata/telegraf/pull/4937): Handle panic when ipmi_sensor input gets bad input. - [#4930](https://github.com/influxdata/telegraf/pull/4930): Don't add unserializable fields to jolokia2 input. - [#4866](https://github.com/influxdata/telegraf/pull/4866): Fix version check in postgresql_extensible. ## v1.8.2 [2018-10-17] ### Bug Fixes - [#4844](https://github.com/influxdata/telegraf/pull/4844): Update write path to match updated InfluxDB v2 API. - [#4840](https://github.com/influxdata/telegraf/pull/4840): Fix missing timeouts in vsphere input. - [#4851](https://github.com/influxdata/telegraf/pull/4851): Support uint fields in aerospike input. - [#4854](https://github.com/influxdata/telegraf/pull/4854): Use container name from list if no name in container stats. - [#4850](https://github.com/influxdata/telegraf/pull/4850): Prevent panic in filecount input on error in file stat. - [#4846](https://github.com/influxdata/telegraf/pull/4846): Fix mqtt_consumer connect and reconnect. - [#4849](https://github.com/influxdata/telegraf/pull/4849): Fix panic in logparser input. - [#4869](https://github.com/influxdata/telegraf/pull/4869): Lower authorization errors to debug level in mongodb input. - [#4875](https://github.com/influxdata/telegraf/pull/4875): Return correct response code on ping input. - [#4874](https://github.com/influxdata/telegraf/pull/4874): Fix segfault in x509_cert input. ## v1.8.1 [2018-10-03] ### Bug Fixes - [#4750](https://github.com/influxdata/telegraf/pull/4750): Fix hardware_type may be truncated in sqlserver input. - [#4723](https://github.com/influxdata/telegraf/issues/4723): Improve performance in basicstats aggregator. - [#4747](https://github.com/influxdata/telegraf/pull/4747): Add hostname to TLS config for SNI support. - [#4675](https://github.com/influxdata/telegraf/issues/4675): Don't add tags with empty values to opentsdb output. - [#4765](https://github.com/influxdata/telegraf/pull/4765): Fix panic during network error in vsphere input. - [#4766](https://github.com/influxdata/telegraf/pull/4766): Unify http_listener error response with InfluxDB. - [#4769](https://github.com/influxdata/telegraf/pull/4769): Add UUID to VMs in vSphere input. - [#4758](https://github.com/influxdata/telegraf/issues/4758): Skip tags with empty values in cloudwatch output. - [#4783](https://github.com/influxdata/telegraf/issues/4783): Fix missing non-realtime samples in vSphere input. - [#4799](https://github.com/influxdata/telegraf/pull/4799): Fix case of timezone/grok_timezone options. ## v1.8 [2018-09-21] ### New Inputs - [activemq](./plugins/inputs/activemq/README.md) - Contributed by @mlabouardy - [beanstalkd](./plugins/inputs/beanstalkd/README.md) - Contributed by @44px - [filecount](./plugins/inputs/filecount/README.md) - Contributed by @sometimesfood - [file](./plugins/inputs/file/README.md) - Contributed by @maxunt - [icinga2](./plugins/inputs/icinga2/README.md) - Contributed by @mlabouardy - [kibana](./plugins/inputs/kibana/README.md) - Contributed by @lpic10 - [pgbouncer](./plugins/inputs/pgbouncer/README.md) - Contributed by @nerzhul - [temp](./plugins/inputs/temp/README.md) - Contributed by @pytimer - [tengine](./plugins/inputs/tengine/README.md) - Contributed by @ertaoxu - [vsphere](./plugins/inputs/vsphere/README.md) - Contributed by @prydin - [x509_cert](./plugins/inputs/x509_cert/README.md) - Contributed by @jtyr ### New Processors - [enum](./plugins/processors/enum/README.md) - Contributed by @KarstenSchnitter - [parser](./plugins/processors/parser/README.md) - Contributed by @Ayrdrie & @maxunt - [rename](./plugins/processors/rename/README.md) - Contributed by @goldibex - [strings](./plugins/processors/strings/README.md) - Contributed by @bsmaldon ### New Aggregators - [valuecounter](./plugins/aggregators/valuecounter/README.md) - Contributed by @piotr1212 ### New Outputs - [azure_monitor](./plugins/outputs/azure_monitor/README.md) - Contributed by @influxdata - [influxdb_v2](./plugins/outputs/influxdb_v2/README.md) - Contributed by @influxdata ### New Parsers - [csv](/plugins/parsers/csv/README.md) - Contributed by @maxunt - [grok](/plugins/parsers/grok/README.md) - Contributed by @maxunt - [logfmt](/plugins/parsers/logfmt/README.md) - Contributed by @Ayrdrie & @maxunt - [wavefront](/plugins/parsers/wavefront/README.md) - Contributed by @puckpuck ### New Serializers - [splunkmetric](/plugins/serializers/splunkmetric/README.md) - Contributed by @ronnocol ### Features - [#4236](https://github.com/influxdata/telegraf/pull/4236): Add SSL/TLS support to redis input. - [#4160](https://github.com/influxdata/telegraf/pull/4160): Add tengine input plugin. - [#4262](https://github.com/influxdata/telegraf/pull/4262): Add power draw field to nvidia_smi plugin. - [#4271](https://github.com/influxdata/telegraf/pull/4271): Add support for solr 7 to the solr input. - [#4281](https://github.com/influxdata/telegraf/pull/4281): Add owner tag on partitions in burrow input. - [#4259](https://github.com/influxdata/telegraf/pull/4259): Add container status tag to docker input. - [#3523](https://github.com/influxdata/telegraf/pull/3523): Add valuecounter aggregator plugin. - [#4307](https://github.com/influxdata/telegraf/pull/4307): Add new measurement with results of pgrep lookup to procstat input. - [#4311](https://github.com/influxdata/telegraf/pull/4311): Add support for comma in logparser timestamp format. - [#4292](https://github.com/influxdata/telegraf/pull/4292): Add path tag to tail input plugin. - [#4322](https://github.com/influxdata/telegraf/pull/4322): Add log message when tail is added or removed from a file. - [#4267](https://github.com/influxdata/telegraf/pull/4267): Add option to use of counter time in win perf counters. - [#4343](https://github.com/influxdata/telegraf/pull/4343): Add energy and power field and device id tag to fibaro input. - [#4347](https://github.com/influxdata/telegraf/pull/4347): Add http path configuration for OpenTSDB output. - [#4352](https://github.com/influxdata/telegraf/pull/4352): Gather IPMI metrics concurrently. - [#4362](https://github.com/influxdata/telegraf/pull/4362): Add mongo document and connection metrics. - [#3772](https://github.com/influxdata/telegraf/pull/3772): Add enum processor plugin. - [#4386](https://github.com/influxdata/telegraf/pull/4386): Add user tag to procstat input. - [#4403](https://github.com/influxdata/telegraf/pull/4403): Add support for multivalue metrics to collectd parser. - [#4418](https://github.com/influxdata/telegraf/pull/4418): Add support for setting kafka client id. - [#4332](https://github.com/influxdata/telegraf/pull/4332): Add file input plugin and grok parser. - [#4320](https://github.com/influxdata/telegraf/pull/4320): Improve cloudwatch output performance. - [#3768](https://github.com/influxdata/telegraf/pull/3768): Add x509_cert input plugin. - [#4471](https://github.com/influxdata/telegraf/pull/4471): Add IPSIpAddress syntax to ipaddr conversion in snmp plugin. - [#4363](https://github.com/influxdata/telegraf/pull/4363): Add filecount input plugin. - [#4485](https://github.com/influxdata/telegraf/pull/4485): Add support for configuring an AWS endpoint_url. - [#4491](https://github.com/influxdata/telegraf/pull/4491): Send all messages before waiting for results in kafka output. - [#4492](https://github.com/influxdata/telegraf/pull/4492): Add support for lz4 compression to kafka output. - [#4450](https://github.com/influxdata/telegraf/pull/4450): Split multiple sensor keys in ipmi input. - [#4364](https://github.com/influxdata/telegraf/pull/4364): Support StatisticValues in cloudwatch output plugin. - [#4431](https://github.com/influxdata/telegraf/pull/4431): Add ip restriction for the prometheus_client output. - [#3918](https://github.com/influxdata/telegraf/pull/3918): Add pgbouncer input plugin. - [#2689](https://github.com/influxdata/telegraf/pull/2689): Add ActiveMQ input plugin. - [#4402](https://github.com/influxdata/telegraf/pull/4402): Add wavefront parser plugin. - [#4528](https://github.com/influxdata/telegraf/pull/4528): Add rename processor plugin. - [#4537](https://github.com/influxdata/telegraf/pull/4537): Add message 'max_bytes' configuration to kafka input. - [#4546](https://github.com/influxdata/telegraf/pull/4546): Add gopsutil meminfo fields to mem plugin. - [#4285](https://github.com/influxdata/telegraf/pull/4285): Document how to parse telegraf logs. - [#4542](https://github.com/influxdata/telegraf/pull/4542): Use dep v0.5.0. - [#4433](https://github.com/influxdata/telegraf/pull/4433): Add ability to set measurement from matched text in grok parser. - [#4565](https://github.com/influxdata/telegraf/pull/4465): Drop message batches in kafka output if too large. - [#4579](https://github.com/influxdata/telegraf/pull/4579): Add support for static and random routing keys in kafka output. - [#4539](https://github.com/influxdata/telegraf/pull/4539): Add logfmt parser plugin. - [#4551](https://github.com/influxdata/telegraf/pull/4551): Add parser processor plugin. - [#4559](https://github.com/influxdata/telegraf/pull/4559): Add Icinga2 input plugin. - [#4351](https://github.com/influxdata/telegraf/pull/4351): Add name, time, path and string field options to JSON parser. - [#4571](https://github.com/influxdata/telegraf/pull/4571): Add forwarded records to sqlserver input. - [#4585](https://github.com/influxdata/telegraf/pull/4585): Add Kibana input plugin. - [#4439](https://github.com/influxdata/telegraf/pull/4439): Add csv parser plugin. - [#4598](https://github.com/influxdata/telegraf/pull/4598): Add read_buffer_size option to statsd input. - [#4089](https://github.com/influxdata/telegraf/pull/4089): Add azure_monitor output plugin. - [#4628](https://github.com/influxdata/telegraf/pull/4628): Add queue_durability parameter to amqp_consumer input. - [#4476](https://github.com/influxdata/telegraf/pull/4476): Add strings processor. - [#4536](https://github.com/influxdata/telegraf/pull/4536): Add OAuth2 support to HTTP output plugin. - [#4633](https://github.com/influxdata/telegraf/pull/4633): Add Unix epoch timestamp support for JSON parser. - [#4657](https://github.com/influxdata/telegraf/pull/4657): Add options for basic auth to haproxy input. - [#4411](https://github.com/influxdata/telegraf/pull/4411): Add temp input plugin. - [#4272](https://github.com/influxdata/telegraf/pull/4272): Add Beanstalkd input plugin. - [#4669](https://github.com/influxdata/telegraf/pull/4669): Add means to specify server password for redis input. - [#4339](https://github.com/influxdata/telegraf/pull/4339): Add Splunk Metrics serializer. - [#4141](https://github.com/influxdata/telegraf/pull/4141): Add input plugin for VMware vSphere. - [#4667](https://github.com/influxdata/telegraf/pull/4667): Align metrics window to interval in cloudwatch input. - [#4642](https://github.com/influxdata/telegraf/pull/4642): Improve Azure Managed Instance support + more in sqlserver input. - [#4682](https://github.com/influxdata/telegraf/pull/4682): Allow alternate binaries for iptables input plugin. - [#4645](https://github.com/influxdata/telegraf/pull/4645): Add influxdb_v2 output plugin. ### Bug Fixes - [#3438](https://github.com/influxdata/telegraf/issues/3438): Fix divide by zero in logparser input. - [#4499](https://github.com/influxdata/telegraf/issues/4499): Fix instance and object name in performance counters with backslashes. - [#4646](https://github.com/influxdata/telegraf/issues/4646): Reset/flush saved contents from bad metric. - [#4520](https://github.com/influxdata/telegraf/issues/4520): Document all supported cli arguments. - [#4674](https://github.com/influxdata/telegraf/pull/4674): Log access denied opening a service at debug level in win_services. - [#4588](https://github.com/influxdata/telegraf/issues/4588): Add support for Kafka 2.0. - [#4087](https://github.com/influxdata/telegraf/issues/4087): Fix nagios parser does not support ranges in performance data. - [#4088](https://github.com/influxdata/telegraf/issues/4088): Fix nagios parser does not strip quotes from performance data. - [#4688](https://github.com/influxdata/telegraf/issues/4688): Fix null value crash in postgresql_extensible input. - [#4681](https://github.com/influxdata/telegraf/pull/4681): Remove the startup authentication check from the cloudwatch output. - [#4644](https://github.com/influxdata/telegraf/issues/4644): Support tailing files created after startup in tail input. - [#4706](https://github.com/influxdata/telegraf/issues/4706): Fix csv format configuration loading. ## v1.7.4 [2018-08-29] ### Bug Fixes - [#4534](https://github.com/influxdata/telegraf/pull/4534): Skip unserializable metric in influxDB UDP output. - [#4554](https://github.com/influxdata/telegraf/pull/4554): Fix powerdns input tests. - [#4584](https://github.com/influxdata/telegraf/pull/4584): Fix burrow_group offset calculation for burrow input. - [#4550](https://github.com/influxdata/telegraf/pull/4550): Add result_code value for errors running ping command. - [#4605](https://github.com/influxdata/telegraf/pull/4605): Remove timeout deadline for udp syslog input. - [#4601](https://github.com/influxdata/telegraf/issues/4601): Ensure channel closed if an error occurs in cgroup input. - [#4544](https://github.com/influxdata/telegraf/issues/4544): Fix sending of basic auth credentials in http output. - [#4526](https://github.com/influxdata/telegraf/issues/4526): Use the correct GOARM value in the armel package. ## v1.7.3 [2018-08-07] ### Bug Fixes - [#4434](https://github.com/influxdata/telegraf/issues/4434): Reduce required docker API version. - [#4498](https://github.com/influxdata/telegraf/pull/4498): Keep leading whitespace for messages in syslog input. - [#4470](https://github.com/influxdata/telegraf/issues/4470): Skip bad entries on interrupt input. - [#4501](https://github.com/influxdata/telegraf/issues/4501): Preserve metric type when using filters in output plugins. - [#3794](https://github.com/influxdata/telegraf/issues/3794): Fix error message if URL is unparsable in influxdb output. - [#4059](https://github.com/influxdata/telegraf/issues/4059): Use explicit zpool properties to fix parse error on FreeBSD 11.2. - [#4514](https://github.com/influxdata/telegraf/pull/4514): Lock buffer when adding metrics. ## v1.7.2 [2018-07-18] ### Bug Fixes - [#4381](https://github.com/influxdata/telegraf/issues/4381): Use localhost as default server tag in zookeeper input. - [#4374](https://github.com/influxdata/telegraf/issues/4374): Don't set values when pattern doesn't match in regex processor. - [#4416](https://github.com/influxdata/telegraf/issues/4416): Fix output format of printer processor. - [#4422](https://github.com/influxdata/telegraf/issues/4422): Fix metric can have duplicate field. - [#4389](https://github.com/influxdata/telegraf/issues/4389): Return error if NewRequest fails in http output. - [#4335](https://github.com/influxdata/telegraf/issues/4335): Reset read deadline for syslog input. - [#4375](https://github.com/influxdata/telegraf/issues/4375): Exclude cached memory on docker input plugin. ## v1.7.1 [2018-07-03] ### Bug Fixes - [#4277](https://github.com/influxdata/telegraf/pull/4277): Treat sigterm as a clean shutdown signal. - [#4284](https://github.com/influxdata/telegraf/pull/4284): Fix selection of tags under nested objects in the JSON parser. - [#4135](https://github.com/influxdata/telegraf/issues/4135): Fix postfix input handling multi-level queues. - [#4334](https://github.com/influxdata/telegraf/pull/4334): Fix syslog timestamp parsing with single digit day of month. - [#2910](https://github.com/influxdata/telegraf/issues/2910): Handle mysql input variations in the user_statistics collecting. - [#4293](https://github.com/influxdata/telegraf/issues/4293): Fix minmax and basicstats aggregators to use uint64. - [#4290](https://github.com/influxdata/telegraf/issues/4290): Document swap input plugin. - [#4316](https://github.com/influxdata/telegraf/issues/4316): Fix incorrect precision being applied to metric in http_listener. ## v1.7 [2018-06-12] ### Release Notes - The `cassandra` input plugin has been deprecated in favor of the `jolokia2` input plugin which is much more configurable and more performant. There is an [example configuration](./plugins/inputs/jolokia2/examples) to help you get started. - For plugins supporting TLS, you can now specify the certificate and keys using `tls_ca`, `tls_cert`, `tls_key`. These options behave the same as the, now deprecated, `ssl` forms. ### New Inputs - [aurora](./plugins/inputs/aurora/README.md) - Contributed by @influxdata - [burrow](./plugins/inputs/burrow/README.md) - Contributed by @arkady-emelyanov - [fibaro](./plugins/inputs/fibaro/README.md) - Contributed by @dynek - [jti_openconfig_telemetry](./plugins/inputs/jti_openconfig_telemetry/README.md) - Contributed by @ajhai - [mcrouter](./plugins/inputs/mcrouter/README.md) - Contributed by @cthayer - [nvidia_smi](./plugins/inputs/nvidia_smi/README.md) - Contributed by @jackzampolin - [syslog](./plugins/inputs/syslog/README.md) - Contributed by @influxdata ### New Processors - [converter](./plugins/processors/converter/README.md) - Contributed by @influxdata - [regex](./plugins/processors/regex/README.md) - Contributed by @44px - [topk](./plugins/processors/topk/README.md) - Contributed by @mirath ### New Outputs - [http](./plugins/outputs/http/README.md) - Contributed by @Dark0096 - [application_insights](./plugins/outputs/application_insights/README.md): Contribute by @karolz-ms ### Features - [#3964](https://github.com/influxdata/telegraf/pull/3964): Add repl_oplog_window_sec metric to mongodb input. - [#3819](https://github.com/influxdata/telegraf/pull/3819): Add per-host shard metrics in mongodb input. - [#3999](https://github.com/influxdata/telegraf/pull/3999): Skip files with leading `..` in config directory. - [#4021](https://github.com/influxdata/telegraf/pull/4021): Add TLS support to socket_writer and socket_listener plugins. - [#4025](https://github.com/influxdata/telegraf/pull/4025): Add snmp input option to strip non fixed length index suffixes. - [#4035](https://github.com/influxdata/telegraf/pull/4035): Add server version tag to docker input. - [#4044](https://github.com/influxdata/telegraf/pull/4044): Add support for LeoFS 1.4 to leofs input. - [#4068](https://github.com/influxdata/telegraf/pull/4068): Add parameter to force the interval of gather for sysstat. - [#3877](https://github.com/influxdata/telegraf/pull/3877): Support busybox ping in the ping input. - [#4077](https://github.com/influxdata/telegraf/pull/4077): Add input plugin for McRouter. - [#4096](https://github.com/influxdata/telegraf/pull/4096): Add topk processor plugin. - [#4114](https://github.com/influxdata/telegraf/pull/4114): Add cursor metrics to mongodb input. - [#3455](https://github.com/influxdata/telegraf/pull/3455): Add tag/integer pair for result to net_response. - [#4010](https://github.com/influxdata/telegraf/pull/3455): Add application_insights output plugin. - [#4167](https://github.com/influxdata/telegraf/pull/4167): Added several important elasticsearch cluster health metrics. - [#4094](https://github.com/influxdata/telegraf/pull/4094): Add batch mode to mqtt output. - [#4158](https://github.com/influxdata/telegraf/pull/4158): Add aurora input plugin. - [#3839](https://github.com/influxdata/telegraf/pull/3839): Add regex processor plugin. - [#4165](https://github.com/influxdata/telegraf/pull/4165): Add support for Graphite 1.1 tags. - [#4162](https://github.com/influxdata/telegraf/pull/4162): Add timeout option to sensors input. - [#3489](https://github.com/influxdata/telegraf/pull/3489): Add burrow input plugin. - [#3969](https://github.com/influxdata/telegraf/pull/3969): Add option to unbound module to use threads as tags. - [#4183](https://github.com/influxdata/telegraf/pull/4183): Add support for TLS and username/password auth to aerospike input. - [#4190](https://github.com/influxdata/telegraf/pull/4190): Add special syslog timestamp parser to grok parser that uses current year. - [#4181](https://github.com/influxdata/telegraf/pull/4181): Add syslog input plugin. - [#4212](https://github.com/influxdata/telegraf/pull/4212): Print the enabled aggregator and processor plugins on startup. - [#3994](https://github.com/influxdata/telegraf/pull/3994): Add static routing_key option to amqp output. - [#3995](https://github.com/influxdata/telegraf/pull/3995): Add passive mode exchange declaration option to amqp consumer input. - [#4216](https://github.com/influxdata/telegraf/pull/4216): Add counter fields to pf input. ### Bug Fixes - [#4018](https://github.com/influxdata/telegraf/pull/4018): Write to working file outputs if any files are not writeable. - [#4036](https://github.com/influxdata/telegraf/pull/4036): Add all win_perf_counters fields for a series in a single metric. - [#4118](https://github.com/influxdata/telegraf/pull/4118): Report results of dns_query instead of 0ms on timeout. - [#4155](https://github.com/influxdata/telegraf/pull/4155): Add consul service tags to metric. - [#2879](https://github.com/influxdata/telegraf/issues/2879): Fix wildcards and multi instance processes in win_perf_counters. - [#2468](https://github.com/influxdata/telegraf/issues/2468): Fix crash on 32-bit Windows in win_perf_counters. - [#4198](https://github.com/influxdata/telegraf/issues/4198): Fix win_perf_counters not collecting at every interval. - [#4227](https://github.com/influxdata/telegraf/issues/4227): Use same flags for all BSD family ping variants. - [#4266](https://github.com/influxdata/telegraf/issues/4266): Remove tags with empty values from Wavefront output. ## v1.6.4 [2018-06-05] ### Bug Fixes - [#4203](https://github.com/influxdata/telegraf/issues/4203): Fix snmp overriding of auto-configured table fields. - [#4218](https://github.com/influxdata/telegraf/issues/4218): Fix uint support in cloudwatch output. - [#4188](https://github.com/influxdata/telegraf/pull/4188): Fix documentation of instance_name option in varnish input. - [#4195](https://github.com/influxdata/telegraf/pull/4195): Revert to previous aerospike library version due to memory leak. ## v1.6.3 [2018-05-21] ### Bug Fixes - [#4127](https://github.com/influxdata/telegraf/issues/4127): Fix intermittent panic in aerospike input. - [#4130](https://github.com/influxdata/telegraf/issues/4130): Fix connection leak in jolokia2_agent. - [#4136](https://github.com/influxdata/telegraf/pull/4130): Fix jolokia2 timeout parsing. - [#4142](https://github.com/influxdata/telegraf/pull/4142): Fix error parsing dropwizard metrics. - [#4149](https://github.com/influxdata/telegraf/issues/4149): Fix librato output support for uint and bool. - [#4176](https://github.com/influxdata/telegraf/pull/4176): Fix waitgroup deadlock if url is incorrect in apache input. ## v1.6.2 [2018-05-08] ### Bug Fixes - [#4078](https://github.com/influxdata/telegraf/pull/4078): Use same timestamp for fields in system input. - [#4091](https://github.com/influxdata/telegraf/pull/4091): Fix handling of uint64 in datadog output. - [#4099](https://github.com/influxdata/telegraf/pull/4099): Ignore UTF8 BOM in JSON parser. - [#4104](https://github.com/influxdata/telegraf/issues/4104): Fix case for slave metrics in mysql input. - [#4110](https://github.com/influxdata/telegraf/issues/4110): Fix uint support in cratedb output. ## v1.6.1 [2018-04-23] ### Bug Fixes - [#3835](https://github.com/influxdata/telegraf/issues/3835): Report mem input fields as gauges instead counters. - [#4030](https://github.com/influxdata/telegraf/issues/4030): Fix graphite outputs unsigned integers in wrong format. - [#4043](https://github.com/influxdata/telegraf/issues/4043): Report available fields if utmp is unreadable. - [#4039](https://github.com/influxdata/telegraf/issues/4039): Fix potential "no fields" error writing to outputs. - [#4037](https://github.com/influxdata/telegraf/issues/4037): Fix uptime reporting in system input when ran inside docker. - [#3750](https://github.com/influxdata/telegraf/issues/3750): Fix mem input "cannot allocate memory" error on FreeBSD based systems. - [#4056](https://github.com/influxdata/telegraf/pull/4056): Fix duplicate tags when overriding an existing tag. - [#4062](https://github.com/influxdata/telegraf/pull/4062): Add server argument as first argument in unbound input. - [#4063](https://github.com/influxdata/telegraf/issues/4063): Fix handling of floats with multiple leading zeroes. - [#4064](https://github.com/influxdata/telegraf/issues/4064): Return errors in mongodb SSL/TLS configuration. ## v1.6 [2018-04-16] ### Release Notes - The `mysql` input plugin has been updated fix a number of type conversion issues. This may cause a `field type error` when inserting into InfluxDB due the change of types. To address this we have introduced a new `metric_version` option to control enabling the new format. For in depth recommendations on upgrading please reference the [mysql plugin documentation](./plugins/inputs/mysql/README.md#metric-version). It is encouraged to migrate to the new model when possible as the old version is deprecated and will be removed in a future version. - The `postgresql` plugins now defaults to using a persistent connection to the database. In environments where TCP connections are terminated the `max_lifetime` setting should be set less than the collection `interval` to prevent errors. - The `sqlserver` input plugin has a new query and data model that can be enabled by setting `query_version = 2`. It is encouraged to migrate to the new model when possible as the old version is deprecated and will be removed in a future version. - An option has been added to the `openldap` input plugin that reverses metric name to improve grouping. This change is enabled when `reverse_metric_names = true` is set. It is encouraged to enable this option when possible as the old ordering is deprecated. - The new `http` input configured with `data_format = "json"` can perform the same task as the, now deprecated, `httpjson` input. ### New Inputs - [http](./plugins/inputs/http/README.md) - Thanks to @grange74 - [ipset](./plugins/inputs/ipset/README.md) - Thanks to @sajoupa - [nats](./plugins/inputs/nats/README.md) - Thanks to @mjs & @levex ### New Processors - [override](./plugins/processors/override/README.md) - Thanks to @KarstenSchnitter ### New Parsers - [dropwizard](./docs/DATA_FORMATS_INPUT.md#dropwizard) - Thanks to @atzoum ### Features - [#3551](https://github.com/influxdata/telegraf/pull/3551): Add health status mapping from string to int in elasticsearch input. - [#3580](https://github.com/influxdata/telegraf/pull/3580): Add control over which stats to gather in basicstats aggregator. - [#3596](https://github.com/influxdata/telegraf/pull/3596): Add messages_delivered_get to rabbitmq input. - [#3632](https://github.com/influxdata/telegraf/pull/3632): Add wired field to mem input. - [#3619](https://github.com/influxdata/telegraf/pull/3619): Add support for gathering exchange metrics to the rabbitmq input. - [#3565](https://github.com/influxdata/telegraf/pull/3565): Add support for additional metrics on Linux in zfs input. - [#3524](https://github.com/influxdata/telegraf/pull/3524): Add available_entropy field to kernel input plugin. - [#3643](https://github.com/influxdata/telegraf/pull/3643): Add user privilege level setting to IPMI sensors. - [#2701](https://github.com/influxdata/telegraf/pull/2701): Use persistent connection to postgresql database. - [#2846](https://github.com/influxdata/telegraf/pull/2846): Add support for dropwizard input format. - [#3666](https://github.com/influxdata/telegraf/pull/3666): Add container health metrics to docker input. - [#3687](https://github.com/influxdata/telegraf/pull/3687): Add support for using globs in devices list of diskio input plugin. - [#2754](https://github.com/influxdata/telegraf/pull/2754): Allow running as console application on Windows. - [#3703](https://github.com/influxdata/telegraf/pull/3703): Add listener counts and node running status to rabbitmq input. - [#3674](https://github.com/influxdata/telegraf/pull/3674): Add NATS Monitoring Input Plugin. - [#3702](https://github.com/influxdata/telegraf/pull/3702): Add ability to select which queues will be gathered in rabbitmq input. - [#3726](https://github.com/influxdata/telegraf/pull/3726): Add support for setting bsd source address to the ping input. - [#3346](https://github.com/influxdata/telegraf/pull/3346): Add Ipset input plugin. - [#3719](https://github.com/influxdata/telegraf/pull/3719): Add TLS and HTTP basic auth to prometheus_client output. - [#3618](https://github.com/influxdata/telegraf/pull/3618): Add new sqlserver output data model. - [#3559](https://github.com/influxdata/telegraf/pull/3559): Add native Go method for finding pids to procstat. - [#3722](https://github.com/influxdata/telegraf/pull/3722): Add additional metrics and reverse metric names option to openldap. - [#3769](https://github.com/influxdata/telegraf/pull/3769): Add TLS support to the mesos input plugin. - [#3546](https://github.com/influxdata/telegraf/pull/3546): Add http input plugin. - [#3781](https://github.com/influxdata/telegraf/pull/3781): Add keep alive support to the TCP mode of statsd. - [#3783](https://github.com/influxdata/telegraf/pull/3783): Support deadline in ping plugin. - [#3765](https://github.com/influxdata/telegraf/pull/3765): Add option to disable labels in prometheus output for string fields. - [#3808](https://github.com/influxdata/telegraf/pull/3808): Add shard server stats to the mongodb input plugin. - [#3713](https://github.com/influxdata/telegraf/pull/3713): Add server option to unbound plugin. - [#3804](https://github.com/influxdata/telegraf/pull/3804): Convert boolean metric values to float in datadog output. - [#3799](https://github.com/influxdata/telegraf/pull/3799): Add Solr 3 compatibility. - [#3797](https://github.com/influxdata/telegraf/pull/3797): Add sum stat to basicstats aggregator. - [#3626](https://github.com/influxdata/telegraf/pull/3626): Add ability to override proxy from environment in http response. - [#3853](https://github.com/influxdata/telegraf/pull/3853): Add host to ping timeout log message. - [#3773](https://github.com/influxdata/telegraf/pull/3773): Add override processor. - [#3814](https://github.com/influxdata/telegraf/pull/3814): Add status_code and result tags and result_type field to http_response input. - [#3880](https://github.com/influxdata/telegraf/pull/3880): Added config flag to skip collection of network protocol metrics. - [#3927](https://github.com/influxdata/telegraf/pull/3927): Add TLS support to kapacitor input. - [#3496](https://github.com/influxdata/telegraf/pull/3496): Add HTTP basic auth support to the http_listener input. - [#3452](https://github.com/influxdata/telegraf/issues/3452): Tags in output InfluxDB Line Protocol are now sorted. - [#3631](https://github.com/influxdata/telegraf/issues/3631): InfluxDB Line Protocol parser now accepts DOS line endings. - [#2496](https://github.com/influxdata/telegraf/issues/2496): An option has been added to skip database creation in the InfluxDB output. - [#3366](https://github.com/influxdata/telegraf/issues/3366): Add support for connecting to InfluxDB over a unix domain socket. - [#3946](https://github.com/influxdata/telegraf/pull/3946): Add optional unsigned integer support to the influx data format. - [#3811](https://github.com/influxdata/telegraf/pull/3811): Add TLS support to zookeeper input. - [#2737](https://github.com/influxdata/telegraf/issues/2737): Add filters for container state to docker input. ### Bug Fixes - [#1896](https://github.com/influxdata/telegraf/issues/1896): Fix various mysql data type conversions. - [#3810](https://github.com/influxdata/telegraf/issues/3810): Fix metric buffer limit in internal plugin after reload. - [#3801](https://github.com/influxdata/telegraf/issues/3801): Fix panic in http_response on invalid regex. - [#3973](https://github.com/influxdata/telegraf/issues/3873): Fix socket_listener setting ReadBufferSize on tcp sockets. - [#1575](https://github.com/influxdata/telegraf/issues/1575): Add tag for target url to phpfpm input. - [#3868](https://github.com/influxdata/telegraf/issues/3868): Fix cannot unmarshal object error in DC/OS input. - [#3648](https://github.com/influxdata/telegraf/issues/3648): Fix InfluxDB output not able to reconnect when server address changes. - [#3957](https://github.com/influxdata/telegraf/issues/3957): Fix parsing of dos line endings in the smart input. - [#3754](https://github.com/influxdata/telegraf/issues/3754): Fix precision truncation when no timestamp included. - [#3655](https://github.com/influxdata/telegraf/issues/3655): Fix SNMPv3 connection with Cisco ASA 5515 in snmp input. - [#3981](https://github.com/influxdata/telegraf/pull/3981): Export all vars defined in /etc/default/telegraf. - [#4004](https://github.com/influxdata/telegraf/issues/4004): Allow grok pattern to contain newlines. ## v1.5.3 [2018-03-14] ### Bug Fixes - [#3729](https://github.com/influxdata/telegraf/issues/3729): Set path to / if HOST_MOUNT_PREFIX matches full path. - [#3739](https://github.com/influxdata/telegraf/issues/3739): Remove userinfo from url tag in prometheus input. - [#3778](https://github.com/influxdata/telegraf/issues/3778): Fix ping plugin not reporting zero durations. - [#3697](https://github.com/influxdata/telegraf/issues/3697): Disable keepalive in mqtt output to prevent deadlock. - [#3786](https://github.com/influxdata/telegraf/pull/3786): Fix collation difference in sqlserver input. - [#3871](https://github.com/influxdata/telegraf/pull/3871): Fix uptime metric in passenger input plugin. - [#3851](https://github.com/influxdata/telegraf/issues/3851): Add output of stderr in case of error to exec log message. ## v1.5.2 [2018-01-30] ### Bug Fixes - [#3684](https://github.com/influxdata/telegraf/pull/3684): Ignore empty lines in Graphite plaintext. - [#3604](https://github.com/influxdata/telegraf/issues/3604): Fix index out of bounds error in solr input plugin. - [#3680](https://github.com/influxdata/telegraf/pull/3680): Reconnect before sending graphite metrics if disconnected. - [#3693](https://github.com/influxdata/telegraf/pull/3693): Align aggregator period with internal ticker to avoid skipping metrics. - [#3629](https://github.com/influxdata/telegraf/issues/3629): Fix a potential deadlock when using aggregators. - [#3697](https://github.com/influxdata/telegraf/issues/3697): Limit wait time for writes in mqtt output. - [#3698](https://github.com/influxdata/telegraf/issues/3698): Revert change in graphite output where dot in field key was replaced by underscore. - [#3710](https://github.com/influxdata/telegraf/issues/3710): Add timeout to wavefront output write. - [#3725](https://github.com/influxdata/telegraf/issues/3725): Exclude master_replid fields from redis input. ## v1.5.1 [2018-01-10] ### Bug Fixes - [#3624](https://github.com/influxdata/telegraf/pull/3624): Fix name error in jolokia2_agent sample config. - [#3625](https://github.com/influxdata/telegraf/pull/3625): Fix DC/OS login expiration time. - [#3593](https://github.com/influxdata/telegraf/pull/3593): Set Content-Type charset in influxdb output and allow it be overridden. - [#3594](https://github.com/influxdata/telegraf/pull/3594): Document permissions setup for postfix input. - [#3633](https://github.com/influxdata/telegraf/pull/3633): Fix deliver_get field in rabbitmq input. - [#3607](https://github.com/influxdata/telegraf/issues/3607): Escape environment variables during config toml parsing. ## v1.5 [2017-12-14] ### New Plugins - [basicstats](./plugins/aggregators/basicstats/README.md) - Thanks to @toni-moreno - [bond](./plugins/inputs/bond/README.md) - Thanks to @ildarsv - [cratedb](./plugins/outputs/cratedb/README.md) - Thanks to @felixge - [dcos](./plugins/inputs/dcos/README.md) - Thanks to @influxdata - [jolokia2](./plugins/inputs/jolokia2/README.md) - Thanks to @dylanmei - [nginx_plus](./plugins/inputs/nginx_plus/README.md) - Thanks to @mplonka & @poblahblahblah - [opensmtpd](./plugins/inputs/opensmtpd/README.md) - Thanks to @aromeyer - [particle](./plugins/inputs/webhooks/particle/README.md) - Thanks to @davidgs - [pf](./plugins/inputs/pf/README.md) - Thanks to @nferch - [postfix](./plugins/inputs/postfix/README.md) - Thanks to @phemmer - [smart](./plugins/inputs/smart/README.md) - Thanks to @rickard-von-essen - [solr](./plugins/inputs/solr/README.md) - Thanks to @ljagiello - [teamspeak](./plugins/inputs/teamspeak/README.md) - Thanks to @p4ddy1 - [unbound](./plugins/inputs/unbound/README.md) - Thanks to @aromeyer - [wavefront](./plugins/outputs/wavefront/README.md) - Thanks to @puckpuck ### Release Notes - In the `kinesis` output, use of the `partition_key` and `use_random_partitionkey` options has been deprecated in favor of the `partition` subtable. This allows for more flexible methods to set the partition key such as by metric name or by tag. - With the release of the new improved `jolokia2` input, the legacy `jolokia` plugin is deprecated and will be removed in a future release. Users of this plugin are encouraged to update to the new `jolokia2` plugin. - In the `postgresql` and `postgresql_extensible` plugins, the type of the oid data type has changed from string to integer. It is recommended to drop affected fields until a new shard is started. For details on how to workaround this issue please see [#3622](https://github.com/influxdata/telegraf/issues/3622). ### Features - [#3170](https://github.com/influxdata/telegraf/pull/3170): Add support for sharding based on metric name. - [#3196](https://github.com/influxdata/telegraf/pull/3196): Add Kafka output plugin topic_suffix option. - [#3027](https://github.com/influxdata/telegraf/pull/3027): Include mount mode option in disk metrics. - [#3191](https://github.com/influxdata/telegraf/pull/3191): TLS and MTLS enhancements to HTTPListener input plugin. - [#3213](https://github.com/influxdata/telegraf/pull/3213): Add polling method to logparser and tail inputs. - [#3211](https://github.com/influxdata/telegraf/pull/3211): Add timeout option for kubernetes input. - [#3234](https://github.com/influxdata/telegraf/pull/3234): Add support for timing sums in statsd input. - [#2617](https://github.com/influxdata/telegraf/issues/2617): Add resource limit monitoring to procstat. - [#3236](https://github.com/influxdata/telegraf/pull/3236): Add support for k8s service DNS discovery to prometheus input. - [#3245](https://github.com/influxdata/telegraf/pull/3245): Add configurable metrics endpoint to prometheus output. - [#3214](https://github.com/influxdata/telegraf/pull/3214): Add new nginx_plus input plugin. - [#3215](https://github.com/influxdata/telegraf/pull/3215): Add support for NSQLookupd to nsq_consumer. - [#2278](https://github.com/influxdata/telegraf/pull/2278): Add redesigned Jolokia input plugin. - [#3106](https://github.com/influxdata/telegraf/pull/3106): Add configurable separator for metrics and fields in opentsdb output. - [#1692](https://github.com/influxdata/telegraf/pull/1692): Add support for the rollbar occurrence webhook event. - [#3160](https://github.com/influxdata/telegraf/pull/3160): Add Wavefront output plugin. - [#3281](https://github.com/influxdata/telegraf/pull/3281): Add extra wired tiger cache metrics to mongodb input. - [#3141](https://github.com/influxdata/telegraf/pull/3141): Collect Docker Swarm service metrics in docker input plugin. - [#2449](https://github.com/influxdata/telegraf/pull/2449): Add smart input plugin for collecting S.M.A.R.T. data. - [#3269](https://github.com/influxdata/telegraf/pull/3269): Add cluster health level configuration to elasticsearch input. - [#3304](https://github.com/influxdata/telegraf/pull/3304): Add ability to limit node stats in elasticsearch input. - [#2167](https://github.com/influxdata/telegraf/pull/2167): Add new basicstats aggregator. - [#3344](https://github.com/influxdata/telegraf/pull/3344): Add UDP IPv6 support to statsd input. - [#3350](https://github.com/influxdata/telegraf/pull/3350): Use labels in prometheus output for string fields. - [#3358](https://github.com/influxdata/telegraf/pull/3358): Add support for decimal timestamps to ts-epoch modifier. - [#3337](https://github.com/influxdata/telegraf/pull/3337): Add histogram and summary types and use in prometheus plugins. - [#3365](https://github.com/influxdata/telegraf/pull/3365): Gather concurrently from snmp agents. - [#3333](https://github.com/influxdata/telegraf/issues/3333): Perform DNS lookup before ping and report result. - [#3398](https://github.com/influxdata/telegraf/issues/3398): Add instance name option to varnish plugin. - [#3406](https://github.com/influxdata/telegraf/pull/3406): Add support for SSL settings to ElasticSearch output plugin. - [#3315](https://github.com/influxdata/telegraf/pull/3315): Add Teamspeak 3 input plugin. - [#3305](https://github.com/influxdata/telegraf/pull/3305): Add modification_time field to filestat input plugin. - [#2019](https://github.com/influxdata/telegraf/pull/2019): Add Solr input plugin. - [#3210](https://github.com/influxdata/telegraf/pull/3210): Add CrateDB output plugin. - [#3459](https://github.com/influxdata/telegraf/pull/3459): Add systemd unit pid and cgroup matching to procstat. - [#3477](https://github.com/influxdata/telegraf/pull/3477): Add Particle Webhook Plugin. - [#3471](https://github.com/influxdata/telegraf/pull/3471): Use MAX() instead of SUM() for latency measurements in sqlserver. - [#3490](https://github.com/influxdata/telegraf/pull/3490): Add index by week number to Elasticsearch output. - [#3434](https://github.com/influxdata/telegraf/pull/3434): Add unbound input plugin. - [#3449](https://github.com/influxdata/telegraf/pull/3449): Add opensmtpd input plugin. - [#3470](https://github.com/influxdata/telegraf/pull/3470): Add support for tags in the index name in elasticsearch output. - [#2553](https://github.com/influxdata/telegraf/pull/2553): Add postfix input plugin. - [#3424](https://github.com/influxdata/telegraf/pull/3424): Add bond input plugin. - [#3518](https://github.com/influxdata/telegraf/pull/3518): Add slab to mem plugin. - [#3519](https://github.com/influxdata/telegraf/pull/3519): Add input plugin for DC/OS. - [#3140](https://github.com/influxdata/telegraf/pull/3140): Add support for glob patterns in net input plugin. - [#3405](https://github.com/influxdata/telegraf/pull/3405): Add input plugin for OpenBSD/FreeBSD pf. - [#3528](https://github.com/influxdata/telegraf/pull/3528): Add option to amqp output to publish persistent messages. - [#3530](https://github.com/influxdata/telegraf/pull/3530): Support I (idle) process state on procfs+Linux. ### Bug Fixes - [#3136](https://github.com/influxdata/telegraf/issues/3136): Fix webhooks input address in use during reload. - [#3258](https://github.com/influxdata/telegraf/issues/3258): Unlock Statsd when stopping to prevent deadlock. - [#3319](https://github.com/influxdata/telegraf/issues/3319): Fix cloudwatch output requires unneeded permissions. - [#3351](https://github.com/influxdata/telegraf/issues/3351): Fix prometheus passthrough for existing value types. - [#3430](https://github.com/influxdata/telegraf/issues/3430): Always ignore autofs filesystems in disk input. - [#3326](https://github.com/influxdata/telegraf/issues/3326): Fail metrics parsing on unescaped quotes. - [#3473](https://github.com/influxdata/telegraf/pull/3473): Whitelist allowed char classes for graphite output. - [#3488](https://github.com/influxdata/telegraf/pull/3488): Use hexadecimal ids and lowercase names in zipkin input. - [#3263](https://github.com/influxdata/telegraf/issues/3263): Fix snmp-tools output parsing with Windows EOLs. - [#3447](https://github.com/influxdata/telegraf/issues/3447): Add shadow-utils dependency to rpm package. - [#3448](https://github.com/influxdata/telegraf/issues/3448): Use deb-systemd-invoke to restart service. - [#3553](https://github.com/influxdata/telegraf/issues/3553): Fix kafka_consumer outside range of offsets error. - [#3568](https://github.com/influxdata/telegraf/issues/3568): Fix separation of multiple prometheus_client outputs. - [#3577](https://github.com/influxdata/telegraf/issues/3577): Don't add system input uptime_format as a counter. ## v1.4.5 [2017-12-01] ### Bug Fixes - [#3500](https://github.com/influxdata/telegraf/issues/3500): Fix global variable collection when using interval_slow option in mysql input. - [#3486](https://github.com/influxdata/telegraf/issues/3486): Fix error getting net connections info in netstat input. - [#3529](https://github.com/influxdata/telegraf/issues/3529): Fix HOST_MOUNT_PREFIX in docker with disk input. ## v1.4.4 [2017-11-08] ### Bug Fixes - [#3401](https://github.com/influxdata/telegraf/pull/3401): Use schema specified in mqtt_consumer input. - [#3419](https://github.com/influxdata/telegraf/issues/3419): Redact datadog API key in log output. - [#3311](https://github.com/influxdata/telegraf/issues/3311): Fix error getting pids in netstat input. - [#3339](https://github.com/influxdata/telegraf/issues/3339): Support HOST_VAR envvar to locate /var in system input. - [#3383](https://github.com/influxdata/telegraf/issues/3383): Use current time if docker container read time is zero value. ## v1.4.3 [2017-10-25] ### Bug Fixes - [#3327](https://github.com/influxdata/telegraf/issues/3327): Fix container name filters in docker input. - [#3321](https://github.com/influxdata/telegraf/issues/3321): Fix snmpwalk address format in leofs input. - [#3329](https://github.com/influxdata/telegraf/issues/3329): Fix case sensitivity issue in sqlserver query. - [#3342](https://github.com/influxdata/telegraf/pull/3342): Fix CPU input plugin stuck after suspend on Linux. - [#3013](https://github.com/influxdata/telegraf/issues/3013): Fix mongodb input panic when restarting mongodb. - [#3224](https://github.com/influxdata/telegraf/pull/3224): Preserve url path prefix in influx output. - [#3354](https://github.com/influxdata/telegraf/pull/3354): Fix TELEGRAF_OPTS expansion in systemd service unit. - [#3357](https://github.com/influxdata/telegraf/issues/3357): Remove warning when JSON contains null value. - [#3375](https://github.com/influxdata/telegraf/issues/3375): Fix ACL token usage in consul input plugin. - [#3369](https://github.com/influxdata/telegraf/issues/3369): Fix unquoting error with Tomcat 6. - [#3373](https://github.com/influxdata/telegraf/issues/3373): Fix syscall panic in diskio on some Linux systems. ## v1.4.2 [2017-10-10] ### Bug Fixes - [#3259](https://github.com/influxdata/telegraf/issues/3259): Fix error if int larger than 32-bit in /proc/vmstat. - [#3265](https://github.com/influxdata/telegraf/issues/3265): Fix parsing of JSON with a UTF8 BOM in httpjson. - [#2887](https://github.com/influxdata/telegraf/issues/2887): Allow JSON data format to contain zero metrics. - [#3284](https://github.com/influxdata/telegraf/issues/3284): Fix format of connection_timeout in mqtt_consumer. - [#3081](https://github.com/influxdata/telegraf/issues/3081): Fix case sensitivity error in sqlserver input. - [#3297](https://github.com/influxdata/telegraf/issues/3297): Add support for proxy environment variables to http_response. - [#1588](https://github.com/influxdata/telegraf/issues/1588): Add support for standard proxy env vars in outputs. - [#3282](https://github.com/influxdata/telegraf/issues/3282): Fix panic in cpu input if number of cpus changes. - [#2854](https://github.com/influxdata/telegraf/issues/2854): Use chunked transfer encoding in InfluxDB output. ## v1.4.1 [2017-09-26] ### Bug Fixes - [#3167](https://github.com/influxdata/telegraf/issues/3167): Fix MQTT input exits if Broker is not available on startup. - [#3217](https://github.com/influxdata/telegraf/issues/3217): Fix optional field value conversions in fluentd input. - [#3227](https://github.com/influxdata/telegraf/issues/3227): Whitelist allowed char classes for opentsdb output. - [#3232](https://github.com/influxdata/telegraf/issues/3232): Fix counter and gauge metric types. - [#3235](https://github.com/influxdata/telegraf/issues/3235): Fix skipped line with empty target in iptables. - [#3175](https://github.com/influxdata/telegraf/issues/3175): Fix duplicate keys in perf counters sqlserver query. - [#3230](https://github.com/influxdata/telegraf/issues/3230): Fix panic in statsd p100 calculation. - [#3242](https://github.com/influxdata/telegraf/issues/3242): Fix arm64 packages contain 32-bit executable. ## v1.4 [2017-09-05] ### Release Notes - The `kafka_consumer` input has been updated to support Kafka 0.9 and above style consumer offset handling. The previous version of this plugin supporting Kafka 0.8 and below is available as the `kafka_consumer_legacy` plugin. - In the `aerospike` input the `node_name` field has been changed to be a tag for both the `aerospike_node` and `aerospike_namespace` measurements. - The default prometheus_client port has been changed to 9273. ### New Plugins - [fail2ban](./plugins/inputs/fail2ban/README.md) - Thanks to @grugrut - [fluentd](./plugins/inputs/fluentd/README.md) - Thanks to @DanKans - [histogram](./plugins/aggregators/histogram/README.md) - Thanks to @vlamug - [minecraft](./plugins/inputs/minecraft/README.md) - Thanks to @adamperlin & @Ayrdrie - [openldap](./plugins/inputs/openldap/README.md) - Thanks to @cobaugh - [salesforce](./plugins/inputs/salesforce/README.md) - Thanks to @rody - [tomcat](./plugins/inputs/tomcat/README.md) - Thanks to @mlindes - [win_services](./plugins/inputs/win_services/README.md) - Thanks to @vlastahajek - [zipkin](./plugins/inputs/zipkin/README.md) - Thanks to @adamperlin & @Ayrdrie ### Features - [#2487](https://github.com/influxdata/telegraf/pull/2487): Add Kafka 0.9+ consumer support - [#2773](https://github.com/influxdata/telegraf/pull/2773): Add support for self-signed certs to InfluxDB input plugin - [#2293](https://github.com/influxdata/telegraf/pull/2293): Add TCP listener for statsd input - [#2581](https://github.com/influxdata/telegraf/pull/2581): Add Docker container environment variables as tags. Only whitelisted - [#2817](https://github.com/influxdata/telegraf/pull/2817): Add timeout option to IPMI sensor plugin - [#2883](https://github.com/influxdata/telegraf/pull/2883): Add support for an optional SSL/TLS configuration to nginx input plugin - [#2882](https://github.com/influxdata/telegraf/pull/2882): Add timezone support for logparser timestamps. - [#2814](https://github.com/influxdata/telegraf/pull/2814): Add result_type field for http_response input. - [#2734](https://github.com/influxdata/telegraf/pull/2734): Add include/exclude filters for docker containers. - [#2602](https://github.com/influxdata/telegraf/pull/2602): Add secure connection support to graphite output. - [#2908](https://github.com/influxdata/telegraf/pull/2908): Add min/max response time on linux/darwin to ping. - [#2929](https://github.com/influxdata/telegraf/pull/2929): Add HTTP Proxy support to influxdb output. - [#2933](https://github.com/influxdata/telegraf/pull/2933): Add standard SSL options to mysql input. - [#2875](https://github.com/influxdata/telegraf/pull/2875): Add input plugin for fail2ban. - [#2924](https://github.com/influxdata/telegraf/pull/2924): Support HOST_PROC in processes and linux_sysctl_fs inputs. - [#2960](https://github.com/influxdata/telegraf/pull/2960): Add Minecraft input plugin. - [#2963](https://github.com/influxdata/telegraf/pull/2963): Add support for RethinkDB 1.0 handshake protocol. - [#2943](https://github.com/influxdata/telegraf/pull/2943): Add optional usage_active and time_active CPU metrics. - [#2973](https://github.com/influxdata/telegraf/pull/2973): Change default prometheus_client port. - [#2661](https://github.com/influxdata/telegraf/pull/2661): Add fluentd input plugin. - [#2990](https://github.com/influxdata/telegraf/pull/2990): Add result_type field to net_response input plugin. - [#2571](https://github.com/influxdata/telegraf/pull/2571): Add read timeout to socket_listener - [#2612](https://github.com/influxdata/telegraf/pull/2612): Add input plugin for OpenLDAP. - [#3042](https://github.com/influxdata/telegraf/pull/3042): Add network option to dns_query. - [#3054](https://github.com/influxdata/telegraf/pull/3054): Add redis_version field to redis input. - [#3063](https://github.com/influxdata/telegraf/pull/3063): Add tls options to docker input. - [#2387](https://github.com/influxdata/telegraf/pull/2387): Add histogram aggregator plugin. - [#3080](https://github.com/influxdata/telegraf/pull/3080): Add zipkin input plugin. - [#3023](https://github.com/influxdata/telegraf/pull/3023): Add Windows Services input plugin. - [#3098](https://github.com/influxdata/telegraf/pull/3098): Add path tag to logparser containing path of logfile. - [#3075](https://github.com/influxdata/telegraf/pull/3075): Add salesforce input plugin. - [#3097](https://github.com/influxdata/telegraf/pull/3097): Add option to run varnish under sudo. - [#3119](https://github.com/influxdata/telegraf/pull/3119): Add weighted_io_time to diskio input. - [#2978](https://github.com/influxdata/telegraf/pull/2978): Add gzip content-encoding support to influxdb output. - [#3127](https://github.com/influxdata/telegraf/pull/3127): Allow using system plugin in Windows. - [#3112](https://github.com/influxdata/telegraf/pull/3112): Add tomcat input plugin. - [#3182](https://github.com/influxdata/telegraf/pull/3182): HTTP headers can be added to InfluxDB output. ### Bug Fixes - [#2607](https://github.com/influxdata/telegraf/issues/2607): Improve logging of errors in Cassandra input. - [#2819](https://github.com/influxdata/telegraf/pull/2819): [enh] set db_version at 0 if query version fails - [#2749](https://github.com/influxdata/telegraf/pull/2749): Fixed sqlserver input to work with case sensitive server collation. - [#2716](https://github.com/influxdata/telegraf/pull/2716): Systemd does not see all shutdowns as failures - [#2782](https://github.com/influxdata/telegraf/pull/2782): Reuse transports in input plugins - [#2815](https://github.com/influxdata/telegraf/issues/2815): Inputs processes fails with "no such process". - [#1137](https://github.com/influxdata/telegraf/issues/1137): Fix multiple plugin loading in win_perf_counters. - [#2855](https://github.com/influxdata/telegraf/pull/2855): MySQL input: log and continue on field parse error. - [#2885](https://github.com/influxdata/telegraf/pull/2885): Fix timeout option in Windows ping input sample configuration. - [#2911](https://github.com/influxdata/telegraf/issues/2911): Fix Kinesis output plugin in govcloud. - [#2917](https://github.com/influxdata/telegraf/issues/2917): Fix Aerospike input adds all nodes to a single series. - [#2452](https://github.com/influxdata/telegraf/pull/2452): Improve Prometheus Client output documentation. - [#2984](https://github.com/influxdata/telegraf/pull/2984): Display error message if prometheus output fails to listen. - [#2997](https://github.com/influxdata/telegraf/issues/2997): Fix elasticsearch output content type detection warning. - [#2914](https://github.com/influxdata/telegraf/issues/2914): Prevent possible deadlock when using aggregators. - [#2860](https://github.com/influxdata/telegraf/issues/2860): Fix combined tagdrop/tagpass filtering. - [#3036](https://github.com/influxdata/telegraf/pull/3036): Fix filtering when both pass and drop match an item. - [#2964](https://github.com/influxdata/telegraf/issues/2964): Only report cpu usage for online cpus in docker input. - [#3050](https://github.com/influxdata/telegraf/pull/3050): Start first aggregator period at startup time. - [#2906](https://github.com/influxdata/telegraf/issues/2906): Fix panic in logparser if file cannot be opened. - [#2886](https://github.com/influxdata/telegraf/issues/2886): Default to localhost if zookeeper has no servers set. - [#2457](https://github.com/influxdata/telegraf/issues/2457): Fix docker memory and cpu reporting in Windows. - [#3058](https://github.com/influxdata/telegraf/issues/3058): Allow iptable entries with trailing text. - [#1680](https://github.com/influxdata/telegraf/issues/1680): Sanitize password from couchbase metric. - [#3104](https://github.com/influxdata/telegraf/issues/3104): Converge to typed value in prometheus output. - [#2899](https://github.com/influxdata/telegraf/issues/2899): Skip compilation of logparser and tail on solaris. - [#2951](https://github.com/influxdata/telegraf/issues/2951): Discard logging from tail library. - [#3126](https://github.com/influxdata/telegraf/pull/3126): Remove log message on ping timeout. - [#3144](https://github.com/influxdata/telegraf/issues/3144): Don't retry points beyond retention policy. - [#3015](https://github.com/influxdata/telegraf/issues/3015): Don't start Telegraf on install in Amazon Linux. - [#3153](https://github.com/influxdata/telegraf/issues/3053): Enable hddtemp input on all platforms. - [#3142](https://github.com/influxdata/telegraf/issues/3142): Escape backslash within string fields. - [#3162](https://github.com/influxdata/telegraf/issues/3162): Fix parsing of SHM remotes in ntpq input - [#3149](https://github.com/influxdata/telegraf/issues/3149): Don't fail parsing zpool stats if pool health is UNAVAIL on FreeBSD. - [#2672](https://github.com/influxdata/telegraf/issues/2672): Fix NSQ input plugin when used with version 1.0.0-compat. - [#2523](https://github.com/influxdata/telegraf/issues/2523): Added CloudWatch metric constraint validation. - [#3179](https://github.com/influxdata/telegraf/issues/3179): Skip non-numerical values in graphite format. - [#3187](https://github.com/influxdata/telegraf/issues/3187): Fix panic when handling string fields with escapes. ## v1.3.5 [2017-07-26] ### Bug Fixes - [#3049](https://github.com/influxdata/telegraf/issues/3049): Fix prometheus output cannot be reloaded. - [#3037](https://github.com/influxdata/telegraf/issues/3037): Fix filestat reporting exists when cannot list directory. - [#2386](https://github.com/influxdata/telegraf/issues/2386): Fix ntpq parse issue when using dns_lookup. - [#2554](https://github.com/influxdata/telegraf/issues/2554): Fix panic when agent.interval = "0s". ## v1.3.4 [2017-07-12] ### Bug Fixes - [#3001](https://github.com/influxdata/telegraf/issues/3001): Fix handling of escape characters within fields. - [#2988](https://github.com/influxdata/telegraf/issues/2988): Fix chrony plugin does not track system time offset. - [#3004](https://github.com/influxdata/telegraf/issues/3004): Do not allow metrics with trailing slashes. - [#3011](https://github.com/influxdata/telegraf/issues/3011): Prevent Write from being called concurrently. ## v1.3.3 [2017-06-28] ### Bug Fixes - [#2915](https://github.com/influxdata/telegraf/issues/2915): Allow dos line endings in tail and logparser. - [#2937](https://github.com/influxdata/telegraf/issues/2937): Remove label value sanitization in prometheus output. - [#2948](https://github.com/influxdata/telegraf/issues/2948): Fix bug parsing default timestamps with modified precision. - [#2954](https://github.com/influxdata/telegraf/issues/2954): Fix panic in elasticsearch input if cannot determine master. ## v1.3.2 [2017-06-14] ### Bug Fixes - [#2862](https://github.com/influxdata/telegraf/issues/2862): Fix InfluxDB UDP metric splitting. - [#2888](https://github.com/influxdata/telegraf/issues/2888): Fix mongodb/leofs urls without scheme. - [#2822](https://github.com/influxdata/telegraf/issues/2822): Fix inconsistent label dimensions in prometheus output. ## v1.3.1 [2017-05-31] ### Bug Fixes - [#2749](https://github.com/influxdata/telegraf/pull/2749): Fixed sqlserver input to work with case sensitive server collation. - [#2782](https://github.com/influxdata/telegraf/pull/2782): Reuse transports in input plugins - [#2815](https://github.com/influxdata/telegraf/issues/2815): Inputs processes fails with "no such process". - [#2851](https://github.com/influxdata/telegraf/pull/2851): Fix InfluxDB output database quoting. - [#2856](https://github.com/influxdata/telegraf/issues/2856): Fix net input on older Linux kernels. - [#2848](https://github.com/influxdata/telegraf/pull/2848): Fix panic in mongo input. - [#2869](https://github.com/influxdata/telegraf/pull/2869): Fix length calculation of split metric buffer. ## v1.3 [2017-05-15] ### Release Notes - Users of the windows `ping` plugin will need to drop or migrate their measurements in order to continue using the plugin. The reason for this is that the windows plugin was outputting a different type than the linux plugin. This made it impossible to use the `ping` plugin for both windows and linux machines. - Ceph: the `ceph_pgmap_state` metric content has been modified to use a unique field `count`, with each state expressed as a `state` tag. Telegraf < 1.3: ```text # field_name value active+clean 123 active+clean+scrubbing 3 ``` Telegraf >= 1.3: ```text # field_name value tag count 123 state=active+clean count 3 state=active+clean+scrubbing ``` - The [Riemann output plugin](./plugins/outputs/riemann) has been rewritten and the previous riemann plugin is _incompatible_ with the new one. The reasons for this are outlined in issue [#1878](https://github.com/influxdata/telegraf/issues/1878). The previous riemann output will still be available using `outputs.riemann_legacy` if needed, but that will eventually be deprecated. It is highly recommended that all users migrate to the new riemann output plugin. - Generic [socket_listener](./plugins/inputs/socket_listener) and [socket_writer](./plugins/outputs/socket_writer) plugins have been implemented for receiving and sending UDP, TCP, unix, & unix-datagram data. These plugins will replace udp_listener and tcp_listener, which are still available but will be deprecated eventually. ### Features - [#2721](https://github.com/influxdata/telegraf/pull/2721): Added SASL options for kafka output plugin. - [#2723](https://github.com/influxdata/telegraf/pull/2723): Added SSL configuration for input haproxy. - [#2494](https://github.com/influxdata/telegraf/pull/2494): Add interrupts input plugin. - [#2094](https://github.com/influxdata/telegraf/pull/2094): Add generic socket listener & writer. - [#2204](https://github.com/influxdata/telegraf/pull/2204): Extend http_response to support searching for a substring in response. Return 1 if found, else 0. - [#2137](https://github.com/influxdata/telegraf/pull/2137): Added userstats to mysql input plugin. - [#2179](https://github.com/influxdata/telegraf/pull/2179): Added more InnoDB metric to MySQL plugin. - [#2229](https://github.com/influxdata/telegraf/pull/2229): `ceph_pgmap_state` metric now uses a single field `count`, with PG state published as `state` tag. - [#2251](https://github.com/influxdata/telegraf/pull/2251): InfluxDB output: use own client for improved through-put and less allocations. - [#2330](https://github.com/influxdata/telegraf/pull/2330): Keep -config-directory when running as Windows service. - [#1900](https://github.com/influxdata/telegraf/pull/1900): Riemann plugin rewrite. - [#1453](https://github.com/influxdata/telegraf/pull/1453): diskio: add support for name templates and udev tags. - [#2277](https://github.com/influxdata/telegraf/pull/2277): add integer metrics for Consul check health state. - [#2201](https://github.com/influxdata/telegraf/pull/2201): Add lock option to the IPtables input plugin. - [#2244](https://github.com/influxdata/telegraf/pull/2244): Support ipmi_sensor plugin querying local ipmi sensors. - [#2339](https://github.com/influxdata/telegraf/pull/2339): Increment gather_errors for all errors emitted by inputs. - [#2071](https://github.com/influxdata/telegraf/issues/2071): Use official docker SDK. - [#1678](https://github.com/influxdata/telegraf/pull/1678): Add AMQP consumer input plugin - [#2512](https://github.com/influxdata/telegraf/pull/2512): Added pprof tool. - [#2501](https://github.com/influxdata/telegraf/pull/2501): Support DEAD(X) state in system input plugin. - [#2522](https://github.com/influxdata/telegraf/pull/2522): Add support for mongodb client certificates. - [#1948](https://github.com/influxdata/telegraf/pull/1948): Support adding SNMP table indexes as tags. - [#2332](https://github.com/influxdata/telegraf/pull/2332): Add Elasticsearch 5.x output - [#2587](https://github.com/influxdata/telegraf/pull/2587): Add json timestamp units configurability - [#2597](https://github.com/influxdata/telegraf/issues/2597): Add support for Linux sysctl-fs metrics. - [#2425](https://github.com/influxdata/telegraf/pull/2425): Support to include/exclude docker container labels as tags - [#1667](https://github.com/influxdata/telegraf/pull/1667): dmcache input plugin - [#2637](https://github.com/influxdata/telegraf/issues/2637): Add support for precision in http_listener - [#2636](https://github.com/influxdata/telegraf/pull/2636): Add `message_len_max` option to `kafka_consumer` input - [#1100](https://github.com/influxdata/telegraf/issues/1100): Add collectd parser - [#1820](https://github.com/influxdata/telegraf/issues/1820): easier plugin testing without outputs - [#2493](https://github.com/influxdata/telegraf/pull/2493): Check signature in the GitHub webhook plugin - [#2038](https://github.com/influxdata/telegraf/issues/2038): Add papertrail support to webhooks - [#2253](https://github.com/influxdata/telegraf/pull/2253): Change jolokia plugin to use bulk requests. - [#2575](https://github.com/influxdata/telegraf/issues/2575) Add diskio input for Darwin - [#2705](https://github.com/influxdata/telegraf/pull/2705): Kinesis output: add use_random_partitionkey option - [#2635](https://github.com/influxdata/telegraf/issues/2635): add tcp keep-alive to socket_listener & socket_writer - [#2031](https://github.com/influxdata/telegraf/pull/2031): Add Kapacitor input plugin - [#2732](https://github.com/influxdata/telegraf/pull/2732): Use go 1.8.1 - [#2712](https://github.com/influxdata/telegraf/issues/2712): Documentation for rabbitmq input plugin - [#2141](https://github.com/influxdata/telegraf/pull/2141): Logparser handles newly-created files. ### Bug Fixes - [#2633](https://github.com/influxdata/telegraf/pull/2633): ipmi_sensor: allow @ symbol in password - [#2077](https://github.com/influxdata/telegraf/issues/2077): SQL Server Input - Arithmetic overflow error converting numeric to data type int. - [#2262](https://github.com/influxdata/telegraf/issues/2262): Flush jitter can inhibit metric collection. - [#2318](https://github.com/influxdata/telegraf/issues/2318): haproxy input - Add missing fields. - [#2287](https://github.com/influxdata/telegraf/issues/2287): Kubernetes input: Handle null startTime for stopped pods. - [#2356](https://github.com/influxdata/telegraf/issues/2356): cpu input panic when /proc/stat is empty. - [#2341](https://github.com/influxdata/telegraf/issues/2341): telegraf swallowing panics in --test mode. - [#2358](https://github.com/influxdata/telegraf/pull/2358): Create pidfile with 644 permissions & defer file deletion. - [#2360](https://github.com/influxdata/telegraf/pull/2360): Fixed install/remove of telegraf on non-systemd Debian/Ubuntu systems - [#2282](https://github.com/influxdata/telegraf/issues/2282): Reloading telegraf freezes prometheus output. - [#2390](https://github.com/influxdata/telegraf/issues/2390): Empty tag value causes error on InfluxDB output. - [#2380](https://github.com/influxdata/telegraf/issues/2380): buffer_size field value is negative number from "internal" plugin. - [#2414](https://github.com/influxdata/telegraf/issues/2414): Missing error handling in the MySQL plugin leads to segmentation violation. - [#2462](https://github.com/influxdata/telegraf/pull/2462): Fix type conflict in windows ping plugin. - [#2178](https://github.com/influxdata/telegraf/issues/2178): logparser: regexp with lookahead. - [#2466](https://github.com/influxdata/telegraf/issues/2466): Telegraf can crash in LoadDirectory on 0600 files. - [#2215](https://github.com/influxdata/telegraf/issues/2215): Iptables input: document better that rules without a comment are ignored. - [#2483](https://github.com/influxdata/telegraf/pull/2483): Fix win_perf_counters capping values at 100. - [#2498](https://github.com/influxdata/telegraf/pull/2498): Exporting Ipmi.Path to be set by config. - [#2500](https://github.com/influxdata/telegraf/pull/2500): Remove warning if parse empty content - [#2520](https://github.com/influxdata/telegraf/pull/2520): Update default value for Cloudwatch rate limit - [#2513](https://github.com/influxdata/telegraf/issues/2513): create /etc/telegraf/telegraf.d directory in tarball. - [#2541](https://github.com/influxdata/telegraf/issues/2541): Return error on unsupported serializer data format. - [#1827](https://github.com/influxdata/telegraf/issues/1827): Fix Windows Performance Counters multi instance identifier - [#2576](https://github.com/influxdata/telegraf/pull/2576): Add write timeout to Riemann output - [#2596](https://github.com/influxdata/telegraf/pull/2596): fix timestamp parsing on prometheus plugin - [#2610](https://github.com/influxdata/telegraf/pull/2610): Fix deadlock when output cannot write - [#2410](https://github.com/influxdata/telegraf/issues/2410): Fix connection leak in postgresql. - [#2628](https://github.com/influxdata/telegraf/issues/2628): Set default measurement name for snmp input. - [#2649](https://github.com/influxdata/telegraf/pull/2649): Improve performance of diskio with many disks - [#2671](https://github.com/influxdata/telegraf/issues/2671): The internal input plugin uses the wrong units for `heap_objects` - [#2684](https://github.com/influxdata/telegraf/pull/2684): Fix ipmi_sensor config is shared between all plugin instances - [#2450](https://github.com/influxdata/telegraf/issues/2450): Network statistics not collected when system has alias interfaces - [#1911](https://github.com/influxdata/telegraf/issues/1911): Sysstat plugin needs LANG=C or similar locale - [#2528](https://github.com/influxdata/telegraf/issues/2528): File output closes standard streams on reload. - [#2603](https://github.com/influxdata/telegraf/issues/2603): AMQP output disconnect blocks all outputs - [#2706](https://github.com/influxdata/telegraf/issues/2706): Improve documentation for redis input plugin ## v1.2.1 [2017-02-01] ### Bug Fixes - [#2317](https://github.com/influxdata/telegraf/issues/2317): Fix segfault on nil metrics with influxdb output. - [#2324](https://github.com/influxdata/telegraf/issues/2324): Fix negative number handling. ### Features - [#2348](https://github.com/influxdata/telegraf/pull/2348): Go version 1.7.4 -> 1.7.5 ## v1.2 [2017-01-00] ### Release Notes - The StatsD plugin will now default all "delete_" config options to "true". This will change te default behavior for users who were not specifying these parameters in their config file. - The StatsD plugin will also no longer save it's state on a service reload. Essentially we have reverted PR [#887](https://github.com/influxdata/telegraf/pull/887). The reason for this is that saving the state in a global variable is not thread-safe (see [#1975](https://github.com/influxdata/telegraf/issues/1975) & [#2102](https://github.com/influxdata/telegraf/issues/2102)), and this creates issues if users want to define multiple instances of the statsd plugin. Saving state on reload may be considered in the future, but this would need to be implemented at a higher level and applied to all plugins, not just statsd. ### Features - [#2123](https://github.com/influxdata/telegraf/pull/2123): Fix improper calculation of CPU percentages - [#1564](https://github.com/influxdata/telegraf/issues/1564): Use RFC3339 timestamps in log output. - [#1997](https://github.com/influxdata/telegraf/issues/1997): Non-default HTTP timeouts for RabbitMQ plugin. - [#2074](https://github.com/influxdata/telegraf/pull/2074): "discard" output plugin added, primarily for testing purposes. - [#1965](https://github.com/influxdata/telegraf/pull/1965): The JSON parser can now parse an array of objects using the same configuration. - [#1807](https://github.com/influxdata/telegraf/pull/1807): Option to use device name rather than path for reporting disk stats. - [#1348](https://github.com/influxdata/telegraf/issues/1348): Telegraf "internal" plugin for collecting stats on itself. - [#2127](https://github.com/influxdata/telegraf/pull/2127): Update Go version to 1.7.4. - [#2126](https://github.com/influxdata/telegraf/pull/2126): Support a metric.Split function. - [#2026](https://github.com/influxdata/telegraf/pull/2065): elasticsearch "shield" (basic auth) support doc. - [#1885](https://github.com/influxdata/telegraf/pull/1885): Fix over-querying of cloudwatch metrics - [#1913](https://github.com/influxdata/telegraf/pull/1913): OpenTSDB basic auth support. - [#1908](https://github.com/influxdata/telegraf/pull/1908): RabbitMQ Connection metrics. - [#1937](https://github.com/influxdata/telegraf/pull/1937): HAProxy session limit metric. - [#2068](https://github.com/influxdata/telegraf/issues/2068): Accept strings for StatsD sets. - [#1893](https://github.com/influxdata/telegraf/issues/1893): Change StatsD default "reset" behavior. - [#2079](https://github.com/influxdata/telegraf/pull/2079): Enable setting ClientID in MQTT output. - [#2001](https://github.com/influxdata/telegraf/pull/2001): MongoDB input plugin: Improve state data. - [#2078](https://github.com/influxdata/telegraf/pull/2078): Ping input: add standard deviation field. - [#2121](https://github.com/influxdata/telegraf/pull/2121): Add GC pause metric to InfluxDB input plugin. - [#2006](https://github.com/influxdata/telegraf/pull/2006): Added response_timeout property to prometheus input plugin. - [#1763](https://github.com/influxdata/telegraf/issues/1763): Pulling github.com/lxn/win's pdh wrapper into telegraf. - [#1898](https://github.com/influxdata/telegraf/issues/1898): Support negative statsd counters. - [#1921](https://github.com/influxdata/telegraf/issues/1921): Elasticsearch cluster stats support. - [#1942](https://github.com/influxdata/telegraf/pull/1942): Change Amazon Kinesis output plugin to use the built-in serializer plugins. - [#1980](https://github.com/influxdata/telegraf/issues/1980): Hide username/password from elasticsearch error log messages. - [#2097](https://github.com/influxdata/telegraf/issues/2097): Configurable HTTP timeouts in Jolokia plugin - [#2255](https://github.com/influxdata/telegraf/pull/2255): Allow changing jolokia attribute delimiter ### Bug Fixes - [#2049](https://github.com/influxdata/telegraf/pull/2049): Fix the Value data format not trimming null characters from input. - [#1949](https://github.com/influxdata/telegraf/issues/1949): Fix windows `net` plugin. - [#1775](https://github.com/influxdata/telegraf/issues/1775): Cache & expire metrics for delivery to prometheus - [#1775](https://github.com/influxdata/telegraf/issues/1775): Cache & expire metrics for delivery to prometheus. - [#2146](https://github.com/influxdata/telegraf/issues/2146): Fix potential panic in aggregator plugin metric maker. - [#1843](https://github.com/influxdata/telegraf/pull/1843) & [#1668](https://github.com/influxdata/telegraf/issues/1668): Add optional ability to define PID as a tag. - [#1730](https://github.com/influxdata/telegraf/issues/1730) & [#2261](https://github.com/influxdata/telegraf/pull/2261): Fix win_perf_counters not gathering non-English counters. - [#2061](https://github.com/influxdata/telegraf/issues/2061): Fix panic when file stat info cannot be collected due to permissions or other issue(s). - [#2045](https://github.com/influxdata/telegraf/issues/2045): Graylog output should set short_message field. - [#1904](https://github.com/influxdata/telegraf/issues/1904): Hddtemp always put the value in the field temperature. - [#1693](https://github.com/influxdata/telegraf/issues/1693): Properly collect nested jolokia struct data. - [#1917](https://github.com/influxdata/telegraf/pull/1917): fix puppetagent inputs plugin to support string for config variable. - [#1987](https://github.com/influxdata/telegraf/issues/1987): fix docker input plugin tags when registry has port. - [#2089](https://github.com/influxdata/telegraf/issues/2089): Fix tail input when reading from a pipe. - [#1449](https://github.com/influxdata/telegraf/issues/1449): MongoDB plugin always shows 0 replication lag. - [#1825](https://github.com/influxdata/telegraf/issues/1825): Consul plugin: add check_id as a tag in metrics to avoid overwrites. - [#1973](https://github.com/influxdata/telegraf/issues/1973): Partial fix: logparser CLF pattern with IPv6 addresses. - [#1975](https://github.com/influxdata/telegraf/issues/1975) & [#2102](https://github.com/influxdata/telegraf/issues/2102): Fix thread-safety when using multiple instances of the statsd input plugin. - [#2027](https://github.com/influxdata/telegraf/issues/2027): docker input: interface conversion panic fix. - [#1814](https://github.com/influxdata/telegraf/issues/1814): snmp: ensure proper context is present on error messages. - [#2299](https://github.com/influxdata/telegraf/issues/2299): opentsdb: add tcp:// prefix if no scheme provided. - [#2297](https://github.com/influxdata/telegraf/issues/2297): influx parser: parse line-protocol without newlines. - [#2245](https://github.com/influxdata/telegraf/issues/2245): influxdb output: fix field type conflict blocking output buffer. ## v1.1.2 [2016-12-12] ### Bug Fixes - [#2007](https://github.com/influxdata/telegraf/issues/2007): Make snmptranslate not required when using numeric OID. - [#2104](https://github.com/influxdata/telegraf/issues/2104): Add a global snmp translation cache. ## v1.1.1 [2016-11-14] ### Bug Fixes - [#2023](https://github.com/influxdata/telegraf/issues/2023): Fix issue parsing toml durations with single quotes. ## v1.1.0 [2016-11-07] ### Release Notes - Telegraf now supports two new types of plugins: processors & aggregators. - On systemd Telegraf will no longer redirect it's stdout to /var/log/telegraf/telegraf.log. On most systems, the logs will be directed to the systemd journal and can be accessed by `journalctl -u telegraf.service`. Consult the systemd journal documentation for configuring journald. There is also a [`logfile` config option](https://github.com/influxdata/telegraf/blob/master/etc/telegraf.conf#L70) available in 1.1, which will allow users to easily configure telegraf to continue sending logs to /var/log/telegraf/telegraf.log. ### Features - [#1726](https://github.com/influxdata/telegraf/issues/1726): Processor & Aggregator plugin support. - [#1861](https://github.com/influxdata/telegraf/pull/1861): adding the tags in the graylog output plugin - [#1732](https://github.com/influxdata/telegraf/pull/1732): Telegraf systemd service, log to journal. - [#1782](https://github.com/influxdata/telegraf/pull/1782): Allow numeric and non-string values for tag_keys. - [#1694](https://github.com/influxdata/telegraf/pull/1694): Adding Gauge and Counter metric types. - [#1606](https://github.com/influxdata/telegraf/pull/1606): Remove carraige returns from exec plugin output on Windows - [#1674](https://github.com/influxdata/telegraf/issues/1674): elasticsearch input: configurable timeout. - [#1607](https://github.com/influxdata/telegraf/pull/1607): Massage metric names in Instrumental output plugin - [#1572](https://github.com/influxdata/telegraf/pull/1572): mesos improvements. - [#1513](https://github.com/influxdata/telegraf/issues/1513): Add Ceph Cluster Performance Statistics - [#1650](https://github.com/influxdata/telegraf/issues/1650): Ability to configure response_timeout in httpjson input. - [#1685](https://github.com/influxdata/telegraf/issues/1685): Add additional redis metrics. - [#1539](https://github.com/influxdata/telegraf/pull/1539): Added capability to send metrics through Http API for OpenTSDB. - [#1471](https://github.com/influxdata/telegraf/pull/1471): iptables input plugin. - [#1542](https://github.com/influxdata/telegraf/pull/1542): Add filestack webhook plugin. - [#1599](https://github.com/influxdata/telegraf/pull/1599): Add server hostname for each docker measurements. - [#1697](https://github.com/influxdata/telegraf/pull/1697): Add NATS output plugin. - [#1407](https://github.com/influxdata/telegraf/pull/1407) & [#1915](https://github.com/influxdata/telegraf/pull/1915): HTTP service listener input plugin. - [#1699](https://github.com/influxdata/telegraf/pull/1699): Add database blacklist option for Postgresql - [#1791](https://github.com/influxdata/telegraf/pull/1791): Add Docker container state metrics to Docker input plugin output - [#1755](https://github.com/influxdata/telegraf/issues/1755): Add support to SNMP for IP & MAC address conversion. - [#1729](https://github.com/influxdata/telegraf/issues/1729): Add support to SNMP for OID index suffixes. - [#1813](https://github.com/influxdata/telegraf/pull/1813): Change default arguments for SNMP plugin. - [#1686](https://github.com/influxdata/telegraf/pull/1686): Mesos input plugin: very high-cardinality mesos-task metrics removed. - [#1838](https://github.com/influxdata/telegraf/pull/1838): Logging overhaul to centralize the logger & log levels, & provide a logfile config option. - [#1700](https://github.com/influxdata/telegraf/pull/1700): HAProxy plugin socket glob matching. - [#1847](https://github.com/influxdata/telegraf/pull/1847): Add Kubernetes plugin for retrieving pod metrics. ### Bug Fixes - [#1955](https://github.com/influxdata/telegraf/issues/1955): Fix NATS plug-ins reconnection logic. - [#1936](https://github.com/influxdata/telegraf/issues/1936): Set required default values in udp_listener & tcp_listener. - [#1926](https://github.com/influxdata/telegraf/issues/1926): Fix toml unmarshal panic in Duration objects. - [#1746](https://github.com/influxdata/telegraf/issues/1746): Fix handling of non-string values for JSON keys listed in tag_keys. - [#1628](https://github.com/influxdata/telegraf/issues/1628): Fix mongodb input panic on version 2.2. - [#1733](https://github.com/influxdata/telegraf/issues/1733): Fix statsd scientific notation parsing - [#1716](https://github.com/influxdata/telegraf/issues/1716): Sensors plugin strconv.ParseFloat: parsing "": invalid syntax - [#1530](https://github.com/influxdata/telegraf/issues/1530): Fix prometheus_client reload panic - [#1764](https://github.com/influxdata/telegraf/issues/1764): Fix kafka consumer panic when nil error is returned down errs channel. - [#1768](https://github.com/influxdata/telegraf/pull/1768): Speed up statsd parsing. - [#1751](https://github.com/influxdata/telegraf/issues/1751): Fix powerdns integer parse error handling. - [#1752](https://github.com/influxdata/telegraf/issues/1752): Fix varnish plugin defaults not being used. - [#1517](https://github.com/influxdata/telegraf/issues/1517): Fix windows glob paths. - [#1137](https://github.com/influxdata/telegraf/issues/1137): Fix issue loading config directory on windows. - [#1772](https://github.com/influxdata/telegraf/pull/1772): Windows remote management interactive service fix. - [#1702](https://github.com/influxdata/telegraf/issues/1702): sqlserver, fix issue when case sensitive collation is activated. - [#1823](https://github.com/influxdata/telegraf/issues/1823): Fix huge allocations in http_listener when dealing with huge payloads. - [#1833](https://github.com/influxdata/telegraf/issues/1833): Fix translating SNMP fields not in MIB. - [#1835](https://github.com/influxdata/telegraf/issues/1835): Fix SNMP emitting empty fields. - [#1854](https://github.com/influxdata/telegraf/pull/1853): SQL Server waitstats truncation bug. - [#1810](https://github.com/influxdata/telegraf/issues/1810): Fix logparser common log format: numbers in ident. - [#1793](https://github.com/influxdata/telegraf/pull/1793): Fix JSON Serialization in OpenTSDB output. - [#1731](https://github.com/influxdata/telegraf/issues/1731): Fix Graphite template ordering, use most specific. - [#1836](https://github.com/influxdata/telegraf/pull/1836): Fix snmp table field initialization for non-automatic table. - [#1724](https://github.com/influxdata/telegraf/issues/1724): cgroups path being parsed as metric. - [#1886](https://github.com/influxdata/telegraf/issues/1886): Fix phpfpm fcgi client panic when URL does not exist. - [#1344](https://github.com/influxdata/telegraf/issues/1344): Fix config file parse error logging. - [#1771](https://github.com/influxdata/telegraf/issues/1771): Delete nil fields in the metric maker. - [#870](https://github.com/influxdata/telegraf/issues/870): Fix MySQL special characters in DSN parsing. - [#1742](https://github.com/influxdata/telegraf/issues/1742): Ping input odd timeout behavior. - [#1950](https://github.com/influxdata/telegraf/pull/1950): Switch to github.com/kballard/go-shellquote. ## v1.0.1 [2016-09-26] ### Bug Fixes - [#1775](https://github.com/influxdata/telegraf/issues/1775): Prometheus output: Fix bug with multi-batch writes. - [#1738](https://github.com/influxdata/telegraf/issues/1738): Fix unmarshal of influxdb metrics with null tags. - [#1773](https://github.com/influxdata/telegraf/issues/1773): Add configurable timeout to influxdb input plugin. - [#1785](https://github.com/influxdata/telegraf/pull/1785): Fix statsd no default value panic. ## v1.0 [2016-09-08] ### Release Notes **Breaking Change** The SNMP plugin is being deprecated in it's current form. There is a [new SNMP plugin](https://github.com/influxdata/telegraf/tree/master/plugins/inputs/snmp) which fixes many of the issues and confusions of its predecessor. For users wanting to continue to use the deprecated SNMP plugin, you will need to change your config file from `[[inputs.snmp]]` to `[[inputs.snmp_legacy]]`. The configuration of the new SNMP plugin is _not_ backwards-compatible. **Breaking Change**: Aerospike main server node measurements have been renamed aerospike_node. Aerospike namespace measurements have been renamed to aerospike_namespace. They will also now be tagged with the node_name that they correspond to. This has been done to differentiate measurements that pertain to node vs. namespace statistics. **Breaking Change**: users of github_webhooks must change to the new `[[inputs.webhooks]]` plugin. This means that the default github_webhooks config: ```toml # A Github Webhook Event collector [[inputs.github_webhooks]] ## Address and port to host Webhook listener on service_address = ":1618" ``` should now look like: ```toml # A Webhooks Event collector [[inputs.webhooks]] ## Address and port to host Webhook listener on service_address = ":1618" [inputs.webhooks.github] path = "/" ``` - Telegraf now supports being installed as an official windows service, which can be installed via `> C:\Program Files\Telegraf\telegraf.exe --service install` - `flush_jitter` behavior has been changed. The random jitter will now be evaluated at every flush interval, rather than once at startup. This makes it consistent with the behavior of `collection_jitter`. - postgresql plugins now handle oid and name typed columns seamlessly, previously they were ignored/skipped. ### Features - [#1617](https://github.com/influxdata/telegraf/pull/1617): postgresql_extensible now handles name and oid types correctly. - [#1413](https://github.com/influxdata/telegraf/issues/1413): Separate container_version from container_image tag. - [#1525](https://github.com/influxdata/telegraf/pull/1525): Support setting per-device and total metrics for Docker network and blockio. - [#1466](https://github.com/influxdata/telegraf/pull/1466): MongoDB input plugin: adding per DB stats from db.stats() - [#1503](https://github.com/influxdata/telegraf/pull/1503): Add tls support for certs to RabbitMQ input plugin - [#1289](https://github.com/influxdata/telegraf/pull/1289): webhooks input plugin. Thanks @francois2metz and @cduez! - [#1247](https://github.com/influxdata/telegraf/pull/1247): rollbar webhook plugin. - [#1408](https://github.com/influxdata/telegraf/pull/1408): mandrill webhook plugin. - [#1402](https://github.com/influxdata/telegraf/pull/1402): docker-machine/boot2docker no longer required for unit tests. - [#1350](https://github.com/influxdata/telegraf/pull/1350): cgroup input plugin. - [#1369](https://github.com/influxdata/telegraf/pull/1369): Add input plugin for consuming metrics from NSQD. - [#1369](https://github.com/influxdata/telegraf/pull/1480): add ability to read redis from a socket. - [#1387](https://github.com/influxdata/telegraf/pull/1387): **Breaking Change** - Redis `role` tag renamed to `replication_role` to avoid global_tags override - [#1437](https://github.com/influxdata/telegraf/pull/1437): Fetching Galera status metrics in MySQL - [#1500](https://github.com/influxdata/telegraf/pull/1500): Aerospike plugin refactored to use official client lib. - [#1434](https://github.com/influxdata/telegraf/pull/1434): Add measurement name arg to logparser plugin. - [#1479](https://github.com/influxdata/telegraf/pull/1479): logparser: change resp_code from a field to a tag. - [#1411](https://github.com/influxdata/telegraf/pull/1411): Implement support for fetching hddtemp data - [#1340](https://github.com/influxdata/telegraf/issues/1340): statsd: do not log every dropped metric. - [#1368](https://github.com/influxdata/telegraf/pull/1368): Add precision rounding to all metrics on collection. - [#1390](https://github.com/influxdata/telegraf/pull/1390): Add support for Tengine - [#1320](https://github.com/influxdata/telegraf/pull/1320): Logparser input plugin for parsing grok-style log patterns. - [#1397](https://github.com/influxdata/telegraf/issues/1397): ElasticSearch: now supports connecting to ElasticSearch via SSL - [#1262](https://github.com/influxdata/telegraf/pull/1261): Add graylog input plugin. - [#1294](https://github.com/influxdata/telegraf/pull/1294): consul input plugin. Thanks @harnash - [#1164](https://github.com/influxdata/telegraf/pull/1164): conntrack input plugin. Thanks @robinpercy! - [#1165](https://github.com/influxdata/telegraf/pull/1165): vmstat input plugin. Thanks @jshim-xm! - [#1208](https://github.com/influxdata/telegraf/pull/1208): Standardized AWS credentials evaluation & wildcard CloudWatch dimensions. Thanks @johnrengelman! - [#1264](https://github.com/influxdata/telegraf/pull/1264): Add SSL config options to http_response plugin. - [#1272](https://github.com/influxdata/telegraf/pull/1272): graphite parser: add ability to specify multiple tag keys, for consistency with influxdb parser. - [#1265](https://github.com/influxdata/telegraf/pull/1265): Make dns lookups for chrony configurable. Thanks @zbindenren! - [#1275](https://github.com/influxdata/telegraf/pull/1275): Allow wildcard filtering of varnish stats. - [#1142](https://github.com/influxdata/telegraf/pull/1142): Support for glob patterns in exec plugin commands configuration. - [#1278](https://github.com/influxdata/telegraf/pull/1278): RabbitMQ input: made url parameter optional by using DefaultURL `http://localhost:15672` if not specified - [#1197](https://github.com/influxdata/telegraf/pull/1197): Limit AWS GetMetricStatistics requests to 10 per second. - [#1278](https://github.com/influxdata/telegraf/pull/1278) & [#1288](https://github.com/influxdata/telegraf/pull/1288) & [#1295](https://github.com/influxdata/telegraf/pull/1295): RabbitMQ/Apache/InfluxDB inputs: made url(s) parameter optional by using reasonable input defaults if not specified - [#1296](https://github.com/influxdata/telegraf/issues/1296): Refactor of flush_jitter argument. - [#1213](https://github.com/influxdata/telegraf/issues/1213): Add inactive & active memory to mem plugin. - [#1543](https://github.com/influxdata/telegraf/pull/1543): Official Windows service. - [#1414](https://github.com/influxdata/telegraf/pull/1414): Forking sensors command to remove C package dependency. - [#1389](https://github.com/influxdata/telegraf/pull/1389): Add a new SNMP plugin. ### Bug Fixes - [#1619](https://github.com/influxdata/telegraf/issues/1619): Fix `make windows` build target - [#1519](https://github.com/influxdata/telegraf/pull/1519): Fix error race conditions and partial failures. - [#1477](https://github.com/influxdata/telegraf/issues/1477): nstat: fix inaccurate config panic. - [#1481](https://github.com/influxdata/telegraf/issues/1481): jolokia: fix handling multiple multi-dimensional attributes. - [#1430](https://github.com/influxdata/telegraf/issues/1430): Fix prometheus character sanitizing. Sanitize more win_perf_counters characters. - [#1534](https://github.com/influxdata/telegraf/pull/1534): Add diskio io_time to FreeBSD & report timing metrics as ms (as linux does). - [#1379](https://github.com/influxdata/telegraf/issues/1379): Fix covering Amazon Linux for post remove flow. - [#1584](https://github.com/influxdata/telegraf/issues/1584): procstat missing fields: read/write bytes & count - [#1472](https://github.com/influxdata/telegraf/pull/1472): diskio input plugin: set 'skip_serial_number = true' by default to avoid high cardinality. - [#1426](https://github.com/influxdata/telegraf/pull/1426): nil metrics panic fix. - [#1384](https://github.com/influxdata/telegraf/pull/1384): Fix datarace in apache input plugin. - [#1399](https://github.com/influxdata/telegraf/issues/1399): Add `read_repairs` statistics to riak plugin. - [#1405](https://github.com/influxdata/telegraf/issues/1405): Fix memory/connection leak in prometheus input plugin. - [#1378](https://github.com/influxdata/telegraf/issues/1378): Trim BOM from config file for Windows support. - [#1339](https://github.com/influxdata/telegraf/issues/1339): Prometheus client output panic on service reload. - [#1461](https://github.com/influxdata/telegraf/pull/1461): Prometheus parser, protobuf format header fix. - [#1334](https://github.com/influxdata/telegraf/issues/1334): Prometheus output, metric refresh and caching fixes. - [#1432](https://github.com/influxdata/telegraf/issues/1432): Panic fix for multiple graphite outputs under very high load. - [#1412](https://github.com/influxdata/telegraf/pull/1412): Instrumental output has better reconnect behavior - [#1460](https://github.com/influxdata/telegraf/issues/1460): Remove PID from procstat plugin to fix cardinality issues. - [#1427](https://github.com/influxdata/telegraf/issues/1427): Cassandra input: version 2.x "column family" fix. - [#1463](https://github.com/influxdata/telegraf/issues/1463): Shared WaitGroup in Exec plugin - [#1436](https://github.com/influxdata/telegraf/issues/1436): logparser: honor modifiers in "pattern" config. - [#1418](https://github.com/influxdata/telegraf/issues/1418): logparser: error and exit on file permissions/missing errors. - [#1499](https://github.com/influxdata/telegraf/pull/1499): Make the user able to specify full path for HAproxy stats - [#1521](https://github.com/influxdata/telegraf/pull/1521): Fix Redis url, an extra "tcp://" was added. - [#1330](https://github.com/influxdata/telegraf/issues/1330): Fix exec plugin panic when using single binary. - [#1336](https://github.com/influxdata/telegraf/issues/1336): Fixed incorrect prometheus metrics source selection. - [#1112](https://github.com/influxdata/telegraf/issues/1112): Set default Zookeeper chroot to empty string. - [#1335](https://github.com/influxdata/telegraf/issues/1335): Fix overall ping timeout to be calculated based on per-ping timeout. - [#1374](https://github.com/influxdata/telegraf/pull/1374): Change "default" retention policy to "". - [#1377](https://github.com/influxdata/telegraf/issues/1377): Graphite output mangling '%' character. - [#1396](https://github.com/influxdata/telegraf/pull/1396): Prometheus input plugin now supports x509 certs authentication - [#1252](https://github.com/influxdata/telegraf/pull/1252) & [#1279](https://github.com/influxdata/telegraf/pull/1279): Fix systemd service. Thanks @zbindenren & @PierreF! - [#1221](https://github.com/influxdata/telegraf/pull/1221): Fix influxdb n_shards counter. - [#1258](https://github.com/influxdata/telegraf/pull/1258): Fix potential kernel plugin integer parse error. - [#1268](https://github.com/influxdata/telegraf/pull/1268): Fix potential influxdb input type assertion panic. - [#1283](https://github.com/influxdata/telegraf/pull/1283): Still send processes metrics if a process exited during metric collection. - [#1297](https://github.com/influxdata/telegraf/issues/1297): disk plugin panic when usage grab fails. - [#1316](https://github.com/influxdata/telegraf/pull/1316): Removed leaked "database" tag on redis metrics. Thanks @PierreF! - [#1323](https://github.com/influxdata/telegraf/issues/1323): Processes plugin: fix potential error with /proc/net/stat directory. - [#1322](https://github.com/influxdata/telegraf/issues/1322): Fix rare RHEL 5.2 panic in gopsutil diskio gathering function. - [#1586](https://github.com/influxdata/telegraf/pull/1586): Remove IF NOT EXISTS from influxdb output database creation. - [#1600](https://github.com/influxdata/telegraf/issues/1600): Fix quoting with text values in postgresql_extensible plugin. - [#1425](https://github.com/influxdata/telegraf/issues/1425): Fix win_perf_counter "index out of range" panic. - [#1634](https://github.com/influxdata/telegraf/issues/1634): Fix ntpq panic when field is missing. - [#1637](https://github.com/influxdata/telegraf/issues/1637): Sanitize graphite output field names. - [#1695](https://github.com/influxdata/telegraf/pull/1695): Fix MySQL plugin not sending 0 value fields. ## v0.13.1 [2016-05-24] ### Release Notes - net_response and http_response plugins timeouts will now accept duration strings, ie, "2s" or "500ms". - Input plugin Gathers will no longer be logged by default, but a Gather for _each_ plugin will be logged in Debug mode. - Debug mode will no longer print every point added to the accumulator. This functionality can be duplicated using the `file` output plugin and printing to "stdout". ### Features - [#1173](https://github.com/influxdata/telegraf/pull/1173): varnish input plugin. Thanks @sfox-xmatters! - [#1138](https://github.com/influxdata/telegraf/pull/1138): nstat input plugin. Thanks @Maksadbek! - [#1139](https://github.com/influxdata/telegraf/pull/1139): instrumental output plugin. Thanks @jasonroelofs! - [#1172](https://github.com/influxdata/telegraf/pull/1172): Ceph storage stats. Thanks @robinpercy! - [#1233](https://github.com/influxdata/telegraf/pull/1233): Updated golint gopsutil dependency. - [#1238](https://github.com/influxdata/telegraf/pull/1238): chrony input plugin. Thanks @zbindenren! - [#479](https://github.com/influxdata/telegraf/issues/479): per-plugin execution time added to debug output. - [#1249](https://github.com/influxdata/telegraf/issues/1249): influxdb output: added write_consistency argument. ### Bug Fixes - [#1195](https://github.com/influxdata/telegraf/pull/1195): Docker panic on timeout. Thanks @zstyblik! - [#1211](https://github.com/influxdata/telegraf/pull/1211): mongodb input. Fix possible panic. Thanks @kols! - [#1215](https://github.com/influxdata/telegraf/pull/1215): Fix for possible gopsutil-dependent plugin hangs. - [#1228](https://github.com/influxdata/telegraf/pull/1228): Fix service plugin host tag overwrite. - [#1198](https://github.com/influxdata/telegraf/pull/1198): http_response: override request Host header properly - [#1230](https://github.com/influxdata/telegraf/issues/1230): Fix Telegraf process hangup due to a single plugin hanging. - [#1214](https://github.com/influxdata/telegraf/issues/1214): Use TCP timeout argument in net_response plugin. - [#1243](https://github.com/influxdata/telegraf/pull/1243): Logfile not created on systemd. ## v0.13 [2016-05-11] ### Release Notes - **Breaking change** in jolokia plugin. See the [jolokia README](https://github.com/influxdata/telegraf/blob/master/plugins/inputs/jolokia/README.md) for updated configuration. The plugin will now support proxy mode and will make POST requests. - New [agent] configuration option: `metric_batch_size`. This option tells telegraf the maximum batch size to allow to accumulate before sending a flush to the configured outputs. `metric_buffer_limit` now refers to the absolute maximum number of metrics that will accumulate before metrics are dropped. - There is no longer an option to `flush_buffer_when_full`, this is now the default and only behavior of telegraf. - **Breaking Change**: docker plugin tags. The cont_id tag no longer exists, it will now be a field, and be called container_id. Additionally, cont_image and cont_name are being renamed to container_image and container_name. - **Breaking Change**: docker plugin measurements. The `docker_cpu`, `docker_mem`, `docker_blkio` and `docker_net` measurements are being renamed to `docker_container_cpu`, `docker_container_mem`, `docker_container_blkio` and `docker_container_net`. Why? Because these metrics are specifically tracking per-container stats. The problem with per-container stats, in some use-cases, is that if containers are short-lived AND names are not kept consistent, then the series cardinality will balloon very quickly. So adding "container" to each metric will: (1) make it more clear that these metrics are per-container, and (2) allow users to easily drop per-container metrics if cardinality is an issue (`namedrop = ["docker_container_*"]`) - `tagexclude` and `taginclude` are now available, which can be used to remove tags from measurements on inputs and outputs. See [the configuration doc](https://github.com/influxdata/telegraf/blob/master/docs/CONFIGURATION.md) for more details. - **Measurement filtering:** All measurement filters now match based on glob only. Previously there was an undocumented behavior where filters would match based on _prefix_ in addition to globs. This means that a filter like `fielddrop = ["time_"]` will need to be changed to `fielddrop = ["time_*"]` - **datadog**: measurement and field names will no longer have `_` replaced by `.` - The following plugins have changed their tags to _not_ overwrite the host tag: - cassandra: `host -> cassandra_host` - disque: `host -> disque_host` - rethinkdb: `host -> rethinkdb_host` - **Breaking Change**: The `win_perf_counters` input has been changed to sanitize field names, replacing `/Sec` and `/sec` with `_persec`, as well as spaces with underscores. This is needed because Graphite doesn't like slashes and spaces, and was failing to accept metrics that had them. The `/[sS]ec` -> `_persec` is just to make things clearer and uniform. - **Breaking Change**: snmp plugin. The `host` tag of the snmp plugin has been changed to the `snmp_host` tag. - The `disk` input plugin can now be configured with the `HOST_MOUNT_PREFIX` environment variable. This value is prepended to any mountpaths discovered before retrieving stats. It is not included on the report path. This is necessary for reporting host disk stats when running from within a container. ### Features - [#1031](https://github.com/influxdata/telegraf/pull/1031): Jolokia plugin proxy mode. Thanks @saiello! - [#1017](https://github.com/influxdata/telegraf/pull/1017): taginclude and tagexclude arguments. - [#1015](https://github.com/influxdata/telegraf/pull/1015): Docker plugin schema refactor. - [#889](https://github.com/influxdata/telegraf/pull/889): Improved MySQL plugin. Thanks @maksadbek! - [#1060](https://github.com/influxdata/telegraf/pull/1060): TTL metrics added to MongoDB input plugin - [#1056](https://github.com/influxdata/telegraf/pull/1056): Don't allow inputs to overwrite host tags. - [#1035](https://github.com/influxdata/telegraf/issues/1035): Add `user`, `exe`, `pidfile` tags to procstat plugin. - [#1041](https://github.com/influxdata/telegraf/issues/1041): Add `n_cpus` field to the system plugin. - [#1072](https://github.com/influxdata/telegraf/pull/1072): New Input Plugin: filestat. - [#1066](https://github.com/influxdata/telegraf/pull/1066): Replication lag metrics for MongoDB input plugin - [#1086](https://github.com/influxdata/telegraf/pull/1086): Ability to specify AWS keys in config file. Thanks @johnrengelman! - [#1096](https://github.com/influxdata/telegraf/pull/1096): Performance refactor of running output buffers. - [#967](https://github.com/influxdata/telegraf/issues/967): Buffer logging improvements. - [#1107](https://github.com/influxdata/telegraf/issues/1107): Support lustre2 job stats. Thanks @hanleyja! - [#1122](https://github.com/influxdata/telegraf/pull/1122): Support setting config path through env variable and default paths. - [#1128](https://github.com/influxdata/telegraf/pull/1128): MongoDB jumbo chunks metric for MongoDB input plugin - [#1146](https://github.com/influxdata/telegraf/pull/1146): HAProxy socket support. Thanks weshmashian! ### Bug Fixes - [#1050](https://github.com/influxdata/telegraf/issues/1050): jolokia plugin - do not overwrite host tag. Thanks @saiello! - [#921](https://github.com/influxdata/telegraf/pull/921): mqtt_consumer stops gathering metrics. Thanks @chaton78! - [#1013](https://github.com/influxdata/telegraf/pull/1013): Close dead riemann output connections. Thanks @echupriyanov! - [#1012](https://github.com/influxdata/telegraf/pull/1012): Set default tags in test accumulator. - [#1024](https://github.com/influxdata/telegraf/issues/1024): Don't replace `.` with `_` in datadog output. - [#1058](https://github.com/influxdata/telegraf/issues/1058): Fix possible leaky TCP connections in influxdb output. - [#1044](https://github.com/influxdata/telegraf/pull/1044): Fix SNMP OID possible collisions. Thanks @relip - [#1022](https://github.com/influxdata/telegraf/issues/1022): Dont error deb/rpm install on systemd errors. - [#1078](https://github.com/influxdata/telegraf/issues/1078): Use default AWS credential chain. - [#1070](https://github.com/influxdata/telegraf/issues/1070): SQL Server input. Fix datatype conversion. - [#1089](https://github.com/influxdata/telegraf/issues/1089): Fix leaky TCP connections in phpfpm plugin. - [#914](https://github.com/influxdata/telegraf/issues/914): Telegraf can drop metrics on full buffers. - [#1098](https://github.com/influxdata/telegraf/issues/1098): Sanitize invalid OpenTSDB characters. - [#1110](https://github.com/influxdata/telegraf/pull/1110): Sanitize * to - in graphite serializer. Thanks @goodeggs! - [#1118](https://github.com/influxdata/telegraf/pull/1118): Sanitize Counter names for `win_perf_counters` input. - [#1125](https://github.com/influxdata/telegraf/pull/1125): Wrap all exec command runners with a timeout, so hung os processes don't halt Telegraf. - [#1113](https://github.com/influxdata/telegraf/pull/1113): Set MaxRetry and RequiredAcks defaults in Kafka output. - [#1090](https://github.com/influxdata/telegraf/issues/1090): [agent] and [global_tags] config sometimes not getting applied. - [#1133](https://github.com/influxdata/telegraf/issues/1133): Use a timeout for docker list & stat cmds. - [#1052](https://github.com/influxdata/telegraf/issues/1052): Docker panic fix when decode fails. - [#1136](https://github.com/influxdata/telegraf/pull/1136): "DELAYED" Inserts were deprecated in MySQL 5.6.6. Thanks @PierreF ## v0.12.1 [2016-04-14] ### Release Notes - Breaking change in the dovecot input plugin. See Features section below. - Graphite output templates are now supported. See the [Output Formats README](https://github.com/influxdata/telegraf/blob/master/docs/DATA_FORMATS_OUTPUT.md#graphite) - Possible breaking change for the librato and graphite outputs. Telegraf will no longer insert field names when the field is simply named `value`. This is because the `value` field is redundant in the graphite/librato context. ### Features - [#1009](https://github.com/influxdata/telegraf/pull/1009): Cassandra input plugin. Thanks @subhachandrachandra! - [#976](https://github.com/influxdata/telegraf/pull/976): Reduce allocations in the UDP and statsd inputs. - [#979](https://github.com/influxdata/telegraf/pull/979): Reduce allocations in the TCP listener. - [#992](https://github.com/influxdata/telegraf/pull/992): Refactor allocations in TCP/UDP listeners. - [#935](https://github.com/influxdata/telegraf/pull/935): AWS Cloudwatch input plugin. Thanks @joshhardy & @ljosa! - [#943](https://github.com/influxdata/telegraf/pull/943): http_response input plugin. Thanks @Lswith! - [#939](https://github.com/influxdata/telegraf/pull/939): sysstat input plugin. Thanks @zbindenren! - [#998](https://github.com/influxdata/telegraf/pull/998): **breaking change** enabled global, user and ip queries in dovecot plugin. Thanks @mikif70! - [#1001](https://github.com/influxdata/telegraf/pull/1001): Graphite serializer templates. - [#1008](https://github.com/influxdata/telegraf/pull/1008): Adding memstats metrics to the influxdb plugin. ### Bug Fixes - [#968](https://github.com/influxdata/telegraf/issues/968): Processes plugin gets unknown state when spaces are in (command name) - [#969](https://github.com/influxdata/telegraf/pull/969): ipmi_sensors: allow : in password. Thanks @awaw! - [#972](https://github.com/influxdata/telegraf/pull/972): dovecot: remove extra newline in dovecot command. Thanks @mrannanj! - [#645](https://github.com/influxdata/telegraf/issues/645): docker plugin i/o error on closed pipe. Thanks @tripledes! ## v0.12.0 [2016-04-05] ### Features - [#951](https://github.com/influxdata/telegraf/pull/951): Parse environment variables in the config file. - [#948](https://github.com/influxdata/telegraf/pull/948): Cleanup config file and make default package version include all plugins (but commented). - [#927](https://github.com/influxdata/telegraf/pull/927): Adds parsing of tags to the statsd input when using DataDog's dogstatsd extension - [#863](https://github.com/influxdata/telegraf/pull/863): AMQP output: allow external auth. Thanks @ekini! - [#707](https://github.com/influxdata/telegraf/pull/707): Improved prometheus plugin. Thanks @titilambert! - [#878](https://github.com/influxdata/telegraf/pull/878): Added json serializer. Thanks @ch3lo! - [#880](https://github.com/influxdata/telegraf/pull/880): Add the ability to specify the bearer token to the prometheus plugin. Thanks @jchauncey! - [#882](https://github.com/influxdata/telegraf/pull/882): Fixed SQL Server Plugin issues - [#849](https://github.com/influxdata/telegraf/issues/849): Adding ability to parse single values as an input data type. - [#844](https://github.com/influxdata/telegraf/pull/844): postgres_extensible plugin added. Thanks @menardorama! - [#866](https://github.com/influxdata/telegraf/pull/866): couchbase input plugin. Thanks @ljosa! - [#789](https://github.com/influxdata/telegraf/pull/789): Support multiple field specification and `field*` in graphite templates. Thanks @chrusty! - [#762](https://github.com/influxdata/telegraf/pull/762): Nagios parser for the exec plugin. Thanks @titilambert! - [#848](https://github.com/influxdata/telegraf/issues/848): Provide option to omit host tag from telegraf agent. - [#928](https://github.com/influxdata/telegraf/pull/928): Deprecating the statsd "convert_names" options, expose separator config. - [#919](https://github.com/influxdata/telegraf/pull/919): ipmi_sensor input plugin. Thanks @ebookbug! - [#945](https://github.com/influxdata/telegraf/pull/945): KAFKA output: codec, acks, and retry configuration. Thanks @framiere! ### Bug Fixes - [#890](https://github.com/influxdata/telegraf/issues/890): Create TLS config even if only ssl_ca is provided. - [#884](https://github.com/influxdata/telegraf/issues/884): Do not call write method if there are 0 metrics to write. - [#898](https://github.com/influxdata/telegraf/issues/898): Put database name in quotes, fixes special characters in the database name. - [#656](https://github.com/influxdata/telegraf/issues/656): No longer run `lsof` on linux to get netstat data, fixes permissions issue. - [#907](https://github.com/influxdata/telegraf/issues/907): Fix prometheus invalid label/measurement name key. - [#841](https://github.com/influxdata/telegraf/issues/841): Fix memcached unix socket panic. - [#873](https://github.com/influxdata/telegraf/issues/873): Fix SNMP plugin sometimes not returning metrics. Thanks @titilambert! - [#934](https://github.com/influxdata/telegraf/pull/934): phpfpm: Fix fcgi uri path. Thanks @rudenkovk! - [#805](https://github.com/influxdata/telegraf/issues/805): Kafka consumer stops gathering after i/o timeout. - [#959](https://github.com/influxdata/telegraf/pull/959): reduce mongodb & prometheus collection timeouts. Thanks @PierreF! ## v0.11.1 [2016-03-17] ### Release Notes - Primarily this release was cut to fix [#859](https://github.com/influxdata/telegraf/issues/859) ### Features - [#747](https://github.com/influxdata/telegraf/pull/747): Start telegraf on install & remove on uninstall. Thanks @PierreF! - [#794](https://github.com/influxdata/telegraf/pull/794): Add service reload ability. Thanks @entertainyou! ### Bug Fixes - [#852](https://github.com/influxdata/telegraf/issues/852): Windows zip package fix - [#859](https://github.com/influxdata/telegraf/issues/859): httpjson plugin panic ## v0.11.0 [2016-03-15] ### Features - [#692](https://github.com/influxdata/telegraf/pull/770): Support InfluxDB retention policies - [#771](https://github.com/influxdata/telegraf/pull/771): Default timeouts for input plugns. Thanks @PierreF! - [#758](https://github.com/influxdata/telegraf/pull/758): UDP Listener input plugin, thanks @whatyouhide! - [#769](https://github.com/influxdata/telegraf/issues/769): httpjson plugin: allow specifying SSL configuration. - [#735](https://github.com/influxdata/telegraf/pull/735): SNMP Table feature. Thanks @titilambert! - [#754](https://github.com/influxdata/telegraf/pull/754): docker plugin: adding `docker info` metrics to output. Thanks @titilambert! - [#788](https://github.com/influxdata/telegraf/pull/788): -input-list and -output-list command-line options. Thanks @ebookbug! - [#778](https://github.com/influxdata/telegraf/pull/778): Adding a TCP input listener. - [#797](https://github.com/influxdata/telegraf/issues/797): Provide option for persistent MQTT consumer client sessions. - [#799](https://github.com/influxdata/telegraf/pull/799): Add number of threads for procstat input plugin. Thanks @titilambert! - [#776](https://github.com/influxdata/telegraf/pull/776): Add Zookeeper chroot option to kafka_consumer. Thanks @prune998! - [#811](https://github.com/influxdata/telegraf/pull/811): Add processes plugin for classifying total procs on system. Thanks @titilambert! - [#235](https://github.com/influxdata/telegraf/issues/235): Add number of users to the `system` input plugin. - [#826](https://github.com/influxdata/telegraf/pull/826): "kernel" linux plugin for /proc/stat metrics (context switches, interrupts, etc.) - [#847](https://github.com/influxdata/telegraf/pull/847): `ntpq`: Input plugin for running ntp query executable and gathering metrics. ### Bug Fixes - [#748](https://github.com/influxdata/telegraf/issues/748): Fix sensor plugin split on ":" - [#722](https://github.com/influxdata/telegraf/pull/722): Librato output plugin fixes. Thanks @chrusty! - [#745](https://github.com/influxdata/telegraf/issues/745): Fix Telegraf toml parse panic on large config files. Thanks @titilambert! - [#781](https://github.com/influxdata/telegraf/pull/781): Fix mqtt_consumer username not being set. Thanks @chaton78! - [#786](https://github.com/influxdata/telegraf/pull/786): Fix mqtt output username not being set. Thanks @msangoi! - [#773](https://github.com/influxdata/telegraf/issues/773): Fix duplicate measurements in snmp plugin. Thanks @titilambert! - [#708](https://github.com/influxdata/telegraf/issues/708): packaging: build ARM package - [#713](https://github.com/influxdata/telegraf/issues/713): packaging: insecure permissions error on log directory - [#816](https://github.com/influxdata/telegraf/issues/816): Fix phpfpm panic if fcgi endpoint unreachable. - [#828](https://github.com/influxdata/telegraf/issues/828): fix net_response plugin overwriting host tag. - [#821](https://github.com/influxdata/telegraf/issues/821): Remove postgres password from server tag. Thanks @menardorama! ## v0.10.4.1 ### Release Notes - Bug in the build script broke deb and rpm packages. ### Bug Fixes - [#750](https://github.com/influxdata/telegraf/issues/750): deb package broken - [#752](https://github.com/influxdata/telegraf/issues/752): rpm package broken ## v0.10.4 [2016-02-24] ### Release Notes - The pass/drop parameters have been renamed to fielddrop/fieldpass parameters, to more accurately indicate their purpose. - There are also now namedrop/namepass parameters for passing/dropping based on the metric _name_. - Experimental windows builds now available. ### Features - [#727](https://github.com/influxdata/telegraf/pull/727): riak input, thanks @jcoene! - [#694](https://github.com/influxdata/telegraf/pull/694): DNS Query input, thanks @mjasion! - [#724](https://github.com/influxdata/telegraf/pull/724): username matching for procstat input, thanks @zorel! - [#736](https://github.com/influxdata/telegraf/pull/736): Ignore dummy filesystems from disk plugin. Thanks @PierreF! - [#737](https://github.com/influxdata/telegraf/pull/737): Support multiple fields for statsd input. Thanks @mattheath! ### Bug Fixes - [#701](https://github.com/influxdata/telegraf/pull/701): output write count shouldnt print in quiet mode. - [#746](https://github.com/influxdata/telegraf/pull/746): httpjson plugin: Fix HTTP GET parameters. ## v0.10.3 [2016-02-18] ### Release Notes - Users of the `exec` and `kafka_consumer` (and the new `nats_consumer` and `mqtt_consumer` plugins) can now specify the incoming data format that they would like to parse. Currently supports: "json", "influx", and "graphite" - Users of message broker and file output plugins can now choose what data format they would like to output. Currently supports: "influx" and "graphite" - For more info on parsing _incoming_ data formats see the [documentation](https://github.com/influxdata/telegraf/blob/master/docs/DATA_FORMATS_INPUT.md) - For more info on serializing _outgoing_ data formats see the [documentation](https://github.com/influxdata/telegraf/blob/master/docs/DATA_FORMATS_OUTPUT.md) - Telegraf now has an option `flush_buffer_when_full` that will flush the metric buffer whenever it fills up for each output, rather than dropping points and only flushing on a set time interval. This will default to `true` and is in the `[agent]` config section. ### Features - [#652](https://github.com/influxdata/telegraf/pull/652): CouchDB Input Plugin. Thanks @codehate! - [#655](https://github.com/influxdata/telegraf/pull/655): Support parsing arbitrary data formats. Currently limited to kafka_consumer and exec inputs. - [#671](https://github.com/influxdata/telegraf/pull/671): Dovecot input plugin. Thanks @mikif70! - [#680](https://github.com/influxdata/telegraf/pull/680): NATS consumer input plugin. Thanks @netixen! - [#676](https://github.com/influxdata/telegraf/pull/676): MQTT consumer input plugin. - [#683](https://github.com/influxdata/telegraf/pull/683): PostGRES input plugin: add pg_stat_bgwriter. Thanks @menardorama! - [#679](https://github.com/influxdata/telegraf/pull/679): File/stdout output plugin. - [#679](https://github.com/influxdata/telegraf/pull/679): Support for arbitrary output data formats. - [#695](https://github.com/influxdata/telegraf/pull/695): raindrops input plugin. Thanks @burdandrei! - [#650](https://github.com/influxdata/telegraf/pull/650): net_response input plugin. Thanks @titilambert! - [#699](https://github.com/influxdata/telegraf/pull/699): Flush based on buffer size rather than time. - [#682](https://github.com/influxdata/telegraf/pull/682): Mesos input plugin. Thanks @tripledes! ### Bug Fixes - [#443](https://github.com/influxdata/telegraf/issues/443): Fix Ping command timeout parameter on Linux. - [#662](https://github.com/influxdata/telegraf/pull/667): Change `[tags]` to `[global_tags]` to fix multiple-plugin tags bug. - [#642](https://github.com/influxdata/telegraf/issues/642): Riemann output plugin issues. - [#394](https://github.com/influxdata/telegraf/issues/394): Support HTTP POST. Thanks @gabelev! - [#715](https://github.com/influxdata/telegraf/pull/715): Fix influxdb precision config panic. Thanks @netixen! ## v0.10.2 [2016-02-04] ### Release Notes - Statsd timing measurements are now aggregated into a single measurement with fields. - Graphite output now inserts tags into the bucket in alphabetical order. - Normalized TLS/SSL support for output plugins: MQTT, AMQP, Kafka - `verify_ssl` config option was removed from Kafka because it was actually doing the opposite of what it claimed to do (yikes). It's been replaced by `insecure_skip_verify` ### Features - [#575](https://github.com/influxdata/telegraf/pull/575): Support for collecting Windows Performance Counters. Thanks @TheFlyingCorpse! - [#564](https://github.com/influxdata/telegraf/issues/564): features for plugin writing simplification. Internal metric data type. - [#603](https://github.com/influxdata/telegraf/pull/603): Aggregate statsd timing measurements into fields. Thanks @marcinbunsch! - [#601](https://github.com/influxdata/telegraf/issues/601): Warn when overwriting cached metrics. - [#614](https://github.com/influxdata/telegraf/pull/614): PowerDNS input plugin. Thanks @Kasen! - [#617](https://github.com/influxdata/telegraf/pull/617): exec plugin: parse influx line protocol in addition to JSON. - [#628](https://github.com/influxdata/telegraf/pull/628): Windows perf counters: pre-vista support ### Bug Fixes - [#595](https://github.com/influxdata/telegraf/issues/595): graphite output should include tags to separate duplicate measurements. - [#599](https://github.com/influxdata/telegraf/issues/599): datadog plugin tags not working. - [#600](https://github.com/influxdata/telegraf/issues/600): datadog measurement/field name parsing is wrong. - [#602](https://github.com/influxdata/telegraf/issues/602): Fix statsd field name templating. - [#612](https://github.com/influxdata/telegraf/pull/612): Docker input panic fix if stats received are nil. - [#634](https://github.com/influxdata/telegraf/pull/634): Properly set host headers in httpjson. Thanks @reginaldosousa! ## v0.10.1 [2016-01-27] ### Release Notes - Telegraf now keeps a fixed-length buffer of metrics per-output. This buffer defaults to 10,000 metrics, and is adjustable. The buffer is cleared when a successful write to that output occurs. - The docker plugin has been significantly overhauled to add more metrics and allow for docker-machine (incl OSX) support. [See the readme](https://github.com/influxdata/telegraf/blob/master/plugins/inputs/docker/README.md) for the latest measurements, fields, and tags. There is also now support for specifying a docker endpoint to get metrics from. ### Features - [#509](https://github.com/influxdata/telegraf/pull/509): Flatten JSON arrays with indices. Thanks @psilva261! - [#512](https://github.com/influxdata/telegraf/pull/512): Python 3 build script, add lsof dep to package. Thanks @Ormod! - [#475](https://github.com/influxdata/telegraf/pull/475): Add response time to httpjson plugin. Thanks @titilambert! - [#519](https://github.com/influxdata/telegraf/pull/519): Added a sensors input based on lm-sensors. Thanks @md14454! - [#467](https://github.com/influxdata/telegraf/issues/467): Add option to disable statsd measurement name conversion. - [#534](https://github.com/influxdata/telegraf/pull/534): NSQ input plugin. Thanks @allingeek! - [#494](https://github.com/influxdata/telegraf/pull/494): Graphite output plugin. Thanks @titilambert! - AMQP SSL support. Thanks @ekini! - [#539](https://github.com/influxdata/telegraf/pull/539): Reload config on SIGHUP. Thanks @titilambert! - [#522](https://github.com/influxdata/telegraf/pull/522): Phusion passenger input plugin. Thanks @kureikain! - [#541](https://github.com/influxdata/telegraf/pull/541): Kafka output TLS cert support. Thanks @Ormod! - [#551](https://github.com/influxdata/telegraf/pull/551): Statsd UDP read packet size now defaults to 1500 bytes, and is configurable. - [#552](https://github.com/influxdata/telegraf/pull/552): Support for collection interval jittering. - [#484](https://github.com/influxdata/telegraf/issues/484): Include usage percent with procstat metrics. - [#553](https://github.com/influxdata/telegraf/pull/553): Amazon CloudWatch output. thanks @skwong2! - [#503](https://github.com/influxdata/telegraf/pull/503): Support docker endpoint configuration. - [#563](https://github.com/influxdata/telegraf/pull/563): Docker plugin overhaul. - [#285](https://github.com/influxdata/telegraf/issues/285): Fixed-size buffer of points. - [#546](https://github.com/influxdata/telegraf/pull/546): SNMP Input plugin. Thanks @titilambert! - [#589](https://github.com/influxdata/telegraf/pull/589): Microsoft SQL Server input plugin. Thanks @zensqlmonitor! - [#573](https://github.com/influxdata/telegraf/pull/573): Github webhooks consumer input. Thanks @jackzampolin! - [#471](https://github.com/influxdata/telegraf/pull/471): httpjson request headers. Thanks @asosso! ### Bug Fixes - [#506](https://github.com/influxdata/telegraf/pull/506): Ping input doesn't return response time metric when timeout. Thanks @titilambert! - [#508](https://github.com/influxdata/telegraf/pull/508): Fix prometheus cardinality issue with the `net` plugin - [#499](https://github.com/influxdata/telegraf/issues/499) & [#502](https://github.com/influxdata/telegraf/issues/502): php fpm unix socket and other fixes, thanks @kureikain! - [#543](https://github.com/influxdata/telegraf/issues/543): Statsd Packet size sometimes truncated. - [#440](https://github.com/influxdata/telegraf/issues/440): Don't query filtered devices for disk stats. - [#463](https://github.com/influxdata/telegraf/issues/463): Docker plugin not working on AWS Linux - [#568](https://github.com/influxdata/telegraf/issues/568): Multiple output race condition. - [#585](https://github.com/influxdata/telegraf/pull/585): Log stack trace and continue on Telegraf panic. Thanks @wutaizeng! ## v0.10.0 [2016-01-12] ### Release Notes - Linux packages have been taken out of `opt`, the binary is now in `/usr/bin` and configuration files are in `/etc/telegraf` - **breaking change** `plugins` have been renamed to `inputs`. This was done because `plugins` is too generic, as there are now also "output plugins", and will likely be "aggregator plugins" and "filter plugins" in the future. Additionally, `inputs/` and `outputs/` directories have been placed in the root-level `plugins/` directory. - **breaking change** the `io` plugin has been renamed `diskio` - **breaking change** plugin measurements aggregated into a single measurement. - **breaking change** `jolokia` plugin: must use global tag/drop/pass parameters for configuration. - **breaking change** `twemproxy` plugin: `prefix` option removed. - **breaking change** `procstat` cpu measurements are now prepended with `cpu_time_` instead of only `cpu_` - **breaking change** some command-line flags have been renamed to separate words. `-configdirectory` -> `-config-directory`, `-filter` -> `-input-filter`, `-outputfilter` -> `-output-filter` - The prometheus plugin schema has not been changed (measurements have not been aggregated). ### Packaging change note RHEL/CentOS users upgrading from 0.2.x to 0.10.0 will probably have their configurations overwritten by the upgrade. There is a backup stored at /etc/telegraf/telegraf.conf.$(date +%s).backup. ### Features - Plugin measurements aggregated into a single measurement. - Added ability to specify per-plugin tags - Added ability to specify per-plugin measurement suffix and prefix. (`name_prefix` and `name_suffix`) - Added ability to override base plugin measurement name. (`name_override`) ### Bug Fixes ## v0.2.5 [unreleased] ### Features - [#427](https://github.com/influxdata/telegraf/pull/427): zfs plugin: pool stats added. Thanks @allenpetersen! - [#428](https://github.com/influxdata/telegraf/pull/428): Amazon Kinesis output. Thanks @jimmystewpot! - [#449](https://github.com/influxdata/telegraf/pull/449): influxdb plugin, thanks @mark-rushakoff ### Bug Fixes - [#430](https://github.com/influxdata/telegraf/issues/430): Network statistics removed in elasticsearch 2.1. Thanks @jipperinbham! - [#452](https://github.com/influxdata/telegraf/issues/452): Elasticsearch open file handles error. Thanks @jipperinbham! ## v0.2.4 [2015-12-08] ### Features - [#412](https://github.com/influxdata/telegraf/pull/412): Additional memcached stats. Thanks @mgresser! - [#410](https://github.com/influxdata/telegraf/pull/410): Additional redis metrics. Thanks @vlaadbrain! - [#414](https://github.com/influxdata/telegraf/issues/414): Jolokia plugin auth parameters - [#415](https://github.com/influxdata/telegraf/issues/415): memcached plugin: support unix sockets - [#418](https://github.com/influxdata/telegraf/pull/418): memcached plugin additional unit tests. - [#408](https://github.com/influxdata/telegraf/pull/408): MailChimp plugin. - [#382](https://github.com/influxdata/telegraf/pull/382): Add system wide network protocol stats to `net` plugin. - [#401](https://github.com/influxdata/telegraf/pull/401): Support pass/drop/tagpass/tagdrop for outputs. Thanks @oldmantaiter! ### Bug Fixes - [#405](https://github.com/influxdata/telegraf/issues/405): Prometheus output cardinality issue - [#388](https://github.com/influxdata/telegraf/issues/388): Fix collection hangup when cpu times decrement. ## v0.2.3 [2015-11-30] ### Release Notes - **breaking change** The `kafka` plugin has been renamed to `kafka_consumer`. and most of the config option names have changed. This only affects the kafka consumer _plugin_ (not the output). There were a number of problems with the kafka plugin that led to it only collecting data once at startup, so the kafka plugin was basically non- functional. - Plugins can now be specified as a list, and multiple plugin instances of the same type can be specified, like this: ```toml [[inputs.cpu]] percpu = false totalcpu = true [[inputs.cpu]] percpu = true totalcpu = false drop = ["cpu_time"] ``` - Riemann output added - Aerospike plugin: tag changed from `host` -> `aerospike_host` ### Features - [#379](https://github.com/influxdata/telegraf/pull/379): Riemann output, thanks @allenj! - [#375](https://github.com/influxdata/telegraf/pull/375): kafka_consumer service plugin. - [#392](https://github.com/influxdata/telegraf/pull/392): Procstat plugin can now accept pgrep -f pattern, thanks @ecarreras! - [#383](https://github.com/influxdata/telegraf/pull/383): Specify plugins as a list. - [#354](https://github.com/influxdata/telegraf/pull/354): Add ability to specify multiple metrics in one statsd line. Thanks @MerlinDMC! ### Bug Fixes - [#371](https://github.com/influxdata/telegraf/issues/371): Kafka consumer plugin not functioning. - [#389](https://github.com/influxdata/telegraf/issues/389): NaN value panic ## v0.2.2 [2015-11-18] ### Release Notes - 0.2.1 has a bug where all lists within plugins get duplicated, this includes lists of servers/URLs. 0.2.2 is being released solely to fix that bug ### Bug Fixes - [#377](https://github.com/influxdata/telegraf/pull/377): Fix for duplicate slices in inputs. ## v0.2.1 [2015-11-16] ### Release Notes - Telegraf will no longer use docker-compose for "long" unit test, it has been changed to just run docker commands in the Makefile. See `make docker-run` and `make docker-kill`. `make test` will still run all unit tests with docker. - Long unit tests are now run in CircleCI, with docker & race detector - Redis plugin tag has changed from `host` to `server` - HAProxy plugin tag has changed from `host` to `server` - UDP output now supported - Telegraf will now compile on FreeBSD - Users can now specify outputs as lists, specifying multiple outputs of the same type. ### Features - [#325](https://github.com/influxdata/telegraf/pull/325): NSQ output. Thanks @jrxFive! - [#318](https://github.com/influxdata/telegraf/pull/318): Prometheus output. Thanks @oldmantaiter! - [#338](https://github.com/influxdata/telegraf/pull/338): Restart Telegraf on package upgrade. Thanks @linsomniac! - [#337](https://github.com/influxdata/telegraf/pull/337): Jolokia plugin, thanks @saiello! - [#350](https://github.com/influxdata/telegraf/pull/350): Amon output. - [#365](https://github.com/influxdata/telegraf/pull/365): Twemproxy plugin by @codeb2cc - [#317](https://github.com/influxdata/telegraf/issues/317): ZFS plugin, thanks @cornerot! - [#364](https://github.com/influxdata/telegraf/pull/364): Support InfluxDB UDP output. - [#370](https://github.com/influxdata/telegraf/pull/370): Support specifying multiple outputs, as lists. - [#372](https://github.com/influxdata/telegraf/pull/372): Remove gosigar and update go-dockerclient for FreeBSD support. Thanks @MerlinDMC! ### Bug Fixes - [#331](https://github.com/influxdata/telegraf/pull/331): Dont overwrite host tag in redis plugin. - [#336](https://github.com/influxdata/telegraf/pull/336): Mongodb plugin should take 2 measurements. - [#351](https://github.com/influxdata/telegraf/issues/317): Fix continual "CREATE DATABASE" in writes - [#360](https://github.com/influxdata/telegraf/pull/360): Apply prefix before ShouldPass check. Thanks @sotfo! ## v0.2.0 [2015-10-27] ### Release Notes - The -test flag will now only output 2 collections for plugins that need it - There is a new agent configuration option: `flush_interval`. This option tells Telegraf how often to flush data to InfluxDB and other output sinks. For example, users can set `interval = "2s"` and `flush_interval = "60s"` for Telegraf to collect data every 2 seconds, and flush every 60 seconds. - `precision` and `utc` are no longer valid agent config values. `precision` has moved to the `influxdb` output config, where it will continue to default to "s" - debug and test output will now print the raw line-protocol string - Telegraf will now, by default, round the collection interval to the nearest even interval. This means that `interval="10s"` will collect every :00, :10, etc. To ease scale concerns, flushing will be "jittered" by a random amount so that all Telegraf instances do not flush at the same time. Both of these options can be controlled via the `round_interval` and `flush_jitter` config options. - Telegraf will now retry metric flushes twice ### Features - [#205](https://github.com/influxdata/telegraf/issues/205): Include per-db redis keyspace info - [#226](https://github.com/influxdata/telegraf/pull/226): Add timestamps to points in Kafka/AMQP outputs. Thanks @ekini - [#90](https://github.com/influxdata/telegraf/issues/90): Add Docker labels to tags in docker plugin - [#223](https://github.com/influxdata/telegraf/pull/223): Add port tag to nginx plugin. Thanks @neezgee! - [#227](https://github.com/influxdata/telegraf/pull/227): Add command intervals to exec plugin. Thanks @jpalay! - [#241](https://github.com/influxdata/telegraf/pull/241): MQTT Output. Thanks @shirou! - Memory plugin: cached and buffered measurements re-added - Logging: additional logging for each collection interval, track the number of metrics collected and from how many inputs. - [#240](https://github.com/influxdata/telegraf/pull/240): procstat plugin, thanks @ranjib! - [#244](https://github.com/influxdata/telegraf/pull/244): netstat plugin, thanks @shirou! - [#262](https://github.com/influxdata/telegraf/pull/262): zookeeper plugin, thanks @jrxFive! - [#237](https://github.com/influxdata/telegraf/pull/237): statsd service plugin, thanks @sparrc - [#273](https://github.com/influxdata/telegraf/pull/273): puppet agent plugin, thats @jrxFive! - [#280](https://github.com/influxdata/telegraf/issues/280): Use InfluxDB client v2. - [#281](https://github.com/influxdata/telegraf/issues/281): Eliminate need to deep copy Batch Points. - [#286](https://github.com/influxdata/telegraf/issues/286): bcache plugin, thanks @cornerot! - [#287](https://github.com/influxdata/telegraf/issues/287): Batch AMQP output, thanks @ekini! - [#301](https://github.com/influxdata/telegraf/issues/301): Collect on even intervals - [#298](https://github.com/influxdata/telegraf/pull/298): Support retrying output writes - [#300](https://github.com/influxdata/telegraf/issues/300): aerospike plugin. Thanks @oldmantaiter! - [#322](https://github.com/influxdata/telegraf/issues/322): Librato output. Thanks @jipperinbham! ### Bug Fixes - [#228](https://github.com/influxdata/telegraf/pull/228): New version of package will replace old one. Thanks @ekini! - [#232](https://github.com/influxdata/telegraf/pull/232): Fix bashism run during deb package installation. Thanks @yankcrime! - [#261](https://github.com/influxdata/telegraf/issues/260): RabbitMQ panics if wrong credentials given. Thanks @ekini! - [#245](https://github.com/influxdata/telegraf/issues/245): Document Exec plugin example. Thanks @ekini! - [#264](https://github.com/influxdata/telegraf/issues/264): logrotate config file fixes. Thanks @linsomniac! - [#290](https://github.com/influxdata/telegraf/issues/290): Fix some plugins sending their values as strings. - [#289](https://github.com/influxdata/telegraf/issues/289): Fix accumulator panic on nil tags. - [#302](https://github.com/influxdata/telegraf/issues/302): Fix `[tags]` getting applied, thanks @gotyaoi! ## v0.1.9 [2015-09-22] ### Release Notes - InfluxDB output config change: `url` is now `urls`, and is a list. Config files will still be backwards compatible if only `url` is specified. - The -test flag will now output two metric collections - Support for filtering telegraf outputs on the CLI -- Telegraf will now allow filtering of output sinks on the command-line using the `-outputfilter` flag, much like how the `-filter` flag works for inputs. - Support for filtering on config-file creation -- Telegraf now supports filtering to -sample-config command. You can now run `telegraf -sample-config -filter cpu -outputfilter influxdb` to get a config file with only the cpu plugin defined, and the influxdb output defined. - **Breaking Change**: The CPU collection plugin has been refactored to fix some bugs and outdated dependency issues. At the same time, I also decided to fix a naming consistency issue, so cpu_percentageIdle will become cpu_usage_idle. Also, all CPU time measurements now have it indicated in their name, so cpu_idle will become cpu_time_idle. Additionally, cpu_time measurements are going to be dropped in the default config. - **Breaking Change**: The memory plugin has been refactored and some measurements have been renamed for consistency. Some measurements have also been removed from being outputted. They are still being collected by gopsutil, and could easily be re-added in a "verbose" mode if there is demand for it. ### Features - [#143](https://github.com/influxdata/telegraf/issues/143): InfluxDB clustering support - [#181](https://github.com/influxdata/telegraf/issues/181): Makefile GOBIN support. Thanks @Vye! - [#203](https://github.com/influxdata/telegraf/pull/200): AMQP output. Thanks @ekini! - [#182](https://github.com/influxdata/telegraf/pull/182): OpenTSDB output. Thanks @rplessl! - [#187](https://github.com/influxdata/telegraf/pull/187): Retry output sink connections on startup. - [#220](https://github.com/influxdata/telegraf/pull/220): Add port tag to apache plugin. Thanks @neezgee! - [#217](https://github.com/influxdata/telegraf/pull/217): Add filtering for output sinks and filtering when specifying a config file. ### Bug Fixes - [#170](https://github.com/influxdata/telegraf/issues/170): Systemd support - [#175](https://github.com/influxdata/telegraf/issues/175): Set write precision before gathering metrics - [#178](https://github.com/influxdata/telegraf/issues/178): redis plugin, multiple server thread hang bug - Fix net plugin on darwin - [#84](https://github.com/influxdata/telegraf/issues/84): Fix docker plugin on CentOS. Thanks @neezgee! - [#189](https://github.com/influxdata/telegraf/pull/189): Fix mem_used_perc. Thanks @mced! - [#192](https://github.com/influxdata/telegraf/issues/192): Increase compatibility of postgresql plugin. Now supports versions 8.1+ - [#203](https://github.com/influxdata/telegraf/issues/203): EL5 rpm support. Thanks @ekini! - [#206](https://github.com/influxdata/telegraf/issues/206): CPU steal/guest values wrong on linux. - [#212](https://github.com/influxdata/telegraf/issues/212): Add hashbang to postinstall script. Thanks @ekini! - [#212](https://github.com/influxdata/telegraf/issues/212): Fix makefile warning. Thanks @ekini! ## v0.1.8 [2015-09-04] ### Release Notes - Telegraf will now write data in UTC at second precision by default - Now using Go 1.5 to build telegraf ### Features - [#150](https://github.com/influxdata/telegraf/pull/150): Add Host Uptime metric to system plugin - [#158](https://github.com/influxdata/telegraf/pull/158): Apache Plugin. Thanks @KPACHbIuLLIAnO4 - [#159](https://github.com/influxdata/telegraf/pull/159): Use second precision for InfluxDB writes - [#165](https://github.com/influxdata/telegraf/pull/165): Add additional metrics to mysql plugin. Thanks @nickscript0 - [#162](https://github.com/influxdata/telegraf/pull/162): Write UTC by default, provide option - [#166](https://github.com/influxdata/telegraf/pull/166): Upload binaries to S3 - [#169](https://github.com/influxdata/telegraf/pull/169): Ping plugin ### Bug Fixes ## v0.1.7 [2015-08-28] ### Features - [#38](https://github.com/influxdata/telegraf/pull/38): Kafka output producer. - [#133](https://github.com/influxdata/telegraf/pull/133): Add plugin.Gather error logging. Thanks @nickscript0! - [#136](https://github.com/influxdata/telegraf/issues/136): Add a -usage flag for printing usage of a single plugin. - [#137](https://github.com/influxdata/telegraf/issues/137): Memcached: fix when a value contains a space - [#138](https://github.com/influxdata/telegraf/issues/138): MySQL server address tag. - [#142](https://github.com/influxdata/telegraf/pull/142): Add Description and SampleConfig funcs to output interface - Indent the toml config file for readability ### Bug Fixes - [#128](https://github.com/influxdata/telegraf/issues/128): system_load measurement missing. - [#129](https://github.com/influxdata/telegraf/issues/129): Latest pkg url fix. - [#131](https://github.com/influxdata/telegraf/issues/131): Fix memory reporting on linux & darwin. Thanks @subhachandrachandra! - [#140](https://github.com/influxdata/telegraf/issues/140): Memory plugin prec->perc typo fix. Thanks @brunoqc! ## v0.1.6 [2015-08-20] ### Features - [#112](https://github.com/influxdata/telegraf/pull/112): Datadog output. Thanks @jipperinbham! - [#116](https://github.com/influxdata/telegraf/pull/116): Use godep to vendor all dependencies - [#120](https://github.com/influxdata/telegraf/pull/120): Httpjson plugin. Thanks @jpalay & @alvaromorales! ### Bug Fixes - [#113](https://github.com/influxdata/telegraf/issues/113): Update README with Telegraf/InfluxDB compatibility - [#118](https://github.com/influxdata/telegraf/pull/118): Fix for disk usage stats in Windows. Thanks @srfraser! - [#122](https://github.com/influxdata/telegraf/issues/122): Fix for DiskUsage segv fault. Thanks @srfraser! - [#126](https://github.com/influxdata/telegraf/issues/126): Nginx plugin not catching net.SplitHostPort error ## v0.1.5 [2015-08-13] ### Features - [#54](https://github.com/influxdata/telegraf/pull/54): MongoDB plugin. Thanks @jipperinbham! - [#55](https://github.com/influxdata/telegraf/pull/55): Elasticsearch plugin. Thanks @brocaar! - [#71](https://github.com/influxdata/telegraf/pull/71): HAProxy plugin. Thanks @kureikain! - [#72](https://github.com/influxdata/telegraf/pull/72): Adding TokuDB metrics to MySQL. Thanks vadimtk! - [#73](https://github.com/influxdata/telegraf/pull/73): RabbitMQ plugin. Thanks @ianunruh! - [#77](https://github.com/influxdata/telegraf/issues/77): Automatically create database. - [#79](https://github.com/influxdata/telegraf/pull/56): Nginx plugin. Thanks @codeb2cc! - [#86](https://github.com/influxdata/telegraf/pull/86): Lustre2 plugin. Thanks srfraser! - [#91](https://github.com/influxdata/telegraf/pull/91): Unit testing - [#92](https://github.com/influxdata/telegraf/pull/92): Exec plugin. Thanks @alvaromorales! - [#98](https://github.com/influxdata/telegraf/pull/98): LeoFS plugin. Thanks @mocchira! - [#103](https://github.com/influxdata/telegraf/pull/103): Filter by metric tags. Thanks @srfraser! - [#106](https://github.com/influxdata/telegraf/pull/106): Options to filter plugins on startup. Thanks @zepouet! - [#107](https://github.com/influxdata/telegraf/pull/107): Multiple outputs beyond influxdb. Thanks @jipperinbham! - [#108](https://github.com/influxdata/telegraf/issues/108): Support setting per-CPU and total-CPU gathering. - [#111](https://github.com/influxdata/telegraf/pull/111): Report CPU Usage in cpu plugin. Thanks @jpalay! ### Bug Fixes - [#85](https://github.com/influxdata/telegraf/pull/85): Fix GetLocalHost testutil function for mac users - [#89](https://github.com/influxdata/telegraf/pull/89): go fmt fixes - [#94](https://github.com/influxdata/telegraf/pull/94): Fix for issue #93, explicitly call sarama.v1 -> sarama - [#101](https://github.com/influxdata/telegraf/issues/101): switch back from master branch if building locally - [#99](https://github.com/influxdata/telegraf/issues/99): update integer output to new InfluxDB line protocol format ## v0.1.4 [2015-07-09] ### Features - [#56](https://github.com/influxdata/telegraf/pull/56): Update README for Kafka plugin. Thanks @EmilS! ### Bug Fixes - [#50](https://github.com/influxdata/telegraf/pull/50): Fix init.sh script to use telegraf directory. Thanks @jseriff! - [#52](https://github.com/influxdata/telegraf/pull/52): Update CHANGELOG to reference updated directory. Thanks @benfb! ## v0.1.3 [2015-07-05] ### Features - [#35](https://github.com/influxdata/telegraf/pull/35): Add Kafka plugin. Thanks @EmilS! - [#47](https://github.com/influxdata/telegraf/pull/47): Add RethinkDB plugin. Thanks @jipperinbham! ### Bug Fixes - [#45](https://github.com/influxdata/telegraf/pull/45): Skip disk tags that don't have a value. Thanks @jhofeditz! - [#43](https://github.com/influxdata/telegraf/pull/43): Fix bug in MySQL plugin. Thanks @marcosnils! ## v0.1.2 [2015-07-01] ### Features - [#12](https://github.com/influxdata/telegraf/pull/12): Add Linux/ARM to the list of built binaries. Thanks @voxxit! - [#14](https://github.com/influxdata/telegraf/pull/14): Clarify the S3 buckets that Telegraf is pushed to. - [#16](https://github.com/influxdata/telegraf/pull/16): Convert Redis to use URI, support Redis AUTH. Thanks @jipperinbham! - [#21](https://github.com/influxdata/telegraf/pull/21): Add memcached plugin. Thanks @Yukki! ### Bug Fixes - [#13](https://github.com/influxdata/telegraf/pull/13): Fix the packaging script. - [#19](https://github.com/influxdata/telegraf/pull/19): Add host name to metric tags. Thanks @sherifzain! - [#20](https://github.com/influxdata/telegraf/pull/20): Fix race condition with accumulator mutex. Thanks @nkatsaros! - [#23](https://github.com/influxdata/telegraf/pull/23): Change name of folder for packages. Thanks @colinrymer! - [#32](https://github.com/influxdata/telegraf/pull/32): Fix spelling of memoory -> memory. Thanks @tylernisonoff! ## v0.1.1 [2015-06-19] ### Release Notes This is the initial release of Telegraf. ================================================ FILE: CHANGELOG.md ================================================ # Changelog ## v1.38.1 [2026-03-16] ### Bugfixes - [#18491](https://github.com/influxdata/telegraf/pull/18491) `inputs.diskio` Sanitize newline characters in serial tag - [#18453](https://github.com/influxdata/telegraf/pull/18453) `inputs.docker` Emit status metrics for non-running containers - [#18513](https://github.com/influxdata/telegraf/pull/18513) `inputs.exec` Log stderr messages - [#18469](https://github.com/influxdata/telegraf/pull/18469) `inputs.mem` Use vm.Cached as vm.Buffers on OpenBSD - [#18455](https://github.com/influxdata/telegraf/pull/18455) `inputs.ping` Warn on using timeout parameter for native method - [#18471](https://github.com/influxdata/telegraf/pull/18471) `internal` Extract go version even more robustly - [#18509](https://github.com/influxdata/telegraf/pull/18509) `outputs.influxdb_v3` Remove duplicate timeout setting ### Dependency Updates - [#18486](https://github.com/influxdata/telegraf/pull/18486) `deps` Bump github.com/SAP/go-hdb from 1.15.1 to 1.15.2 - [#18477](https://github.com/influxdata/telegraf/pull/18477) `deps` Bump github.com/alitto/pond/v2 from 2.6.2 to 2.7.0 - [#18488](https://github.com/influxdata/telegraf/pull/18488) `deps` Bump github.com/apache/arrow-go/v18 from 18.5.1 to 18.5.2 - [#18487](https://github.com/influxdata/telegraf/pull/18487) `deps` Bump github.com/emiago/sipgo from 1.2.0 to 1.2.1 - [#18475](https://github.com/influxdata/telegraf/pull/18475) `deps` Bump github.com/gophercloud/gophercloud/v2 from 2.10.0 to 2.11.0 - [#18481](https://github.com/influxdata/telegraf/pull/18481) `deps` Bump github.com/nats-io/nats-server/v2 from 2.12.4 to 2.12.5 - [#18075](https://github.com/influxdata/telegraf/pull/18075) `deps` Bump go.opentelemetry.io/collector/pdata from 1.46.0 to 1.53.0 - [#18483](https://github.com/influxdata/telegraf/pull/18483) `deps` Bump go.opentelemetry.io/proto/otlp from 1.9.0 to 1.10.0 - [#18485](https://github.com/influxdata/telegraf/pull/18485) `deps` Bump go.opentelemetry.io/proto/otlp/collector/profiles/v1development from 0.2.0 to 0.3.0 - [#18478](https://github.com/influxdata/telegraf/pull/18478) `deps` Bump golang.org/x/oauth2 from 0.35.0 to 0.36.0 - [#18484](https://github.com/influxdata/telegraf/pull/18484) `deps` Bump golang.org/x/sync from 0.19.0 to 0.20.0 - [#18480](https://github.com/influxdata/telegraf/pull/18480) `deps` Bump google.golang.org/api from 0.269.0 to 0.270.0 - [#18490](https://github.com/influxdata/telegraf/pull/18490) `deps` Bump google.golang.org/grpc from 1.79.1 to 1.79.2 - [#18474](https://github.com/influxdata/telegraf/pull/18474) `deps` Bump the aws-sdk-go-v2 group with 11 updates - [#18473](https://github.com/influxdata/telegraf/pull/18473) `deps` Bump tj-actions/changed-files from 47.0.4 to 47.0.5 ## v1.38.0 [2026-03-09] ### Important Changes - PR [#17961](https://github.com/influxdata/telegraf/pull/17961) makes the **strict environment variable handling the default**! In case you need the old behavior you can opt-out using the `--non-strict-env-handling` flag. ### New Plugins - [#18183](https://github.com/influxdata/telegraf/pull/18183) `inputs.sip` Add plugin - [#18223](https://github.com/influxdata/telegraf/pull/18223) `outputs.influxdb_v3` Add plugin ### Features - [#18086](https://github.com/influxdata/telegraf/pull/18086) `agent` Optimise disk buffer strategy - [#18232](https://github.com/influxdata/telegraf/pull/18232) `common.opcua` Add string configuration option for node ID - [#18411](https://github.com/influxdata/telegraf/pull/18411) `common.opcua` Add support for datetime arrays - [#18181](https://github.com/influxdata/telegraf/pull/18181) `inputs.docker` Implement startup error behavior options - [#18425](https://github.com/influxdata/telegraf/pull/18425) `inputs.gnmi` Allow to emit delete metrics - [#18466](https://github.com/influxdata/telegraf/pull/18466) `inputs.mqtt_consumer` Add option for maximum reconnect interval - [#18063](https://github.com/influxdata/telegraf/pull/18063) `inputs.mysql` Add replication latency fields - [#18117](https://github.com/influxdata/telegraf/pull/18117) `inputs.mysql` Add wsrep provider options fields - [#18272](https://github.com/influxdata/telegraf/pull/18272) `inputs.mysql` Support encryption algorithm statistics if present - [#18134](https://github.com/influxdata/telegraf/pull/18134) `inputs.nftables` Monitor set element counts - [#18246](https://github.com/influxdata/telegraf/pull/18246) `inputs.nftables` Support named counters - [#18259](https://github.com/influxdata/telegraf/pull/18259) `inputs.statsd` Add support for Datadog service checks - [#18393](https://github.com/influxdata/telegraf/pull/18393) `outputs.health` Add option for setting default status - [#18415](https://github.com/influxdata/telegraf/pull/18415) `outputs.heartbeat` Add logging information - [#17577](https://github.com/influxdata/telegraf/pull/17577) `outputs.heartbeat` Add status evaluation - [#18305](https://github.com/influxdata/telegraf/pull/18305) `outputs.influxdb_v2` Add trace logging for write request timing - [#18422](https://github.com/influxdata/telegraf/pull/18422) `outputs.mongodb` Allow writing metrics in batches - [#17997](https://github.com/influxdata/telegraf/pull/17997) `outputs.opentelemetry` Support http protocol - [#18337](https://github.com/influxdata/telegraf/pull/18337) `outputs.redistimeseries` Add option to expire values - [#18339](https://github.com/influxdata/telegraf/pull/18339) `outputs.stackdriver` Add credentials file support for stackdriver output plugin - [#18341](https://github.com/influxdata/telegraf/pull/18341) `prometheus` Add UTF-8 metric and label name sanitization ### Bugfixes - [#18429](https://github.com/influxdata/telegraf/pull/18429) `common.opcua` Use configured timestamp format for datetime arrays - [#18381](https://github.com/influxdata/telegraf/pull/18381) `inputs.fibaro` Handle numeric value2 field from HC3 devices - [#18424](https://github.com/influxdata/telegraf/pull/18424) `inputs.http` Close gzip request body on early failures - [#18412](https://github.com/influxdata/telegraf/pull/18412) `inputs.internet_speed` Fix server_id_include filter logic - [#18452](https://github.com/influxdata/telegraf/pull/18452) `inputs.mqtt_consumer` Rely on paho auto-reconnect to restore message flow after network disruption - [#18392](https://github.com/influxdata/telegraf/pull/18392) `inputs.opcua_listener` Prevent panic on events with empty fields - [#18387](https://github.com/influxdata/telegraf/pull/18387) `inputs.smart` Include NVMe SMART data in smart_device measurement - [#18416](https://github.com/influxdata/telegraf/pull/18416) `outputs.influxdb` Prevent goroutine leak on gzip write failure - [#18418](https://github.com/influxdata/telegraf/pull/18418) `outputs.opentelemetry` Prevent goroutine leak on gzip write failure ### Dependency Updates - [#18436](https://github.com/influxdata/telegraf/pull/18436) `deps` Bump cloud.google.com/go/bigquery from 1.73.1 to 1.74.0 - [#18444](https://github.com/influxdata/telegraf/pull/18444) `deps` Bump github.com/IBM/sarama from 1.46.3 to 1.47.0 - [#18449](https://github.com/influxdata/telegraf/pull/18449) `deps` Bump github.com/SAP/go-hdb from 1.15.0 to 1.15.1 - [#18398](https://github.com/influxdata/telegraf/pull/18398) `deps` Bump github.com/antchfx/xpath from 1.3.5 to 1.3.6 - [#18442](https://github.com/influxdata/telegraf/pull/18442) `deps` Bump github.com/aws/smithy-go from 1.24.1 to 1.24.2 - [#18400](https://github.com/influxdata/telegraf/pull/18400) `deps` Bump github.com/hashicorp/consul/api from 1.33.2 to 1.33.3 - [#18438](https://github.com/influxdata/telegraf/pull/18438) `deps` Bump github.com/hashicorp/consul/api from 1.33.3 to 1.33.4 - [#18446](https://github.com/influxdata/telegraf/pull/18446) `deps` Bump github.com/lxc/incus/v6 from 6.21.0 to 6.22.0 - [#18441](https://github.com/influxdata/telegraf/pull/18441) `deps` Bump github.com/microsoft/go-mssqldb from 1.9.6 to 1.9.8 - [#18404](https://github.com/influxdata/telegraf/pull/18404) `deps` Bump github.com/nats-io/nats.go from 1.48.0 to 1.49.0 - [#18439](https://github.com/influxdata/telegraf/pull/18439) `deps` Bump github.com/prometheus/procfs from 0.19.2 to 0.20.1 - [#18440](https://github.com/influxdata/telegraf/pull/18440) `deps` Bump github.com/shirou/gopsutil/v4 from 4.26.1 to 4.26.2 - [#18402](https://github.com/influxdata/telegraf/pull/18402) `deps` Bump github.com/vmware/govmomi from 0.52.0 to 0.53.0 - [#18399](https://github.com/influxdata/telegraf/pull/18399) `deps` Bump go.step.sm/crypto from 0.76.0 to 0.76.2 - [#18450](https://github.com/influxdata/telegraf/pull/18450) `deps` Bump golang.org/x/net from 0.50.0 to 0.51.0 - [#18437](https://github.com/influxdata/telegraf/pull/18437) `deps` Bump google.golang.org/api from 0.266.0 to 0.269.0 - [#18448](https://github.com/influxdata/telegraf/pull/18448) `deps` Bump k8s.io/api from 0.35.1 to 0.35.2 - [#18447](https://github.com/influxdata/telegraf/pull/18447) `deps` Bump k8s.io/apimachinery from 0.35.1 to 0.35.2 - [#18443](https://github.com/influxdata/telegraf/pull/18443) `deps` Bump k8s.io/client-go from 0.35.1 to 0.35.2 - [#18403](https://github.com/influxdata/telegraf/pull/18403) `deps` Bump modernc.org/sqlite from 1.45.0 to 1.46.1 - [#18397](https://github.com/influxdata/telegraf/pull/18397) `deps` Bump the aws-sdk-go-v2 group with 11 updates - [#18435](https://github.com/influxdata/telegraf/pull/18435) `deps` Bump the aws-sdk-go-v2 group with 2 updates - [#18396](https://github.com/influxdata/telegraf/pull/18396) `deps` Bump tj-actions/changed-files from 47.0.2 to 47.0.4 ## v1.37.3 [2026-02-23] ### Bugfixes - [#18195](https://github.com/influxdata/telegraf/pull/18195) `common.jolokia2` Add Jolokia 2.x compatibility for proxy target tag - [#18378](https://github.com/influxdata/telegraf/pull/18378) `common.opcua` Include node ID in duplicate metric check - [#18335](https://github.com/influxdata/telegraf/pull/18335) `inputs.disk` Preserve device tag for virtual filesystems - [#18374](https://github.com/influxdata/telegraf/pull/18374) `inputs.docker` Remove pre-filtering of states - [#18383](https://github.com/influxdata/telegraf/pull/18383) `inputs.docker_log` Remove pre-filtering of states - [#18347](https://github.com/influxdata/telegraf/pull/18347) `inputs.jenkins` Report all concurrent builds - [#18377](https://github.com/influxdata/telegraf/pull/18377) `inputs.prometheus` Add thread safety and proper cleanup for shared informer factories - [#18304](https://github.com/influxdata/telegraf/pull/18304) `inputs.prometheus` Cleanup shared informers on stop - [#18367](https://github.com/influxdata/telegraf/pull/18367) `inputs.upsd` Stop silently dropping mandatory variables from additional_fields - [#18386](https://github.com/influxdata/telegraf/pull/18386) `serializers.template` Unwrap tracking metrics ### Dependency Updates - [#18354](https://github.com/influxdata/telegraf/pull/18354) `deps` Bump cloud.google.com/go/auth from 0.18.1 to 0.18.2 - [#18324](https://github.com/influxdata/telegraf/pull/18324) `deps` Bump cloud.google.com/go/bigquery from 1.72.0 to 1.73.1 - [#18319](https://github.com/influxdata/telegraf/pull/18319) `deps` Bump cloud.google.com/go/pubsub/v2 from 2.3.0 to 2.4.0 - [#18298](https://github.com/influxdata/telegraf/pull/18298) `deps` Bump cloud.google.com/go/storage from 1.59.1 to 1.59.2 - [#18361](https://github.com/influxdata/telegraf/pull/18361) `deps` Bump cloud.google.com/go/storage from 1.59.2 to 1.60.0 - [#18376](https://github.com/influxdata/telegraf/pull/18376) `deps` Bump filippo.io/edwards25519 from 1.1.0 to 1.1.1 - [#18292](https://github.com/influxdata/telegraf/pull/18292) `deps` Bump github.com/ClickHouse/clickhouse-go/v2 from 2.42.0 to 2.43.0 - [#18295](https://github.com/influxdata/telegraf/pull/18295) `deps` Bump github.com/IBM/nzgo/v12 from 12.0.10 to 12.0.11 - [#18297](https://github.com/influxdata/telegraf/pull/18297) `deps` Bump github.com/SAP/go-hdb from 1.14.18 to 1.14.19 - [#18328](https://github.com/influxdata/telegraf/pull/18328) `deps` Bump github.com/SAP/go-hdb from 1.14.19 to 1.14.22 - [#18364](https://github.com/influxdata/telegraf/pull/18364) `deps` Bump github.com/SAP/go-hdb from 1.14.22 to 1.15.0 - [#18358](https://github.com/influxdata/telegraf/pull/18358) `deps` Bump github.com/alitto/pond/v2 from 2.6.0 to 2.6.2 - [#18289](https://github.com/influxdata/telegraf/pull/18289) `deps` Bump github.com/aws/aws-sdk-go-v2/service/ec2 from 1.282.0 to 1.285.0 - [#18362](https://github.com/influxdata/telegraf/pull/18362) `deps` Bump github.com/coocood/freecache from 1.2.4 to 1.2.5 - [#18299](https://github.com/influxdata/telegraf/pull/18299) `deps` Bump github.com/coreos/go-systemd/v22 from 22.6.0 to 22.7.0 - [#18294](https://github.com/influxdata/telegraf/pull/18294) `deps` Bump github.com/golang-jwt/jwt/v5 from 5.3.0 to 5.3.1 - [#18291](https://github.com/influxdata/telegraf/pull/18291) `deps` Bump github.com/google/cel-go from 0.26.1 to 0.27.0 - [#18330](https://github.com/influxdata/telegraf/pull/18330) `deps` Bump github.com/klauspost/compress from 1.18.3 to 1.18.4 - [#18268](https://github.com/influxdata/telegraf/pull/18268) `deps` Bump github.com/lxc/incus/v6 from 6.20.0 to 6.21.0 - [#18296](https://github.com/influxdata/telegraf/pull/18296) `deps` Bump github.com/nats-io/nats-server/v2 from 2.12.3 to 2.12.4 - [#18356](https://github.com/influxdata/telegraf/pull/18356) `deps` Bump github.com/p4lang/p4runtime from 1.4.1 to 1.5.0 - [#18326](https://github.com/influxdata/telegraf/pull/18326) `deps` Bump github.com/prometheus-community/pro-bing from 0.7.0 to 0.8.0 - [#18355](https://github.com/influxdata/telegraf/pull/18355) `deps` Bump github.com/redis/go-redis/v9 from 9.17.3 to 9.18.0 - [#18293](https://github.com/influxdata/telegraf/pull/18293) `deps` Bump github.com/shirou/gopsutil/v4 from 4.25.11 to 4.26.1 - [#18331](https://github.com/influxdata/telegraf/pull/18331) `deps` Bump github.com/snowflakedb/gosnowflake from 1.18.1 to 1.19.0 - [#18323](https://github.com/influxdata/telegraf/pull/18323) `deps` Bump github.com/vertica/vertica-sql-go from 1.3.4 to 1.3.5 - [#18290](https://github.com/influxdata/telegraf/pull/18290) `deps` Bump go.mongodb.org/mongo-driver from 1.17.7 to 1.17.8 - [#18332](https://github.com/influxdata/telegraf/pull/18332) `deps` Bump go.mongodb.org/mongo-driver from 1.17.8 to 1.17.9 - [#18318](https://github.com/influxdata/telegraf/pull/18318) `deps` Bump golang.org/x/mod from 0.32.0 to 0.33.0 - [#18322](https://github.com/influxdata/telegraf/pull/18322) `deps` Bump golang.org/x/net from 0.49.0 to 0.50.0 - [#18333](https://github.com/influxdata/telegraf/pull/18333) `deps` Bump golang.org/x/term from 0.39.0 to 0.40.0 - [#18329](https://github.com/influxdata/telegraf/pull/18329) `deps` Bump golang.org/x/text from 0.33.0 to 0.34.0 - [#18300](https://github.com/influxdata/telegraf/pull/18300) `deps` Bump google.golang.org/api from 0.262.0 to 0.264.0 - [#18317](https://github.com/influxdata/telegraf/pull/18317) `deps` Bump google.golang.org/api from 0.264.0 to 0.265.0 - [#18357](https://github.com/influxdata/telegraf/pull/18357) `deps` Bump google.golang.org/grpc from 1.78.0 to 1.79.1 - [#18363](https://github.com/influxdata/telegraf/pull/18363) `deps` Bump k8s.io/client-go from 0.35.0 to 0.35.1 - [#18327](https://github.com/influxdata/telegraf/pull/18327) `deps` Bump modernc.org/sqlite from 1.44.3 to 1.45.0 - [#18288](https://github.com/influxdata/telegraf/pull/18288) `deps` Bump super-linter/super-linter from 8.3.2 to 8.4.0 - [#18315](https://github.com/influxdata/telegraf/pull/18315) `deps` Bump super-linter/super-linter from 8.4.0 to 8.5.0 - [#18353](https://github.com/influxdata/telegraf/pull/18353) `deps` Bump the aws-sdk-go-v2 group with 2 updates - [#18316](https://github.com/influxdata/telegraf/pull/18316) `deps` Bump the aws-sdk-go-v2 group with 2 updates - [#18314](https://github.com/influxdata/telegraf/pull/18314) `deps` Bump tj-actions/changed-files from 47.0.1 to 47.0.2 - [#18372](https://github.com/influxdata/telegraf/pull/18372) `deps` Update github.com/pion/dtls from v2 to v3 ## v1.37.2 [2026-02-02] ### Bugfixes - [#18254](https://github.com/influxdata/telegraf/pull/18254) `inputs.cisco_telemetry_mdt` Handle DME events correctly - [#18177](https://github.com/influxdata/telegraf/pull/18177) `inputs.nftables` Handle named counter references in JSON output - [#18233](https://github.com/influxdata/telegraf/pull/18233) `inputs.procstat` Handle newer versions of systemd correctly - [#18225](https://github.com/influxdata/telegraf/pull/18225) `inputs.statsd` Handle negative lengths - [#18278](https://github.com/influxdata/telegraf/pull/18278) `parsers.dropwizard` Correct sample config setting name for tag path ### Dependency Updates - [#18204](https://github.com/influxdata/telegraf/pull/18204) `deps` Bump aws-sdk-go-v2 group with 11 updates - [#18260](https://github.com/influxdata/telegraf/pull/18260) `deps` Bump aws-sdk-go-v2 group with 2 updates - [#18265](https://github.com/influxdata/telegraf/pull/18265) `deps` Bump cloud.google.com/go/auth from 0.18.0 to 0.18.1 - [#18212](https://github.com/influxdata/telegraf/pull/18212) `deps` Bump cloud.google.com/go/storage from 1.58.0 to 1.59.0 - [#18243](https://github.com/influxdata/telegraf/pull/18243) `deps` Bump cloud.google.com/go/storage from 1.59.0 to 1.59.1 - [#18237](https://github.com/influxdata/telegraf/pull/18237) `deps` Bump github.com/Azure/azure-sdk-for-go/sdk/azcore from 1.20.0 to 1.21.0 - [#18216](https://github.com/influxdata/telegraf/pull/18216) `deps` Bump github.com/SAP/go-hdb from 1.14.16 to 1.14.17 - [#18236](https://github.com/influxdata/telegraf/pull/18236) `deps` Bump github.com/SAP/go-hdb from 1.14.17 to 1.14.18 - [#18270](https://github.com/influxdata/telegraf/pull/18270) `deps` Bump github.com/apache/arrow-go/v18 from 18.5.0 to 18.5.1 - [#18235](https://github.com/influxdata/telegraf/pull/18235) `deps` Bump github.com/aws/aws-sdk-go-v2/service/ec2 from 1.279.1 to 1.279.2 - [#18206](https://github.com/influxdata/telegraf/pull/18206) `deps` Bump github.com/gosnmp/gosnmp from 1.43.1 to 1.43.2 - [#18240](https://github.com/influxdata/telegraf/pull/18240) `deps` Bump github.com/hashicorp/consul/api from 1.33.0 to 1.33.2 - [#18242](https://github.com/influxdata/telegraf/pull/18242) `deps` Bump github.com/klauspost/compress from 1.18.2 to 1.18.3 - [#18266](https://github.com/influxdata/telegraf/pull/18266) `deps` Bump github.com/linkedin/goavro/v2 from 2.14.1 to 2.15.0 - [#18239](https://github.com/influxdata/telegraf/pull/18239) `deps` Bump github.com/microsoft/go-mssqldb from 1.9.5 to 1.9.6 - [#18210](https://github.com/influxdata/telegraf/pull/18210) `deps` Bump github.com/miekg/dns from 1.1.69 to 1.1.70 - [#18264](https://github.com/influxdata/telegraf/pull/18264) `deps` Bump github.com/miekg/dns from 1.1.70 to 1.1.72 - [#18271](https://github.com/influxdata/telegraf/pull/18271) `deps` Bump github.com/redis/go-redis/v9 from 9.17.2 to 9.17.3 - [#18244](https://github.com/influxdata/telegraf/pull/18244) `deps` Bump github.com/sirupsen/logrus from 1.9.3 to 1.9.4 - [#18262](https://github.com/influxdata/telegraf/pull/18262) `deps` Bump github.com/tdrn-org/go-tr064 from 0.2.2 to 0.2.3 - [#18267](https://github.com/influxdata/telegraf/pull/18267) `deps` Bump go.mongodb.org/mongo-driver from 1.17.6 to 1.17.7 - [#18269](https://github.com/influxdata/telegraf/pull/18269) `deps` Bump go.step.sm/crypto from 0.75.0 to 0.76.0 - [#18215](https://github.com/influxdata/telegraf/pull/18215) `deps` Bump golang.org/x/crypto from 0.46.0 to 0.47.0 - [#18208](https://github.com/influxdata/telegraf/pull/18208) `deps` Bump golang.org/x/mod from 0.31.0 to 0.32.0 - [#18207](https://github.com/influxdata/telegraf/pull/18207) `deps` Bump golang.org/x/net from 0.48.0 to 0.49.0 - [#18217](https://github.com/influxdata/telegraf/pull/18217) `deps` Bump gonum.org/v1/gonum from 0.16.0 to 0.17.0 - [#18261](https://github.com/influxdata/telegraf/pull/18261) `deps` Bump google.golang.org/api from 0.257.0 to 0.262.0 - [#18213](https://github.com/influxdata/telegraf/pull/18213) `deps` Bump modernc.org/sqlite from 1.42.2 to 1.43.0 - [#18241](https://github.com/influxdata/telegraf/pull/18241) `deps` Bump modernc.org/sqlite from 1.43.0 to 1.44.2 - [#18263](https://github.com/influxdata/telegraf/pull/18263) `deps` Bump modernc.org/sqlite from 1.44.2 to 1.44.3 ## v1.37.1 [2026-01-12] ### Bugfixes - [#18138](https://github.com/influxdata/telegraf/pull/18138) `config` Add missing validation for labels in plugins - [#18108](https://github.com/influxdata/telegraf/pull/18108) `config` Make labels and selectors conform to specification - [#18144](https://github.com/influxdata/telegraf/pull/18144) `inputs.procstat` Isolate process cache per filter to fix tag collision - [#18191](https://github.com/influxdata/telegraf/pull/18191) `outputs.sql` Populate column cache for existing tables ### Dependency Updates - [#18125](https://github.com/influxdata/telegraf/pull/18125) `deps` Bump cloud.google.com/go/auth from 0.17.0 to 0.18.0 - [#18140](https://github.com/influxdata/telegraf/pull/18140) `deps` Bump cloud.google.com/go/auth from 0.17.0 to 0.18.0 - [#18094](https://github.com/influxdata/telegraf/pull/18094) `deps` Bump cloud.google.com/go/storage from 1.57.2 to 1.58.0 - [#18157](https://github.com/influxdata/telegraf/pull/18157) `deps` Bump github.com/BurntSushi/toml from 1.5.0 to 1.6.0 - [#18124](https://github.com/influxdata/telegraf/pull/18124) `deps` Bump github.com/ClickHouse/clickhouse-go/v2 from 2.41.0 to 2.42.0 - [#18101](https://github.com/influxdata/telegraf/pull/18101) `deps` Bump github.com/SAP/go-hdb from 1.14.13 to 1.14.14 - [#18153](https://github.com/influxdata/telegraf/pull/18153) `deps` Bump github.com/SAP/go-hdb from 1.14.14 to 1.14.15 - [#18199](https://github.com/influxdata/telegraf/pull/18199) `deps` Bump github.com/SAP/go-hdb from 1.14.15 to 1.14.16 - [#18123](https://github.com/influxdata/telegraf/pull/18123) `deps` Bump github.com/apache/arrow-go/v18 from 18.4.1 to 18.5.0 - [#18200](https://github.com/influxdata/telegraf/pull/18200) `deps` Bump github.com/apache/inlong/inlong-sdk/dataproxy-sdk-twins/dataproxy-sdk-golang from 1.0.6 to 1.0.7 - [#18197](https://github.com/influxdata/telegraf/pull/18197) `deps` Bump github.com/gophercloud/gophercloud/v2 from 2.9.0 to 2.10.0 - [#18198](https://github.com/influxdata/telegraf/pull/18198) `deps` Bump github.com/gosnmp/gosnmp from 1.42.1 to 1.43.1 - [#18132](https://github.com/influxdata/telegraf/pull/18132) `deps` Bump github.com/jedib0t/go-pretty/v6 from 6.7.5 to 6.7.7 - [#18169](https://github.com/influxdata/telegraf/pull/18169) `deps` Bump github.com/jedib0t/go-pretty/v6 from 6.7.7 to 6.7.8 - [#18189](https://github.com/influxdata/telegraf/pull/18189) `deps` Bump github.com/likexian/whois from 1.15.6 to 1.15.7 - [#18187](https://github.com/influxdata/telegraf/pull/18187) `deps` Bump github.com/likexian/whois-parser from 1.24.20 to 1.24.21 - [#18150](https://github.com/influxdata/telegraf/pull/18150) `deps` Bump github.com/lxc/incus/v6 from 6.19.1 to 6.20.0 - [#18130](https://github.com/influxdata/telegraf/pull/18130) `deps` Bump github.com/miekg/dns from 1.1.68 to 1.1.69 - [#18149](https://github.com/influxdata/telegraf/pull/18149) `deps` Bump github.com/nats-io/nats-server/v2 from 2.12.2 to 2.12.3 - [#18147](https://github.com/influxdata/telegraf/pull/18147) `deps` Bump github.com/nats-io/nats.go from 1.47.0 to 1.48.0 - [#18172](https://github.com/influxdata/telegraf/pull/18172) `deps` Bump github.com/netsampler/goflow2/v2 from 2.2.3 to 2.2.6 - [#18190](https://github.com/influxdata/telegraf/pull/18190) `deps` Bump github.com/prometheus/common from 0.67.4 to 0.67.5 - [#18102](https://github.com/influxdata/telegraf/pull/18102) `deps` Bump github.com/prometheus/prometheus from 0.307.3 to 0.308.0 - [#18155](https://github.com/influxdata/telegraf/pull/18155) `deps` Bump github.com/prometheus/prometheus from 0.308.0 to 0.308.1 - [#18129](https://github.com/influxdata/telegraf/pull/18129) `deps` Bump github.com/snowflakedb/gosnowflake from 1.18.0 to 1.18.1 - [#18103](https://github.com/influxdata/telegraf/pull/18103) `deps` Bump github.com/tinylib/msgp from 1.5.0 to 1.6.1 - [#18188](https://github.com/influxdata/telegraf/pull/18188) `deps` Bump github.com/tinylib/msgp from 1.6.1 to 1.6.3 - [#18186](https://github.com/influxdata/telegraf/pull/18186) `deps` Bump github.com/yuin/goldmark from 1.7.13 to 1.7.15 - [#18201](https://github.com/influxdata/telegraf/pull/18201) `deps` Bump github.com/yuin/goldmark from 1.7.15 to 1.7.16 - [#18092](https://github.com/influxdata/telegraf/pull/18092) `deps` Bump go.step.sm/crypto from 0.74.0 to 0.75.0 - [#18098](https://github.com/influxdata/telegraf/pull/18098) `deps` Bump golang.org/x/crypto from 0.45.0 to 0.46.0 - [#18100](https://github.com/influxdata/telegraf/pull/18100) `deps` Bump golang.org/x/mod from 0.30.0 to 0.31.0 - [#18127](https://github.com/influxdata/telegraf/pull/18127) `deps` Bump golang.org/x/net from 0.47.0 to 0.48.0 - [#18095](https://github.com/influxdata/telegraf/pull/18095) `deps` Bump golang.org/x/oauth2 from 0.33.0 to 0.34.0 - [#18093](https://github.com/influxdata/telegraf/pull/18093) `deps` Bump golang.org/x/sync from 0.18.0 to 0.19.0 - [#18096](https://github.com/influxdata/telegraf/pull/18096) `deps` Bump golang.org/x/sys from 0.38.0 to 0.39.0 - [#18099](https://github.com/influxdata/telegraf/pull/18099) `deps` Bump golang.org/x/term from 0.37.0 to 0.38.0 - [#18097](https://github.com/influxdata/telegraf/pull/18097) `deps` Bump golang.org/x/text from 0.31.0 to 0.32.0 - [#18104](https://github.com/influxdata/telegraf/pull/18104) `deps` Bump google.golang.org/api from 0.256.0 to 0.257.0 - [#18173](https://github.com/influxdata/telegraf/pull/18173) `deps` Bump google.golang.org/grpc from 1.77.0 to 1.78.0 - [#18131](https://github.com/influxdata/telegraf/pull/18131) `deps` Bump google.golang.org/protobuf from 1.36.10 to 1.36.11 - [#18128](https://github.com/influxdata/telegraf/pull/18128) `deps` Bump k8s.io/api from 0.34.2 to 0.34.3 - [#18148](https://github.com/influxdata/telegraf/pull/18148) `deps` Bump k8s.io/apimachinery from 0.34.3 to 0.35.0 - [#18126](https://github.com/influxdata/telegraf/pull/18126) `deps` Bump k8s.io/client-go from 0.34.2 to 0.34.3 - [#18154](https://github.com/influxdata/telegraf/pull/18154) `deps` Bump k8s.io/client-go from 0.34.3 to 0.35.0 - [#18152](https://github.com/influxdata/telegraf/pull/18152) `deps` Bump modernc.org/sqlite from 1.40.1 to 1.41.0 - [#18171](https://github.com/influxdata/telegraf/pull/18171) `deps` Bump modernc.org/sqlite from 1.41.0 to 1.42.2 - [#18170](https://github.com/influxdata/telegraf/pull/18170) `deps` Bump software.sslmate.com/src/go-pkcs12 from 0.6.0 to 0.7.0 - [#18158](https://github.com/influxdata/telegraf/pull/18158) `deps` Bump super-linter/super-linter from 8.3.0 to 8.3.1 - [#18174](https://github.com/influxdata/telegraf/pull/18174) `deps` Bump super-linter/super-linter from 8.3.1 to 8.3.2 - [#18091](https://github.com/influxdata/telegraf/pull/18091) `deps` Bump the aws-sdk-go-v2 group with 11 updates - [#18146](https://github.com/influxdata/telegraf/pull/18146) `deps` Bump the aws-sdk-go-v2 group with 3 updates - [#18121](https://github.com/influxdata/telegraf/pull/18121) `deps` Bump the aws-sdk-go-v2 group with 8 updates - [#18120](https://github.com/influxdata/telegraf/pull/18120) `deps` Bump tj-actions/changed-files from 47.0.0 to 47.0.1 - [#18115](https://github.com/influxdata/telegraf/pull/18115) `deps` Update golangci-lint to 2.7.2 ## v1.37.0 [2025-12-08] ### Important Changes - PR [#17966](https://github.com/influxdata/telegraf/pull/17966) introduced the strict handling of environment variables to prevent security issues. However, strict handling prevents using environment variables for non-string settings as the configuration before replacing the variables must be TOML conform. To provide security-by-default, we will change the **default behavior of Telegraf to the strict environment variable handling with v1.38.0**! Please make sure your configuration works in the now conditions by using the `--strict-env-handling` flag! If your configuration works in strict mode or you are not using environment variables, **do not** add the flag as it will be removed later and ignore the new warning at startup. In case you need the current behavior please add `--non-strict-env-handling` when starting Telegraf to prepare for the upcoming change! ### New Plugins - [#17993](https://github.com/influxdata/telegraf/pull/17993) `inputs.logql` Add plugin - [#17604](https://github.com/influxdata/telegraf/pull/17604) `inputs.nftables` Add plugin - [#17701](https://github.com/influxdata/telegraf/pull/17701) `inputs.promql` Add plugin - [#17831](https://github.com/influxdata/telegraf/pull/17831) `inputs.timex` Add plugin - [#17875](https://github.com/influxdata/telegraf/pull/17875) `outputs.arc` Add plugin - [#17998](https://github.com/influxdata/telegraf/pull/17998) `outputs.heartbeat` Add plugin - [#17921](https://github.com/influxdata/telegraf/pull/17921) `secretstores.googlecloud` Add plugin - [#17844](https://github.com/influxdata/telegraf/pull/17844) `secretstores.vault` Add plugin ### Features - [#18084](https://github.com/influxdata/telegraf/pull/18084) `config` Allow specifying env-handling mode for config check - [#17753](https://github.com/influxdata/telegraf/pull/17753) `config` Remove deprecated options - [#17915](https://github.com/influxdata/telegraf/pull/17915) `config` Store loaded sources - [#17080](https://github.com/influxdata/telegraf/pull/17080) `internal` Add support for parsing a timestamp in a TimeZone - [#17916](https://github.com/influxdata/telegraf/pull/17916) `logging` Allow registering callbacks for logging events - [#17749](https://github.com/influxdata/telegraf/pull/17749) `models` Implement collection of plugin-internal statistics for all types - [#18044](https://github.com/influxdata/telegraf/pull/18044) `common.socket` Add option to specify source IP restrictions - [#17760](https://github.com/influxdata/telegraf/pull/17760) `inputs.aerospike` Remove deprecated options - [#17759](https://github.com/influxdata/telegraf/pull/17759) `inputs.cpu` Add number of physical CPUs - [#17761](https://github.com/influxdata/telegraf/pull/17761) `inputs.gnmi` Remove deprecated options - [#17732](https://github.com/influxdata/telegraf/pull/17732) `inputs.influxdb_v2_listener` Implement ping endpoint - [#17733](https://github.com/influxdata/telegraf/pull/17733) `inputs.influxdb_v2_listener` Migrate to selfstat collector - [#17965](https://github.com/influxdata/telegraf/pull/17965) `inputs.ldap` Support external SASL bind (#17477) - [#17478](https://github.com/influxdata/telegraf/pull/17478) `inputs.ldap` Support ldapi protocol - [#17743](https://github.com/influxdata/telegraf/pull/17743) `inputs.modbus` Remove deprecated plugin option values - [#17762](https://github.com/influxdata/telegraf/pull/17762) `inputs.mongodb` Remove deprecated options - [#17792](https://github.com/influxdata/telegraf/pull/17792) `inputs.nats_consumer` Acknowledge messages on delivery - [#17710](https://github.com/influxdata/telegraf/pull/17710) `inputs.nats_consumer` Allow configuring Jetstream stream - [#17742](https://github.com/influxdata/telegraf/pull/17742) `inputs.net` Remove deprecated plugin option value - [#17624](https://github.com/influxdata/telegraf/pull/17624) `inputs.netflow` Add datatypes to PEN mapping - [#17697](https://github.com/influxdata/telegraf/pull/17697) `inputs.netflow` Add support for float32 datatype - [#17906](https://github.com/influxdata/telegraf/pull/17906) `inputs.opcua` Add namespace URI support - [#17825](https://github.com/influxdata/telegraf/pull/17825) `inputs.opcua` Add remote certificate trust configuration - [#17752](https://github.com/influxdata/telegraf/pull/17752) `inputs.opcua` Remove deprecated options - [#17991](https://github.com/influxdata/telegraf/pull/17991) `inputs.opcua` Support persistent self-signed client certificates - [#17633](https://github.com/influxdata/telegraf/pull/17633) `inputs.rabbitmq` Add type tag to queues - [#18080](https://github.com/influxdata/telegraf/pull/18080) `inputs.s7comm` Add option idle_timeout - [#17550](https://github.com/influxdata/telegraf/pull/17550) `inputs.smart` Parse vendor specific ratio values - [#17948](https://github.com/influxdata/telegraf/pull/17948) `inputs.snmp` Add option to stop polling on first error - [#17375](https://github.com/influxdata/telegraf/pull/17375) `inputs.sql` Add Vertica support - [#17924](https://github.com/influxdata/telegraf/pull/17924) `inputs.sqlserver` Add support for LPC and named-pipe protocols - [#17796](https://github.com/influxdata/telegraf/pull/17796) `inputs.sqlserver` Set pool size and idle connection - [#17872](https://github.com/influxdata/telegraf/pull/17872) `inputs.statsd` Improve performance - [#17763](https://github.com/influxdata/telegraf/pull/17763) `inputs.win_perf_counters` Remove deprecated options - [#17751](https://github.com/influxdata/telegraf/pull/17751) `inputs.zookeeper` Remove deprecated option - [#17950](https://github.com/influxdata/telegraf/pull/17950) `outputs.amon` Deprecate plugin - [#18062](https://github.com/influxdata/telegraf/pull/18062) `outputs.heartbeat` Add configuration information - [#18050](https://github.com/influxdata/telegraf/pull/18050) `outputs.heartbeat` Add optional statistics output - [#17869](https://github.com/influxdata/telegraf/pull/17869) `outputs.mongodb` Add PLAIN authentication support and validation - [#17755](https://github.com/influxdata/telegraf/pull/17755) `outputs.mqtt` Remove deprecated option - [#18048](https://github.com/influxdata/telegraf/pull/18048) `outputs.nats` Add secret-support for credentials - [#18007](https://github.com/influxdata/telegraf/pull/18007) `outputs.nats` Support nkey seed authentication - [#17409](https://github.com/influxdata/telegraf/pull/17409) `outputs.remotefile` Add compression for remotefile plugin - [#17764](https://github.com/influxdata/telegraf/pull/17764) `parsers.binary` Remove deprecated options - [#17754](https://github.com/influxdata/telegraf/pull/17754) `parsers.xpath` Remove deprecated options - [#17576](https://github.com/influxdata/telegraf/pull/17576) `processors.execd` Add log prefixing - [#17741](https://github.com/influxdata/telegraf/pull/17741) `processors.template` Remove deprecated template syntax ### Bugfixes - [#18064](https://github.com/influxdata/telegraf/pull/18064) `common.opcua` Skip file permission check on Windows - [#18012](https://github.com/influxdata/telegraf/pull/18012) `inputs.docker_log` Remove hard-coded API version - [#17960](https://github.com/influxdata/telegraf/pull/17960) `inputs.opcua` Add private key for certificate-based user authentication - [#18036](https://github.com/influxdata/telegraf/pull/18036) `inputs.procstat` Make port conversion more robust - [#18014](https://github.com/influxdata/telegraf/pull/18014) `outputs.influxdb_v2` Correct calculation of amount of batches for concurrent writes ### Dependency Updates - [#18051](https://github.com/influxdata/telegraf/pull/18051) `deps` Bump actions/checkout from 5 to 6 - [#18021](https://github.com/influxdata/telegraf/pull/18021) `deps` Bump cloud.google.com/go/storage from 1.57.1 to 1.57.2 - [#18055](https://github.com/influxdata/telegraf/pull/18055) `deps` Bump github.com/ClickHouse/clickhouse-go/v2 from 2.40.3 to 2.41.0 - [#18019](https://github.com/influxdata/telegraf/pull/18019) `deps` Bump github.com/SAP/go-hdb from 1.14.12 to 1.14.13 - [#18076](https://github.com/influxdata/telegraf/pull/18076) `deps` Bump github.com/alitto/pond/v2 from 2.5.0 to 2.6.0 - [#18074](https://github.com/influxdata/telegraf/pull/18074) `deps` Bump github.com/aws/smithy-go from 1.23.2 to 1.24.0 - [#18020](https://github.com/influxdata/telegraf/pull/18020) `deps` Bump github.com/gophercloud/gophercloud/v2 from 2.8.0 to 2.9.0 - [#17887](https://github.com/influxdata/telegraf/pull/17887) `deps` Bump github.com/hashicorp/consul/api from 1.32.4 to 1.33.0 - [#18024](https://github.com/influxdata/telegraf/pull/18024) `deps` Bump github.com/jedib0t/go-pretty/v6 from 6.7.1 to 6.7.2 - [#18056](https://github.com/influxdata/telegraf/pull/18056) `deps` Bump github.com/jedib0t/go-pretty/v6 from 6.7.2 to 6.7.5 - [#18072](https://github.com/influxdata/telegraf/pull/18072) `deps` Bump github.com/klauspost/compress from 1.18.1 to 1.18.2 - [#18071](https://github.com/influxdata/telegraf/pull/18071) `deps` Bump github.com/lxc/incus/v6 from 6.18.0 to 6.19.1 - [#18018](https://github.com/influxdata/telegraf/pull/18018) `deps` Bump github.com/microsoft/go-mssqldb from 1.9.3 to 1.9.4 - [#18017](https://github.com/influxdata/telegraf/pull/18017) `deps` Bump github.com/nats-io/nats-server/v2 from 2.12.1 to 2.12.2 - [#18054](https://github.com/influxdata/telegraf/pull/18054) `deps` Bump github.com/prometheus/common from 0.67.2 to 0.67.4 - [#18053](https://github.com/influxdata/telegraf/pull/18053) `deps` Bump github.com/redis/go-redis/v9 from 9.16.0 to 9.17.0 - [#18073](https://github.com/influxdata/telegraf/pull/18073) `deps` Bump github.com/redis/go-redis/v9 from 9.17.0 to 9.17.2 - [#18027](https://github.com/influxdata/telegraf/pull/18027) `deps` Bump github.com/safchain/ethtool from 0.6.2 to 0.7.0 - [#18070](https://github.com/influxdata/telegraf/pull/18070) `deps` Bump github.com/shirou/gopsutil/v4 from 4.25.10 to 4.25.11 - [#18057](https://github.com/influxdata/telegraf/pull/18057) `deps` Bump github.com/snowflakedb/gosnowflake from 1.17.0 to 1.18.0 - [#17815](https://github.com/influxdata/telegraf/pull/17815) `deps` Bump github.com/vertica/vertica-sql-go from 1.3.3 to 1.3.4 - [#18031](https://github.com/influxdata/telegraf/pull/18031) `deps` Bump go.opentelemetry.io/collector/pdata from 1.45.0 to 1.46.0 - [#18043](https://github.com/influxdata/telegraf/pull/18043) `deps` Bump golang.org/x/crypto from 0.44.0 to 0.45.0 - [#18023](https://github.com/influxdata/telegraf/pull/18023) `deps` Bump golang.org/x/mod from 0.29.0 to 0.30.0 - [#18029](https://github.com/influxdata/telegraf/pull/18029) `deps` Bump golang.org/x/net from 0.46.0 to 0.47.0 - [#18025](https://github.com/influxdata/telegraf/pull/18025) `deps` Bump google.golang.org/api from 0.255.0 to 0.256.0 - [#18058](https://github.com/influxdata/telegraf/pull/18058) `deps` Bump google.golang.org/grpc from 1.76.0 to 1.77.0 - [#18033](https://github.com/influxdata/telegraf/pull/18033) `deps` Bump k8s.io/client-go from 0.34.1 to 0.34.2 - [#18030](https://github.com/influxdata/telegraf/pull/18030) `deps` Bump modernc.org/sqlite from 1.40.0 to 1.40.1 - [#18069](https://github.com/influxdata/telegraf/pull/18069) `deps` Bump super-linter/super-linter from 8.2.1 to 8.3.0 - [#18052](https://github.com/influxdata/telegraf/pull/18052) `deps` Bump the aws-sdk-go-v2 group with 11 updates - [#18015](https://github.com/influxdata/telegraf/pull/18015) `deps` Bump the aws-sdk-go-v2 group with 9 updates ## v1.36.4 [2025-11-17] ### Bugfixes - [#17873](https://github.com/influxdata/telegraf/pull/17873) `common.kafka` Avoid API version requests for SASLv0 handshakes - [#17966](https://github.com/influxdata/telegraf/pull/17966) `config` Implement strict envvar handling to prevent insecure text replacement - [#17877](https://github.com/influxdata/telegraf/pull/17877) `inputs.kinesis_consumer` Ignore expired parent shards - [#17908](https://github.com/influxdata/telegraf/pull/17908) `inputs.tail` Handle missing read permissions for directory globbing - [#17968](https://github.com/influxdata/telegraf/pull/17968) `inputs.turbostat` Allow floating point intervals - [#17953](https://github.com/influxdata/telegraf/pull/17953) `inputs.zfs` Avoid panic by handling explicitly empty kstat metrics - [#17949](https://github.com/influxdata/telegraf/pull/17949) `outputs.influxdb_v2` Handle serialization errors correctly - [#17920](https://github.com/influxdata/telegraf/pull/17920) `outputs.loki` Sanitize colons in label names - [#17990](https://github.com/influxdata/telegraf/pull/17990) `outputs.sql` Mark table as found during initial existence check ### Dependency Updates - [#17935](https://github.com/influxdata/telegraf/pull/17935) `deps` Bump cloud.google.com/go/bigquery from 1.71.0 to 1.72.0 - [#17897](https://github.com/influxdata/telegraf/pull/17897) `deps` Bump cloud.google.com/go/pubsub/v2 from 2.2.1 to 2.3.0 - [#17943](https://github.com/influxdata/telegraf/pull/17943) `deps` Bump cloud.google.com/go/storage from 1.57.0 to 1.57.1 - [#17970](https://github.com/influxdata/telegraf/pull/17970) `deps` Bump github.com/Azure/azure-sdk-for-go/sdk/azcore from 1.19.1 to 1.20.0 - [#17973](https://github.com/influxdata/telegraf/pull/17973) `deps` Bump github.com/Azure/azure-sdk-for-go/sdk/azidentity from 1.13.0 to 1.13.1 - [#17901](https://github.com/influxdata/telegraf/pull/17901) `deps` Bump github.com/IBM/sarama from 1.46.2 to 1.46.3 - [#17889](https://github.com/influxdata/telegraf/pull/17889) `deps` Bump github.com/SAP/go-hdb from 1.14.7 to 1.14.9 - [#17977](https://github.com/influxdata/telegraf/pull/17977) `deps` Bump github.com/SAP/go-hdb from 1.14.9 to 1.14.12 - [#17981](https://github.com/influxdata/telegraf/pull/17981) `deps` Bump github.com/apache/iotdb-client-go from 1.3.4 to 1.3.5 - [#17900](https://github.com/influxdata/telegraf/pull/17900) `deps` Bump github.com/aws/aws-sdk-go-v2 from 1.39.3 to 1.39.4 - [#17899](https://github.com/influxdata/telegraf/pull/17899) `deps` Bump github.com/aws/aws-sdk-go-v2/config from 1.31.13 to 1.31.15 - [#17898](https://github.com/influxdata/telegraf/pull/17898) `deps` Bump github.com/aws/aws-sdk-go-v2/service/cloudwatch from 1.51.2 to 1.51.4 - [#17858](https://github.com/influxdata/telegraf/pull/17858) `deps` Bump github.com/aws/aws-sdk-go-v2/service/cloudwatchlogs from 1.58.2 to 1.58.3 - [#17892](https://github.com/influxdata/telegraf/pull/17892) `deps` Bump github.com/aws/aws-sdk-go-v2/service/cloudwatchlogs from 1.58.3 to 1.58.5 - [#17854](https://github.com/influxdata/telegraf/pull/17854) `deps` Bump github.com/aws/aws-sdk-go-v2/service/dynamodb from 1.51.0 to 1.51.1 - [#17890](https://github.com/influxdata/telegraf/pull/17890) `deps` Bump github.com/aws/aws-sdk-go-v2/service/dynamodb from 1.51.1 to 1.52.2 - [#17855](https://github.com/influxdata/telegraf/pull/17855) `deps` Bump github.com/aws/aws-sdk-go-v2/service/ec2 from 1.255.0 to 1.257.2 - [#17886](https://github.com/influxdata/telegraf/pull/17886) `deps` Bump github.com/aws/aws-sdk-go-v2/service/ec2 from 1.257.2 to 1.258.1 - [#17883](https://github.com/influxdata/telegraf/pull/17883) `deps` Bump github.com/aws/aws-sdk-go-v2/service/kinesis from 1.40.6 to 1.41.0 - [#17847](https://github.com/influxdata/telegraf/pull/17847) `deps` Bump github.com/aws/aws-sdk-go-v2/service/timestreamwrite from 1.35.5 to 1.35.6 - [#17891](https://github.com/influxdata/telegraf/pull/17891) `deps` Bump github.com/aws/aws-sdk-go-v2/service/timestreamwrite from 1.35.6 to 1.35.7 - [#17944](https://github.com/influxdata/telegraf/pull/17944) `deps` Bump github.com/aws/smithy-go from 1.23.1 to 1.23.2 - [#17978](https://github.com/influxdata/telegraf/pull/17978) `deps` Bump github.com/docker/docker from 28.5.1+incompatible to 28.5.2+incompatible - [#18009](https://github.com/influxdata/telegraf/pull/18009) `deps` Bump github.com/dvsekhvalnov/jose2go from 1.6.0 to 1.7.0 - [#17941](https://github.com/influxdata/telegraf/pull/17941) `deps` Bump github.com/gofrs/uuid/v5 from 5.3.2 to 5.4.0 - [#17927](https://github.com/influxdata/telegraf/pull/17927) `deps` Bump github.com/gopacket/gopacket from 1.4.0 to 1.5.0 - [#17988](https://github.com/influxdata/telegraf/pull/17988) `deps` Bump github.com/influxdata/toml from v0.0.0-20190415235208-270119a8ce65 to v0.0.0-20251106153700-c381e153d076 - [#17932](https://github.com/influxdata/telegraf/pull/17932) `deps` Bump github.com/jedib0t/go-pretty/v6 from 6.6.8 to 6.6.9 - [#17979](https://github.com/influxdata/telegraf/pull/17979) `deps` Bump github.com/jedib0t/go-pretty/v6 from 6.6.9 to 6.7.1 - [#17896](https://github.com/influxdata/telegraf/pull/17896) `deps` Bump github.com/linkedin/goavro/v2 from 2.14.0 to 2.14.1 - [#17942](https://github.com/influxdata/telegraf/pull/17942) `deps` Bump github.com/lxc/incus/v6 from 6.17.0 to 6.18.0 - [#17937](https://github.com/influxdata/telegraf/pull/17937) `deps` Bump github.com/prometheus/common from 0.67.1 to 0.67.2 - [#17885](https://github.com/influxdata/telegraf/pull/17885) `deps` Bump github.com/prometheus/procfs from 0.17.0 to 0.19.1 - [#17930](https://github.com/influxdata/telegraf/pull/17930) `deps` Bump github.com/prometheus/procfs from 0.19.1 to 0.19.2 - [#17894](https://github.com/influxdata/telegraf/pull/17894) `deps` Bump github.com/prometheus/prometheus from 0.307.1 to 0.307.2 - [#17928](https://github.com/influxdata/telegraf/pull/17928) `deps` Bump github.com/prometheus/prometheus from 0.307.2 to 0.307.3 - [#17895](https://github.com/influxdata/telegraf/pull/17895) `deps` Bump github.com/redis/go-redis/v9 from 9.14.1 to 9.16.0 - [#17939](https://github.com/influxdata/telegraf/pull/17939) `deps` Bump github.com/shirou/gopsutil/v4 from 4.25.9 to 4.25.10 - [#17976](https://github.com/influxdata/telegraf/pull/17976) `deps` Bump github.com/testcontainers/testcontainers-go from 0.39.0 to 0.40.0 - [#17983](https://github.com/influxdata/telegraf/pull/17983) `deps` Bump github.com/testcontainers/testcontainers-go/modules/azure from 0.39.0 to 0.40.0 - [#17972](https://github.com/influxdata/telegraf/pull/17972) `deps` Bump github.com/testcontainers/testcontainers-go/modules/kafka from 0.39.0 to 0.40.0 - [#17893](https://github.com/influxdata/telegraf/pull/17893) `deps` Bump github.com/tinylib/msgp from 1.4.0 to 1.5.0 - [#17934](https://github.com/influxdata/telegraf/pull/17934) `deps` Bump go.mongodb.org/mongo-driver from 1.17.4 to 1.17.6 - [#17865](https://github.com/influxdata/telegraf/pull/17865) `deps` Bump go.opentelemetry.io/collector/pdata from 1.43.0 to 1.44.0 - [#17945](https://github.com/influxdata/telegraf/pull/17945) `deps` Bump go.opentelemetry.io/collector/pdata from 1.44.0 to 1.45.0 - [#17933](https://github.com/influxdata/telegraf/pull/17933) `deps` Bump go.opentelemetry.io/proto/otlp from 1.8.0 to 1.9.0 - [#17938](https://github.com/influxdata/telegraf/pull/17938) `deps` Bump go.opentelemetry.io/proto/otlp/collector/profiles/v1development from 0.1.0 to 0.2.0 - [#17936](https://github.com/influxdata/telegraf/pull/17936) `deps` Bump go.step.sm/crypto from 0.72.0 to 0.73.0 - [#17974](https://github.com/influxdata/telegraf/pull/17974) `deps` Bump go.step.sm/crypto from 0.73.0 to 0.74.0 - [#17984](https://github.com/influxdata/telegraf/pull/17984) `deps` Bump golang.org/x/oauth2 from 0.32.0 to 0.33.0 - [#17980](https://github.com/influxdata/telegraf/pull/17980) `deps` Bump golang.org/x/sync from 0.17.0 to 0.18.0 - [#17971](https://github.com/influxdata/telegraf/pull/17971) `deps` Bump golang.org/x/sys from 0.37.0 to 0.38.0 - [#17884](https://github.com/influxdata/telegraf/pull/17884) `deps` Bump google.golang.org/api from 0.252.0 to 0.253.0 - [#17929](https://github.com/influxdata/telegraf/pull/17929) `deps` Bump google.golang.org/api from 0.253.0 to 0.254.0 - [#17975](https://github.com/influxdata/telegraf/pull/17975) `deps` Bump google.golang.org/api from 0.254.0 to 0.255.0 - [#17931](https://github.com/influxdata/telegraf/pull/17931) `deps` Bump modernc.org/sqlite from 1.39.1 to 1.40.0 - [#17926](https://github.com/influxdata/telegraf/pull/17926) `deps` Bump the aws-sdk-go-v2 group with 11 updates - [#17969](https://github.com/influxdata/telegraf/pull/17969) `deps` Bump the aws-sdk-go-v2 group with 11 updates ## v1.36.3 [2025-10-21] ### Bugfixes - [#17765](https://github.com/influxdata/telegraf/pull/17765) `inputs.chrony` Prevent race condition in concurrent gather calls - [#17634](https://github.com/influxdata/telegraf/pull/17634) `inputs.docker` Fix incorrect CPU usage_percent for Podman containers - [#17740](https://github.com/influxdata/telegraf/pull/17740) `inputs.kube_inventory` Prevent panic in endpoints' ready flag - [#17483](https://github.com/influxdata/telegraf/pull/17483) `inputs.smart` Correct exit_status for active vs standby drives - [#17617](https://github.com/influxdata/telegraf/pull/17617) `inputs.zfs` Parse field values according to provided type - [#17787](https://github.com/influxdata/telegraf/pull/17787) `outputs.nats` Unwrap wrapped metrics to avoid panic on missing Field method - [#17573](https://github.com/influxdata/telegraf/pull/17573) `parsers.csv` Support concurrent usage - [#17738](https://github.com/influxdata/telegraf/pull/17738) `secretstores.systemd` Handle dash version separator correctly ### Dependency Updates - [#17770](https://github.com/influxdata/telegraf/pull/17770) `deps` Bump cloud.google.com/go/bigquery from 1.70.0 to 1.71.0 - [#17821](https://github.com/influxdata/telegraf/pull/17821) `deps` Bump cloud.google.com/go/monitoring from 1.24.2 to 1.24.3 - [#17777](https://github.com/influxdata/telegraf/pull/17777) `deps` Bump cloud.google.com/go/pubsub/v2 from 2.0.0 to 2.2.0 - [#17846](https://github.com/influxdata/telegraf/pull/17846) `deps` Bump cloud.google.com/go/pubsub/v2 from 2.2.0 to 2.2.1 - [#17718](https://github.com/influxdata/telegraf/pull/17718) `deps` Bump cloud.google.com/go/storage from 1.56.2 to 1.57.0 - [#17805](https://github.com/influxdata/telegraf/pull/17805) `deps` Bump github.com/Azure/azure-sdk-for-go/sdk/azidentity from 1.12.0 to 1.13.0 - [#17784](https://github.com/influxdata/telegraf/pull/17784) `deps` Bump github.com/Azure/azure-sdk-for-go/sdk/messaging/azeventhubs from 1.4.0 to 2.0.0 - [#17810](https://github.com/influxdata/telegraf/pull/17810) `deps` Bump github.com/Azure/azure-sdk-for-go/sdk/messaging/azeventhubs/v2 from 2.0.0 to 2.0.1 - [#17804](https://github.com/influxdata/telegraf/pull/17804) `deps` Bump github.com/IBM/sarama from 1.46.1 to 1.46.2 - [#17724](https://github.com/influxdata/telegraf/pull/17724) `deps` Bump github.com/SAP/go-hdb from 1.14.4 to 1.14.5 - [#17808](https://github.com/influxdata/telegraf/pull/17808) `deps` Bump github.com/SAP/go-hdb from 1.14.5 to 1.14.6 - [#17866](https://github.com/influxdata/telegraf/pull/17866) `deps` Bump github.com/SAP/go-hdb from 1.14.6 to 1.14.7 - [#17822](https://github.com/influxdata/telegraf/pull/17822) `deps` Bump github.com/antchfx/xmlquery from 1.4.4 to 1.5.0 - [#17868](https://github.com/influxdata/telegraf/pull/17868) `deps` Bump github.com/aws/aws-sdk-go-v2/config from 1.31.12 to 1.31.13 - [#17730](https://github.com/influxdata/telegraf/pull/17730) `deps` Bump github.com/aws/aws-sdk-go-v2/config from 1.31.9 to 1.31.12 - [#17719](https://github.com/influxdata/telegraf/pull/17719) `deps` Bump github.com/aws/aws-sdk-go-v2/service/cloudwatch from 1.50.1 to 1.51.1 - [#17863](https://github.com/influxdata/telegraf/pull/17863) `deps` Bump github.com/aws/aws-sdk-go-v2/service/cloudwatch from 1.51.1 to 1.51.2 - [#17716](https://github.com/influxdata/telegraf/pull/17716) `deps` Bump github.com/aws/aws-sdk-go-v2/service/cloudwatchlogs from 1.58.0 to 1.58.2 - [#17715](https://github.com/influxdata/telegraf/pull/17715) `deps` Bump github.com/aws/aws-sdk-go-v2/service/dynamodb from 1.50.3 to 1.50.5 - [#17772](https://github.com/influxdata/telegraf/pull/17772) `deps` Bump github.com/aws/aws-sdk-go-v2/service/dynamodb from 1.50.5 to 1.51.0 - [#17714](https://github.com/influxdata/telegraf/pull/17714) `deps` Bump github.com/aws/aws-sdk-go-v2/service/ec2 from 1.253.0 to 1.254.1 - [#17814](https://github.com/influxdata/telegraf/pull/17814) `deps` Bump github.com/aws/aws-sdk-go-v2/service/ec2 from 1.254.1 to 1.255.0 - [#17728](https://github.com/influxdata/telegraf/pull/17728) `deps` Bump github.com/aws/aws-sdk-go-v2/service/kinesis from 1.40.3 to 1.40.5 - [#17848](https://github.com/influxdata/telegraf/pull/17848) `deps` Bump github.com/aws/aws-sdk-go-v2/service/kinesis from 1.40.5 to 1.40.6 - [#17723](https://github.com/influxdata/telegraf/pull/17723) `deps` Bump github.com/aws/aws-sdk-go-v2/service/timestreamwrite from 1.35.3 to 1.35.5 - [#17864](https://github.com/influxdata/telegraf/pull/17864) `deps` Bump github.com/aws/smithy-go from 1.23.0 to 1.23.1 - [#17849](https://github.com/influxdata/telegraf/pull/17849) `deps` Bump github.com/bluenviron/gomavlib/v3 from 3.2.1 to 3.3.0 - [#17774](https://github.com/influxdata/telegraf/pull/17774) `deps` Bump github.com/docker/docker from 28.4.0+incompatible to 28.5.0+incompatible - [#17816](https://github.com/influxdata/telegraf/pull/17816) `deps` Bump github.com/docker/docker from 28.5.0+incompatible to 28.5.1+incompatible - [#17769](https://github.com/influxdata/telegraf/pull/17769) `deps` Bump github.com/go-ldap/ldap/v3 from 3.4.11 to 3.4.12 - [#17775](https://github.com/influxdata/telegraf/pull/17775) `deps` Bump github.com/go-logfmt/logfmt from 0.6.0 to 0.6.1 - [#17727](https://github.com/influxdata/telegraf/pull/17727) `deps` Bump github.com/hashicorp/consul/api from 1.32.3 to 1.32.4 - [#17862](https://github.com/influxdata/telegraf/pull/17862) `deps` Bump github.com/klauspost/compress from 1.18.0 to 1.18.1 - [#17773](https://github.com/influxdata/telegraf/pull/17773) `deps` Bump github.com/leodido/go-syslog/v4 from 4.2.1-0.20250421191238-de2e76af1251 to 4.3.0 - [#17729](https://github.com/influxdata/telegraf/pull/17729) `deps` Bump github.com/lxc/incus/v6 from 6.16.0 to 6.17.0 - [#17860](https://github.com/influxdata/telegraf/pull/17860) `deps` Bump github.com/nats-io/nats-server/v2 from 2.12.0 to 2.12.1 - [#17766](https://github.com/influxdata/telegraf/pull/17766) `deps` Bump github.com/nats-io/nats.go from 1.46.0 to 1.46.1 - [#17851](https://github.com/influxdata/telegraf/pull/17851) `deps` Bump github.com/nats-io/nats.go from 1.46.1 to 1.47.0 - [#17813](https://github.com/influxdata/telegraf/pull/17813) `deps` Bump github.com/prometheus/common from 0.66.1 to 0.67.1 - [#17867](https://github.com/influxdata/telegraf/pull/17867) `deps` Bump github.com/prometheus/prometheus from 0.306.0 to 0.307.1 - [#17861](https://github.com/influxdata/telegraf/pull/17861) `deps` Bump github.com/redis/go-redis/v9 from 9.14.0 to 9.14.1 - [#17767](https://github.com/influxdata/telegraf/pull/17767) `deps` Bump github.com/shirou/gopsutil/v4 from 4.25.8 to 4.25.9 - [#17725](https://github.com/influxdata/telegraf/pull/17725) `deps` Bump github.com/snowflakedb/gosnowflake from 0.0.0-20250911095445-20c4d105d9a0 to 1.17.0 - [#17776](https://github.com/influxdata/telegraf/pull/17776) `deps` Bump go.opentelemetry.io/collector/pdata from 1.42.0 to 1.43.0 - [#17817](https://github.com/influxdata/telegraf/pull/17817) `deps` Bump go.step.sm/crypto from 0.70.0 to 0.71.0 - [#17857](https://github.com/influxdata/telegraf/pull/17857) `deps` Bump go.step.sm/crypto from 0.71.0 to 0.72.0 - [#17820](https://github.com/influxdata/telegraf/pull/17820) `deps` Bump golang.org/x/crypto from 0.42.0 to 0.43.0 - [#17806](https://github.com/influxdata/telegraf/pull/17806) `deps` Bump golang.org/x/mod from 0.28.0 to 0.29.0 - [#17819](https://github.com/influxdata/telegraf/pull/17819) `deps` Bump golang.org/x/net from 0.44.0 to 0.46.0 - [#17818](https://github.com/influxdata/telegraf/pull/17818) `deps` Bump golang.org/x/oauth2 from 0.31.0 to 0.32.0 - [#17823](https://github.com/influxdata/telegraf/pull/17823) `deps` Bump golang.org/x/sys from 0.36.0 to 0.37.0 - [#17717](https://github.com/influxdata/telegraf/pull/17717) `deps` Bump google.golang.org/api from 0.249.0 to 0.250.0 - [#17778](https://github.com/influxdata/telegraf/pull/17778) `deps` Bump google.golang.org/api from 0.250.0 to 0.251.0 - [#17807](https://github.com/influxdata/telegraf/pull/17807) `deps` Bump google.golang.org/api from 0.251.0 to 0.252.0 - [#17771](https://github.com/influxdata/telegraf/pull/17771) `deps` Bump google.golang.org/grpc from 1.75.1 to 1.76.0 - [#17768](https://github.com/influxdata/telegraf/pull/17768) `deps` Bump google.golang.org/protobuf from 1.36.9 to 1.36.10 - [#17811](https://github.com/influxdata/telegraf/pull/17811) `deps` Bump modernc.org/sqlite from 1.39.0 to 1.39.1 - [#17779](https://github.com/influxdata/telegraf/pull/17779) `deps` Bump super-linter/super-linter from 8.1.0 to 8.2.0 - [#17853](https://github.com/influxdata/telegraf/pull/17853) `deps` Bump super-linter/super-linter from 8.2.0 to 8.2.1 - [#17610](https://github.com/influxdata/telegraf/pull/17610) `deps` Switch to maintained yaml library - [#17794](https://github.com/influxdata/telegraf/pull/17794) `deps` Update golangci-lint to 2.5.0 ## v1.36.2 [2025-09-29] ### Bugfixes - [#17609](https://github.com/influxdata/telegraf/pull/17609) `filter` Handle multiple conditions correctly - [#17552](https://github.com/influxdata/telegraf/pull/17552) `inputs.procstat` Use correct values for disk_read_bytes, disk_write_bytes on Linux - [#17613](https://github.com/influxdata/telegraf/pull/17613) `inputs.tail` Fix data race when cleaning up unused tailers ### Dependency Updates - [#17599](https://github.com/influxdata/telegraf/pull/17599) `deps` Bump actions/setup-go from 5 to 6 - [#17650](https://github.com/influxdata/telegraf/pull/17650) `deps` Bump cloud.google.com/go/bigquery from 1.69.0 to 1.70.0 - [#17654](https://github.com/influxdata/telegraf/pull/17654) `deps` Bump cloud.google.com/go/storage from 1.56.1 to 1.56.2 - [#17688](https://github.com/influxdata/telegraf/pull/17688) `deps` Bump github.com/Azure/azure-sdk-for-go/sdk/azcore from 1.19.0 to 1.19.1 - [#17683](https://github.com/influxdata/telegraf/pull/17683) `deps` Bump github.com/Azure/azure-sdk-for-go/sdk/azidentity from 1.11.0 to 1.12.0 - [#17644](https://github.com/influxdata/telegraf/pull/17644) `deps` Bump github.com/ClickHouse/clickhouse-go/v2 from 2.40.1 to 2.40.3 - [#17522](https://github.com/influxdata/telegraf/pull/17522) `deps` Bump github.com/IBM/sarama from 1.45.2 to 1.46.0 - [#17682](https://github.com/influxdata/telegraf/pull/17682) `deps` Bump github.com/IBM/sarama from 1.46.0 to 1.46.1 - [#17636](https://github.com/influxdata/telegraf/pull/17636) `deps` Bump github.com/SAP/go-hdb from 1.14.0 to 1.14.3 - [#17677](https://github.com/influxdata/telegraf/pull/17677) `deps` Bump github.com/SAP/go-hdb from 1.14.3 to 1.14.4 - [#17647](https://github.com/influxdata/telegraf/pull/17647) `deps` Bump github.com/apache/arrow-go/v18 from 18.4.0 to 18.4.1 - [#17587](https://github.com/influxdata/telegraf/pull/17587) `deps` Bump github.com/apache/inlong/inlong-sdk/dataproxy-sdk-twins/dataproxy-sdk-golang from 1.0.5 to 1.0.6 - [#17642](https://github.com/influxdata/telegraf/pull/17642) `deps` Bump github.com/awnumar/memguard from 0.22.5 to 0.23.0 - [#17693](https://github.com/influxdata/telegraf/pull/17693) `deps` Bump github.com/aws/aws-sdk-go-v2/config from 1.31.4 to 1.31.9 - [#17588](https://github.com/influxdata/telegraf/pull/17588) `deps` Bump github.com/aws/aws-sdk-go-v2/feature/ec2/imds from 1.18.5 to 1.18.7 - [#17641](https://github.com/influxdata/telegraf/pull/17641) `deps` Bump github.com/aws/aws-sdk-go-v2/service/cloudwatch from 1.48.2 to 1.50.1 - [#17656](https://github.com/influxdata/telegraf/pull/17656) `deps` Bump github.com/aws/aws-sdk-go-v2/service/cloudwatchlogs from 1.57.0 to 1.57.4 - [#17690](https://github.com/influxdata/telegraf/pull/17690) `deps` Bump github.com/aws/aws-sdk-go-v2/service/cloudwatchlogs from 1.57.4 to 1.58.0 - [#17596](https://github.com/influxdata/telegraf/pull/17596) `deps` Bump github.com/aws/aws-sdk-go-v2/service/dynamodb from 1.49.1 to 1.50.2 - [#17649](https://github.com/influxdata/telegraf/pull/17649) `deps` Bump github.com/aws/aws-sdk-go-v2/service/dynamodb from 1.50.2 to 1.50.3 - [#17583](https://github.com/influxdata/telegraf/pull/17583) `deps` Bump github.com/aws/aws-sdk-go-v2/service/ec2 from 1.246.0 to 1.251.1 - [#17640](https://github.com/influxdata/telegraf/pull/17640) `deps` Bump github.com/aws/aws-sdk-go-v2/service/ec2 from 1.251.1 to 1.251.2 - [#17681](https://github.com/influxdata/telegraf/pull/17681) `deps` Bump github.com/aws/aws-sdk-go-v2/service/ec2 from 1.251.2 to 1.253.0 - [#17595](https://github.com/influxdata/telegraf/pull/17595) `deps` Bump github.com/aws/aws-sdk-go-v2/service/kinesis from 1.39.1 to 1.40.2 - [#17646](https://github.com/influxdata/telegraf/pull/17646) `deps` Bump github.com/aws/aws-sdk-go-v2/service/kinesis from 1.40.2 to 1.40.3 - [#17638](https://github.com/influxdata/telegraf/pull/17638) `deps` Bump github.com/aws/aws-sdk-go-v2/service/sts from 1.38.1 to 1.38.4 - [#17582](https://github.com/influxdata/telegraf/pull/17582) `deps` Bump github.com/aws/aws-sdk-go-v2/service/timestreamwrite from 1.34.2 to 1.35.2 - [#17658](https://github.com/influxdata/telegraf/pull/17658) `deps` Bump github.com/aws/aws-sdk-go-v2/service/timestreamwrite from 1.35.2 to 1.35.3 - [#17673](https://github.com/influxdata/telegraf/pull/17673) `deps` Bump github.com/cloudevents/sdk-go/v2 from 2.16.1 to 2.16.2 - [#17601](https://github.com/influxdata/telegraf/pull/17601) `deps` Bump github.com/docker/docker from 28.3.3+incompatible to 28.4.0+incompatible - [#17653](https://github.com/influxdata/telegraf/pull/17653) `deps` Bump github.com/eclipse/paho.golang from 0.22.0 to 0.23.0 - [#17680](https://github.com/influxdata/telegraf/pull/17680) `deps` Bump github.com/eclipse/paho.mqtt.golang from 1.5.0 to 1.5.1 - [#17597](https://github.com/influxdata/telegraf/pull/17597) `deps` Bump github.com/google/cel-go from 0.26.0 to 0.26.1 - [#17689](https://github.com/influxdata/telegraf/pull/17689) `deps` Bump github.com/hashicorp/consul/api from 1.32.1 to 1.32.3 - [#17651](https://github.com/influxdata/telegraf/pull/17651) `deps` Bump github.com/lxc/incus/v6 from 6.15.0 to 6.16.0 - [#17635](https://github.com/influxdata/telegraf/pull/17635) `deps` Bump github.com/nats-io/nats-server/v2 from 2.11.8 to 2.11.9 - [#17670](https://github.com/influxdata/telegraf/pull/17670) `deps` Bump github.com/nats-io/nats-server/v2 from 2.11.9 to 2.12.0 - [#17675](https://github.com/influxdata/telegraf/pull/17675) `deps` Bump github.com/nats-io/nats.go from 1.45.0 to 1.46.0 - [#17674](https://github.com/influxdata/telegraf/pull/17674) `deps` Bump github.com/peterbourgon/unixtransport from 0.0.6 to 0.0.7 - [#17593](https://github.com/influxdata/telegraf/pull/17593) `deps` Bump github.com/prometheus/client_golang from 1.23.0 to 1.23.2 - [#17585](https://github.com/influxdata/telegraf/pull/17585) `deps` Bump github.com/prometheus/common from 0.65.0 to 0.66.1 - [#17685](https://github.com/influxdata/telegraf/pull/17685) `deps` Bump github.com/prometheus/prometheus from 0.305.0 to 0.306.0 - [#17329](https://github.com/influxdata/telegraf/pull/17329) `deps` Bump github.com/prometheus/prometheus from 0.54.1 to 0.305.0 - [#17645](https://github.com/influxdata/telegraf/pull/17645) `deps` Bump github.com/redis/go-redis/v9 from 9.12.1 to 9.14.0 - [#17567](https://github.com/influxdata/telegraf/pull/17567) `deps` Bump github.com/shirou/gopsutil/v4 from 4.25.7 to 4.25.8 - [#17699](https://github.com/influxdata/telegraf/pull/17699) `deps` Bump github.com/snowflakedb/gosnowflake from 1.16.0 to 0.0.0-20250911095445-20c4d105d9a0 - [#17590](https://github.com/influxdata/telegraf/pull/17590) `deps` Bump github.com/stretchr/testify from 1.10.0 to 1.11.1 - [#17687](https://github.com/influxdata/telegraf/pull/17687) `deps` Bump github.com/testcontainers/testcontainers-go from 0.38.0 to 0.39.0 - [#17676](https://github.com/influxdata/telegraf/pull/17676) `deps` Bump github.com/testcontainers/testcontainers-go/modules/azure from 0.38.0 to 0.39.0 - [#17671](https://github.com/influxdata/telegraf/pull/17671) `deps` Bump github.com/testcontainers/testcontainers-go/modules/kafka from 0.38.0 to 0.39.0 - [#17584](https://github.com/influxdata/telegraf/pull/17584) `deps` Bump github.com/tidwall/wal from 1.2.0 to 1.2.1 - [#17581](https://github.com/influxdata/telegraf/pull/17581) `deps` Bump github.com/tinylib/msgp from 1.3.0 to 1.4.0 - [#17591](https://github.com/influxdata/telegraf/pull/17591) `deps` Bump go.opentelemetry.io/collector/pdata from 1.39.0 to 1.41.0 - [#17686](https://github.com/influxdata/telegraf/pull/17686) `deps` Bump go.opentelemetry.io/collector/pdata from 1.41.0 to 1.42.0 - [#17602](https://github.com/influxdata/telegraf/pull/17602) `deps` Bump go.opentelemetry.io/proto/otlp from 1.7.0 to 1.8.0 - [#17652](https://github.com/influxdata/telegraf/pull/17652) `deps` Bump golang.org/x/crypto from 0.41.0 to 0.42.0 - [#17691](https://github.com/influxdata/telegraf/pull/17691) `deps` Bump golang.org/x/mod from 0.27.0 to 0.28.0 - [#17655](https://github.com/influxdata/telegraf/pull/17655) `deps` Bump golang.org/x/oauth2 from 0.30.0 to 0.31.0 - [#17589](https://github.com/influxdata/telegraf/pull/17589) `deps` Bump golang.org/x/sync from 0.16.0 to 0.17.0 - [#17580](https://github.com/influxdata/telegraf/pull/17580) `deps` Bump golang.org/x/term from 0.34.0 to 0.35.0 - [#17679](https://github.com/influxdata/telegraf/pull/17679) `deps` Bump google.golang.org/api from 0.248.0 to 0.249.0 - [#17639](https://github.com/influxdata/telegraf/pull/17639) `deps` Bump google.golang.org/grpc from 1.75.0 to 1.75.1 - [#17643](https://github.com/influxdata/telegraf/pull/17643) `deps` Bump google.golang.org/protobuf from 1.36.8 to 1.36.9 - [#17598](https://github.com/influxdata/telegraf/pull/17598) `deps` Bump k8s.io/api from 0.33.4 to 0.34.0 - [#17692](https://github.com/influxdata/telegraf/pull/17692) `deps` Bump k8s.io/client-go from 0.34.0 to 0.34.1 - [#17657](https://github.com/influxdata/telegraf/pull/17657) `deps` Bump modernc.org/sqlite from 1.38.2 to 1.39.0 - [#17648](https://github.com/influxdata/telegraf/pull/17648) `deps` Bump tj-actions/changed-files from 46.0.5 to 47.0.0 - [#17707](https://github.com/influxdata/telegraf/pull/17707) `deps` Remove collectd replacement ## v1.36.1 [2025-09-08] ### Bugfixes - [#17605](https://github.com/influxdata/telegraf/pull/17605) `outputs.influxdb` Fix crash on init ## v1.36.0 [2025-09-08] ### Important Changes - PR [#17355](https://github.com/influxdata/telegraf/pull/17355) changes the `profiles` support of `inputs.opentelemetry` from the `v1 experimental` to the `v1 development` as this experimental API is updated upstream. This will change the metric by for example removing the no-longer reported `frame_type`, `stack_trace_id`, `build_id`, and `build_id_type` fields. Also, the value format of other fields or tags might have changed. Please refer to the [OpenTelemetry documentation](https://opentelemetry.io/docs/) for more details. ### New Plugins - [#17368](https://github.com/influxdata/telegraf/pull/17368) `inputs.turbostat` Add plugin - [#17078](https://github.com/influxdata/telegraf/pull/17078) `processors.round` Add plugin ### Features - [#16705](https://github.com/influxdata/telegraf/pull/16705) `agent` Introduce labels and selectors to enable and disable plugins - [#17547](https://github.com/influxdata/telegraf/pull/17547) `inputs.influxdb_v2_listener` Add `/health` route - [#17312](https://github.com/influxdata/telegraf/pull/17312) `inputs.internal` Allow to collect statistics per plugin instance - [#17024](https://github.com/influxdata/telegraf/pull/17024) `inputs.lvm` Add sync_percent for lvm_logical_vol - [#17355](https://github.com/influxdata/telegraf/pull/17355) `inputs.opentelemetry` Upgrade otlp proto module - [#17156](https://github.com/influxdata/telegraf/pull/17156) `inputs.syslog` Add support for RFC3164 over TCP - [#17543](https://github.com/influxdata/telegraf/pull/17543) `inputs.syslog` Allow limiting message size in octet counting mode - [#17539](https://github.com/influxdata/telegraf/pull/17539) `inputs.x509_cert` Add support for Windows certificate stores - [#17244](https://github.com/influxdata/telegraf/pull/17244) `output.nats` Allow disabling stream creation for externally managed streams - [#17474](https://github.com/influxdata/telegraf/pull/17474) `outputs.elasticsearch` Support array headers and preserve commas in values - [#17548](https://github.com/influxdata/telegraf/pull/17548) `outputs.influxdb` Add internal statistics for written bytes - [#17213](https://github.com/influxdata/telegraf/pull/17213) `outputs.nats` Allow providing a subject layout - [#17346](https://github.com/influxdata/telegraf/pull/17346) `outputs.nats` Enable batch serialization with use_batch_format - [#17249](https://github.com/influxdata/telegraf/pull/17249) `outputs.sql` Allow sending batches of metrics in transactions - [#17510](https://github.com/influxdata/telegraf/pull/17510) `parsers.avro` Support record arrays at root level - [#17365](https://github.com/influxdata/telegraf/pull/17365) `plugins.snmp` Allow debug logging in gosnmp - [#17345](https://github.com/influxdata/telegraf/pull/17345) `selfstat` Implement collection of plugin-internal statistics ### Bugfixes - [#17411](https://github.com/influxdata/telegraf/pull/17411) `inputs.diskio` Handle counter wrapping in io fields - [#17551](https://github.com/influxdata/telegraf/pull/17551) `inputs.s7comm` Use correct value for string length with 'extra' parameter - [#17579](https://github.com/influxdata/telegraf/pull/17579) `internal` Extract go version more robustly - [#17566](https://github.com/influxdata/telegraf/pull/17566) `outputs` Retrigger batch-available-events only if at least one metric was written successfully - [#17381](https://github.com/influxdata/telegraf/pull/17381) `packaging` Rename rpm from loong64 to loongarch64 ### Dependency Updates - [#17519](https://github.com/influxdata/telegraf/pull/17519) `deps` Bump cloud.google.com/go/storage from 1.56.0 to 1.56.1 - [#17532](https://github.com/influxdata/telegraf/pull/17532) `deps` Bump github.com/Azure/azure-sdk-for-go/sdk/azcore from 1.18.2 to 1.19.0 - [#17494](https://github.com/influxdata/telegraf/pull/17494) `deps` Bump github.com/SAP/go-hdb from 1.13.12 to 1.14.0 - [#17488](https://github.com/influxdata/telegraf/pull/17488) `deps` Bump github.com/antchfx/xpath from 1.3.4 to 1.3.5 - [#17540](https://github.com/influxdata/telegraf/pull/17540) `deps` Bump github.com/aws/aws-sdk-go-v2/config from 1.31.0 to 1.31.2 - [#17538](https://github.com/influxdata/telegraf/pull/17538) `deps` Bump github.com/aws/aws-sdk-go-v2/credentials from 1.18.4 to 1.18.6 - [#17517](https://github.com/influxdata/telegraf/pull/17517) `deps` Bump github.com/aws/aws-sdk-go-v2/feature/ec2/imds from 1.18.3 to 1.18.4 - [#17528](https://github.com/influxdata/telegraf/pull/17528) `deps` Bump github.com/aws/aws-sdk-go-v2/service/cloudwatch from 1.48.0 to 1.48.2 - [#17536](https://github.com/influxdata/telegraf/pull/17536) `deps` Bump github.com/aws/aws-sdk-go-v2/service/cloudwatchlogs from 1.56.0 to 1.57.0 - [#17524](https://github.com/influxdata/telegraf/pull/17524) `deps` Bump github.com/aws/aws-sdk-go-v2/service/dynamodb from 1.46.0 to 1.49.1 - [#17493](https://github.com/influxdata/telegraf/pull/17493) `deps` Bump github.com/aws/aws-sdk-go-v2/service/ec2 from 1.242.0 to 1.244.0 - [#17527](https://github.com/influxdata/telegraf/pull/17527) `deps` Bump github.com/aws/aws-sdk-go-v2/service/ec2 from 1.244.0 to 1.246.0 - [#17530](https://github.com/influxdata/telegraf/pull/17530) `deps` Bump github.com/aws/aws-sdk-go-v2/service/kinesis from 1.38.0 to 1.39.1 - [#17534](https://github.com/influxdata/telegraf/pull/17534) `deps` Bump github.com/aws/aws-sdk-go-v2/service/sts from 1.37.0 to 1.38.0 - [#17513](https://github.com/influxdata/telegraf/pull/17513) `deps` Bump github.com/aws/aws-sdk-go-v2/service/timestreamwrite from 1.34.0 to 1.34.2 - [#17514](https://github.com/influxdata/telegraf/pull/17514) `deps` Bump github.com/coreos/go-systemd/v22 from 22.5.0 to 22.6.0 - [#17563](https://github.com/influxdata/telegraf/pull/17563) `deps` Bump github.com/facebook/time from 0.0.0-20240626113945-18207c5d8ddc to 0.0.0-20250903103710-a5911c32cdb9 - [#17526](https://github.com/influxdata/telegraf/pull/17526) `deps` Bump github.com/gophercloud/gophercloud/v2 from 2.7.0 to 2.8.0 - [#17537](https://github.com/influxdata/telegraf/pull/17537) `deps` Bump github.com/microsoft/go-mssqldb from 1.9.2 to 1.9.3 - [#17490](https://github.com/influxdata/telegraf/pull/17490) `deps` Bump github.com/nats-io/nats-server/v2 from 2.11.7 to 2.11.8 - [#17523](https://github.com/influxdata/telegraf/pull/17523) `deps` Bump github.com/nats-io/nats.go from 1.44.0 to 1.45.0 - [#17492](https://github.com/influxdata/telegraf/pull/17492) `deps` Bump github.com/safchain/ethtool from 0.5.10 to 0.6.2 - [#17486](https://github.com/influxdata/telegraf/pull/17486) `deps` Bump github.com/snowflakedb/gosnowflake from 1.15.0 to 1.16.0 - [#17541](https://github.com/influxdata/telegraf/pull/17541) `deps` Bump github.com/tidwall/wal from 1.1.8 to 1.2.0 - [#17529](https://github.com/influxdata/telegraf/pull/17529) `deps` Bump github.com/vmware/govmomi from 0.51.0 to 0.52.0 - [#17496](https://github.com/influxdata/telegraf/pull/17496) `deps` Bump go.opentelemetry.io/collector/pdata from 1.36.1 to 1.38.0 - [#17533](https://github.com/influxdata/telegraf/pull/17533) `deps` Bump go.opentelemetry.io/collector/pdata from 1.38.0 to 1.39.0 - [#17516](https://github.com/influxdata/telegraf/pull/17516) `deps` Bump go.step.sm/crypto from 0.69.0 to 0.70.0 - [#17499](https://github.com/influxdata/telegraf/pull/17499) `deps` Bump golang.org/x/mod from 0.26.0 to 0.27.0 - [#17497](https://github.com/influxdata/telegraf/pull/17497) `deps` Bump golang.org/x/net from 0.42.0 to 0.43.0 - [#17487](https://github.com/influxdata/telegraf/pull/17487) `deps` Bump google.golang.org/api from 0.246.0 to 0.247.0 - [#17531](https://github.com/influxdata/telegraf/pull/17531) `deps` Bump google.golang.org/api from 0.247.0 to 0.248.0 - [#17520](https://github.com/influxdata/telegraf/pull/17520) `deps` Bump google.golang.org/grpc from 1.74.2 to 1.75.0 - [#17518](https://github.com/influxdata/telegraf/pull/17518) `deps` Bump google.golang.org/protobuf from 1.36.7 to 1.36.8 - [#17498](https://github.com/influxdata/telegraf/pull/17498) `deps` Bump k8s.io/client-go from 0.33.3 to 0.33.4 - [#17515](https://github.com/influxdata/telegraf/pull/17515) `deps` Bump super-linter/super-linter from 8.0.0 to 8.1.0 ## v1.35.4 [2025-08-18] ### Bugfixes - [#17451](https://github.com/influxdata/telegraf/pull/17451) `agent` Update help message for CLI flag --test - [#17413](https://github.com/influxdata/telegraf/pull/17413) `inputs.gnmi` Handle empty updates in gnmi notification response - [#17445](https://github.com/influxdata/telegraf/pull/17445) `inputs.redfish` Log correct address on HTTP error ### Dependency Updates - [#17454](https://github.com/influxdata/telegraf/pull/17454) `deps` Bump actions/checkout from 4 to 5 - [#17404](https://github.com/influxdata/telegraf/pull/17404) `deps` Bump cloud.google.com/go/storage from 1.55.0 to 1.56.0 - [#17428](https://github.com/influxdata/telegraf/pull/17428) `deps` Bump github.com/Azure/azure-sdk-for-go/sdk/azcore from 1.18.1 to 1.18.2 - [#17455](https://github.com/influxdata/telegraf/pull/17455) `deps` Bump github.com/Azure/azure-sdk-for-go/sdk/azidentity from 1.10.1 to 1.11.0 - [#17383](https://github.com/influxdata/telegraf/pull/17383) `deps` Bump github.com/ClickHouse/clickhouse-go/v2 from 2.37.2 to 2.39.0 - [#17435](https://github.com/influxdata/telegraf/pull/17435) `deps` Bump github.com/ClickHouse/clickhouse-go/v2 from 2.39.0 to 2.40.1 - [#17393](https://github.com/influxdata/telegraf/pull/17393) `deps` Bump github.com/apache/arrow-go/v18 from 18.3.1 to 18.4.0 - [#17439](https://github.com/influxdata/telegraf/pull/17439) `deps` Bump github.com/apache/inlong/inlong-sdk/dataproxy-sdk-twins/dataproxy-sdk-golang from 1.0.3 to 1.0.5 - [#17437](https://github.com/influxdata/telegraf/pull/17437) `deps` Bump github.com/aws/aws-sdk-go-v2 from 1.37.0 to 1.37.2 - [#17402](https://github.com/influxdata/telegraf/pull/17402) `deps` Bump github.com/aws/aws-sdk-go-v2/config from 1.29.17 to 1.30.0 - [#17458](https://github.com/influxdata/telegraf/pull/17458) `deps` Bump github.com/aws/aws-sdk-go-v2/config from 1.30.1 to 1.31.0 - [#17391](https://github.com/influxdata/telegraf/pull/17391) `deps` Bump github.com/aws/aws-sdk-go-v2/credentials from 1.17.70 to 1.18.0 - [#17436](https://github.com/influxdata/telegraf/pull/17436) `deps` Bump github.com/aws/aws-sdk-go-v2/credentials from 1.18.1 to 1.18.3 - [#17434](https://github.com/influxdata/telegraf/pull/17434) `deps` Bump github.com/aws/aws-sdk-go-v2/feature/ec2/imds from 1.18.0 to 1.18.2 - [#17461](https://github.com/influxdata/telegraf/pull/17461) `deps` Bump github.com/aws/aws-sdk-go-v2/service/cloudwatch from 1.45.3 to 1.48.0 - [#17392](https://github.com/influxdata/telegraf/pull/17392) `deps` Bump github.com/aws/aws-sdk-go-v2/service/cloudwatchlogs from 1.51.0 to 1.54.0 - [#17440](https://github.com/influxdata/telegraf/pull/17440) `deps` Bump github.com/aws/aws-sdk-go-v2/service/cloudwatchlogs from 1.54.0 to 1.55.0 - [#17473](https://github.com/influxdata/telegraf/pull/17473) `deps` Bump github.com/aws/aws-sdk-go-v2/service/cloudwatchlogs from 1.55.0 to 1.56.0 - [#17431](https://github.com/influxdata/telegraf/pull/17431) `deps` Bump github.com/aws/aws-sdk-go-v2/service/dynamodb from 1.44.0 to 1.46.0 - [#17470](https://github.com/influxdata/telegraf/pull/17470) `deps` Bump github.com/aws/aws-sdk-go-v2/service/ec2 from 1.231.0 to 1.242.0 - [#17397](https://github.com/influxdata/telegraf/pull/17397) `deps` Bump github.com/aws/aws-sdk-go-v2/service/kinesis from 1.35.3 to 1.36.0 - [#17430](https://github.com/influxdata/telegraf/pull/17430) `deps` Bump github.com/aws/aws-sdk-go-v2/service/kinesis from 1.36.0 to 1.37.0 - [#17469](https://github.com/influxdata/telegraf/pull/17469) `deps` Bump github.com/aws/aws-sdk-go-v2/service/kinesis from 1.37.0 to 1.38.0 - [#17432](https://github.com/influxdata/telegraf/pull/17432) `deps` Bump github.com/aws/aws-sdk-go-v2/service/sts from 1.35.0 to 1.36.0 - [#17401](https://github.com/influxdata/telegraf/pull/17401) `deps` Bump github.com/aws/aws-sdk-go-v2/service/timestreamwrite from 1.31.2 to 1.32.0 - [#17421](https://github.com/influxdata/telegraf/pull/17421) `deps` Bump github.com/aws/aws-sdk-go-v2/service/timestreamwrite from 1.32.0 to 1.33.0 - [#17464](https://github.com/influxdata/telegraf/pull/17464) `deps` Bump github.com/aws/aws-sdk-go-v2/service/timestreamwrite from 1.33.0 to 1.34.0 - [#17457](https://github.com/influxdata/telegraf/pull/17457) `deps` Bump github.com/clarify/clarify-go from 0.4.0 to 0.4.1 - [#17407](https://github.com/influxdata/telegraf/pull/17407) `deps` Bump github.com/docker/docker from 28.3.2+incompatible to 28.3.3+incompatible - [#17463](https://github.com/influxdata/telegraf/pull/17463) `deps` Bump github.com/docker/go-connections from 0.5.0 to 0.6.0 - [#17394](https://github.com/influxdata/telegraf/pull/17394) `deps` Bump github.com/golang-jwt/jwt/v5 from 5.2.2 to 5.2.3 - [#17423](https://github.com/influxdata/telegraf/pull/17423) `deps` Bump github.com/gopacket/gopacket from 1.3.1 to 1.4.0 - [#17399](https://github.com/influxdata/telegraf/pull/17399) `deps` Bump github.com/jedib0t/go-pretty/v6 from 6.6.7 to 6.6.8 - [#17422](https://github.com/influxdata/telegraf/pull/17422) `deps` Bump github.com/lxc/incus/v6 from 6.14.0 to 6.15.0 - [#17429](https://github.com/influxdata/telegraf/pull/17429) `deps` Bump github.com/miekg/dns from 1.1.67 to 1.1.68 - [#17433](https://github.com/influxdata/telegraf/pull/17433) `deps` Bump github.com/nats-io/nats-server/v2 from 2.11.6 to 2.11.7 - [#17426](https://github.com/influxdata/telegraf/pull/17426) `deps` Bump github.com/nats-io/nats.go from 1.43.0 to 1.44.0 - [#17456](https://github.com/influxdata/telegraf/pull/17456) `deps` Bump github.com/redis/go-redis/v9 from 9.11.0 to 9.12.1 - [#17420](https://github.com/influxdata/telegraf/pull/17420) `deps` Bump github.com/shirou/gopsutil/v4 from 4.25.6 to 4.25.7 - [#17388](https://github.com/influxdata/telegraf/pull/17388) `deps` Bump github.com/testcontainers/testcontainers-go/modules/azure from 0.37.0 to 0.38.0 - [#17382](https://github.com/influxdata/telegraf/pull/17382) `deps` Bump github.com/testcontainers/testcontainers-go/modules/kafka from 0.37.0 to 0.38.0 - [#17427](https://github.com/influxdata/telegraf/pull/17427) `deps` Bump github.com/yuin/goldmark from 1.7.12 to 1.7.13 - [#17386](https://github.com/influxdata/telegraf/pull/17386) `deps` Bump go.opentelemetry.io/collector/pdata from 1.36.0 to 1.36.1 - [#17425](https://github.com/influxdata/telegraf/pull/17425) `deps` Bump go.step.sm/crypto from 0.67.0 to 0.68.0 - [#17462](https://github.com/influxdata/telegraf/pull/17462) `deps` Bump go.step.sm/crypto from 0.68.0 to 0.69.0 - [#17460](https://github.com/influxdata/telegraf/pull/17460) `deps` Bump golang.org/x/crypto from 0.40.0 to 0.41.0 - [#17424](https://github.com/influxdata/telegraf/pull/17424) `deps` Bump google.golang.org/api from 0.243.0 to 0.244.0 - [#17459](https://github.com/influxdata/telegraf/pull/17459) `deps` Bump google.golang.org/api from 0.244.0 to 0.246.0 - [#17465](https://github.com/influxdata/telegraf/pull/17465) `deps` Bump google.golang.org/protobuf from 1.36.6 to 1.36.7 - [#17384](https://github.com/influxdata/telegraf/pull/17384) `deps` Bump k8s.io/apimachinery from 0.33.2 to 0.33.3 - [#17389](https://github.com/influxdata/telegraf/pull/17389) `deps` Bump k8s.io/client-go from 0.33.2 to 0.33.3 - [#17396](https://github.com/influxdata/telegraf/pull/17396) `deps` Bump modernc.org/sqlite from 1.38.0 to 1.38.1 - [#17385](https://github.com/influxdata/telegraf/pull/17385) `deps` Bump software.sslmate.com/src/go-pkcs12 from 0.5.0 to 0.6.0 - [#17390](https://github.com/influxdata/telegraf/pull/17390) `deps` Bump super-linter/super-linter from 7.4.0 to 8.0.0 - [#17448](https://github.com/influxdata/telegraf/pull/17448) `deps` Fix collectd dependency not resolving - [#17410](https://github.com/influxdata/telegraf/pull/17410) `deps` Migrate from cloud.google.com/go/pubsub to v2 ## v1.35.3 [2025-07-28] ### Bugfixes - [#17373](https://github.com/influxdata/telegraf/pull/17373) `agent` Handle nil timer on telegraf reload when no debounce is specified - [#17340](https://github.com/influxdata/telegraf/pull/17340) `agent` Make Windows service install more robust - [#17310](https://github.com/influxdata/telegraf/pull/17310) `outputs.sql` Add timestamp to derived datatypes - [#17349](https://github.com/influxdata/telegraf/pull/17349) `outputs` Retrigger batch-available-events only for non-failing writes - [#17293](https://github.com/influxdata/telegraf/pull/17293) `parsers.json_v2` Respect string type for objects and arrays - [#17367](https://github.com/influxdata/telegraf/pull/17367) `plugins.snmp` Update gosnmp to prevent panic in snmp agents - [#17292](https://github.com/influxdata/telegraf/pull/17292) `processors.snmp_lookup` Avoid re-enqueing updates after plugin stopped - [#17369](https://github.com/influxdata/telegraf/pull/17369) `processors.snmp_lookup` Prevent deadlock during plugin shutdown ### Dependency Updates - [#17320](https://github.com/influxdata/telegraf/pull/17320) `deps` Bump github.com/Azure/azure-sdk-for-go/sdk/azcore from 1.18.0 to 1.18.1 - [#17328](https://github.com/influxdata/telegraf/pull/17328) `deps` Bump github.com/SAP/go-hdb from 1.13.11 to 1.13.12 - [#17301](https://github.com/influxdata/telegraf/pull/17301) `deps` Bump github.com/SAP/go-hdb from 1.13.9 to 1.13.11 - [#17326](https://github.com/influxdata/telegraf/pull/17326) `deps` Bump github.com/alitto/pond/v2 from 2.4.0 to 2.5.0 - [#17295](https://github.com/influxdata/telegraf/pull/17295) `deps` Bump github.com/aws/aws-sdk-go-v2/service/ec2 from 1.227.0 to 1.230.0 - [#17332](https://github.com/influxdata/telegraf/pull/17332) `deps` Bump github.com/aws/aws-sdk-go-v2/service/ec2 from 1.230.0 to 1.231.0 - [#17300](https://github.com/influxdata/telegraf/pull/17300) `deps` Bump github.com/docker/docker from 28.3.0+incompatible to 28.3.1+incompatible - [#17334](https://github.com/influxdata/telegraf/pull/17334) `deps` Bump github.com/docker/docker from 28.3.1+incompatible to 28.3.2+incompatible - [#17327](https://github.com/influxdata/telegraf/pull/17327) `deps` Bump github.com/google/cel-go from 0.25.0 to 0.26.0 - [#17331](https://github.com/influxdata/telegraf/pull/17331) `deps` Bump github.com/miekg/dns from 1.1.66 to 1.1.67 - [#17297](https://github.com/influxdata/telegraf/pull/17297) `deps` Bump github.com/nats-io/nats-server/v2 from 2.11.5 to 2.11.6 - [#17321](https://github.com/influxdata/telegraf/pull/17321) `deps` Bump github.com/openconfig/goyang from 1.6.2 to 1.6.3 - [#17298](https://github.com/influxdata/telegraf/pull/17298) `deps` Bump github.com/prometheus/procfs from 0.16.1 to 0.17.0 - [#17296](https://github.com/influxdata/telegraf/pull/17296) `deps` Bump github.com/shirou/gopsutil/v4 from 4.25.5 to 4.25.6 - [#17299](https://github.com/influxdata/telegraf/pull/17299) `deps` Bump github.com/snowflakedb/gosnowflake from 1.14.1 to 1.15.0 - [#17323](https://github.com/influxdata/telegraf/pull/17323) `deps` Bump go.opentelemetry.io/collector/pdata from 1.35.0 to 1.36.0 - [#17091](https://github.com/influxdata/telegraf/pull/17091) `deps` Bump go.step.sm/crypto from 0.64.0 to 0.67.0 - [#17330](https://github.com/influxdata/telegraf/pull/17330) `deps` Bump golang.org/x/crypto from 0.39.0 to 0.40.0 - [#17322](https://github.com/influxdata/telegraf/pull/17322) `deps` Bump golang.org/x/mod from 0.25.0 to 0.26.0 - [#17336](https://github.com/influxdata/telegraf/pull/17336) `deps` Bump golang.org/x/net from 0.41.0 to 0.42.0 - [#17337](https://github.com/influxdata/telegraf/pull/17337) `deps` Bump golang.org/x/sys from 0.33.0 to 0.34.0 - [#17335](https://github.com/influxdata/telegraf/pull/17335) `deps` Bump golang.org/x/term from 0.32.0 to 0.33.0 - [#17294](https://github.com/influxdata/telegraf/pull/17294) `deps` Bump google.golang.org/api from 0.239.0 to 0.240.0 - [#17325](https://github.com/influxdata/telegraf/pull/17325) `deps` Bump google.golang.org/api from 0.240.0 to 0.241.0 - [#17138](https://github.com/influxdata/telegraf/pull/17138) `deps` Bump modernc.org/sqlite from 1.37.0 to 1.38.0 ## v1.35.2 [2025-07-07] ### Bugfixes - [#17248](https://github.com/influxdata/telegraf/pull/17248) `agent` Add missing config flags for migrate command - [#17240](https://github.com/influxdata/telegraf/pull/17240) `disk-buffer` Correctly reset the mask after adding to an empty buffer - [#17284](https://github.com/influxdata/telegraf/pull/17284) `disk-buffer` Expire metric tracking information in the right place - [#17257](https://github.com/influxdata/telegraf/pull/17257) `disk-buffer` Mask old tracking metrics on restart - [#17247](https://github.com/influxdata/telegraf/pull/17247) `disk-buffer` Remove empty buffer on close - [#17285](https://github.com/influxdata/telegraf/pull/17285) `inputs.gnmi` Avoid interpreting path elements with multiple colons as namespace - [#17278](https://github.com/influxdata/telegraf/pull/17278) `inputs.gnmi` Handle base64 encoded IEEE-754 floats correctly - [#17258](https://github.com/influxdata/telegraf/pull/17258) `inputs.kibana` Support Kibana 8.x status API format change - [#17214](https://github.com/influxdata/telegraf/pull/17214) `inputs.ntpq` Fix ntpq field misalignment parsing errors - [#17234](https://github.com/influxdata/telegraf/pull/17234) `outputs.microsoft_fabric` Correct app name - [#17291](https://github.com/influxdata/telegraf/pull/17291) `outputs.nats` Avoid initializing Jetstream unconditionally - [#17246](https://github.com/influxdata/telegraf/pull/17246) `outputs` Retrigger batch-available-events correctly ### Dependency Updates - [#17217](https://github.com/influxdata/telegraf/pull/17217) `deps` Bump github.com/Azure/azure-sdk-for-go/sdk/messaging/azeventhubs from 1.3.2 to 1.4.0 - [#17226](https://github.com/influxdata/telegraf/pull/17226) `deps` Bump github.com/ClickHouse/clickhouse-go/v2 from 2.37.0 to 2.37.1 - [#17265](https://github.com/influxdata/telegraf/pull/17265) `deps` Bump github.com/ClickHouse/clickhouse-go/v2 from 2.37.1 to 2.37.2 - [#17268](https://github.com/influxdata/telegraf/pull/17268) `deps` Bump github.com/Masterminds/semver/v3 from 3.3.1 to 3.4.0 - [#17271](https://github.com/influxdata/telegraf/pull/17271) `deps` Bump github.com/SAP/go-hdb from 1.13.7 to 1.13.9 - [#17232](https://github.com/influxdata/telegraf/pull/17232) `deps` Bump github.com/alitto/pond/v2 from 2.3.4 to 2.4.0 - [#17231](https://github.com/influxdata/telegraf/pull/17231) `deps` Bump github.com/apache/arrow-go/v18 from 18.3.0 to 18.3.1 - [#17223](https://github.com/influxdata/telegraf/pull/17223) `deps` Bump github.com/aws/aws-sdk-go-v2/config from 1.29.15 to 1.29.17 - [#17220](https://github.com/influxdata/telegraf/pull/17220) `deps` Bump github.com/aws/aws-sdk-go-v2/credentials from 1.17.69 to 1.17.70 - [#17227](https://github.com/influxdata/telegraf/pull/17227) `deps` Bump github.com/aws/aws-sdk-go-v2/service/cloudwatchlogs from 1.50.3 to 1.51.0 - [#17262](https://github.com/influxdata/telegraf/pull/17262) `deps` Bump github.com/aws/aws-sdk-go-v2/service/dynamodb from 1.43.4 to 1.44.0 - [#17224](https://github.com/influxdata/telegraf/pull/17224) `deps` Bump github.com/aws/aws-sdk-go-v2/service/ec2 from 1.225.1 to 1.225.2 - [#17260](https://github.com/influxdata/telegraf/pull/17260) `deps` Bump github.com/aws/aws-sdk-go-v2/service/ec2 from 1.226.0 to 1.227.0 - [#17264](https://github.com/influxdata/telegraf/pull/17264) `deps` Bump github.com/docker/docker from 28.2.2+incompatible to 28.3.0+incompatible - [#17256](https://github.com/influxdata/telegraf/pull/17256) `deps` Bump github.com/lxc/incus/v6 from 6.13.0 to 6.14.0 - [#17272](https://github.com/influxdata/telegraf/pull/17272) `deps` Bump github.com/microsoft/go-mssqldb from 1.8.2 to 1.9.2 - [#17261](https://github.com/influxdata/telegraf/pull/17261) `deps` Bump github.com/nats-io/nats-server/v2 from 2.11.4 to 2.11.5 - [#17266](https://github.com/influxdata/telegraf/pull/17266) `deps` Bump github.com/peterbourgon/unixtransport from 0.0.5 to 0.0.6 - [#17229](https://github.com/influxdata/telegraf/pull/17229) `deps` Bump github.com/prometheus/common from 0.64.0 to 0.65.0 - [#17267](https://github.com/influxdata/telegraf/pull/17267) `deps` Bump github.com/redis/go-redis/v9 from 9.10.0 to 9.11.0 - [#17273](https://github.com/influxdata/telegraf/pull/17273) `deps` Bump go.opentelemetry.io/collector/pdata from 1.34.0 to 1.35.0 - [#17219](https://github.com/influxdata/telegraf/pull/17219) `deps` Bump google.golang.org/api from 0.237.0 to 0.238.0 - [#17263](https://github.com/influxdata/telegraf/pull/17263) `deps` Bump google.golang.org/api from 0.238.0 to 0.239.0 - [#17218](https://github.com/influxdata/telegraf/pull/17218) `deps` Bump k8s.io/api from 0.33.1 to 0.33.2 - [#17228](https://github.com/influxdata/telegraf/pull/17228) `deps` Bump k8s.io/client-go from 0.33.1 to 0.33.2 ## v1.35.1 [2025-06-23] ### Bugfixes - [#17178](https://github.com/influxdata/telegraf/pull/17178) `inputs.procstat` Fix user filter conditional logic - [#17210](https://github.com/influxdata/telegraf/pull/17210) `processors.strings` Add explicit TOML tags on struct fields ### Dependency Updates - [#17194](https://github.com/influxdata/telegraf/pull/17194) `deps` Bump github.com/Azure/azure-sdk-for-go/sdk/azidentity from 1.10.0 to 1.10.1 - [#17189](https://github.com/influxdata/telegraf/pull/17189) `deps` Bump github.com/ClickHouse/clickhouse-go/v2 from 2.36.0 to 2.37.0 - [#17186](https://github.com/influxdata/telegraf/pull/17186) `deps` Bump github.com/SAP/go-hdb from 1.13.6 to 1.13.7 - [#17188](https://github.com/influxdata/telegraf/pull/17188) `deps` Bump github.com/alitto/pond/v2 from 2.3.2 to 2.3.4 - [#17180](https://github.com/influxdata/telegraf/pull/17180) `deps` Bump github.com/aws/aws-sdk-go-v2/credentials from 1.17.68 to 1.17.69 - [#17185](https://github.com/influxdata/telegraf/pull/17185) `deps` Bump github.com/aws/aws-sdk-go-v2/service/cloudwatch from 1.45.1 to 1.45.2 - [#17187](https://github.com/influxdata/telegraf/pull/17187) `deps` Bump github.com/aws/aws-sdk-go-v2/service/cloudwatchlogs from 1.50.1 to 1.50.2 - [#17183](https://github.com/influxdata/telegraf/pull/17183) `deps` Bump github.com/aws/aws-sdk-go-v2/service/dynamodb from 1.43.2 to 1.43.3 - [#17182](https://github.com/influxdata/telegraf/pull/17182) `deps` Bump github.com/aws/aws-sdk-go-v2/service/ec2 from 1.225.0 to 1.225.1 - [#17190](https://github.com/influxdata/telegraf/pull/17190) `deps` Bump github.com/aws/aws-sdk-go-v2/service/kinesis from 1.35.1 to 1.35.2 - [#17193](https://github.com/influxdata/telegraf/pull/17193) `deps` Bump github.com/aws/aws-sdk-go-v2/service/timestreamwrite from 1.31.0 to 1.31.1 - [#17195](https://github.com/influxdata/telegraf/pull/17195) `deps` Bump github.com/aws/smithy-go from 1.22.3 to 1.22.4 - [#17196](https://github.com/influxdata/telegraf/pull/17196) `deps` Bump github.com/cloudevents/sdk-go/v2 from 2.16.0 to 2.16.1 - [#17212](https://github.com/influxdata/telegraf/pull/17212) `deps` Bump github.com/go-chi/chi/v5 from 5.2.1 to 5.2.2 - [#17191](https://github.com/influxdata/telegraf/pull/17191) `deps` Bump github.com/go-sql-driver/mysql from 1.9.2 to 1.9.3 - [#17192](https://github.com/influxdata/telegraf/pull/17192) `deps` Bump github.com/peterbourgon/unixtransport from 0.0.4 to 0.0.5 - [#17181](https://github.com/influxdata/telegraf/pull/17181) `deps` Bump github.com/redis/go-redis/v9 from 9.9.0 to 9.10.0 - [#17197](https://github.com/influxdata/telegraf/pull/17197) `deps` Bump github.com/urfave/cli/v2 from 2.27.6 to 2.27.7 - [#17198](https://github.com/influxdata/telegraf/pull/17198) `deps` Bump go.opentelemetry.io/collector/pdata from 1.33.0 to 1.34.0 - [#17184](https://github.com/influxdata/telegraf/pull/17184) `deps` Bump google.golang.org/api from 0.236.0 to 0.237.0 ## v1.35.0 [2025-06-16] ### Deprecation Removals This release removes the following deprecated plugin aliases: - `inputs.cisco_telemetry_gnmi` in [#17101](https://github.com/influxdata/telegraf/pull/17101) - `inputs.http_listener` in [#17102](https://github.com/influxdata/telegraf/pull/17102) - `inputs.KNXListener` in [#17168](https://github.com/influxdata/telegraf/pull/17168) - `inputs.logparser` in [#17170](https://github.com/influxdata/telegraf/pull/17170) Furthermore, the following deprecated plugin options are removed: - `ssl_ca`, `ssl_cert` and `ssl_key` of common TLS settings in [#17119](https://github.com/influxdata/telegraf/pull/17119) - `url` of `inputs.amqp_consumer` in [#17149](https://github.com/influxdata/telegraf/pull/17149) - `namespace` of `inputs.cloudwatch` in [#17123](https://github.com/influxdata/telegraf/pull/17123) - `datacentre` of `inputs.consul` in [#17150](https://github.com/influxdata/telegraf/pull/17150) - `container_names`, `perdevice` and `total` of `inputs.docker` in [#17148](https://github.com/influxdata/telegraf/pull/17148) - `http_timeout` of `inputs.elasticsearch` in [#17124](https://github.com/influxdata/telegraf/pull/17124) - `directory` of `inputs.filecount` in [#17152](https://github.com/influxdata/telegraf/pull/17152) - `guess_path_tag` and `enable_tls` of `inputs.gnmi` in [#17151](https://github.com/influxdata/telegraf/pull/17151) - `bearer_token` of `inputs.http` in [#17153](https://github.com/influxdata/telegraf/pull/17153) - `path` and `port` of `inputs.http_listener_v2` in [#17158](https://github.com/influxdata/telegraf/pull/17158) - `address` of `inputs.http_response` in [#17157](https://github.com/influxdata/telegraf/pull/17157) - `object_type` of `inputs.icinga2` in [#17163](https://github.com/influxdata/telegraf/pull/17163) - `max_line_size` of `inputs.influxdb_listener` in [#17162](https://github.com/influxdata/telegraf/pull/17162) - `enable_file_download` of `inputs.internet_speed` in [#17165](https://github.com/influxdata/telegraf/pull/17165) - `bearer_token_string` of `inputs.kube_inventory` in [#17110](https://github.com/influxdata/telegraf/pull/17110) - `bearer_token_string` of `inputs.kubernetes` in [#17109](https://github.com/influxdata/telegraf/pull/17109) - `server` of `inputs.nsq_consumer` in [#17166](https://github.com/influxdata/telegraf/pull/17166) - `dns_lookup` of `inputs.ntpq` in [#17159](https://github.com/influxdata/telegraf/pull/17159) - `ssl` of `inputs.openldap` in [#17103](https://github.com/influxdata/telegraf/pull/17103) - `name` and `queues` of `inputs.rabbitmq` in [#17105](https://github.com/influxdata/telegraf/pull/17105) - `path` of `inputs.smart` in [#17113](https://github.com/influxdata/telegraf/pull/17113) - `azuredb` and `query_version` of `inputs.sqlserver` in [#17112](https://github.com/influxdata/telegraf/pull/17112) - `parse_data_dog_tags` and `udp_packet_size` of `inputs.statsd` in [#17171](https://github.com/influxdata/telegraf/pull/17171) - `force_discover_on_init` of `inputs.vsphere` in [#17169](https://github.com/influxdata/telegraf/pull/17169) - `database`, `precision`, `retention_policy` and `url` of `outputs.amqp` in [#16950](https://github.com/influxdata/telegraf/pull/16950) - `precision` of `outputs.influxdb` in [#17160](https://github.com/influxdata/telegraf/pull/17160) - `partitionkey` and `use_random_partitionkey` of `outputs.kinesis` in [#17167](https://github.com/influxdata/telegraf/pull/17167) - `source_tag` of `outputs.librato` in [#17174](https://github.com/influxdata/telegraf/pull/17174) - `batch` and `topic_prefix` of `outputs.mqtt` in [#17176](https://github.com/influxdata/telegraf/pull/17176) - `trace` of `outputs.remotefile` in [#17173](https://github.com/influxdata/telegraf/pull/17173) - `host`, `port` and `string_to_number` of `outputs.wavefront` in [#17172](https://github.com/influxdata/telegraf/pull/17172) Replacements do exist, so please migrate your configuration in case you are still using one of those plugins or options. The `telegraf config migrate` command might be able to assist with the procedure. ### New Plugins - [#16390](https://github.com/influxdata/telegraf/pull/16390) `inputs.fritzbox` Add plugin - [#16780](https://github.com/influxdata/telegraf/pull/16780) `inputs.mavlink` Add plugin - [#16509](https://github.com/influxdata/telegraf/pull/16509) `inputs.whois` Add plugin - [#16211](https://github.com/influxdata/telegraf/pull/16211) `outputs.inlong` Add plugin - [#16827](https://github.com/influxdata/telegraf/pull/16827) `outputs.microsoft_fabric` Add plugin - [#16629](https://github.com/influxdata/telegraf/pull/16629) `processors.cumulative_sum` Add plugin ### Features - [#17048](https://github.com/influxdata/telegraf/pull/17048) `agent` Add debounce for watch events - [#16524](https://github.com/influxdata/telegraf/pull/16524) `common.kafka` Add AWS-MSK-IAM SASL authentication - [#16867](https://github.com/influxdata/telegraf/pull/16867) `common.ratelimiter` Implement means to reserve memory for concurrent use - [#16148](https://github.com/influxdata/telegraf/pull/16148) `common.shim` Add batch to shim - [#17121](https://github.com/influxdata/telegraf/pull/17121) `inputs.amqp_consumer` Allow string values in queue arguments - [#17051](https://github.com/influxdata/telegraf/pull/17051) `inputs.opcua` Allow forcing reconnection on every gather cycle - [#16532](https://github.com/influxdata/telegraf/pull/16532) `inputs.opcua_listener` Allow to subscribe to OPCUA events - [#16882](https://github.com/influxdata/telegraf/pull/16882) `inputs.prometheus` Add HTTP service discovery support - [#16999](https://github.com/influxdata/telegraf/pull/16999) `inputs.s7comm` Add support for LREAL and LINT data types - [#16452](https://github.com/influxdata/telegraf/pull/16452) `inputs.unbound` Collect histogram statistics - [#16700](https://github.com/influxdata/telegraf/pull/16700) `inputs.whois` Support IDN domains - [#17119](https://github.com/influxdata/telegraf/pull/17119) `migrations` Add migration for common.tls ssl options - [#17101](https://github.com/influxdata/telegraf/pull/17101) `migrations` Add migration for inputs.cisco_telemetry_gnmi - [#17123](https://github.com/influxdata/telegraf/pull/17123) `migrations` Add migration for inputs.cloudwatch - [#17148](https://github.com/influxdata/telegraf/pull/17148) `migrations` Add migration for inputs.docker - [#17124](https://github.com/influxdata/telegraf/pull/17124) `migrations` Add migration for inputs.elasticsearch - [#17102](https://github.com/influxdata/telegraf/pull/17102) `migrations` Add migration for inputs.http_listener - [#17162](https://github.com/influxdata/telegraf/pull/17162) `migrations` Add migration for inputs.influxdb_listener - [#17110](https://github.com/influxdata/telegraf/pull/17110) `migrations` Add migration for inputs.kube_inventory - [#17109](https://github.com/influxdata/telegraf/pull/17109) `migrations` Add migration for inputs.kubernetes - [#17103](https://github.com/influxdata/telegraf/pull/17103) `migrations` Add migration for inputs.openldap - [#17105](https://github.com/influxdata/telegraf/pull/17105) `migrations` Add migration for inputs.rabbitmq - [#17113](https://github.com/influxdata/telegraf/pull/17113) `migrations` Add migration for inputs.smart - [#17112](https://github.com/influxdata/telegraf/pull/17112) `migrations` Add migration for inputs.sqlserver - [#16950](https://github.com/influxdata/telegraf/pull/16950) `migrations` Add migration for outputs.amqp - [#17160](https://github.com/influxdata/telegraf/pull/17160) `migrations` Add migration for outputs.influxdb - [#17149](https://github.com/influxdata/telegraf/pull/17149) `migrations` Add migration for inputs.amqp_consumer - [#17150](https://github.com/influxdata/telegraf/pull/17150) `migrations` Add migration for inputs.consul - [#17152](https://github.com/influxdata/telegraf/pull/17152) `migrations` Add migration for inputs.filecount - [#17151](https://github.com/influxdata/telegraf/pull/17151) `migrations` Add migration for inputs.gnmi - [#17153](https://github.com/influxdata/telegraf/pull/17153) `migrations` Add migration for inputs.http - [#17158](https://github.com/influxdata/telegraf/pull/17158) `migrations` Add migration for inputs.http_listener_v2 - [#17157](https://github.com/influxdata/telegraf/pull/17157) `migrations` Add migration for inputs.http_response - [#17163](https://github.com/influxdata/telegraf/pull/17163) `migrations` Add migration for inputs.icinga2 - [#17165](https://github.com/influxdata/telegraf/pull/17165) `migrations` Add migration for inputs.internet_speed - [#17166](https://github.com/influxdata/telegraf/pull/17166) `migrations` Add migration for inputs.nsq_consumer - [#17159](https://github.com/influxdata/telegraf/pull/17159) `migrations` Add migration for inputs.ntpq - [#17171](https://github.com/influxdata/telegraf/pull/17171) `migrations` Add migration for inputs.statsd - [#17169](https://github.com/influxdata/telegraf/pull/17169) `migrations` Add migration for inputs.vsphere - [#17167](https://github.com/influxdata/telegraf/pull/17167) `migrations` Add migration for outputs.kinesis - [#17174](https://github.com/influxdata/telegraf/pull/17174) `migrations` Add migration for outputs.librato - [#17176](https://github.com/influxdata/telegraf/pull/17176) `migrations` Add migration for outputs.mqtt - [#17173](https://github.com/influxdata/telegraf/pull/17173) `migrations` Add migration for outputs.remotefile - [#17172](https://github.com/influxdata/telegraf/pull/17172) `migrations` Add migration for outputs.wavefront - [#17168](https://github.com/influxdata/telegraf/pull/17168) `migrations` Add migration for inputs.KNXListener - [#17170](https://github.com/influxdata/telegraf/pull/17170) `migrations` Add migration for inputs.logparser - [#16646](https://github.com/influxdata/telegraf/pull/16646) `outputs.health` Add max time between metrics check - [#16597](https://github.com/influxdata/telegraf/pull/16597) `outputs.http` Include body sample in non-retryable error logs - [#16741](https://github.com/influxdata/telegraf/pull/16741) `outputs.influxdb_v2` Implement concurrent writes - [#16746](https://github.com/influxdata/telegraf/pull/16746) `outputs.influxdb_v2` Support secrets in http_headers values - [#16582](https://github.com/influxdata/telegraf/pull/16582) `outputs.nats` Allow asynchronous publishing for Jetstream - [#16544](https://github.com/influxdata/telegraf/pull/16544) `outputs.sql` Add option to automate table schema updates - [#16678](https://github.com/influxdata/telegraf/pull/16678) `outputs.sql` Support secret for dsn - [#16583](https://github.com/influxdata/telegraf/pull/16583) `outputs.stackdriver` Ensure quota is charged to configured project - [#16717](https://github.com/influxdata/telegraf/pull/16717) `processors.defaults` Add support for specifying default tags - [#16701](https://github.com/influxdata/telegraf/pull/16701) `processors.enum` Add multiple tag mapping - [#16030](https://github.com/influxdata/telegraf/pull/16030) `processors.enum` Allow mapping to be applied to multiple fields - [#16494](https://github.com/influxdata/telegraf/pull/16494) `serializer.prometheusremotewrite` Allow sending native histograms ### Bugfixes - [#17044](https://github.com/influxdata/telegraf/pull/17044) `inputs.opcua` Fix integration test - [#16986](https://github.com/influxdata/telegraf/pull/16986) `inputs.procstat` Resolve remote usernames on Posix systems - [#16699](https://github.com/influxdata/telegraf/pull/16699) `inputs.win_wmi` Free resources to avoid leaks - [#17118](https://github.com/influxdata/telegraf/pull/17118) `migrations` Update table content for general plugin migrations ### Dependency Updates - [#17089](https://github.com/influxdata/telegraf/pull/17089) `deps` Bump cloud.google.com/go/bigquery from 1.68.0 to 1.69.0 - [#17026](https://github.com/influxdata/telegraf/pull/17026) `deps` Bump cloud.google.com/go/storage from 1.53.0 to 1.54.0 - [#17095](https://github.com/influxdata/telegraf/pull/17095) `deps` Bump cloud.google.com/go/storage from 1.54.0 to 1.55.0 - [#17034](https://github.com/influxdata/telegraf/pull/17034) `deps` Bump github.com/Azure/azure-sdk-for-go/sdk/azidentity from 1.9.0 to 1.10.0 - [#17065](https://github.com/influxdata/telegraf/pull/17065) `deps` Bump github.com/ClickHouse/clickhouse-go/v2 from 2.34.0 to 2.35.0 - [#17145](https://github.com/influxdata/telegraf/pull/17145) `deps` Bump github.com/ClickHouse/clickhouse-go/v2 from 2.35.0 to 2.36.0 - [#17062](https://github.com/influxdata/telegraf/pull/17062) `deps` Bump github.com/IBM/nzgo/v12 from 12.0.9 to 12.0.10 - [#17083](https://github.com/influxdata/telegraf/pull/17083) `deps` Bump github.com/IBM/sarama from 1.45.1 to 1.45.2 - [#17040](https://github.com/influxdata/telegraf/pull/17040) `deps` Bump github.com/apache/inlong/inlong-sdk/dataproxy-sdk-twins/dataproxy-sdk-golang from 1.0.0 to 1.0.1 - [#17060](https://github.com/influxdata/telegraf/pull/17060) `deps` Bump github.com/apache/inlong/inlong-sdk/dataproxy-sdk-twins/dataproxy-sdk-golang from 1.0.1 to 1.0.2 - [#17127](https://github.com/influxdata/telegraf/pull/17127) `deps` Bump github.com/apache/inlong/inlong-sdk/dataproxy-sdk-twins/dataproxy-sdk-golang from 1.0.2 to 1.0.3 - [#17061](https://github.com/influxdata/telegraf/pull/17061) `deps` Bump github.com/apache/thrift from 0.21.0 to 0.22.0 - [#16954](https://github.com/influxdata/telegraf/pull/16954) `deps` Bump github.com/aws/aws-msk-iam-sasl-signer-go from 1.0.1 to 1.0.3 - [#17041](https://github.com/influxdata/telegraf/pull/17041) `deps` Bump github.com/aws/aws-msk-iam-sasl-signer-go from 1.0.3 to 1.0.4 - [#17128](https://github.com/influxdata/telegraf/pull/17128) `deps` Bump github.com/aws/aws-sdk-go-v2/config from 1.29.14 to 1.29.15 - [#17129](https://github.com/influxdata/telegraf/pull/17129) `deps` Bump github.com/aws/aws-sdk-go-v2/credentials from 1.17.67 to 1.17.68 - [#17057](https://github.com/influxdata/telegraf/pull/17057) `deps` Bump github.com/aws/aws-sdk-go-v2/service/cloudwatch from 1.44.3 to 1.45.0 - [#17132](https://github.com/influxdata/telegraf/pull/17132) `deps` Bump github.com/aws/aws-sdk-go-v2/service/cloudwatch from 1.45.0 to 1.45.1 - [#17029](https://github.com/influxdata/telegraf/pull/17029) `deps` Bump github.com/aws/aws-sdk-go-v2/service/cloudwatchlogs from 1.49.0 to 1.50.0 - [#17131](https://github.com/influxdata/telegraf/pull/17131) `deps` Bump github.com/aws/aws-sdk-go-v2/service/cloudwatchlogs from 1.50.0 to 1.50.1 - [#17143](https://github.com/influxdata/telegraf/pull/17143) `deps` Bump github.com/aws/aws-sdk-go-v2/service/dynamodb from 1.43.1 to 1.43.2 - [#17037](https://github.com/influxdata/telegraf/pull/17037) `deps` Bump github.com/aws/aws-sdk-go-v2/service/ec2 from 1.218.0 to 1.219.0 - [#17067](https://github.com/influxdata/telegraf/pull/17067) `deps` Bump github.com/aws/aws-sdk-go-v2/service/ec2 from 1.220.0 to 1.222.0 - [#17093](https://github.com/influxdata/telegraf/pull/17093) `deps` Bump github.com/aws/aws-sdk-go-v2/service/ec2 from 1.222.0 to 1.224.0 - [#17136](https://github.com/influxdata/telegraf/pull/17136) `deps` Bump github.com/aws/aws-sdk-go-v2/service/ec2 from 1.224.0 to 1.225.0 - [#17139](https://github.com/influxdata/telegraf/pull/17139) `deps` Bump github.com/aws/aws-sdk-go-v2/service/kinesis from 1.35.0 to 1.35.1 - [#16996](https://github.com/influxdata/telegraf/pull/16996) `deps` Bump github.com/bluenviron/gomavlib/v3 from 3.1.0 to 3.2.1 - [#16987](https://github.com/influxdata/telegraf/pull/16987) `deps` Bump github.com/creack/goselect from 0.1.2 to 0.1.3 - [#17097](https://github.com/influxdata/telegraf/pull/17097) `deps` Bump github.com/docker/docker from 28.1.1+incompatible to 28.2.2+incompatible - [#17133](https://github.com/influxdata/telegraf/pull/17133) `deps` Bump github.com/gosnmp/gosnmp from 1.40.0 to 1.41.0 - [#17126](https://github.com/influxdata/telegraf/pull/17126) `deps` Bump github.com/linkedin/goavro/v2 from 2.13.1 to 2.14.0 - [#17087](https://github.com/influxdata/telegraf/pull/17087) `deps` Bump github.com/lxc/incus/v6 from 6.12.0 to 6.13.0 - [#17085](https://github.com/influxdata/telegraf/pull/17085) `deps` Bump github.com/microsoft/go-mssqldb from 1.8.1 to 1.8.2 - [#17064](https://github.com/influxdata/telegraf/pull/17064) `deps` Bump github.com/nats-io/nats-server/v2 from 2.11.3 to 2.11.4 - [#17140](https://github.com/influxdata/telegraf/pull/17140) `deps` Bump github.com/nats-io/nats.go from 1.42.0 to 1.43.0 - [#17134](https://github.com/influxdata/telegraf/pull/17134) `deps` Bump github.com/netsampler/goflow2/v2 from 2.2.2 to 2.2.3 - [#17028](https://github.com/influxdata/telegraf/pull/17028) `deps` Bump github.com/prometheus/common from 0.63.0 to 0.64.0 - [#17066](https://github.com/influxdata/telegraf/pull/17066) `deps` Bump github.com/rclone/rclone from 1.69.2 to 1.69.3 - [#17096](https://github.com/influxdata/telegraf/pull/17096) `deps` Bump github.com/redis/go-redis/v9 from 9.8.0 to 9.9.0 - [#17088](https://github.com/influxdata/telegraf/pull/17088) `deps` Bump github.com/shirou/gopsutil/v4 from 4.25.4 to 4.25.5 - [#17135](https://github.com/influxdata/telegraf/pull/17135) `deps` Bump github.com/sijms/go-ora/v2 from 2.8.24 to 2.9.0 - [#17094](https://github.com/influxdata/telegraf/pull/17094) `deps` Bump github.com/snowflakedb/gosnowflake from 1.14.0 to 1.14.1 - [#17035](https://github.com/influxdata/telegraf/pull/17035) `deps` Bump github.com/tinylib/msgp from 1.2.5 to 1.3.0 - [#17054](https://github.com/influxdata/telegraf/pull/17054) `deps` Bump github.com/vmware/govmomi from 0.50.0 to 0.51.0 - [#17039](https://github.com/influxdata/telegraf/pull/17039) `deps` Bump github.com/yuin/goldmark from 1.7.11 to 1.7.12 - [#17130](https://github.com/influxdata/telegraf/pull/17130) `deps` Bump go.mongodb.org/mongo-driver from 1.17.3 to 1.17.4 - [#17056](https://github.com/influxdata/telegraf/pull/17056) `deps` Bump go.opentelemetry.io/collector/pdata from 1.31.0 to 1.33.0 - [#17058](https://github.com/influxdata/telegraf/pull/17058) `deps` Bump go.step.sm/crypto from 0.63.0 to 0.64.0 - [#17141](https://github.com/influxdata/telegraf/pull/17141) `deps` Bump golang.org/x/crypto from 0.38.0 to 0.39.0 - [#17144](https://github.com/influxdata/telegraf/pull/17144) `deps` Bump golang.org/x/mod from 0.24.0 to 0.25.0 - [#17033](https://github.com/influxdata/telegraf/pull/17033) `deps` Bump google.golang.org/api from 0.232.0 to 0.233.0 - [#17055](https://github.com/influxdata/telegraf/pull/17055) `deps` Bump google.golang.org/api from 0.233.0 to 0.234.0 - [#17086](https://github.com/influxdata/telegraf/pull/17086) `deps` Bump google.golang.org/api from 0.234.0 to 0.235.0 - [#17036](https://github.com/influxdata/telegraf/pull/17036) `deps` Bump google.golang.org/grpc from 1.72.0 to 1.72.1 - [#17059](https://github.com/influxdata/telegraf/pull/17059) `deps` Bump google.golang.org/grpc from 1.72.1 to 1.72.2 - [#17137](https://github.com/influxdata/telegraf/pull/17137) `deps` Bump google.golang.org/grpc from 1.72.2 to 1.73.0 - [#17031](https://github.com/influxdata/telegraf/pull/17031) `deps` Bump k8s.io/api from 0.33.0 to 0.33.1 - [#17038](https://github.com/influxdata/telegraf/pull/17038) `deps` Bump k8s.io/apimachinery from 0.33.0 to 0.33.1 - [#17030](https://github.com/influxdata/telegraf/pull/17030) `deps` Bump k8s.io/client-go from 0.33.0 to 0.33.1 - [#17025](https://github.com/influxdata/telegraf/pull/17025) `deps` Bump super-linter/super-linter from 7.3.0 to 7.4.0 ## v1.34.4 [2025-05-19] ### Bugfixes - [#17009](https://github.com/influxdata/telegraf/pull/17009) `inputs.cloudwatch` Restore filtering to match all dimensions - [#16978](https://github.com/influxdata/telegraf/pull/16978) `inputs.nfsclient` Handle errors during mountpoint filtering - [#17021](https://github.com/influxdata/telegraf/pull/17021) `inputs.opcua` Fix type mismatch in unit test - [#16854](https://github.com/influxdata/telegraf/pull/16854) `inputs.opcua` Handle session invalidation between gather cycles - [#16879](https://github.com/influxdata/telegraf/pull/16879) `inputs.tail` Prevent leaking file descriptors - [#16815](https://github.com/influxdata/telegraf/pull/16815) `inputs.win_eventlog` Handle large events to avoid they get dropped silently - [#16878](https://github.com/influxdata/telegraf/pull/16878) `parsers.json_v2` Handle measurements with multiple objects correctly ### Dependency Updates - [#16991](https://github.com/influxdata/telegraf/pull/16991) `deps` Bump cloud.google.com/go/bigquery from 1.67.0 to 1.68.0 - [#16963](https://github.com/influxdata/telegraf/pull/16963) `deps` Bump cloud.google.com/go/storage from 1.52.0 to 1.53.0 - [#16955](https://github.com/influxdata/telegraf/pull/16955) `deps` Bump github.com/Azure/azure-sdk-for-go/sdk/storage/azqueue from 1.0.0 to 1.0.1 - [#16989](https://github.com/influxdata/telegraf/pull/16989) `deps` Bump github.com/SAP/go-hdb from 1.13.5 to 1.13.6 - [#16998](https://github.com/influxdata/telegraf/pull/16998) `deps` Bump github.com/apache/arrow-go/v18 from 18.2.0 to 18.3.0 - [#16952](https://github.com/influxdata/telegraf/pull/16952) `deps` Bump github.com/aws/aws-sdk-go-v2/service/cloudwatchlogs from 1.47.3 to 1.48.0 - [#16995](https://github.com/influxdata/telegraf/pull/16995) `deps` Bump github.com/aws/aws-sdk-go-v2/service/cloudwatchlogs from 1.48.0 to 1.49.0 - [#16974](https://github.com/influxdata/telegraf/pull/16974) `deps` Bump github.com/aws/aws-sdk-go-v2/service/ec2 from 1.212.0 to 1.214.0 - [#16993](https://github.com/influxdata/telegraf/pull/16993) `deps` Bump github.com/aws/aws-sdk-go-v2/service/ec2 from 1.215.0 to 1.218.0 - [#16968](https://github.com/influxdata/telegraf/pull/16968) `deps` Bump github.com/aws/aws-sdk-go-v2/service/kinesis from 1.33.3 to 1.35.0 - [#16988](https://github.com/influxdata/telegraf/pull/16988) `deps` Bump github.com/aws/aws-sdk-go-v2/service/timestreamwrite from 1.30.2 to 1.31.0 - [#17013](https://github.com/influxdata/telegraf/pull/17013) `deps` Bump github.com/ebitengine/purego from 0.8.2 to 0.8.3 - [#16972](https://github.com/influxdata/telegraf/pull/16972) `deps` Bump github.com/hashicorp/consul/api from 1.32.0 to 1.32.1 - [#16992](https://github.com/influxdata/telegraf/pull/16992) `deps` Bump github.com/microsoft/go-mssqldb from 1.8.0 to 1.8.1 - [#16990](https://github.com/influxdata/telegraf/pull/16990) `deps` Bump github.com/miekg/dns from 1.1.65 to 1.1.66 - [#16975](https://github.com/influxdata/telegraf/pull/16975) `deps` Bump github.com/nats-io/nats-server/v2 from 2.11.2 to 2.11.3 - [#16967](https://github.com/influxdata/telegraf/pull/16967) `deps` Bump github.com/nats-io/nats.go from 1.41.2 to 1.42.0 - [#16964](https://github.com/influxdata/telegraf/pull/16964) `deps` Bump github.com/rclone/rclone from 1.69.1 to 1.69.2 - [#16973](https://github.com/influxdata/telegraf/pull/16973) `deps` Bump github.com/redis/go-redis/v9 from 9.7.3 to 9.8.0 - [#16962](https://github.com/influxdata/telegraf/pull/16962) `deps` Bump github.com/shirou/gopsutil/v4 from 4.25.3 to 4.25.4 - [#16969](https://github.com/influxdata/telegraf/pull/16969) `deps` Bump github.com/snowflakedb/gosnowflake from 1.13.3 to 1.14.0 - [#16994](https://github.com/influxdata/telegraf/pull/16994) `deps` Bump github.com/vishvananda/netlink from 1.3.1-0.20250221194427-0af32151e72b to 1.3.1 - [#16958](https://github.com/influxdata/telegraf/pull/16958) `deps` Bump go.step.sm/crypto from 0.62.0 to 0.63.0 - [#16960](https://github.com/influxdata/telegraf/pull/16960) `deps` Bump golang.org/x/crypto from 0.37.0 to 0.38.0 - [#16966](https://github.com/influxdata/telegraf/pull/16966) `deps` Bump golang.org/x/net from 0.39.0 to 0.40.0 - [#16957](https://github.com/influxdata/telegraf/pull/16957) `deps` Bump google.golang.org/api from 0.230.0 to 0.231.0 - [#16853](https://github.com/influxdata/telegraf/pull/16853) `deps` Switch to maintained azure testcontainer module ## v1.34.3 [2025-05-05] ### Bugfixes - [#16697](https://github.com/influxdata/telegraf/pull/16697) `agent` Correctly truncate the disk buffer - [#16868](https://github.com/influxdata/telegraf/pull/16868) `common.ratelimiter` Only grow the buffer but never shrink - [#16812](https://github.com/influxdata/telegraf/pull/16812) `inputs.cloudwatch` Handle metric includes/excludes correctly to prevent panic - [#16911](https://github.com/influxdata/telegraf/pull/16911) `inputs.lustre2` Skip empty files - [#16594](https://github.com/influxdata/telegraf/pull/16594) `inputs.opcua` Handle node array values - [#16782](https://github.com/influxdata/telegraf/pull/16782) `inputs.win_wmi` Replace hard-coded class-name with correct config setting - [#16781](https://github.com/influxdata/telegraf/pull/16781) `inputs.win_wmi` Restrict threading model to APARTMENTTHREADED - [#16857](https://github.com/influxdata/telegraf/pull/16857) `outputs.quix` Allow empty certificate for new cloud managed instances ### Dependency Updates - [#16804](https://github.com/influxdata/telegraf/pull/16804) `deps` Bump cloud.google.com/go/bigquery from 1.66.2 to 1.67.0 - [#16835](https://github.com/influxdata/telegraf/pull/16835) `deps` Bump cloud.google.com/go/monitoring from 1.24.0 to 1.24.2 - [#16785](https://github.com/influxdata/telegraf/pull/16785) `deps` Bump cloud.google.com/go/pubsub from 1.48.0 to 1.49.0 - [#16897](https://github.com/influxdata/telegraf/pull/16897) `deps` Bump cloud.google.com/go/storage from 1.51.0 to 1.52.0 - [#16840](https://github.com/influxdata/telegraf/pull/16840) `deps` Bump github.com/BurntSushi/toml from 1.4.0 to 1.5.0 - [#16838](https://github.com/influxdata/telegraf/pull/16838) `deps` Bump github.com/aliyun/alibaba-cloud-sdk-go from 1.63.104 to 1.63.106 - [#16908](https://github.com/influxdata/telegraf/pull/16908) `deps` Bump github.com/aliyun/alibaba-cloud-sdk-go from 1.63.106 to 1.63.107 - [#16789](https://github.com/influxdata/telegraf/pull/16789) `deps` Bump github.com/antchfx/xpath from 1.3.3 to 1.3.4 - [#16807](https://github.com/influxdata/telegraf/pull/16807) `deps` Bump github.com/apache/arrow-go/v18 from 18.1.0 to 18.2.0 - [#16844](https://github.com/influxdata/telegraf/pull/16844) `deps` Bump github.com/apache/iotdb-client-go from 1.3.3 to 1.3.4 - [#16839](https://github.com/influxdata/telegraf/pull/16839) `deps` Bump github.com/aws/aws-sdk-go-v2/service/cloudwatch from 1.44.1 to 1.44.3 - [#16836](https://github.com/influxdata/telegraf/pull/16836) `deps` Bump github.com/aws/aws-sdk-go-v2/service/cloudwatchlogs from 1.45.3 to 1.47.3 - [#16846](https://github.com/influxdata/telegraf/pull/16846) `deps` Bump github.com/aws/aws-sdk-go-v2/service/dynamodb from 1.42.2 to 1.42.4 - [#16905](https://github.com/influxdata/telegraf/pull/16905) `deps` Bump github.com/aws/aws-sdk-go-v2/service/dynamodb from 1.42.4 to 1.43.1 - [#16842](https://github.com/influxdata/telegraf/pull/16842) `deps` Bump github.com/aws/aws-sdk-go-v2/service/ec2 from 1.210.1 to 1.211.3 - [#16900](https://github.com/influxdata/telegraf/pull/16900) `deps` Bump github.com/aws/aws-sdk-go-v2/service/ec2 from 1.211.3 to 1.212.0 - [#16903](https://github.com/influxdata/telegraf/pull/16903) `deps` Bump github.com/aws/aws-sdk-go-v2/service/kinesis from 1.33.2 to 1.33.3 - [#16793](https://github.com/influxdata/telegraf/pull/16793) `deps` Bump github.com/aws/aws-sdk-go-v2/service/timestreamwrite from 1.27.4 to 1.30.2 - [#16802](https://github.com/influxdata/telegraf/pull/16802) `deps` Bump github.com/clarify/clarify-go from 0.3.1 to 0.4.0 - [#16849](https://github.com/influxdata/telegraf/pull/16849) `deps` Bump github.com/docker/docker from 28.0.4+incompatible to 28.1.1+incompatible - [#16830](https://github.com/influxdata/telegraf/pull/16830) `deps` Bump github.com/go-ldap/ldap/v3 from 3.4.10 to 3.4.11 - [#16801](https://github.com/influxdata/telegraf/pull/16801) `deps` Bump github.com/go-sql-driver/mysql from 1.8.1 to 1.9.2 - [#16806](https://github.com/influxdata/telegraf/pull/16806) `deps` Bump github.com/gofrs/uuid/v5 from 5.3.0 to 5.3.2 - [#16895](https://github.com/influxdata/telegraf/pull/16895) `deps` Bump github.com/google/cel-go from 0.24.1 to 0.25.0 - [#16797](https://github.com/influxdata/telegraf/pull/16797) `deps` Bump github.com/gopcua/opcua from 0.7.1 to 0.7.4 - [#16894](https://github.com/influxdata/telegraf/pull/16894) `deps` Bump github.com/gopcua/opcua from 0.7.4 to 0.8.0 - [#16660](https://github.com/influxdata/telegraf/pull/16660) `deps` Bump github.com/gosmnp/gosnmp from 1.39.0 to 1.40.0 - [#16902](https://github.com/influxdata/telegraf/pull/16902) `deps` Bump github.com/gosnmp/gosnmp from 1.39.0 to 1.40.0 - [#16841](https://github.com/influxdata/telegraf/pull/16841) `deps` Bump github.com/hashicorp/consul/api from 1.31.2 to 1.32.0 - [#16891](https://github.com/influxdata/telegraf/pull/16891) `deps` Bump github.com/jedib0t/go-pretty/v6 from 6.6.5 to 6.6.7 - [#16892](https://github.com/influxdata/telegraf/pull/16892) `deps` Bump github.com/lxc/incus/v6 from 6.11.0 to 6.12.0 - [#16786](https://github.com/influxdata/telegraf/pull/16786) `deps` Bump github.com/microsoft/go-mssqldb from 1.7.2 to 1.8.0 - [#16851](https://github.com/influxdata/telegraf/pull/16851) `deps` Bump github.com/miekg/dns from 1.1.64 to 1.1.65 - [#16808](https://github.com/influxdata/telegraf/pull/16808) `deps` Bump github.com/nats-io/nats-server/v2 from 2.10.25 to 2.10.27 - [#16888](https://github.com/influxdata/telegraf/pull/16888) `deps` Bump github.com/nats-io/nats-server/v2 from 2.10.27 to 2.11.2 - [#16909](https://github.com/influxdata/telegraf/pull/16909) `deps` Bump github.com/nats-io/nats.go from 1.41.1 to 1.41.2 - [#16790](https://github.com/influxdata/telegraf/pull/16790) `deps` Bump github.com/openconfig/gnmi from 0.11.0 to 0.14.1 - [#16799](https://github.com/influxdata/telegraf/pull/16799) `deps` Bump github.com/openconfig/goyang from 1.6.0 to 1.6.2 - [#16848](https://github.com/influxdata/telegraf/pull/16848) `deps` Bump github.com/prometheus-community/pro-bing from 0.4.1 to 0.7.0 - [#16795](https://github.com/influxdata/telegraf/pull/16795) `deps` Bump github.com/prometheus/client_golang from 1.21.1 to 1.22.0 - [#16845](https://github.com/influxdata/telegraf/pull/16845) `deps` Bump github.com/prometheus/client_model from 0.6.1 to 0.6.2 - [#16901](https://github.com/influxdata/telegraf/pull/16901) `deps` Bump github.com/prometheus/procfs from 0.16.0 to 0.16.1 - [#16792](https://github.com/influxdata/telegraf/pull/16792) `deps` Bump github.com/safchain/ethtool from 0.3.0 to 0.5.10 - [#16791](https://github.com/influxdata/telegraf/pull/16791) `deps` Bump github.com/seancfoley/ipaddress-go from 1.7.0 to 1.7.1 - [#16794](https://github.com/influxdata/telegraf/pull/16794) `deps` Bump github.com/shirou/gopsutil/v4 from 4.25.1 to 4.25.3 - [#16828](https://github.com/influxdata/telegraf/pull/16828) `deps` Bump github.com/snowflakedb/gosnowflake from 1.11.2 to 1.13.1 - [#16904](https://github.com/influxdata/telegraf/pull/16904) `deps` Bump github.com/snowflakedb/gosnowflake from 1.13.1 to 1.13.3 - [#16787](https://github.com/influxdata/telegraf/pull/16787) `deps` Bump github.com/srebhan/cborquery from 1.0.3 to 1.0.4 - [#16837](https://github.com/influxdata/telegraf/pull/16837) `deps` Bump github.com/srebhan/protobufquery from 1.0.1 to 1.0.4 - [#16893](https://github.com/influxdata/telegraf/pull/16893) `deps` Bump github.com/testcontainers/testcontainers-go from 0.36.0 to 0.37.0 - [#16803](https://github.com/influxdata/telegraf/pull/16803) `deps` Bump github.com/testcontainers/testcontainers-go/modules/kafka from 0.34.0 to 0.36.0 - [#16890](https://github.com/influxdata/telegraf/pull/16890) `deps` Bump github.com/testcontainers/testcontainers-go/modules/kafka from 0.36.0 to 0.37.0 - [#16850](https://github.com/influxdata/telegraf/pull/16850) `deps` Bump github.com/vmware/govmomi from 0.49.0 to 0.50.0 - [#16784](https://github.com/influxdata/telegraf/pull/16784) `deps` Bump github.com/yuin/goldmark from 1.7.8 to 1.7.9 - [#16896](https://github.com/influxdata/telegraf/pull/16896) `deps` Bump github.com/yuin/goldmark from 1.7.9 to 1.7.11 - [#16832](https://github.com/influxdata/telegraf/pull/16832) `deps` Bump go.mongodb.org/mongo-driver from 1.17.0 to 1.17.3 - [#16800](https://github.com/influxdata/telegraf/pull/16800) `deps` Bump go.opentelemetry.io/collector/pdata from 1.29.0 to 1.30.0 - [#16907](https://github.com/influxdata/telegraf/pull/16907) `deps` Bump go.opentelemetry.io/collector/pdata from 1.30.0 to 1.31.0 - [#16831](https://github.com/influxdata/telegraf/pull/16831) `deps` Bump go.step.sm/crypto from 0.60.0 to 0.61.0 - [#16886](https://github.com/influxdata/telegraf/pull/16886) `deps` Bump go.step.sm/crypto from 0.61.0 to 0.62.0 - [#16816](https://github.com/influxdata/telegraf/pull/16816) `deps` Bump golangci-lint from v2.0.2 to v2.1.2 - [#16852](https://github.com/influxdata/telegraf/pull/16852) `deps` Bump gonum.org/v1/gonum from 0.15.1 to 0.16.0 - [#16805](https://github.com/influxdata/telegraf/pull/16805) `deps` Bump google.golang.org/api from 0.228.0 to 0.229.0 - [#16898](https://github.com/influxdata/telegraf/pull/16898) `deps` Bump google.golang.org/api from 0.229.0 to 0.230.0 - [#16834](https://github.com/influxdata/telegraf/pull/16834) `deps` Bump google.golang.org/grpc from 1.71.1 to 1.72.0 - [#16889](https://github.com/influxdata/telegraf/pull/16889) `deps` Bump k8s.io/client-go from 0.32.3 to 0.33.0 - [#16843](https://github.com/influxdata/telegraf/pull/16843) `deps` Bump modernc.org/sqlite from 1.36.2 to 1.37.0 ## v1.34.2 [2025-04-14] ### Bugfixes - [#16375](https://github.com/influxdata/telegraf/pull/16375) `aggregators` Handle time drift when calculating aggregation windows ### Dependency Updates - [#16689](https://github.com/influxdata/telegraf/pull/16689) `deps` Bump cloud.google.com/go/pubsub from 1.45.3 to 1.48.0 - [#16769](https://github.com/influxdata/telegraf/pull/16769) `deps` Bump cloud.google.com/go/storage from 1.50.0 to 1.51.0 - [#16771](https://github.com/influxdata/telegraf/pull/16771) `deps` Bump github.com/Azure/azure-sdk-for-go/sdk/azcore from 1.17.0 to 1.18.0 - [#16708](https://github.com/influxdata/telegraf/pull/16708) `deps` Bump github.com/Azure/azure-sdk-for-go/sdk/messaging/azeventhubs from 1.2.3 to 1.3.1 - [#16764](https://github.com/influxdata/telegraf/pull/16764) `deps` Bump github.com/Azure/azure-sdk-for-go/sdk/messaging/azeventhubs from 1.3.1 to 1.3.2 - [#16777](https://github.com/influxdata/telegraf/pull/16777) `deps` Bump github.com/ClickHouse/clickhouse-go/v2 from 2.30.3 to 2.34.0 - [#16707](https://github.com/influxdata/telegraf/pull/16707) `deps` Bump github.com/IBM/sarama from v1.43.3 to v1.45.1 - [#16739](https://github.com/influxdata/telegraf/pull/16739) `deps` Bump github.com/SAP/go-hdb from 1.9.10 to 1.13.5 - [#16754](https://github.com/influxdata/telegraf/pull/16754) `deps` Bump github.com/aliyun/alibaba-cloud-sdk-go from 1.62.721 to 1.63.104 - [#16767](https://github.com/influxdata/telegraf/pull/16767) `deps` Bump github.com/antchfx/jsonquery from 1.3.3 to 1.3.6 - [#16758](https://github.com/influxdata/telegraf/pull/16758) `deps` Bump github.com/aws/aws-sdk-go-v2/config from 1.29.6 to 1.29.13 - [#16710](https://github.com/influxdata/telegraf/pull/16710) `deps` Bump github.com/aws/aws-sdk-go-v2/credentials from 1.17.59 to 1.17.65 - [#16685](https://github.com/influxdata/telegraf/pull/16685) `deps` Bump github.com/aws/aws-sdk-go-v2/service/cloudwatch from 1.43.14 to 1.44.1 - [#16773](https://github.com/influxdata/telegraf/pull/16773) `deps` Bump github.com/aws/aws-sdk-go-v2/service/dynamodb from 1.40.0 to 1.42.2 - [#16688](https://github.com/influxdata/telegraf/pull/16688) `deps` Bump github.com/aws/aws-sdk-go-v2/service/ec2 from 1.203.1 to 1.210.1 - [#16772](https://github.com/influxdata/telegraf/pull/16772) `deps` Bump github.com/aws/aws-sdk-go-v2/service/kinesis from 1.32.6 to 1.33.2 - [#16711](https://github.com/influxdata/telegraf/pull/16711) `deps` Bump github.com/cloudevents/sdk-go/v2 from 2.15.2 to 2.16.0 - [#16687](https://github.com/influxdata/telegraf/pull/16687) `deps` Bump github.com/google/cel-go from 0.23.0 to 0.24.1 - [#16712](https://github.com/influxdata/telegraf/pull/16712) `deps` Bump github.com/gophercloud/gophercloud/v2 from 2.0.0-rc.3 to 2.6.0 - [#16738](https://github.com/influxdata/telegraf/pull/16738) `deps` Bump github.com/gorcon/rcon from 1.3.5 to 1.4.0 - [#16737](https://github.com/influxdata/telegraf/pull/16737) `deps` Bump github.com/gosnmp/gosnmp from 1.38.0 to 1.39.0 - [#16752](https://github.com/influxdata/telegraf/pull/16752) `deps` Bump github.com/lxc/incus/v6 from 6.9.0 to 6.11.0 - [#16761](https://github.com/influxdata/telegraf/pull/16761) `deps` Bump github.com/nats-io/nats.go from 1.39.1 to 1.41.1 - [#16753](https://github.com/influxdata/telegraf/pull/16753) `deps` Bump github.com/netsampler/goflow2/v2 from 2.2.1 to 2.2.2 - [#16760](https://github.com/influxdata/telegraf/pull/16760) `deps` Bump github.com/p4lang/p4runtime from 1.4.0 to 1.4.1 - [#16766](https://github.com/influxdata/telegraf/pull/16766) `deps` Bump github.com/prometheus/common from 0.62.0 to 0.63.0 - [#16686](https://github.com/influxdata/telegraf/pull/16686) `deps` Bump github.com/rclone/rclone from 1.68.2 to 1.69.1 - [#16770](https://github.com/influxdata/telegraf/pull/16770) `deps` Bump github.com/sijms/go-ora/v2 from 2.8.22 to 2.8.24 - [#16709](https://github.com/influxdata/telegraf/pull/16709) `deps` Bump github.com/testcontainers/testcontainers-go from 0.35.0 to 0.36.0 - [#16763](https://github.com/influxdata/telegraf/pull/16763) `deps` Bump github.com/tinylib/msgp from 1.2.0 to 1.2.5 - [#16757](https://github.com/influxdata/telegraf/pull/16757) `deps` Bump github.com/urfave/cli/v2 from 2.27.2 to 2.27.6 - [#16724](https://github.com/influxdata/telegraf/pull/16724) `deps` Bump github.com/vmware/govmomi from v0.45.1 to v0.49.0 - [#16768](https://github.com/influxdata/telegraf/pull/16768) `deps` Bump go.opentelemetry.io/collector/pdata from 1.25.0 to 1.29.0 - [#16765](https://github.com/influxdata/telegraf/pull/16765) `deps` Bump go.step.sm/crypto from 0.59.1 to 0.60.0 - [#16756](https://github.com/influxdata/telegraf/pull/16756) `deps` Bump golang.org/x/crypto from 0.36.0 to 0.37.0 - [#16683](https://github.com/influxdata/telegraf/pull/16683) `deps` Bump golangci-lint from v1.64.5 to v2.0.2 - [#16759](https://github.com/influxdata/telegraf/pull/16759) `deps` Bump google.golang.org/api from 0.224.0 to 0.228.0 - [#16755](https://github.com/influxdata/telegraf/pull/16755) `deps` Bump k8s.io/client-go from 0.32.1 to 0.32.3 - [#16684](https://github.com/influxdata/telegraf/pull/16684) `deps` Bump tj-actions/changed-files from 46.0.1 to 46.0.3 - [#16736](https://github.com/influxdata/telegraf/pull/16736) `deps` Bump tj-actions/changed-files from 46.0.3 to 46.0.4 - [#16751](https://github.com/influxdata/telegraf/pull/16751) `deps` Bump tj-actions/changed-files from 46.0.4 to 46.0.5 ## v1.34.1 [2025-03-24] ### Bugfixes - [#16638](https://github.com/influxdata/telegraf/pull/16638) `agent` Condense plugin source information table when multiple plugins in same file - [#16674](https://github.com/influxdata/telegraf/pull/16674) `inputs.tail` Do not seek on pipes - [#16643](https://github.com/influxdata/telegraf/pull/16643) `inputs.tail` Use correct initial_read_offset persistent offset naming in the code - [#16628](https://github.com/influxdata/telegraf/pull/16628) `outputs.influxdb_v2` Use dynamic token secret - [#16625](https://github.com/influxdata/telegraf/pull/16625) `outputs.sql` Allow to disable timestamp column - [#16682](https://github.com/influxdata/telegraf/pull/16682) `secrets` Make 'insufficient lockable memory' warning work on BSDs ### Dependency Updates - [#16612](https://github.com/influxdata/telegraf/pull/16612) `deps` Bump github.com/PaesslerAG/gval from 1.2.2 to 1.2.4 - [#16650](https://github.com/influxdata/telegraf/pull/16650) `deps` Bump github.com/aws/smithy-go from 1.22.2 to 1.22.3 - [#16680](https://github.com/influxdata/telegraf/pull/16680) `deps` Bump github.com/golang-jwt/jwt/v4 from 4.5.1 to 4.5.2 - [#16679](https://github.com/influxdata/telegraf/pull/16679) `deps` Bump github.com/golang-jwt/jwt/v5 from 5.2.1 to 5.2.2 - [#16610](https://github.com/influxdata/telegraf/pull/16610) `deps` Bump github.com/golang/snappy from 0.0.4 to 1.0.0 - [#16652](https://github.com/influxdata/telegraf/pull/16652) `deps` Bump github.com/hashicorp/consul/api from 1.29.2 to 1.31.2 - [#16651](https://github.com/influxdata/telegraf/pull/16651) `deps` Bump github.com/leodido/go-syslog/v4 from 4.1.0 to 4.2.0 - [#16613](https://github.com/influxdata/telegraf/pull/16613) `deps` Bump github.com/linkedin/goavro/v2 from 2.13.0 to 2.13.1 - [#16671](https://github.com/influxdata/telegraf/pull/16671) `deps` Bump github.com/redis/go-redis/v9 from 9.7.0 to 9.7.3 - [#16611](https://github.com/influxdata/telegraf/pull/16611) `deps` Bump go.step.sm/crypto from 0.54.0 to 0.59.1 - [#16640](https://github.com/influxdata/telegraf/pull/16640) `deps` Bump golang.org/x/crypto from 0.35.0 to 0.36.0 - [#16620](https://github.com/influxdata/telegraf/pull/16620) `deps` Bump golang.org/x/net from 0.35.0 to 0.36.0 - [#16639](https://github.com/influxdata/telegraf/pull/16639) `deps` Bump golang.org/x/oauth2 from 0.26.0 to 0.28.0 - [#16653](https://github.com/influxdata/telegraf/pull/16653) `deps` Bump k8s.io/api from 0.32.1 to 0.32.3 - [#16659](https://github.com/influxdata/telegraf/pull/16659) `deps` Bump tj-actions/changed-files from v45 to v46.0.1 ## v1.34.0 [2025-03-10] ### New Plugins - [#15988](https://github.com/influxdata/telegraf/pull/15988) `inputs.firehose` Add new plugin - [#16352](https://github.com/influxdata/telegraf/pull/16352) `inputs.huebridge` Add plugin - [#16392](https://github.com/influxdata/telegraf/pull/16392) `inputs.nsdp` Add plugin ### Features - [#16333](https://github.com/influxdata/telegraf/pull/16333) `agent` Add support for input probing - [#16270](https://github.com/influxdata/telegraf/pull/16270) `agent` Print plugins source information - [#16474](https://github.com/influxdata/telegraf/pull/16474) `inputs.cgroup` Support more cgroup v2 formats - [#16337](https://github.com/influxdata/telegraf/pull/16337) `inputs.cloudwatch` Allow wildcards for namespaces - [#16292](https://github.com/influxdata/telegraf/pull/16292) `inputs.docker` Support swarm jobs - [#16501](https://github.com/influxdata/telegraf/pull/16501) `inputs.exec` Allow to get untruncated errors in debug mode - [#16480](https://github.com/influxdata/telegraf/pull/16480) `inputs.gnmi` Add support for `depth` extension - [#16336](https://github.com/influxdata/telegraf/pull/16336) `inputs.infiniband` Add support for RDMA counters - [#16124](https://github.com/influxdata/telegraf/pull/16124) `inputs.ipset` Add metric for number of entries and individual IPs - [#16579](https://github.com/influxdata/telegraf/pull/16579) `inputs.nvidia_smi` Add new power-draw fields for v12 scheme - [#16305](https://github.com/influxdata/telegraf/pull/16305) `inputs.nvidia_smi` Implement probing - [#16105](https://github.com/influxdata/telegraf/pull/16105) `inputs.procstat` Add child level tag - [#16066](https://github.com/influxdata/telegraf/pull/16066) `inputs.proxmox` Allow to add VM-id and status as tag - [#16287](https://github.com/influxdata/telegraf/pull/16287) `inputs.systemd_units` Add active_enter_timestamp_us field - [#16342](https://github.com/influxdata/telegraf/pull/16342) `inputs.tail` Add `initial_read_offset` config for controlling read behavior - [#16355](https://github.com/influxdata/telegraf/pull/16355) `inputs.webhooks` Add support for GitHub workflow events - [#16508](https://github.com/influxdata/telegraf/pull/16508) `inputs.x509_cert` Add support for JKS and PKCS#12 keystores - [#16491](https://github.com/influxdata/telegraf/pull/16491) `outputs.mqtt` Add sprig for topic name generator for homie layout - [#16570](https://github.com/influxdata/telegraf/pull/16570) `outputs.nats` Use Jetstream publisher when using Jetstream - [#16566](https://github.com/influxdata/telegraf/pull/16566) `outputs.prometheus_client` Allow adding custom headers - [#16272](https://github.com/influxdata/telegraf/pull/16272) `parsers.avro` Allow union fields to be specified as tags - [#16493](https://github.com/influxdata/telegraf/pull/16493) `parsers.prometheusremotewrite` Add dense metric version to better support histograms - [#16214](https://github.com/influxdata/telegraf/pull/16214) `processors.converter` Add support for base64 encoded IEEE floats - [#16497](https://github.com/influxdata/telegraf/pull/16497) `processors.template` Add sprig function for templates ### Bugfixes - [#16542](https://github.com/influxdata/telegraf/pull/16542) `inputs.gnmi` Handle path elements without name but with keys correctly - [#16606](https://github.com/influxdata/telegraf/pull/16606) `inputs.huebridge` Cleanup and fix linter issues - [#16580](https://github.com/influxdata/telegraf/pull/16580) `inputs.net` Skip checks in containerized environments - [#16555](https://github.com/influxdata/telegraf/pull/16555) `outputs.opensearch` Use correct pipeline name while creating bulk-indexers - [#16557](https://github.com/influxdata/telegraf/pull/16557) `serializers.prometheus` Use legacy validation for metric name ### Dependency Updates - [#16576](https://github.com/influxdata/telegraf/pull/16576) `deps` Bump github.com/Azure/azure-sdk-for-go/sdk/azidentity from 1.8.1 to 1.8.2 - [#16553](https://github.com/influxdata/telegraf/pull/16553) `deps` Bump github.com/Azure/go-autorest/autorest from 0.11.29 to 0.11.30 - [#16552](https://github.com/influxdata/telegraf/pull/16552) `deps` Bump github.com/aws/aws-sdk-go-v2/service/ec2 from 1.198.1 to 1.203.1 - [#16554](https://github.com/influxdata/telegraf/pull/16554) `deps` Bump github.com/go-jose/go-jose/v4 from 4.0.4 to 4.0.5 - [#16574](https://github.com/influxdata/telegraf/pull/16574) `deps` Bump github.com/gopcua/opcua from 0.5.3 to 0.7.1 - [#16551](https://github.com/influxdata/telegraf/pull/16551) `deps` Bump github.com/nats-io/nats.go from 1.39.0 to 1.39.1 - [#16575](https://github.com/influxdata/telegraf/pull/16575) `deps` Bump github.com/tidwall/wal from 1.1.7 to 1.1.8 - [#16578](https://github.com/influxdata/telegraf/pull/16578) `deps` Bump super-linter/super-linter from 7.2.1 to 7.3.0 ## v1.33.3 [2025-02-25] ### Important Changes - PR [#16507](https://github.com/influxdata/telegraf/pull/16507) adds the `enforce_first_namespace_as_origin` to the GNMI input plugin. This option allows to disable mangling of the response `path` tag by _not_ using namespaces as origin. It is highly recommended to disable the option. However, disabling the behavior might change the `path` tag and thus might break existing queries. Furthermore, the tag modification might increase cardinality in your database. ### Bugfixes - [#16546](https://github.com/influxdata/telegraf/pull/16546) `agent` Add authorization and user-agent when watching remote configs - [#16507](https://github.com/influxdata/telegraf/pull/16507) `inputs.gnmi` Allow to disable using first namespace as origin - [#16511](https://github.com/influxdata/telegraf/pull/16511) `inputs.proxmox` Allow search domain to be empty - [#16530](https://github.com/influxdata/telegraf/pull/16530) `internal` Fix plural acronyms in SnakeCase function - [#16539](https://github.com/influxdata/telegraf/pull/16539) `logging` Handle closing correctly and fix tests - [#16535](https://github.com/influxdata/telegraf/pull/16535) `processors.execd` Detect line-protocol parser correctly ### Dependency Updates - [#16506](https://github.com/influxdata/telegraf/pull/16506) `deps` Bump github.com/ClickHouse/clickhouse-go/v2 from 2.30.1 to 2.30.3 - [#16502](https://github.com/influxdata/telegraf/pull/16502) `deps` Bump github.com/antchfx/xmlquery from 1.4.1 to 1.4.4 - [#16519](https://github.com/influxdata/telegraf/pull/16519) `deps` Bump github.com/aws/aws-sdk-go-v2/service/cloudwatch from 1.43.1 to 1.43.14 - [#16503](https://github.com/influxdata/telegraf/pull/16503) `deps` Bump github.com/aws/aws-sdk-go-v2/service/dynamodb from 1.36.2 to 1.40.0 - [#16522](https://github.com/influxdata/telegraf/pull/16522) `deps` Bump github.com/nats-io/nats.go from 1.37.0 to 1.39.0 - [#16505](https://github.com/influxdata/telegraf/pull/16505) `deps` Bump github.com/srebhan/cborquery from 1.0.1 to 1.0.3 - [#16534](https://github.com/influxdata/telegraf/pull/16534) `deps` Bump github.com/vishvananda/netlink from 1.3.0 to 1.3.1-0.20250221194427-0af32151e72b - [#16521](https://github.com/influxdata/telegraf/pull/16521) `deps` Bump go.opentelemetry.io/collector/pdata from 1.12.0 to 1.25.0 - [#16504](https://github.com/influxdata/telegraf/pull/16504) `deps` Bump golang.org/x/net from 0.34.0 to 0.35.0 - [#16512](https://github.com/influxdata/telegraf/pull/16512) `deps` Bump golangci-lint from v1.63.4 to v1.64.5 ## v1.33.2 [2025-02-10] ### Important Changes - PR [#16423](https://github.com/influxdata/telegraf/pull/16423) converts the ClickHouse drivers to the v2 version. This new version also requires a [new format for the DSN](https://github.com/ClickHouse/clickhouse-go/tree/v2.30.2?tab=readme-ov-file#dsn). The plugin tries its best to convert the old DSN to the new format but might not be able to do so. Please check for warnings in your log file and convert to the new format as soon as possible. - PR [#16403](https://github.com/influxdata/telegraf/pull/16403) ensures consistency of the NetFlow plugin's `ip_version` field type by enforcing "IPv4", "IPv6", or "unknown" string values. Previously the `ip_version` could become an (unsigned) integer when parsing raw-packets' headers especially with SFlow v5 input. Please watch out for type-conflicts on the output side! ### Bugfixes - [#16477](https://github.com/influxdata/telegraf/pull/16477) `agent` Avoid panic by checking for skip_processors_after_aggregators - [#16489](https://github.com/influxdata/telegraf/pull/16489) `agent` Set `godebug x509negativeserial=1` as a workaround - [#16403](https://github.com/influxdata/telegraf/pull/16403) `inputs.netflow` Ensure type consistency for sFlow's IP version field - [#16447](https://github.com/influxdata/telegraf/pull/16447) `inputs.x509_cert` Add config to left-pad serial number to 128-bits - [#16448](https://github.com/influxdata/telegraf/pull/16448) `outputs.azure_monitor` Prevent infinite send loop for outdated metrics - [#16472](https://github.com/influxdata/telegraf/pull/16472) `outputs.sql` Fix insert into ClickHouse - [#16454](https://github.com/influxdata/telegraf/pull/16454) `service` Set address to prevent orphaned dbus-session processes ### Dependency Updates - [#16442](https://github.com/influxdata/telegraf/pull/16442) `deps` Bump cloud.google.com/go/storage from 1.47.0 to 1.50.0 - [#16414](https://github.com/influxdata/telegraf/pull/16414) `deps` Bump github.com/Azure/azure-sdk-for-go/sdk/azidentity from 1.7.0 to 1.8.1 - [#16416](https://github.com/influxdata/telegraf/pull/16416) `deps` Bump github.com/apache/iotdb-client-go from 1.3.2 to 1.3.3 - [#16415](https://github.com/influxdata/telegraf/pull/16415) `deps` Bump github.com/aws/aws-sdk-go-v2 from 1.32.8 to 1.33.0 - [#16394](https://github.com/influxdata/telegraf/pull/16394) `deps` Bump github.com/aws/aws-sdk-go-v2/service/cloudwatchlogs from 1.38.0 to 1.45.3 - [#16468](https://github.com/influxdata/telegraf/pull/16468) `deps` Bump github.com/aws/aws-sdk-go-v2/service/sts from 1.33.10 to 1.33.12 - [#16439](https://github.com/influxdata/telegraf/pull/16439) `deps` Bump github.com/aws/aws-sdk-go-v2/service/sts from 1.33.2 to 1.33.10 - [#16395](https://github.com/influxdata/telegraf/pull/16395) `deps` Bump github.com/eclipse/paho.golang from 0.21.0 to 0.22.0 - [#16470](https://github.com/influxdata/telegraf/pull/16470) `deps` Bump github.com/go-ldap/ldap/v3 from 3.4.8 to 3.4.10 - [#16440](https://github.com/influxdata/telegraf/pull/16440) `deps` Bump github.com/google/cel-go from 0.21.0 to 0.23.0 - [#16445](https://github.com/influxdata/telegraf/pull/16445) `deps` Bump github.com/lxc/incus/v6 from 6.6.0 to 6.9.0 - [#16466](https://github.com/influxdata/telegraf/pull/16466) `deps` Bump github.com/nats-io/nats-server/v2 from 2.10.17 to 2.10.25 - [#16453](https://github.com/influxdata/telegraf/pull/16453) `deps` Bump github.com/prometheus/common from 0.61.0 to 0.62.0 - [#16417](https://github.com/influxdata/telegraf/pull/16417) `deps` Bump github.com/shirou/gopsutil/v4 from 4.24.10 to 4.24.12 - [#16369](https://github.com/influxdata/telegraf/pull/16369) `deps` Bump github.com/shirou/gopsutil/v4 from v4.24.10 to v4.24.12 - [#16397](https://github.com/influxdata/telegraf/pull/16397) `deps` Bump github.com/showwin/speedtest-go from 1.7.9 to 1.7.10 - [#16467](https://github.com/influxdata/telegraf/pull/16467) `deps` Bump github.com/yuin/goldmark from 1.6.0 to 1.7.8 - [#16360](https://github.com/influxdata/telegraf/pull/16360) `deps` Bump golangci-lint from v1.62.2 to v1.63.4 - [#16469](https://github.com/influxdata/telegraf/pull/16469) `deps` Bump google.golang.org/api from 0.214.0 to 0.219.0 - [#16396](https://github.com/influxdata/telegraf/pull/16396) `deps` Bump k8s.io/api from 0.31.3 to 0.32.1 - [#16482](https://github.com/influxdata/telegraf/pull/16482) `deps` Update Apache arrow from 0.0-20240716144821-cf5d7c7ec3cf to 18.1.0 - [#16423](https://github.com/influxdata/telegraf/pull/16423) `deps` Update ClickHouse SQL driver from 1.5.4 to to 2.30.1 ## v1.33.1 [2025-01-10] ### Important Changes - The default value of `skip_processors_after_aggregators` will change to `true` with Telegraf `v1.40.0`, skip running the processors again after aggregators! If you need the current default behavior, please explicitly set the option to `false`! To silence the warning and use the future default behavior, please explicitly set the option to `true`. ### Bugfixes - [#16290](https://github.com/influxdata/telegraf/pull/16290) `agent` Skip initialization of second processor state if requested - [#16377](https://github.com/influxdata/telegraf/pull/16377) `inputs.intel_powerstat` Fix option removal version - [#16310](https://github.com/influxdata/telegraf/pull/16310) `inputs.mongodb` Do not dereference nil pointer if gathering database stats fails - [#16383](https://github.com/influxdata/telegraf/pull/16383) `outputs.influxdb_v2` Allow overriding auth and agent headers - [#16388](https://github.com/influxdata/telegraf/pull/16388) `outputs.influxdb_v2` Fix panic and API error handling - [#16289](https://github.com/influxdata/telegraf/pull/16289) `outputs.remotefile` Handle tracking metrics correctly ### Dependency Updates - [#16344](https://github.com/influxdata/telegraf/pull/16344) `deps` Bump cloud.google.com/go/bigquery from 1.64.0 to 1.65.0 - [#16283](https://github.com/influxdata/telegraf/pull/16283) `deps` Bump cloud.google.com/go/monitoring from 1.21.1 to 1.22.0 - [#16315](https://github.com/influxdata/telegraf/pull/16315) `deps` Bump github.com/Azure/go-autorest/autorest/adal from 0.9.23 to 0.9.24 - [#16319](https://github.com/influxdata/telegraf/pull/16319) `deps` Bump github.com/IBM/nzgo/v12 from 12.0.9-0.20231115043259-49c27f2dfe48 to 12.0.9 - [#16346](https://github.com/influxdata/telegraf/pull/16346) `deps` Bump github.com/Masterminds/semver/v3 from 3.3.0 to 3.3.1 - [#16280](https://github.com/influxdata/telegraf/pull/16280) `deps` Bump github.com/aws/aws-sdk-go-v2/config from 1.27.39 to 1.28.6 - [#16343](https://github.com/influxdata/telegraf/pull/16343) `deps` Bump github.com/aws/aws-sdk-go-v2/service/ec2 from 1.162.1 to 1.198.1 - [#16317](https://github.com/influxdata/telegraf/pull/16317) `deps` Bump github.com/fatih/color from 1.17.0 to 1.18.0 - [#16345](https://github.com/influxdata/telegraf/pull/16345) `deps` Bump github.com/gopacket/gopacket from 1.3.0 to 1.3.1 - [#16282](https://github.com/influxdata/telegraf/pull/16282) `deps` Bump github.com/nats-io/nats.go from 1.36.0 to 1.37.0 - [#16318](https://github.com/influxdata/telegraf/pull/16318) `deps` Bump github.com/prometheus/common from 0.60.0 to 0.61.0 - [#16324](https://github.com/influxdata/telegraf/pull/16324) `deps` Bump github.com/vapourismo/knx-go from v0.0.0-20240217175130-922a0d50c241 to v0.0.0-20240915133544-a6ab43471c11 - [#16297](https://github.com/influxdata/telegraf/pull/16297) `deps` Bump golang.org/x/crypto from 0.29.0 to 0.31.0 - [#16281](https://github.com/influxdata/telegraf/pull/16281) `deps` Bump k8s.io/client-go from 0.30.1 to 0.31.3 - [#16313](https://github.com/influxdata/telegraf/pull/16313) `deps` Bump super-linter/super-linter from 7.2.0 to 7.2.1 ## v1.33.0 [2024-12-09] ### New Plugins - [#15754](https://github.com/influxdata/telegraf/pull/15754) `inputs.neoom_beaam` Add new plugin - [#15869](https://github.com/influxdata/telegraf/pull/15869) `processors.batch` Add batch processor - [#16144](https://github.com/influxdata/telegraf/pull/16144) `outputs.quix` Add plugin ### Features - [#16010](https://github.com/influxdata/telegraf/pull/16010) `agent` Add --watch-interval option for polling config changes - [#15948](https://github.com/influxdata/telegraf/pull/15948) `aggregators.basicstats` Add first field - [#15891](https://github.com/influxdata/telegraf/pull/15891) `common.socket` Allow parallel parsing with a pool of workers - [#16141](https://github.com/influxdata/telegraf/pull/16141) `inputs.amqp_consumer` Allow specification of queue arguments - [#15950](https://github.com/influxdata/telegraf/pull/15950) `inputs.diskio` Add field io await and util - [#15919](https://github.com/influxdata/telegraf/pull/15919) `inputs.kafka_consumer` Implement startup error behavior options - [#15910](https://github.com/influxdata/telegraf/pull/15910) `inputs.memcached` Add support for external-store metrics - [#15990](https://github.com/influxdata/telegraf/pull/15990) `inputs.mock` Add sine phase - [#16040](https://github.com/influxdata/telegraf/pull/16040) `inputs.modbus` Allow grouping across register types - [#15865](https://github.com/influxdata/telegraf/pull/15865) `inputs.prometheus` Allow to use secrets for credentials - [#16230](https://github.com/influxdata/telegraf/pull/16230) `inputs.smart` Add Power on Hours and Cycle Count - [#15935](https://github.com/influxdata/telegraf/pull/15935) `inputs.snmp` Add displayhint conversion - [#16027](https://github.com/influxdata/telegraf/pull/16027) `inputs.snmp` Convert uneven bytes to int - [#15976](https://github.com/influxdata/telegraf/pull/15976) `inputs.socket_listener` Use reception time as timestamp - [#15853](https://github.com/influxdata/telegraf/pull/15853) `inputs.statsd` Allow reporting sets and timings count as floats - [#11591](https://github.com/influxdata/telegraf/pull/11591) `inputs.vsphere` Add VM memory configuration - [#16109](https://github.com/influxdata/telegraf/pull/16109) `inputs.vsphere` Add cpu temperature field - [#15917](https://github.com/influxdata/telegraf/pull/15917) `inputs` Add option to choose the metric time source - [#16242](https://github.com/influxdata/telegraf/pull/16242) `logging` Allow overriding message key for structured logging - [#15742](https://github.com/influxdata/telegraf/pull/15742) `outputs.influxdb_v2` Add rate limit implementation - [#15943](https://github.com/influxdata/telegraf/pull/15943) `outputs.mqtt` Add sprig functions for topic name generator - [#16041](https://github.com/influxdata/telegraf/pull/16041) `outputs.postgresql` Allow limiting of column name length - [#16258](https://github.com/influxdata/telegraf/pull/16258) `outputs` Add rate-limiting infrastructure - [#16146](https://github.com/influxdata/telegraf/pull/16146) `outputs` Implement partial write errors - [#15883](https://github.com/influxdata/telegraf/pull/15883) `outputs` Only copy metric if its not filtered out - [#15893](https://github.com/influxdata/telegraf/pull/15893) `serializers.prometheusremotewrite` Log metric conversion errors ### Bugfixes - [#16248](https://github.com/influxdata/telegraf/pull/16248) `inputs.netflow` Decode flags in TCP and IP headers correctly - [#16257](https://github.com/influxdata/telegraf/pull/16257) `inputs.procstat` Handle running processes correctly across multiple filters - [#16219](https://github.com/influxdata/telegraf/pull/16219) `logging` Add Close() func for redirectLogger - [#16255](https://github.com/influxdata/telegraf/pull/16255) `logging` Clean up extra empty spaces when redirectLogger is used - [#16274](https://github.com/influxdata/telegraf/pull/16274) `logging` Fix duplicated prefix and attrMsg in log message when redirectLogger is used ### Dependency Updates - [#16232](https://github.com/influxdata/telegraf/pull/16232) `deps` Bump cloud.google.com/go/bigquery from 1.63.1 to 1.64.0 - [#16235](https://github.com/influxdata/telegraf/pull/16235) `deps` Bump cloud.google.com/go/storage from 1.43.0 to 1.47.0 - [#16198](https://github.com/influxdata/telegraf/pull/16198) `deps` Bump github.com/aws/aws-sdk-go-v2/service/cloudwatch from 1.42.2 to 1.43.1 - [#16234](https://github.com/influxdata/telegraf/pull/16234) `deps` Bump github.com/aws/aws-sdk-go-v2/service/kinesis from 1.29.3 to 1.32.6 - [#16201](https://github.com/influxdata/telegraf/pull/16201) `deps` Bump github.com/intel/powertelemetry from 1.0.1 to 1.0.2 - [#16200](https://github.com/influxdata/telegraf/pull/16200) `deps` Bump github.com/rclone/rclone from 1.68.1 to 1.68.2 - [#16199](https://github.com/influxdata/telegraf/pull/16199) `deps` Bump github.com/vishvananda/netns from 0.0.4 to 0.0.5 - [#16236](https://github.com/influxdata/telegraf/pull/16236) `deps` Bump golang.org/x/net from 0.30.0 to 0.31.0 - [#16250](https://github.com/influxdata/telegraf/pull/16250) `deps` Bump golangci-lint from v1.62.0 to v1.62.2 - [#16233](https://github.com/influxdata/telegraf/pull/16233) `deps` Bump google.golang.org/grpc from 1.67.1 to 1.68.0 - [#16202](https://github.com/influxdata/telegraf/pull/16202) `deps` Bump modernc.org/sqlite from 1.33.1 to 1.34.1 - [#16203](https://github.com/influxdata/telegraf/pull/16203) `deps` Bump super-linter/super-linter from 7.1.0 to 7.2.0 ## v1.32.3 [2024-11-18] ### Important Changes - PR [#16015](https://github.com/influxdata/telegraf/pull/16015) changes the internal counters of the Bind plugin to unsigned integers matching the server implementation. We keep backward compatibility by setting `report_counters_as_int` to `true` by default to avoid type conflicts on the output side. However, you should change this setting to `false` as soon as possible to avoid invalid values and parsing errors with the v3 XML statistics. ### Bugfixes - [#16123](https://github.com/influxdata/telegraf/pull/16123) `agent` Restore setup order of stateful plugins to Init() then SetState() - [#16111](https://github.com/influxdata/telegraf/pull/16111) `common.socket` Make sure the scanner buffer matches the read-buffer size - [#16156](https://github.com/influxdata/telegraf/pull/16156) `common.socket` Use read buffer size config setting as a datagram reader buffer size - [#16015](https://github.com/influxdata/telegraf/pull/16015) `inputs.bind` Convert counters to uint64 - [#16171](https://github.com/influxdata/telegraf/pull/16171) `inputs.gnmi` Register connection statistics before creating client - [#16197](https://github.com/influxdata/telegraf/pull/16197) `inputs.netflow` Cast TCP ports to uint16 - [#16110](https://github.com/influxdata/telegraf/pull/16110) `inputs.ntpq` Avoid panic on empty lines and make sure -p is present - [#16155](https://github.com/influxdata/telegraf/pull/16155) `inputs.snmp` Fix crash when trying to format fields from unknown OIDs - [#16145](https://github.com/influxdata/telegraf/pull/16145) `inputs.snmp_trap` Remove timeout deprecation - [#16108](https://github.com/influxdata/telegraf/pull/16108) `logger` Avoid setting the log-format default too early ### Dependency Updates - [#16093](https://github.com/influxdata/telegraf/pull/16093) `deps` Bump cloud.google.com/go/pubsub from 1.42.0 to 1.45.1 - [#16175](https://github.com/influxdata/telegraf/pull/16175) `deps` Bump github.com/aws/aws-sdk-go-v2/credentials from 1.17.37 to 1.17.44 - [#16096](https://github.com/influxdata/telegraf/pull/16096) `deps` Bump github.com/gofrs/uuid/v5 from 5.2.0 to 5.3.0 - [#16136](https://github.com/influxdata/telegraf/pull/16136) `deps` Bump github.com/golang-jwt/jwt/v4 from 4.5.0 to 4.5.1 - [#16094](https://github.com/influxdata/telegraf/pull/16094) `deps` Bump github.com/gopacket/gopacket from 1.2.0 to 1.3.0 - [#16133](https://github.com/influxdata/telegraf/pull/16133) `deps` Bump github.com/jackc/pgtype from 1.14.3 to 1.14.4 - [#16131](https://github.com/influxdata/telegraf/pull/16131) `deps` Bump github.com/openconfig/gnmi from 0.10.0 to 0.11.0 - [#16092](https://github.com/influxdata/telegraf/pull/16092) `deps` Bump github.com/prometheus/client_golang from 1.20.4 to 1.20.5 - [#16178](https://github.com/influxdata/telegraf/pull/16178) `deps` Bump github.com/rclone/rclone from 1.67.0 to 1.68.1 - [#16132](https://github.com/influxdata/telegraf/pull/16132) `deps` Bump github.com/shirou/gopsutil/v4 from 4.24.9 to 4.24.10 - [#16176](https://github.com/influxdata/telegraf/pull/16176) `deps` Bump github.com/sijms/go-ora/v2 from 2.8.19 to 2.8.22 - [#16134](https://github.com/influxdata/telegraf/pull/16134) `deps` Bump github.com/testcontainers/testcontainers-go/modules/kafka from 0.33.0 to 0.34.0 - [#16174](https://github.com/influxdata/telegraf/pull/16174) `deps` Bump github.com/tidwall/gjson from 1.17.1 to 1.18.0 - [#16135](https://github.com/influxdata/telegraf/pull/16135) `deps` Bump github.com/vmware/govmomi from 0.39.0 to 0.45.1 - [#16095](https://github.com/influxdata/telegraf/pull/16095) `deps` Bump golang.org/x/sys from 0.25.0 to 0.26.0 - [#16177](https://github.com/influxdata/telegraf/pull/16177) `deps` Bump golang.org/x/text from 0.19.0 to 0.20.0 - [#16172](https://github.com/influxdata/telegraf/pull/16172) `deps` Bump golangci-lint from v1.61.0 to v1.62.0 ## v1.32.2 [2024-10-28] ### Bugfixes - [#15966](https://github.com/influxdata/telegraf/pull/15966) `agent` Use a unique WAL file for plugin instances of the same type - [#16074](https://github.com/influxdata/telegraf/pull/16074) `inputs.kafka_consumer` Fix deadlock - [#16009](https://github.com/influxdata/telegraf/pull/16009) `inputs.netflow` Cast complex types to field compatible ones - [#16026](https://github.com/influxdata/telegraf/pull/16026) `inputs.opcua` Allow to retry reads on invalid sessions - [#16060](https://github.com/influxdata/telegraf/pull/16060) `inputs.procstat` Correctly use systemd-unit setting for finding them - [#16008](https://github.com/influxdata/telegraf/pull/16008) `inputs.win_eventlog` Handle XML data fields' filtering the same way as event fields - [#15968](https://github.com/influxdata/telegraf/pull/15968) `outputs.remotefile` Create a new serializer instance per output file - [#16014](https://github.com/influxdata/telegraf/pull/16014) `outputs.syslog` Trim field-names belonging to explicit SDIDs correctly ### Dependency Updates - [#15992](https://github.com/influxdata/telegraf/pull/15992) `deps` Bump cloud.google.com/go/bigquery from 1.62.0 to 1.63.1 - [#16056](https://github.com/influxdata/telegraf/pull/16056) `deps` Bump github.com/Azure/azure-sdk-for-go/sdk/azcore from 1.14.0 to 1.16.0 - [#16021](https://github.com/influxdata/telegraf/pull/16021) `deps` Bump github.com/IBM/sarama from 1.43.2 to 1.43.3 - [#16019](https://github.com/influxdata/telegraf/pull/16019) `deps` Bump github.com/alitto/pond from 1.9.0 to 1.9.2 - [#16018](https://github.com/influxdata/telegraf/pull/16018) `deps` Bump github.com/apache/thrift from 0.20.0 to 0.21.0 - [#16054](https://github.com/influxdata/telegraf/pull/16054) `deps` Bump github.com/aws/aws-sdk-go-v2 from 1.32.1 to 1.32.2 - [#15996](https://github.com/influxdata/telegraf/pull/15996) `deps` Bump github.com/aws/aws-sdk-go-v2/service/cloudwatch from 1.40.4 to 1.42.1 - [#16055](https://github.com/influxdata/telegraf/pull/16055) `deps` Bump github.com/aws/aws-sdk-go-v2/service/cloudwatch from 1.42.1 to 1.42.2 - [#16057](https://github.com/influxdata/telegraf/pull/16057) `deps` Bump github.com/aws/aws-sdk-go-v2/service/dynamodb from 1.34.9 to 1.36.2 - [#16022](https://github.com/influxdata/telegraf/pull/16022) `deps` Bump github.com/docker/docker from 27.1.1+incompatible to 27.3.1+incompatible - [#15993](https://github.com/influxdata/telegraf/pull/15993) `deps` Bump github.com/gosnmp/gosnmp from 1.37.0 to 1.38.0 - [#15947](https://github.com/influxdata/telegraf/pull/15947) `deps` Bump github.com/gwos/tcg/sdk from v8.7.2 to v8.8.0 - [#16053](https://github.com/influxdata/telegraf/pull/16053) `deps` Bump github.com/lxc/incus/v6 from 6.2.0 to 6.6.0 - [#15994](https://github.com/influxdata/telegraf/pull/15994) `deps` Bump github.com/signalfx/golib/v3 from 3.3.53 to 3.3.54 - [#15995](https://github.com/influxdata/telegraf/pull/15995) `deps` Bump github.com/snowflakedb/gosnowflake from 1.11.1 to 1.11.2 - [#16020](https://github.com/influxdata/telegraf/pull/16020) `deps` Bump go.step.sm/crypto from 0.51.1 to 0.54.0 - [#16023](https://github.com/influxdata/telegraf/pull/16023) `deps` Bump github.com/shirou/gopsutil from v3.24.4 to v4.24.9 ## v1.32.1 [2024-10-07] ### Important Changes - PR [#15796](https://github.com/influxdata/telegraf/pull/15796) changes the delivery state update of un-parseable messages from `ACK` to `NACK` without requeueing. This way, those messages are not lost and can optionally be handled using a dead-letter exchange by other means. - Removal of old-style serializer creation. This should not directly affect users as it is an API change. All serializers in Telegraf are already ported to the new framework. If you experience any issues with not being able to create serializers let us know! ### Bugfixes - [#15969](https://github.com/influxdata/telegraf/pull/15969) `agent` Fix buffer not flushing if all metrics are written - [#15937](https://github.com/influxdata/telegraf/pull/15937) `config` Correctly print removal version info - [#15900](https://github.com/influxdata/telegraf/pull/15900) `common.http` Keep timeout after creating oauth client - [#15796](https://github.com/influxdata/telegraf/pull/15796) `inputs.amqp_consumer` NACKing messages on non-delivery related errors - [#15923](https://github.com/influxdata/telegraf/pull/15923) `inputs.cisco_telemetry_mdt` Handle NXOS DME subtree telemetry format - [#15907](https://github.com/influxdata/telegraf/pull/15907) `inputs.consul` Move config checking to Init method - [#15982](https://github.com/influxdata/telegraf/pull/15982) `inputs.influxdb_v2_listener` Fix concurrent read/write dict - [#15960](https://github.com/influxdata/telegraf/pull/15960) `inputs.vsphere` Add tags to VSAN ESA disks - [#15921](https://github.com/influxdata/telegraf/pull/15921) `parsers.avro` Add mutex to cache access - [#15965](https://github.com/influxdata/telegraf/pull/15965) `processors.aws_ec2` Remove leading slash and cancel worker only if it exists ### Dependency Updates - [#15932](https://github.com/influxdata/telegraf/pull/15932) `deps` Bump cloud.google.com/go/monitoring from 1.20.2 to 1.21.1 - [#15863](https://github.com/influxdata/telegraf/pull/15863) `deps` Bump github.com/Azure/azure-kusto-go from 0.15.3 to 0.16.1 - [#15862](https://github.com/influxdata/telegraf/pull/15862) `deps` Bump github.com/Azure/azure-sdk-for-go/sdk/azcore from 1.13.0 to 1.14.0 - [#15957](https://github.com/influxdata/telegraf/pull/15957) `deps` Bump github.com/aws/aws-sdk-go-v2/feature/ec2/imds from 1.16.12 to 1.16.14 - [#15859](https://github.com/influxdata/telegraf/pull/15859) `deps` Bump github.com/aws/aws-sdk-go-v2/service/dynamodb from 1.34.4 to 1.34.9 - [#15931](https://github.com/influxdata/telegraf/pull/15931) `deps` Bump github.com/boschrexroth/ctrlx-datalayer-golang from 1.3.0 to 1.3.1 - [#15890](https://github.com/influxdata/telegraf/pull/15890) `deps` Bump github.com/harlow/kinesis-consumer from v0.3.6-0.20240606153816-553e2392fdf3 to v0.3.6-0.20240916192723-43900507c911 - [#15904](https://github.com/influxdata/telegraf/pull/15904) `deps` Bump github.com/netsampler/goflow2/v2 from 2.1.5 to 2.2.1 - [#15903](https://github.com/influxdata/telegraf/pull/15903) `deps` Bump github.com/p4lang/p4runtime from 1.3.0 to 1.4.0 - [#15905](https://github.com/influxdata/telegraf/pull/15905) `deps` Bump github.com/prometheus/client_golang from 1.20.2 to 1.20.3 - [#15930](https://github.com/influxdata/telegraf/pull/15930) `deps` Bump github.com/prometheus/client_golang from 1.20.3 to 1.20.4 - [#15962](https://github.com/influxdata/telegraf/pull/15962) `deps` Bump github.com/prometheus/common from 0.55.0 to 0.60.0 - [#15860](https://github.com/influxdata/telegraf/pull/15860) `deps` Bump github.com/snowflakedb/gosnowflake from 1.10.0 to 1.11.1 - [#15954](https://github.com/influxdata/telegraf/pull/15954) `deps` Bump github.com/srebhan/protobufquery from 0.0.0-20230803132024-ae4c0d878e55 to 1.0.1 - [#15929](https://github.com/influxdata/telegraf/pull/15929) `deps` Bump go.mongodb.org/mongo-driver from 1.16.0 to 1.17.0 - [#15902](https://github.com/influxdata/telegraf/pull/15902) `deps` Bump golang.org/x/mod from 0.19.0 to 0.21.0 - [#15955](https://github.com/influxdata/telegraf/pull/15955) `deps` Bump golang.org/x/oauth2 from 0.21.0 to 0.23.0 - [#15861](https://github.com/influxdata/telegraf/pull/15861) `deps` Bump golang.org/x/term from 0.23.0 to 0.24.0 - [#15856](https://github.com/influxdata/telegraf/pull/15856) `deps` Bump golangci-lint from v1.60.3 to v1.61.0 - [#15933](https://github.com/influxdata/telegraf/pull/15933) `deps` Bump k8s.io/apimachinery from 0.30.1 to 0.31.1 - [#15901](https://github.com/influxdata/telegraf/pull/15901) `deps` Bump modernc.org/sqlite from 1.32.0 to 1.33.1 ## v1.32.0 [2024-09-09] ### Important Changes - This release contains a logging overhaul as well as some new features for logging (see PRs [#15556](https://github.com/influxdata/telegraf/pull/15556), [#15629](https://github.com/influxdata/telegraf/pull/15629), [#15677](https://github.com/influxdata/telegraf/pull/15677), [#15695](https://github.com/influxdata/telegraf/pull/15695) and [#15751](https://github.com/influxdata/telegraf/pull/15751)). As a consequence the redunant `logtarget` setting is deprecated, `stderr` is used if no `logfile` is provided, otherwise messages are logged to the given file. For using the Windows `eventlog` set `logformat = "eventlog"`! - This release contains a change in json_v2 parser config parsing - if the config is empty (not define any rules), initialization will fail (see PR [#15844](https://github.com/influxdata/telegraf/pull/15844)). - This release contains a feature for a disk-backed metric buffer under the `buffer_strategy` agent config (see PR [#15564](https://github.com/influxdata/telegraf/pull/15564)). Please note, this feature is **experimental**, please give it a test and report any issues you encounter. ### New Plugins - [#15700](https://github.com/influxdata/telegraf/pull/15700) `inputs.slurm` SLURM workload manager - [#15602](https://github.com/influxdata/telegraf/pull/15602) `outputs.parquet` Parquet file writer - [#15569](https://github.com/influxdata/telegraf/pull/15569) `outputs.remotefile` Output to remote location like S3 ### Features - [#15732](https://github.com/influxdata/telegraf/pull/15732) `agent` Add config check sub-command - [#15564](https://github.com/influxdata/telegraf/pull/15564) `agent` Add metric disk buffer - [#15645](https://github.com/influxdata/telegraf/pull/15645) `agent` Enable watching for new configuration files - [#15644](https://github.com/influxdata/telegraf/pull/15644) `agent` Watch for deleted files - [#15695](https://github.com/influxdata/telegraf/pull/15695) `logging` Add 'trace' log-level - [#15677](https://github.com/influxdata/telegraf/pull/15677) `logging` Allow to override log-level per plugin - [#15751](https://github.com/influxdata/telegraf/pull/15751) `logging` Implement structured logging - [#15640](https://github.com/influxdata/telegraf/pull/15640) `common.cookie` Allow usage of secrets in headers - [#15636](https://github.com/influxdata/telegraf/pull/15636) `common.shim` Enable metric tracking within external plugins - [#15570](https://github.com/influxdata/telegraf/pull/15570) `common.tls` Allow group aliases for cipher-suites - [#15628](https://github.com/influxdata/telegraf/pull/15628) `inputs.amd_rocm_smi` Parse newer ROCm versions - [#15519](https://github.com/influxdata/telegraf/pull/15519) `inputs.azure_monitor` Add client options parameter - [#15544](https://github.com/influxdata/telegraf/pull/15544) `inputs.elasticsearch` Add support for custom headers - [#15688](https://github.com/influxdata/telegraf/pull/15688) `inputs.elasticsearch` Gather enrich stats - [#15834](https://github.com/influxdata/telegraf/pull/15834) `inputs.execd` Allow to provide logging prefixes on stderr - [#15764](https://github.com/influxdata/telegraf/pull/15764) `inputs.http_listener_v2` Add unix socket mode - [#15495](https://github.com/influxdata/telegraf/pull/15495) `inputs.ipmi_sensor` Collect additional commands - [#15790](https://github.com/influxdata/telegraf/pull/15790) `inputs.kafka_consumer` Allow to select the metric time source - [#15648](https://github.com/influxdata/telegraf/pull/15648) `inputs.modbus` Allow reading single bits of input and holding registers - [#15528](https://github.com/influxdata/telegraf/pull/15528) `inputs.mqtt_consumer` Add variable length topic parsing - [#15486](https://github.com/influxdata/telegraf/pull/15486) `inputs.mqtt_consumer` Implement startup error behaviors - [#15749](https://github.com/influxdata/telegraf/pull/15749) `inputs.mysql` Add support for replica status - [#15521](https://github.com/influxdata/telegraf/pull/15521) `inputs.netflow` Add more fields for sFlow extended gateway packets - [#15396](https://github.com/influxdata/telegraf/pull/15396) `inputs.netflow` Add support for sFlow drop notification packets - [#15468](https://github.com/influxdata/telegraf/pull/15468) `inputs.openstack` Allow collection without admin privileges - [#15637](https://github.com/influxdata/telegraf/pull/15637) `inputs.opentelemetry` Add profiles support - [#15423](https://github.com/influxdata/telegraf/pull/15423) `inputs.procstat` Add ability to collect per-process socket statistics - [#15655](https://github.com/influxdata/telegraf/pull/15655) `inputs.s7comm` Implement startup-error behavior settings - [#15600](https://github.com/influxdata/telegraf/pull/15600) `inputs.sql` Add SAP HANA SQL driver - [#15424](https://github.com/influxdata/telegraf/pull/15424) `inputs.sqlserver` Introduce user specified ID parameter for ADD logins - [#15687](https://github.com/influxdata/telegraf/pull/15687) `inputs.statsd` Expose allowed_pending_messages as internal stat - [#15458](https://github.com/influxdata/telegraf/pull/15458) `inputs.systemd_units` Support user scoped units - [#15702](https://github.com/influxdata/telegraf/pull/15702) `outputs.datadog` Add support for submitting alongside dd-agent - [#15668](https://github.com/influxdata/telegraf/pull/15668) `outputs.dynatrace` Report metrics as a delta counter using regular expression - [#15471](https://github.com/influxdata/telegraf/pull/15471) `outputs.elasticsearch` Allow custom template index settings - [#15613](https://github.com/influxdata/telegraf/pull/15613) `outputs.elasticsearch` Support data streams - [#15722](https://github.com/influxdata/telegraf/pull/15722) `outputs.kafka` Add option to add metric name as record header - [#15689](https://github.com/influxdata/telegraf/pull/15689) `outputs.kafka` Add option to set producer message timestamp - [#15787](https://github.com/influxdata/telegraf/pull/15787) `outputs.syslog` Implement startup error behavior options - [#15697](https://github.com/influxdata/telegraf/pull/15697) `parsers.value` Add base64 datatype - [#15795](https://github.com/influxdata/telegraf/pull/15795) `processors.aws_ec2` Allow to use instance metadata ### Bugfixes - [#15661](https://github.com/influxdata/telegraf/pull/15661) `agent` Fix buffer directory config and document - [#15788](https://github.com/influxdata/telegraf/pull/15788) `inputs.kinesis_consumer` Honor the configured endpoint - [#15791](https://github.com/influxdata/telegraf/pull/15791) `inputs.mysql` Enforce float for all known floating-point information - [#15743](https://github.com/influxdata/telegraf/pull/15743) `inputs.snmp` Avoid sending a nil to gosmi's GetEnumBitsFormatted - [#15815](https://github.com/influxdata/telegraf/pull/15815) `logger` Handle trace level for standard log - [#15781](https://github.com/influxdata/telegraf/pull/15781) `outputs.kinesis` Honor the configured endpoint - [#15615](https://github.com/influxdata/telegraf/pull/15615) `outputs.remotefile` Resolve linter not checking error - [#15740](https://github.com/influxdata/telegraf/pull/15740) `serializers.template` Unwrap metrics if required ### Dependency Updates - [#15829](https://github.com/influxdata/telegraf/pull/15829) `deps` Bump github.com/BurntSushi/toml from 1.3.2 to 1.4.0 - [#15775](https://github.com/influxdata/telegraf/pull/15775) `deps` Bump github.com/aws/aws-sdk-go-v2/feature/ec2/imds from 1.16.11 to 1.16.12 - [#15733](https://github.com/influxdata/telegraf/pull/15733) `deps` Bump github.com/aws/aws-sdk-go-v2/service/cloudwatch from 1.38.7 to 1.40.3 - [#15761](https://github.com/influxdata/telegraf/pull/15761) `deps` Bump github.com/aws/aws-sdk-go-v2/service/cloudwatch from 1.40.3 to 1.40.4 - [#15827](https://github.com/influxdata/telegraf/pull/15827) `deps` Bump github.com/aws/aws-sdk-go-v2/service/cloudwatchlogs from 1.37.3 to 1.38.0 - [#15760](https://github.com/influxdata/telegraf/pull/15760) `deps` Bump github.com/aws/aws-sdk-go-v2/service/timestreamwrite from 1.25.5 to 1.27.4 - [#15737](https://github.com/influxdata/telegraf/pull/15737) `deps` Bump github.com/eclipse/paho.mqtt.golang from 1.4.3 to 1.5.0 - [#15734](https://github.com/influxdata/telegraf/pull/15734) `deps` Bump github.com/google/cel-go from 0.20.1 to 0.21.0 - [#15777](https://github.com/influxdata/telegraf/pull/15777) `deps` Bump github.com/miekg/dns from 1.1.59 to 1.1.62 - [#15828](https://github.com/influxdata/telegraf/pull/15828) `deps` Bump github.com/openconfig/goyang from 1.5.0 to 1.6.0 - [#15735](https://github.com/influxdata/telegraf/pull/15735) `deps` Bump github.com/pion/dtls/v2 from 2.2.11 to 2.2.12 - [#15779](https://github.com/influxdata/telegraf/pull/15779) `deps` Bump github.com/prometheus/client_golang from 1.19.1 to 1.20.2 - [#15831](https://github.com/influxdata/telegraf/pull/15831) `deps` Bump github.com/prometheus/prometheus from 0.53.1 to 0.54.1 - [#15736](https://github.com/influxdata/telegraf/pull/15736) `deps` Bump github.com/redis/go-redis/v9 from 9.5.1 to 9.6.1 - [#15830](https://github.com/influxdata/telegraf/pull/15830) `deps` Bump github.com/seancfoley/ipaddress-go from 1.6.0 to 1.7.0 - [#15842](https://github.com/influxdata/telegraf/pull/15842) `deps` Bump github.com/showwin/speedtest-go from 1.7.7 to 1.7.9 - [#15778](https://github.com/influxdata/telegraf/pull/15778) `deps` Bump go.step.sm/crypto from 0.50.0 to 0.51.1 - [#15776](https://github.com/influxdata/telegraf/pull/15776) `deps` Bump golang.org/x/net from 0.27.0 to 0.28.0 - [#15757](https://github.com/influxdata/telegraf/pull/15757) `deps` Bump golang.org/x/sync from 0.7.0 to 0.8.0 - [#15759](https://github.com/influxdata/telegraf/pull/15759) `deps` Bump gonum.org/v1/gonum from 0.15.0 to 0.15.1 - [#15758](https://github.com/influxdata/telegraf/pull/15758) `deps` Bump modernc.org/sqlite from 1.30.0 to 1.32.0 - [#15756](https://github.com/influxdata/telegraf/pull/15756) `deps` Bump super-linter/super-linter from 6.8.0 to 7.0.0 - [#15826](https://github.com/influxdata/telegraf/pull/15826) `deps` Bump super-linter/super-linter from 7.0.0 to 7.1.0 - [#15780](https://github.com/influxdata/telegraf/pull/15780) `deps` Bump tj-actions/changed-files from 44 to 45 ## v1.31.3 [2024-08-12] ### Bugfixes - [#15552](https://github.com/influxdata/telegraf/pull/15552) `inputs.chrony` Use DGRAM for the unix socket - [#15667](https://github.com/influxdata/telegraf/pull/15667) `inputs.diskio` Print warnings once, add details to messages - [#15670](https://github.com/influxdata/telegraf/pull/15670) `inputs.mqtt_consumer` Restore trace logging option - [#15696](https://github.com/influxdata/telegraf/pull/15696) `inputs.opcua` Reconnect if closed connection - [#15724](https://github.com/influxdata/telegraf/pull/15724) `inputs.smartctl` Use --scan-open instead of --scan to provide correct device type info - [#15649](https://github.com/influxdata/telegraf/pull/15649) `inputs.tail` Prevent deadlock when closing and max undelivered lines hit ### Dependency Updates - [#15720](https://github.com/influxdata/telegraf/pull/15720) `deps` Bump Go from v1.22.5 to v1.22.6 - [#15683](https://github.com/influxdata/telegraf/pull/15683) `deps` Bump cloud.google.com/go/bigquery from 1.61.0 to 1.62.0 - [#15654](https://github.com/influxdata/telegraf/pull/15654) `deps` Bump cloud.google.com/go/monitoring from 1.19.0 to 1.20.2 - [#15679](https://github.com/influxdata/telegraf/pull/15679) `deps` Bump cloud.google.com/go/monitoring from 1.20.2 to 1.20.3 - [#15626](https://github.com/influxdata/telegraf/pull/15626) `deps` Bump github.com/antchfx/xmlquery from 1.4.0 to 1.4.1 - [#15706](https://github.com/influxdata/telegraf/pull/15706) `deps` Bump github.com/apache/iotdb-client-go from 1.2.0-tsbs to 1.3.2 - [#15651](https://github.com/influxdata/telegraf/pull/15651) `deps` Bump github.com/aws/aws-sdk-go-v2/credentials from 1.17.17 to 1.17.27 - [#15703](https://github.com/influxdata/telegraf/pull/15703) `deps` Bump github.com/aws/aws-sdk-go-v2/service/kinesis from v1.27.4 to v1.29.3 - [#15681](https://github.com/influxdata/telegraf/pull/15681) `deps` Bump github.com/docker/docker from 25.0.5-incompatible to 27.1.1-incompatible - [#15650](https://github.com/influxdata/telegraf/pull/15650) `deps` Bump github.com/gofrs/uuid/v5 from 5.0.0 to 5.2.0 - [#15705](https://github.com/influxdata/telegraf/pull/15705) `deps` Bump github.com/gorilla/websocket from 1.5.1 to 1.5.3 - [#15708](https://github.com/influxdata/telegraf/pull/15708) `deps` Bump github.com/multiplay/go-ts3 from 1.1.0 to 1.2.0 - [#15707](https://github.com/influxdata/telegraf/pull/15707) `deps` Bump github.com/prometheus-community/pro-bing from 0.4.0 to 0.4.1 - [#15709](https://github.com/influxdata/telegraf/pull/15709) `deps` Bump github.com/prometheus/prometheus from 0.48.1 to 0.53.1 - [#15680](https://github.com/influxdata/telegraf/pull/15680) `deps` Bump github.com/vmware/govmomi from 0.37.2 to 0.39.0 - [#15682](https://github.com/influxdata/telegraf/pull/15682) `deps` Bump go.mongodb.org/mongo-driver from 1.14.0 to 1.16.0 - [#15652](https://github.com/influxdata/telegraf/pull/15652) `deps` Bump go.step.sm/crypto from 0.47.1 to 0.50.0 - [#15653](https://github.com/influxdata/telegraf/pull/15653) `deps` Bump google.golang.org/grpc from 1.64.1 to 1.65.0 - [#15704](https://github.com/influxdata/telegraf/pull/15704) `deps` Bump super-linter/super-linter from 6.7.0 to 6.8.0 ## v1.31.2 [2024-07-22] ### Bugfixes - [#15589](https://github.com/influxdata/telegraf/pull/15589) `common.socket` Switch to context to simplify closing - [#15601](https://github.com/influxdata/telegraf/pull/15601) `inputs.ping` Check addr length to avoid crash - [#15618](https://github.com/influxdata/telegraf/pull/15618) `inputs.snmp` Translate field correctly when not in table - [#15586](https://github.com/influxdata/telegraf/pull/15586) `parsers.xpath` Allow resolving extensions - [#15630](https://github.com/influxdata/telegraf/pull/15630) `tools.custom_builder` Handle multiple instances of the same plugin correctly ### Dependency Updates - [#15582](https://github.com/influxdata/telegraf/pull/15582) `deps` Bump cloud.google.com/go/storage from 1.41.0 to 1.42.0 - [#15623](https://github.com/influxdata/telegraf/pull/15623) `deps` Bump cloud.google.com/go/storage from 1.42.0 to 1.43.0 - [#15607](https://github.com/influxdata/telegraf/pull/15607) `deps` Bump github.com/alitto/pond from 1.8.3 to 1.9.0 - [#15625](https://github.com/influxdata/telegraf/pull/15625) `deps` Bump github.com/antchfx/xpath from 1.3.0 to 1.3.1 - [#15622](https://github.com/influxdata/telegraf/pull/15622) `deps` Bump github.com/aws/aws-sdk-go-v2/service/cloudwatchlogs from 1.34.3 to 1.37.3 - [#15606](https://github.com/influxdata/telegraf/pull/15606) `deps` Bump github.com/hashicorp/consul/api from 1.26.1 to 1.29.1 - [#15604](https://github.com/influxdata/telegraf/pull/15604) `deps` Bump github.com/jackc/pgx/v4 from 4.18.2 to 4.18.3 - [#15581](https://github.com/influxdata/telegraf/pull/15581) `deps` Bump github.com/nats-io/nats-server/v2 from 2.10.16 to 2.10.17 - [#15603](https://github.com/influxdata/telegraf/pull/15603) `deps` Bump github.com/openconfig/goyang from 1.0.0 to 1.5.0 - [#15624](https://github.com/influxdata/telegraf/pull/15624) `deps` Bump github.com/sijms/go-ora/v2 from 2.8.4 to 2.8.19 - [#15585](https://github.com/influxdata/telegraf/pull/15585) `deps` Bump github.com/testcontainers/testcontainers-go/modules/kafka from 0.30.0 to 0.31.0 - [#15605](https://github.com/influxdata/telegraf/pull/15605) `deps` Bump github.com/tinylib/msgp from 1.1.9 to 1.2.0 - [#15584](https://github.com/influxdata/telegraf/pull/15584) `deps` Bump github.com/urfave/cli/v2 from 2.27.1 to 2.27.2 - [#15614](https://github.com/influxdata/telegraf/pull/15614) `deps` Bump google.golang.org/grpc from 1.64.0 to 1.64.1 - [#15608](https://github.com/influxdata/telegraf/pull/15608) `deps` Bump super-linter/super-linter from 6.6.0 to 6.7.0 For versions earlier than v1.13 and earlier see [CHANGELOG-1.13.md](CHANGELOG-1.13.md). ## v1.31.1 [2024-07-01] ### Bugfixes - [#15488](https://github.com/influxdata/telegraf/pull/15488) `agent` Ignore startup-errors in test mode - [#15568](https://github.com/influxdata/telegraf/pull/15568) `inputs.chrony` Handle ServerStats4 response - [#15551](https://github.com/influxdata/telegraf/pull/15551) `inputs.chrony` Support local (reference) sources - [#15565](https://github.com/influxdata/telegraf/pull/15565) `inputs.gnmi` Handle YANG namespaces in paths correctly - [#15496](https://github.com/influxdata/telegraf/pull/15496) `inputs.http_response` Fix for IPv4 and IPv6 addresses when interface is set - [#15493](https://github.com/influxdata/telegraf/pull/15493) `inputs.mysql` Handle custom TLS configs correctly - [#15514](https://github.com/influxdata/telegraf/pull/15514) `logging` Add back constants for backward compatibility - [#15531](https://github.com/influxdata/telegraf/pull/15531) `secretstores.oauth2` Ensure endpoint params is not nil ### Dependency Updates - [#15483](https://github.com/influxdata/telegraf/pull/15483) `deps` Bump cloud.google.com/go/monitoring from 1.18.1 to 1.19.0 - [#15559](https://github.com/influxdata/telegraf/pull/15559) `deps` Bump github.com/Azure/azure-kusto-go from 0.15.2 to 0.15.3 - [#15489](https://github.com/influxdata/telegraf/pull/15489) `deps` Bump github.com/Azure/azure-sdk-for-go/sdk/azidentity from 1.5.1 to 1.6.0 - [#15560](https://github.com/influxdata/telegraf/pull/15560) `deps` Bump github.com/Azure/go-autorest/autorest/azure/auth from 0.5.12 to 0.5.13 - [#15480](https://github.com/influxdata/telegraf/pull/15480) `deps` Bump github.com/IBM/sarama from 1.43.1 to 1.43.2 - [#15526](https://github.com/influxdata/telegraf/pull/15526) `deps` Bump github.com/aws/aws-sdk-go-v2/service/cloudwatch from 1.37.0 to 1.38.7 - [#15527](https://github.com/influxdata/telegraf/pull/15527) `deps` Bump github.com/aws/aws-sdk-go-v2/service/dynamodb from 1.30.2 to 1.32.9 - [#15558](https://github.com/influxdata/telegraf/pull/15558) `deps` Bump github.com/aws/aws-sdk-go-v2/service/dynamodb from 1.32.9 to 1.33.2 - [#15448](https://github.com/influxdata/telegraf/pull/15448) `deps` Bump github.com/aws/aws-sdk-go-v2/service/ec2 from 1.161.1 to 1.162.1 - [#15557](https://github.com/influxdata/telegraf/pull/15557) `deps` Bump github.com/go-ldap/ldap/v3 from 3.4.6 to 3.4.8 - [#15523](https://github.com/influxdata/telegraf/pull/15523) `deps` Bump github.com/linkedin/goavro/v2 from 2.12.0 to 2.13.0 - [#15484](https://github.com/influxdata/telegraf/pull/15484) `deps` Bump github.com/microsoft/go-mssqldb from 1.7.0 to 1.7.2 - [#15561](https://github.com/influxdata/telegraf/pull/15561) `deps` Bump github.com/nats-io/nats-server/v2 from 2.10.14 to 2.10.16 - [#15524](https://github.com/influxdata/telegraf/pull/15524) `deps` Bump github.com/prometheus/common from 0.53.0 to 0.54.0 - [#15481](https://github.com/influxdata/telegraf/pull/15481) `deps` Bump github.com/prometheus/procfs from 0.15.0 to 0.15.1 - [#15482](https://github.com/influxdata/telegraf/pull/15482) `deps` Bump github.com/rabbitmq/amqp091-go from 1.9.0 to 1.10.0 - [#15525](https://github.com/influxdata/telegraf/pull/15525) `deps` Bump go.step.sm/crypto from 0.44.1 to 0.47.1 - [#15479](https://github.com/influxdata/telegraf/pull/15479) `deps` Bump super-linter/super-linter from 6.5.1 to 6.6.0 ## v1.31.0 [2024-06-10] ### Important Changes - [PR #15186](https://github.com/influxdata/telegraf/pull/15186) changes the meaning of `inputs.procstat` fields `read_bytes` and `write_bytes` on Linux to now contain _all_ I/O operations for consistency with other operating-systems. The previous values are output as `disk_read_bytes` and `disk_write_bytes` measuring _only_ the I/O on the storage layer. ### New Plugins - [#15066](https://github.com/influxdata/telegraf/pull/15066) `inputs.smartctl` smartctl - [#15298](https://github.com/influxdata/telegraf/pull/15298) `parsers.openmetrics` OpenMetrics - [#15008](https://github.com/influxdata/telegraf/pull/15008) `parsers.parquet` Apache Parquet - [#15094](https://github.com/influxdata/telegraf/pull/15094) `processors.timestamp` Timestamp ### Features - [#15433](https://github.com/influxdata/telegraf/pull/15433) `agent` Add uint support in cli test output - [#15377](https://github.com/influxdata/telegraf/pull/15377) `agent` Introduce CLI option to set config URL retry attempts - [#15388](https://github.com/influxdata/telegraf/pull/15388) `agent` Introduce CLI option to reload remote URL configs on change - [#15030](https://github.com/influxdata/telegraf/pull/15030) `aggregators.basicstats` Add last field - [#15268](https://github.com/influxdata/telegraf/pull/15268) `aggregators.final` Add option to disable appending _final - [#15319](https://github.com/influxdata/telegraf/pull/15319) `aggregators.merge` Allow to round metric timestamps - [#15426](https://github.com/influxdata/telegraf/pull/15426) `cli` List available parsers and serializers - [#15341](https://github.com/influxdata/telegraf/pull/15341) `common.opcua` Add session timeout as configuration option - [#15395](https://github.com/influxdata/telegraf/pull/15395) `input.azure_monitor` Use default Azure credentials chain when no secret provided - [#15233](https://github.com/influxdata/telegraf/pull/15233) `inputs.ceph` Use perf schema to determine metric type - [#14992](https://github.com/influxdata/telegraf/pull/14992) `inputs.dns_query` Allow ignoring errors of specific types - [#15400](https://github.com/influxdata/telegraf/pull/15400) `inputs.exec` Add option to ignore return code - [#15271](https://github.com/influxdata/telegraf/pull/15271) `inputs.execd` Add option to not restart program on error - [#15330](https://github.com/influxdata/telegraf/pull/15330) `inputs.file` Add tag with absolute path of file - [#15171](https://github.com/influxdata/telegraf/pull/15171) `inputs.gnmi` Add keepalive settings - [#15278](https://github.com/influxdata/telegraf/pull/15278) `inputs.gnmi` Add option to create more descriptive tags - [#15173](https://github.com/influxdata/telegraf/pull/15173) `inputs.gnmi` Add secret store support for username and password - [#15201](https://github.com/influxdata/telegraf/pull/15201) `inputs.gnmi` Add yang-model decoding of JSON IETF payloads - [#15256](https://github.com/influxdata/telegraf/pull/15256) `inputs.gnmi` Allow to pass accepted cipher suites - [#15454](https://github.com/influxdata/telegraf/pull/15454) `inputs.http_listener` Allow setting custom success return code - [#15110](https://github.com/influxdata/telegraf/pull/15110) `inputs.http_response` Add cookie authentication - [#15438](https://github.com/influxdata/telegraf/pull/15438) `inputs.influxdb` Add metrics for build, crypto and commandline - [#15361](https://github.com/influxdata/telegraf/pull/15361) `inputs.influxdb_v2_listener` Add support for rate limiting - [#15407](https://github.com/influxdata/telegraf/pull/15407) `inputs.influxdb_v2_listener` Support secret store for token - [#15329](https://github.com/influxdata/telegraf/pull/15329) `inputs.internet_speed` Introduce packet loss field - [#15368](https://github.com/influxdata/telegraf/pull/15368) `inputs.kafka_consumer` Add resolve canonical bootstrap server option - [#15169](https://github.com/influxdata/telegraf/pull/15169) `inputs.knx_listener` Add support for string data type - [#15069](https://github.com/influxdata/telegraf/pull/15069) `inputs.knx_listener` Allow usage of DPT string representation - [#15049](https://github.com/influxdata/telegraf/pull/15049) `inputs.kubernetes` Add option to node metric name - [#15044](https://github.com/influxdata/telegraf/pull/15044) `inputs.lustre2` Add eviction_count field - [#15042](https://github.com/influxdata/telegraf/pull/15042) `inputs.lustre2` Add health-check metric - [#14813](https://github.com/influxdata/telegraf/pull/14813) `inputs.lustre2` Add support for bulk read/write stats - [#15045](https://github.com/influxdata/telegraf/pull/15045) `inputs.lustre2` Skip brw_stats in case of insufficient permissions - [#15270](https://github.com/influxdata/telegraf/pull/15270) `inputs.mock` Add baseline option to sine - [#15314](https://github.com/influxdata/telegraf/pull/15314) `inputs.netflow` Add support for IPFIX option packets - [#15180](https://github.com/influxdata/telegraf/pull/15180) `inputs.netflow` Add support for netflow v9 option packets - [#15282](https://github.com/influxdata/telegraf/pull/15282) `inputs.nvidia_smi` Add power-limit field for v12 scheme - [#15460](https://github.com/influxdata/telegraf/pull/15460) `inputs.openstack` Use service catalog from v3 authentication if available - [#15231](https://github.com/influxdata/telegraf/pull/15231) `inputs.opentelemetry` Add option to set max receive message size - [#15299](https://github.com/influxdata/telegraf/pull/15299) `inputs.procstat` Add option to select properties to collect - [#14948](https://github.com/influxdata/telegraf/pull/14948) `inputs.procstat` Allow multiple selection criteria - [#15186](https://github.com/influxdata/telegraf/pull/15186) `inputs.procstat` Report consistent I/O on Linux - [#14981](https://github.com/influxdata/telegraf/pull/14981) `inputs.radius` Provide setting to set request IP address - [#15293](https://github.com/influxdata/telegraf/pull/15293) `inputs.redis` Add latency percentiles metric - [#15000](https://github.com/influxdata/telegraf/pull/15000) `inputs.s7comm` Add optional connection type setting - [#15439](https://github.com/influxdata/telegraf/pull/15439) `inputs.snmp` Convert octet string with invalid data to hex - [#15137](https://github.com/influxdata/telegraf/pull/15137) `inputs.sqlserver` Add persistent version store metrics - [#15380](https://github.com/influxdata/telegraf/pull/15380) `inputs.statsd` Add support for DogStatsD v1.2 - [#15371](https://github.com/influxdata/telegraf/pull/15371) `inputs.statsd` Allow counters to report as float - [#15306](https://github.com/influxdata/telegraf/pull/15306) `inputs.win_eventlog` Add option to define event batch-size - [#14973](https://github.com/influxdata/telegraf/pull/14973) `inputs.win_wmi` Add support for remote queries - [#15300](https://github.com/influxdata/telegraf/pull/15300) `inputs.win_wmi` Allow to invoke methods - [#15145](https://github.com/influxdata/telegraf/pull/15145) `inputs` Add framework to retry on startup errors - [#15065](https://github.com/influxdata/telegraf/pull/15065) `outputs.cratedb` Allow configuration of startup error handling - [#15477](https://github.com/influxdata/telegraf/pull/15477) `outputs.elasticsearch` Allow settings extra headers for elasticsearch output - [#15225](https://github.com/influxdata/telegraf/pull/15225) `outputs.influxdb` Add option to define local address - [#15228](https://github.com/influxdata/telegraf/pull/15228) `outputs.influxdb_v2` Add option to set local address - [#15475](https://github.com/influxdata/telegraf/pull/15475) `outputs.influxdb_v2` Preserve custom query parameters on write - [#15429](https://github.com/influxdata/telegraf/pull/15429) `outputs.mqtt` Add client trace logging, resolve MQTT5 reconnect login - [#15041](https://github.com/influxdata/telegraf/pull/15041) `outputs.postgresql` Add secret store support - [#15073](https://github.com/influxdata/telegraf/pull/15073) `outputs.postgresql` Allow configuration of startup error handling - [#14884](https://github.com/influxdata/telegraf/pull/14884) `outputs` Add framework to retry on startup errors - [#14952](https://github.com/influxdata/telegraf/pull/14952) `parser.prometheusremotewrite` Parse and generate histogram buckets - [#14961](https://github.com/influxdata/telegraf/pull/14961) `parsers.binary` Allow base64-encoded input data - [#15328](https://github.com/influxdata/telegraf/pull/15328) `processors.parser` Add base64 decode for fields - [#15434](https://github.com/influxdata/telegraf/pull/15434) `processors.printer` Embed Influx serializer options - [#15170](https://github.com/influxdata/telegraf/pull/15170) `processors.starlark` Allow persistence of global state - [#15220](https://github.com/influxdata/telegraf/pull/15220) `serializers.influx` Add option to omit timestamp - [#14975](https://github.com/influxdata/telegraf/pull/14975) `snmp` Add secret support for auth_password and priv_password ### Bugfixes - [#15402](https://github.com/influxdata/telegraf/pull/15402) `agent` Warn on multiple agent configuration tables seen - [#15440](https://github.com/influxdata/telegraf/pull/15440) `inputs.cloudwatch` Add accounts when enabled - [#15428](https://github.com/influxdata/telegraf/pull/15428) `inputs.cloudwatch` Ensure account list is larger than index - [#15456](https://github.com/influxdata/telegraf/pull/15456) `inputs.ecs` Check for nil pointer before use - [#15401](https://github.com/influxdata/telegraf/pull/15401) `inputs.postgresql_extensible` Use same timestamp for each gather - [#15260](https://github.com/influxdata/telegraf/pull/15260) `inputs.procstat` Do not report dead processes as running for orphan PID files - [#15332](https://github.com/influxdata/telegraf/pull/15332) `inputs.smartctl` Add additional fields - [#15466](https://github.com/influxdata/telegraf/pull/15466) `processors.snmp_lookup` Return empty tag-map on error to avoid panic ### Dependency Updates - [#15385](https://github.com/influxdata/telegraf/pull/15385) `deps` Bump cloud.google.com/go/storage from 1.40.0 to 1.41.0 - [#15446](https://github.com/influxdata/telegraf/pull/15446) `deps` Bump github.com/awnumar/memguard from 0.22.4 to 0.22.5 - [#15413](https://github.com/influxdata/telegraf/pull/15413) `deps` Bump github.com/fatih/color from 1.16.0 to 1.17.0 - [#15410](https://github.com/influxdata/telegraf/pull/15410) `deps` Bump github.com/jhump/protoreflect from 1.15.6 to 1.16.0 - [#15441](https://github.com/influxdata/telegraf/pull/15441) `deps` Bump github.com/lxc/incus v0.4.0 to v6.2.0 - [#15381](https://github.com/influxdata/telegraf/pull/15381) `deps` Bump github.com/miekg/dns from 1.1.58 to 1.1.59 - [#15444](https://github.com/influxdata/telegraf/pull/15444) `deps` Bump github.com/openzipkin/zipkin-go from 0.4.2 to 0.4.3 - [#15412](https://github.com/influxdata/telegraf/pull/15412) `deps` Bump github.com/prometheus/common from 0.52.2 to 0.53.0 - [#15362](https://github.com/influxdata/telegraf/pull/15362) `deps` Bump github.com/showwin/speedtest-go from 1.7.5 to 1.7.6 - [#15382](https://github.com/influxdata/telegraf/pull/15382) `deps` Bump github.com/showwin/speedtest-go from 1.7.6 to 1.7.7 - [#15384](https://github.com/influxdata/telegraf/pull/15384) `deps` Bump github.com/snowflakedb/gosnowflake from 1.7.2 to 1.10.0 - [#15470](https://github.com/influxdata/telegraf/pull/15470) `deps` Bump go from v1.22.3 to v1.22.4 - [#15411](https://github.com/influxdata/telegraf/pull/15411) `deps` Bump golang.org/x/crypto from 0.22.0 to 0.23.0 - [#15447](https://github.com/influxdata/telegraf/pull/15447) `deps` Bump golang.org/x/net from 0.24.0 to 0.25.0 - [#15383](https://github.com/influxdata/telegraf/pull/15383) `deps` Bump k8s.io/* from 0.29.3 to 0.30.1 - [#15445](https://github.com/influxdata/telegraf/pull/15445) `deps` Bump modernc.org/sqlite from 1.29.10 to 1.30.0 - [#15409](https://github.com/influxdata/telegraf/pull/15409) `deps` Bump modernc.org/sqlite from 1.29.5 to 1.29.10 - [#15386](https://github.com/influxdata/telegraf/pull/15386) `deps` Bump super-linter/super-linter from 6.4.1 to 6.5.0 - [#15408](https://github.com/influxdata/telegraf/pull/15408) `deps` Bump super-linter/super-linter from 6.5.0 to 6.5.1 - [#15393](https://github.com/influxdata/telegraf/pull/15393) `deps` Switch to github.com/leodido/go-syslog - [#15403](https://github.com/influxdata/telegraf/pull/15403) `deps` Update OpenTelemetry dependencies ## v1.30.3 [2024-05-20] ### Bugfixes - [#15213](https://github.com/influxdata/telegraf/pull/15213) `http` Stop plugins from leaking file descriptors on telegraf reload - [#15312](https://github.com/influxdata/telegraf/pull/15312) `input.redis` Discard invalid errorstat lines - [#15317](https://github.com/influxdata/telegraf/pull/15317) `inputs.cloudwatch` Option to produce dense metrics - [#15259](https://github.com/influxdata/telegraf/pull/15259) `inputs.gnmi` Ensure path contains elements to avoid panic - [#15239](https://github.com/influxdata/telegraf/pull/15239) `inputs.http_listener_v2` Wrap timestamp parsing error messages - [#15323](https://github.com/influxdata/telegraf/pull/15323) `inputs.netflow` Log unknown fields only once - [#15212](https://github.com/influxdata/telegraf/pull/15212) `inputs.sysstat` Prevent default sadc_interval from increasing on reload - [#15223](https://github.com/influxdata/telegraf/pull/15223) `makefile` Use go's dependency checker for per platform builds - [#15224](https://github.com/influxdata/telegraf/pull/15224) `outputs.graphite` Handle local address without port correctly - [#15277](https://github.com/influxdata/telegraf/pull/15277) `outputs.loki` Option to sanitize label names - [#15346](https://github.com/influxdata/telegraf/pull/15346) `windows` Make sure to log the final error message on exit ### Dependency Updates - [#15262](https://github.com/influxdata/telegraf/pull/15262) `deps` Bump cloud.google.com/go/bigquery from 1.59.1 to 1.61.0 - [#15308](https://github.com/influxdata/telegraf/pull/15308) `deps` Bump github.com/Azure/azure-kusto-go from 0.15.0 to 0.15.2 - [#15203](https://github.com/influxdata/telegraf/pull/15203) `deps` Bump github.com/aliyun/alibaba-cloud-sdk-go from 1.62.713 to 1.62.721 - [#15349](https://github.com/influxdata/telegraf/pull/15349) `deps` Bump github.com/antchfx/xmlquery from 1.3.18 to 1.4.0 - [#15263](https://github.com/influxdata/telegraf/pull/15263) `deps` Bump github.com/antchfx/xpath from 1.2.5 to 1.3.0 - [#15348](https://github.com/influxdata/telegraf/pull/15348) `deps` Bump github.com/aws/aws-sdk-go-v2/config from 1.27.9 to 1.27.13 - [#15202](https://github.com/influxdata/telegraf/pull/15202) `deps` Bump github.com/aws/aws-sdk-go-v2/credentials from 1.17.9 to 1.17.11 - [#15350](https://github.com/influxdata/telegraf/pull/15350) `deps` Bump github.com/aws/aws-sdk-go-v2/service/ec2 from 1.151.1 to 1.161.1 - [#15307](https://github.com/influxdata/telegraf/pull/15307) `deps` Bump github.com/coocood/freecache from 1.2.3 to 1.2.4 - [#15205](https://github.com/influxdata/telegraf/pull/15205) `deps` Bump github.com/google/cel-go from 0.18.1 to 0.20.1 - [#15276](https://github.com/influxdata/telegraf/pull/15276) `deps` Bump github.com/grid-x/modbus from v0.0.0-20211113184042-7f2251c342c9 to v0.0.0-20240503115206-582f2ab60a18 - [#15347](https://github.com/influxdata/telegraf/pull/15347) `deps` Bump github.com/nats-io/nats-server/v2 from 2.10.9 to 2.10.14 - [#15310](https://github.com/influxdata/telegraf/pull/15310) `deps` Bump github.com/pion/dtls/v2 from 2.2.10 to 2.2.11 - [#15265](https://github.com/influxdata/telegraf/pull/15265) `deps` Bump github.com/prometheus/procfs from 0.13.0 to 0.14.0 - [#15272](https://github.com/influxdata/telegraf/pull/15272) `deps` Bump github.com/shirou/gopsutil/v3 from v3.24.3 to v3.24.4 - [#15264](https://github.com/influxdata/telegraf/pull/15264) `deps` Bump github.com/testcontainers/testcontainers-go/modules/kafka from 0.26.1-0.20231116140448-68d5f8983d09 to 0.30.0 - [#15351](https://github.com/influxdata/telegraf/pull/15351) `deps` Bump github.com/vmware/govmomi from 0.37.0 to 0.37.2 - [#15327](https://github.com/influxdata/telegraf/pull/15327) `deps` Bump go from v1.22.2 to v1.22.3 - [#15206](https://github.com/influxdata/telegraf/pull/15206) `deps` Bump golang.org/x/mod from 0.16.0 to 0.17.0 - [#15266](https://github.com/influxdata/telegraf/pull/15266) `deps` Bump golang.org/x/sync from 0.6.0 to 0.7.0 - [#15303](https://github.com/influxdata/telegraf/pull/15303) `deps` Bump golangci-lint from v1.57.2 to v1.58.0 - [#15309](https://github.com/influxdata/telegraf/pull/15309) `deps` Bump google.golang.org/api from 0.171.0 to 0.177.0 - [#15207](https://github.com/influxdata/telegraf/pull/15207) `deps` Bump super-linter/super-linter from 6.3.1 to 6.4.1 - [#15316](https://github.com/influxdata/telegraf/pull/15316) `deps` Migrate to maintained gopacket library ## v1.30.2 [2024-04-22] ### Important Changes - [PR #15108](https://github.com/influxdata/telegraf/pull/15108) reverts the behavior of `inputs.systemd_units` back to pre-v1.30.0 to only collect units already loaded by systemd, i.e. not collecting disabled or static units. This was necessary because using unspecific filters will cause significant load on the system as systemd needs to read all unit-files matching the pattern in each gather cycle. If you use specific patterns and want to collect non-loaded units, please set the `collect_disabled_units` option to `true`. ### Bugfixes - [#15054](https://github.com/influxdata/telegraf/pull/15054) `agent` Ensure import of required package for pprof support - [#15155](https://github.com/influxdata/telegraf/pull/15155) `inputs.diskio` Update path from /sys/block to /sys/class/block - [#15146](https://github.com/influxdata/telegraf/pull/15146) `inputs.modbus` Avoid overflow when calculating with uint16 addresses - [#15144](https://github.com/influxdata/telegraf/pull/15144) `inputs.nvidia` Include power limit field for v11 - [#15178](https://github.com/influxdata/telegraf/pull/15178) `inputs.opcua` Make sure to always create a request - [#15176](https://github.com/influxdata/telegraf/pull/15176) `inputs.phpfpm` Check for error before continue processing - [#15195](https://github.com/influxdata/telegraf/pull/15195) `inputs.prometheus` Correctly handle host header - [#15078](https://github.com/influxdata/telegraf/pull/15078) `inputs.prometheus` Remove duplicate response_timeout option - [#15154](https://github.com/influxdata/telegraf/pull/15154) `inputs.sqlserver` Honor timezone on backup metrics - [#15129](https://github.com/influxdata/telegraf/pull/15129) `inputs.systemd_units` Reconnect if connection is lost - [#15108](https://github.com/influxdata/telegraf/pull/15108) `inputs.systemd_units` Revert to only gather loaded units by default - [#15132](https://github.com/influxdata/telegraf/pull/15132) `inputs.win_eventlog` Handle empty query correctly - [#15157](https://github.com/influxdata/telegraf/pull/15157) `outputs.opensearch` Correctly error during failures or disconnect - [#15196](https://github.com/influxdata/telegraf/pull/15196) `outputs.sql` Enable the use of krb5 with mssql driver - [#15168](https://github.com/influxdata/telegraf/pull/15168) `systemd` Remove 5 second timeout, use default (90 seconds) ### Dependency Updates - [#15087](https://github.com/influxdata/telegraf/pull/15087) `deps` Bump github.com/aliyun/alibaba-cloud-sdk-go from 1.62.563 to 1.62.708 - [#15163](https://github.com/influxdata/telegraf/pull/15163) `deps` Bump github.com/aliyun/alibaba-cloud-sdk-go from 1.62.708 to 1.62.713 - [#15086](https://github.com/influxdata/telegraf/pull/15086) `deps` Bump github.com/apache/iotdb-client-go from 0.12.2-0.20220722111104-cd17da295b46 to 1.2.0-tsbs - [#15125](https://github.com/influxdata/telegraf/pull/15125) `deps` Bump github.com/aws/aws-sdk-go-v2/service/cloudwatch from 1.36.1 to 1.37.0 - [#15164](https://github.com/influxdata/telegraf/pull/15164) `deps` Bump github.com/aws/aws-sdk-go-v2/service/kinesis from 1.27.1 to 1.27.4 - [#15161](https://github.com/influxdata/telegraf/pull/15161) `deps` Bump github.com/aws/aws-sdk-go-v2/service/timestreamwrite from 1.25.2 to 1.25.5 - [#15162](https://github.com/influxdata/telegraf/pull/15162) `deps` Bump github.com/go-sql-driver/mysql from 1.7.1 to 1.8.1 - [#15084](https://github.com/influxdata/telegraf/pull/15084) `deps` Bump github.com/gophercloud/gophercloud from 1.9.0 to 1.11.0 - [#15126](https://github.com/influxdata/telegraf/pull/15126) `deps` Bump github.com/jackc/pgtype from 1.14.2 to 1.14.3 - [#15100](https://github.com/influxdata/telegraf/pull/15100) `deps` Bump github.com/prometheus/client_golang from 1.18.0 to 1.19.0 - [#15127](https://github.com/influxdata/telegraf/pull/15127) `deps` Bump github.com/redis/go-redis/v9 from 9.2.1 to 9.5.1 - [#15082](https://github.com/influxdata/telegraf/pull/15082) `deps` Bump github.com/shirou/gopsutil from v3.23.11 to v3.24.3 - [#15085](https://github.com/influxdata/telegraf/pull/15085) `deps` Bump github.com/testcontainers/testcontainers-go from 0.27.0 to 0.29.1 - [#15160](https://github.com/influxdata/telegraf/pull/15160) `deps` Bump github.com/vmware/govmomi from 0.33.1 to 0.37.0 - [#15193](https://github.com/influxdata/telegraf/pull/15193) `deps` Bump golang.org/x/net from 0.22.0 to 0.23.0 - [#15128](https://github.com/influxdata/telegraf/pull/15128) `deps` Bump golang.org/x/oauth2 from 0.18.0 to 0.19.0 - [#15124](https://github.com/influxdata/telegraf/pull/15124) `deps` Bump k8s.io/client-go from 0.29.2 to 0.29.3 - [#15123](https://github.com/influxdata/telegraf/pull/15123) `deps` Bump super-linter/super-linter from 6.3.0 to 6.3.1 - [#15083](https://github.com/influxdata/telegraf/pull/15083) `deps` Bump tj-actions/changed-files from 43 to 44 ## v1.30.1 [2024-04-01] ### Bugfixes - [#14966](https://github.com/influxdata/telegraf/pull/14966) `inputs.chrony` Remove chronyc dependency in documentation - [#15003](https://github.com/influxdata/telegraf/pull/15003) `inputs.diskio` Add missing udev properties - [#14979](https://github.com/influxdata/telegraf/pull/14979) `inputs.dns_query` Fill out additional record fields - [#15025](https://github.com/influxdata/telegraf/pull/15025) `inputs.dns_query` Include the canonical CNAME target - [#15007](https://github.com/influxdata/telegraf/pull/15007) `inputs.knx_listener` Ignore GroupValueRead requests - [#14959](https://github.com/influxdata/telegraf/pull/14959) `inputs.knx_listener` Reconnect after connection loss - [#15063](https://github.com/influxdata/telegraf/pull/15063) `inputs.mysql` Parse boolean values in metric v1 correctly - [#15012](https://github.com/influxdata/telegraf/pull/15012) `inputs.mysql` Use correct column-types for Percona 8 user stats - [#15023](https://github.com/influxdata/telegraf/pull/15023) `inputs.nvidia_smi` Add process info metrics - [#14977](https://github.com/influxdata/telegraf/pull/14977) `inputs.openstack` Resolve regression in block storage and server info - [#15036](https://github.com/influxdata/telegraf/pull/15036) `inputs.phpfpm` Add timeout for fcgi - [#15011](https://github.com/influxdata/telegraf/pull/15011) `inputs.ping` Add option to force ipv4 - [#15021](https://github.com/influxdata/telegraf/pull/15021) `inputs.prometheus` Initialize logger of parser - [#14996](https://github.com/influxdata/telegraf/pull/14996) `inputs.smart` Improve regexp to support flags with a plus - [#14987](https://github.com/influxdata/telegraf/pull/14987) `inputs.systemd_units` Handle disabled multi-instance units correctly - [#14958](https://github.com/influxdata/telegraf/pull/14958) `outputs.bigquery` Add scope to bigquery and remove timeout context - [#14991](https://github.com/influxdata/telegraf/pull/14991) `secrets` Avoid count underflow by only counting initialized secrets - [#15040](https://github.com/influxdata/telegraf/pull/15040) `windows` Ensure watch-config is passed to Windows service ### Dependency Updates - [#15071](https://github.com/influxdata/telegraf/pull/15071) `deps` Bump github.com/IBM/sarama from v1.42.2 to v1.43.1 - [#15017](https://github.com/influxdata/telegraf/pull/15017) `deps` Bump github.com/aws/aws-sdk-go-v2 from 1.25.3 to 1.26.0 - [#15058](https://github.com/influxdata/telegraf/pull/15058) `deps` Bump github.com/aws/aws-sdk-go-v2/config from 1.27.5 to 1.27.9 - [#15060](https://github.com/influxdata/telegraf/pull/15060) `deps` Bump github.com/aws/aws-sdk-go-v2/feature/ec2/imds from 1.15.2 to 1.16.0 - [#14969](https://github.com/influxdata/telegraf/pull/14969) `deps` Bump github.com/aws/aws-sdk-go-v2/service/cloudwatchlogs from 1.34.2 to 1.34.3 - [#15014](https://github.com/influxdata/telegraf/pull/15014) `deps` Bump github.com/aws/aws-sdk-go-v2/service/ec2 from 1.149.3 to 1.151.1 - [#14971](https://github.com/influxdata/telegraf/pull/14971) `deps` Bump github.com/aws/aws-sdk-go-v2/service/sts from 1.28.2 to 1.28.4 - [#15029](https://github.com/influxdata/telegraf/pull/15029) `deps` Bump github.com/docker/docker from 25.0.0+incompatible to 25.0.5+incompatible - [#15016](https://github.com/influxdata/telegraf/pull/15016) `deps` Bump github.com/jackc/pgtype from 1.14.0 to 1.14.2 - [#14978](https://github.com/influxdata/telegraf/pull/14978) `deps` Bump github.com/jackc/pgx/v4 from 4.18.1 to 4.18.2 - [#14968](https://github.com/influxdata/telegraf/pull/14968) `deps` Bump github.com/klauspost/compress from 1.17.6 to 1.17.7 - [#14967](https://github.com/influxdata/telegraf/pull/14967) `deps` Bump github.com/pion/dtls/v2 from 2.2.8 to 2.2.10 - [#15059](https://github.com/influxdata/telegraf/pull/15059) `deps` Bump github.com/prometheus-community/pro-bing from 0.3.0 to 0.4.0 - [#14970](https://github.com/influxdata/telegraf/pull/14970) `deps` Bump github.com/prometheus/procfs from 0.12.0 to 0.13.0 - [#15009](https://github.com/influxdata/telegraf/pull/15009) `deps` Bump github.com/stretchr/testify v1.8.4 to v1.9.0 - [#15061](https://github.com/influxdata/telegraf/pull/15061) `deps` Bump go.step.sm/crypto from 0.43.0 to 0.44.1 - [#15018](https://github.com/influxdata/telegraf/pull/15018) `deps` Bump golang.org/x/crypto from 0.20.0 to 0.21.0 - [#15015](https://github.com/influxdata/telegraf/pull/15015) `deps` Bump gonum.org/v1/gonum from 0.14.0 to 0.15.0 - [#15057](https://github.com/influxdata/telegraf/pull/15057) `deps` Bump google.golang.org/api from 0.165.0 to 0.171.0 - [#14989](https://github.com/influxdata/telegraf/pull/14989) `deps` Bump google.golang.org/protobuf from 1.32.0 to 1.33.0 - [#15013](https://github.com/influxdata/telegraf/pull/15013) `deps` Bump tj-actions/changed-files from 42 to 43 ## v1.30.0 [2024-03-11] ### Deprecation Removals This release removes the following deprecated plugins: - `inputs.cassandra` in [#14859](https://github.com/influxdata/telegraf/pull/14859) - `inputs.httpjson` in [#14860](https://github.com/influxdata/telegraf/pull/14860) - `inputs.io` in [#14861](https://github.com/influxdata/telegraf/pull/14861) - `inputs.jolokia` in [#14862](https://github.com/influxdata/telegraf/pull/14862) - `inputs.kafka_consumer_legacy` in [#14863](https://github.com/influxdata/telegraf/pull/14863) - `inputs.snmp_legacy` in [#14864](https://github.com/influxdata/telegraf/pull/14864) - `inputs.tcp_listener` in [#14865](https://github.com/influxdata/telegraf/pull/14865) - `inputs.udp_listener` in [#14866](https://github.com/influxdata/telegraf/pull/14866) - `outputs.riemann_legacy` in [#14867](https://github.com/influxdata/telegraf/pull/14867) Furthermore, the following deprecated plugin options are removed: - `mountpoints` of `inputs.disk` in [#14913](https://github.com/influxdata/telegraf/pull/14913) - `metric_buffer` of `inputs.mqtt_consumer` in [#14914](https://github.com/influxdata/telegraf/pull/14914) - `metric_buffer` of `inputs.nats_consumer` in [#14915](https://github.com/influxdata/telegraf/pull/14915) - `url` of `outputs.influxdb` in [#14916](https://github.com/influxdata/telegraf/pull/14916) Replacements do exist, so please migrate your configuration in case you are still using one of those plugins. The `telegraf config migrate` command might be able to assist with the procedure. ### Important Changes - The default read-timeout of `inputs.syslog` of five seconds is not a sensible default as the plugin will close the connection if the time between consecutive messages exceeds the timeout. [#14837](https://github.com/influxdata/telegraf/pull/14828) sets the timeout to infinite (i.e zero) as this is the expected behavior. - With correctly sanitizing PostgreSQL addresses ([PR #14829](https://github.com/influxdata/telegraf/pull/14829)) the `server` tag value for a URI-format address might change in case it contains spaces, backslashes or single-quotes in non-redacted parameters. ### New Plugins - [#13739](https://github.com/influxdata/telegraf/pull/13739) `outputs.zabbix` Add Zabbix plugin - [#14474](https://github.com/influxdata/telegraf/pull/14474) `serializers.binary` Add binary serializer - [#14223](https://github.com/influxdata/telegraf/pull/14223) `processors.snmp_lookup` Add SNMP lookup processor ### Features - [#14491](https://github.com/influxdata/telegraf/pull/14491) Add loongarch64 nightly and release builds - [#14882](https://github.com/influxdata/telegraf/pull/14882) `agent` Add option to skip re-running processors after aggregators - [#14676](https://github.com/influxdata/telegraf/pull/14676) `common.opcua` Add debug info for nodes not in server namespace - [#14743](https://github.com/influxdata/telegraf/pull/14743) `http` Allow secrets in headers - [#14806](https://github.com/influxdata/telegraf/pull/14806) `inputs.aerospike` Deprecate plugin - [#14872](https://github.com/influxdata/telegraf/pull/14872) `inputs.amd_rocm_smi` Add startup_error_behavior config option - [#14673](https://github.com/influxdata/telegraf/pull/14673) `inputs.chrony` Allow to collect additional metrics - [#14629](https://github.com/influxdata/telegraf/pull/14629) `inputs.chrony` Remove chronyc dependency - [#14585](https://github.com/influxdata/telegraf/pull/14585) `inputs.kafka_consumer` Mark messages that failed parsing - [#14507](https://github.com/influxdata/telegraf/pull/14507) `inputs.kernel` Add Pressure Stall Information - [#14764](https://github.com/influxdata/telegraf/pull/14764) `inputs.modbus` Add workaround for unusual string-byte locations - [#14625](https://github.com/influxdata/telegraf/pull/14625) `inputs.net` Add speed metric - [#14680](https://github.com/influxdata/telegraf/pull/14680) `inputs.nvidia_smi` Add startup_error_behavior config option - [#14424](https://github.com/influxdata/telegraf/pull/14424) `inputs.prometheus` Add internal metrics - [#14661](https://github.com/influxdata/telegraf/pull/14661) `inputs.prometheus` Add option to limit body length - [#14702](https://github.com/influxdata/telegraf/pull/14702) `inputs.redfish` Allow secrets for username/password configuration - [#14613](https://github.com/influxdata/telegraf/pull/14613) `inputs.smart` Add a device_type tag to differentiate disks behind a RAID controller - [#14792](https://github.com/influxdata/telegraf/pull/14792) `inputs.sqlserver` Add stolen target memory ratio - [#14814](https://github.com/influxdata/telegraf/pull/14814) `inputs.systemd_units` Allow to query unloaded/disabled units - [#14539](https://github.com/influxdata/telegraf/pull/14539) `inputs.systemd_units` Introduce show subcommand for additional data - [#14684](https://github.com/influxdata/telegraf/pull/14684) `inputs.win_services` Make service selection case-insensitive - [#14628](https://github.com/influxdata/telegraf/pull/14628) `outputs.graphite` Allow to set the local address to bind - [#14236](https://github.com/influxdata/telegraf/pull/14236) `outputs.nats` Introduce NATS Jetstream option - [#14658](https://github.com/influxdata/telegraf/pull/14658) `outputs.nebius_cloud_monitoring` Add service configuration setting - [#14836](https://github.com/influxdata/telegraf/pull/14836) `outputs.websocket` Allow specifying secrets in headers - [#14870](https://github.com/influxdata/telegraf/pull/14870) `serializers.csv` Allow specifying fixed column order ### Bugfixes - [#14840](https://github.com/influxdata/telegraf/pull/14840) `agent` Catch panics in inputs goroutine - [#14858](https://github.com/influxdata/telegraf/pull/14858) `config` Reword error message about missing config option - [#14874](https://github.com/influxdata/telegraf/pull/14874) `inputs.docker_log` Use correct name when matching container - [#14951](https://github.com/influxdata/telegraf/pull/14951) `inputs.gnmi` Add option to guess path tag from subscription - [#14953](https://github.com/influxdata/telegraf/pull/14953) `inputs.gnmi` Handle canonical field-name correctly - [#14910](https://github.com/influxdata/telegraf/pull/14910) `inputs.netflow` Fallback to IPFIX mappings for Netflow v9 - [#14852](https://github.com/influxdata/telegraf/pull/14852) `inputs.phpfpm` Continue despite erroneous sockets - [#14871](https://github.com/influxdata/telegraf/pull/14871) `inputs.prometheus` List namespaces only when filtering by namespace - [#14606](https://github.com/influxdata/telegraf/pull/14606) `parsers.prometheus` Do not touch input data for protocol-buffers - [#14880](https://github.com/influxdata/telegraf/pull/14880) `processors.override` Correct TOML tag name - [#14937](https://github.com/influxdata/telegraf/pull/14937) `statefile` Ensure valid statefile in package ### Dependency Updates - [#14931](https://github.com/influxdata/telegraf/pull/14931) `deps` Bump all github.com/aws/aws-sdk-go-v2 dependencies - [#14894](https://github.com/influxdata/telegraf/pull/14894) `deps` Bump cloud.google.com/go/bigquery from 1.58.0 to 1.59.1 - [#14932](https://github.com/influxdata/telegraf/pull/14932) `deps` Bump github.com/aws/aws-sdk-go-v2/service/dynamodb from 1.27.0 to 1.30.2 - [#14949](https://github.com/influxdata/telegraf/pull/14949) `deps` Bump github.com/cloudevents/sdk-go/v2 from 2.15.0 to 2.15.2 - [#14929](https://github.com/influxdata/telegraf/pull/14929) `deps` Bump github.com/eclipse/paho.golang from 0.20.0 to 0.21.0 - [#14892](https://github.com/influxdata/telegraf/pull/14892) `deps` Bump github.com/microsoft/go-mssqldb from 1.6.0 to 1.7.0 - [#14923](https://github.com/influxdata/telegraf/pull/14923) `deps` Bump github.com/netsampler/goflow2 from v1.3.6 to v2.1.2 - [#14895](https://github.com/influxdata/telegraf/pull/14895) `deps` Bump github.com/peterbourgon/unixtransport from 0.0.3 to 0.0.4 - [#14933](https://github.com/influxdata/telegraf/pull/14933) `deps` Bump github.com/prometheus/client_model from 0.5.0 to 0.6.0 - [#14857](https://github.com/influxdata/telegraf/pull/14857) `deps` Bump github.com/srebhan/cborquery from v0.0.0-20230626165538-38be85b82316 to v1.0.1 - [#14918](https://github.com/influxdata/telegraf/pull/14918) `deps` Bump github.com/vapourismo/knx-go from v0.0.0-20240107135439-816b70397a00 to v0.0.0-20240217175130-922a0d50c241 - [#14893](https://github.com/influxdata/telegraf/pull/14893) `deps` Bump go.mongodb.org/mongo-driver from 1.13.1 to 1.14.0 - [#14891](https://github.com/influxdata/telegraf/pull/14891) `deps` Bump golang.org/x/crypto from 0.19.0 to 0.20.0 - [#14930](https://github.com/influxdata/telegraf/pull/14930) `deps` Bump modernc.org/sqlite from 1.28.0 to 1.29.2 - [#14897](https://github.com/influxdata/telegraf/pull/14897) `deps` Bump super-linter/super-linter from 6.1.1 to 6.2.0 - [#14934](https://github.com/influxdata/telegraf/pull/14934) `deps` Bump super-linter/super-linter from 6.2.0 to 6.3.0 ## v1.29.5 [2024-02-20] ### Bugfixes - [#14669](https://github.com/influxdata/telegraf/pull/14669) `inputs.filecount` Respect symlink files with FollowSymLinks - [#14838](https://github.com/influxdata/telegraf/pull/14838) `inputs.gnmi` Normalize path for inline origin handling - [#14679](https://github.com/influxdata/telegraf/pull/14679) `inputs.kafka_consumer` Fix typo of msg_headers_as_tags - [#14707](https://github.com/influxdata/telegraf/pull/14707) `inputs.postgresql_extensible` Add support for bool tags - [#14659](https://github.com/influxdata/telegraf/pull/14659) `inputs.redfish` Resolve iLO4 fan data - [#14665](https://github.com/influxdata/telegraf/pull/14665) `inputs.snmp_trap` Enable SHA ciphers - [#14635](https://github.com/influxdata/telegraf/pull/14635) `inputs.vsphere` Use guest.guestId value if set for guest name - [#14752](https://github.com/influxdata/telegraf/pull/14752) `outputs.mqtt` Retry metrics for server timeout - [#14770](https://github.com/influxdata/telegraf/pull/14770) `processors.execd` Accept tracking metrics instead of dropping them - [#14832](https://github.com/influxdata/telegraf/pull/14832) `processors.unpivot` Handle tracking metrics correctly - [#14654](https://github.com/influxdata/telegraf/pull/14654) `rpm` Ensure telegraf is installed after useradd ### Dependency Updates - [#14690](https://github.com/influxdata/telegraf/pull/14690) `deps` Bump cloud.google.com/go/bigquery from 1.57.1 to 1.58.0 - [#14772](https://github.com/influxdata/telegraf/pull/14772) `deps` Bump cloud.google.com/go/pubsub from 1.33.0 to 1.36.1 - [#14819](https://github.com/influxdata/telegraf/pull/14819) `deps` Bump cloud.google.com/go/storage from 1.36.0 to 1.38.0 - [#14688](https://github.com/influxdata/telegraf/pull/14688) `deps` Bump github.com/Azure/azure-event-hubs-go/v3 from 3.6.1 to 3.6.2 - [#14845](https://github.com/influxdata/telegraf/pull/14845) `deps` Bump github.com/DATA-DOG/go-sqlmock from 1.5.0 to 1.5.2 - [#14820](https://github.com/influxdata/telegraf/pull/14820) `deps` Bump github.com/IBM/sarama from 1.42.1 to 1.42.2 - [#14774](https://github.com/influxdata/telegraf/pull/14774) `deps` Bump github.com/awnumar/memguard from 0.22.4-0.20231204102859-fce56aae03b8 to 0.22.4 - [#14687](https://github.com/influxdata/telegraf/pull/14687) `deps` Bump github.com/cloudevents/sdk-go/v2 from 2.14.0 to 2.15.0 - [#14769](https://github.com/influxdata/telegraf/pull/14769) `deps` Bump github.com/eclipse/paho.golang from 0.11.0 to 0.20.0 - [#14775](https://github.com/influxdata/telegraf/pull/14775) `deps` Bump github.com/google/uuid from 1.5.0 to 1.6.0 - [#14686](https://github.com/influxdata/telegraf/pull/14686) `deps` Bump github.com/gopcua/opcua from 0.4.0 to 0.5.3 - [#14848](https://github.com/influxdata/telegraf/pull/14848) `deps` Bump github.com/gophercloud/gophercloud from 1.7.0 to 1.9.0 - [#14755](https://github.com/influxdata/telegraf/pull/14755) `deps` Bump github.com/gwos/tcg/sdk from v0.0.0-20220621192633-df0eac0a1a4c to v8.7.2 - [#14816](https://github.com/influxdata/telegraf/pull/14816) `deps` Bump github.com/jhump/protoreflect from 1.15.4 to 1.15.6 - [#14773](https://github.com/influxdata/telegraf/pull/14773) `deps` Bump github.com/klauspost/compress from 1.17.4 to 1.17.6 - [#14817](https://github.com/influxdata/telegraf/pull/14817) `deps` Bump github.com/miekg/dns from 1.1.57 to 1.1.58 - [#14766](https://github.com/influxdata/telegraf/pull/14766) `deps` Bump github.com/showwin/speedtest-go from 1.6.7 to 1.6.10 - [#14765](https://github.com/influxdata/telegraf/pull/14765) `deps` Bump github.com/urfave/cli/v2 from 2.25.7 to 2.27.1 - [#14818](https://github.com/influxdata/telegraf/pull/14818) `deps` Bump go.opentelemetry.io/collector/pdata from 1.0.1 to 1.1.0 - [#14768](https://github.com/influxdata/telegraf/pull/14768) `deps` Bump golang.org/x/oauth2 from 0.16.0 to 0.17.0 - [#14849](https://github.com/influxdata/telegraf/pull/14849) `deps` Bump google.golang.org/api from 0.162.0 to 0.165.0 - [#14847](https://github.com/influxdata/telegraf/pull/14847) `deps` Bump google.golang.org/grpc from 1.61.0 to 1.61.1 - [#14689](https://github.com/influxdata/telegraf/pull/14689) `deps` Bump k8s.io/apimachinery from 0.29.0 to 0.29.1 - [#14767](https://github.com/influxdata/telegraf/pull/14767) `deps` Bump k8s.io/client-go from 0.29.0 to 0.29.1 - [#14846](https://github.com/influxdata/telegraf/pull/14846) `deps` Bump k8s.io/client-go from 0.29.1 to 0.29.2 - [#14850](https://github.com/influxdata/telegraf/pull/14850) `deps` Bump super-linter/super-linter from 6.0.0 to 6.1.1 - [#14771](https://github.com/influxdata/telegraf/pull/14771) `deps` Bump tj-actions/changed-files from 41 to 42 - [#14757](https://github.com/influxdata/telegraf/pull/14757) `deps` Get rid of golang.org/x/exp and use stable versions instead - [#14753](https://github.com/influxdata/telegraf/pull/14753) `deps` Use github.com/coreos/go-systemd/v22 instead of git version ## v1.29.4 [2024-01-31] ### Bugfixes - [#14619](https://github.com/influxdata/telegraf/pull/14619) `inputs.snmp_trap` Handle octet strings - [#14649](https://github.com/influxdata/telegraf/pull/14649) `inputs.temp` Fix regression in metric formats - [#14655](https://github.com/influxdata/telegraf/pull/14655) `processors.parser` Drop tracking metrics when not carried forward ### Dependency Updates - [#14651](https://github.com/influxdata/telegraf/pull/14651) `deps` Bump all AWS dependencies - [#14642](https://github.com/influxdata/telegraf/pull/14642) `deps` Bump github.com/compose-spec/compose-go from 1.20.0 to 1.20.2 - [#14641](https://github.com/influxdata/telegraf/pull/14641) `deps` Bump github.com/gosnmp/gosnmp from 1.36.1 to 1.37.0 - [#14643](https://github.com/influxdata/telegraf/pull/14643) `deps` Bump github.com/microsoft/go-mssqldb from 1.5.0 to 1.6.0 - [#14644](https://github.com/influxdata/telegraf/pull/14644) `deps` Bump github.com/nats-io/nats-server/v2 from 2.10.6 to 2.10.9 - [#14640](https://github.com/influxdata/telegraf/pull/14640) `deps` Bump github.com/yuin/goldmark from 1.5.6 to 1.6.0 ## v1.29.3 [2024-01-29] ### Bugfixes - [#14627](https://github.com/influxdata/telegraf/pull/14627) `common.encoding` Remove locally-defined errors and use upstream ones - [#14553](https://github.com/influxdata/telegraf/pull/14553) `inputs.gnmi` Refactor alias handling to prevent clipping - [#14575](https://github.com/influxdata/telegraf/pull/14575) `inputs.temp` Recover pre-v1.22.4 temperature sensor readings - [#14526](https://github.com/influxdata/telegraf/pull/14526) `inputs.win_perf_counters` Check errors post-collection for skip - [#14570](https://github.com/influxdata/telegraf/pull/14570) `inputs.win_perf_counters` Ignore PdhCstatusNoInstance as well - [#14519](https://github.com/influxdata/telegraf/pull/14519) `outputs.iotdb` Handle paths that contain illegal characters - [#14604](https://github.com/influxdata/telegraf/pull/14604) `outputs.loki` Do not close body before reading it - [#14582](https://github.com/influxdata/telegraf/pull/14582) `outputs.mqtt` Preserve leading slash in topic ### Dependency Updates - [#14578](https://github.com/influxdata/telegraf/pull/14578) `deps` Bump github.com/aws/aws-sdk-go-v2/service/cloudwatchlogs from 1.29.5 to 1.31.0 - [#14576](https://github.com/influxdata/telegraf/pull/14576) `deps` Bump github.com/aws/aws-sdk-go-v2/service/sts from 1.26.5 to 1.26.7 - [#14577](https://github.com/influxdata/telegraf/pull/14577) `deps` Bump github.com/clarify/clarify-go from 0.2.4 to 0.3.1 - [#14607](https://github.com/influxdata/telegraf/pull/14607) `deps` Bump github.com/docker/docker from 24.0.7+incompatible to 25.0.0+incompatible - [#14545](https://github.com/influxdata/telegraf/pull/14545) `deps` Bump github.com/docker/go-connections from 0.4.0 to 0.5.0 - [#14609](https://github.com/influxdata/telegraf/pull/14609) `deps` Bump github.com/fatih/color from 1.15.0 to 1.16.0 - [#14546](https://github.com/influxdata/telegraf/pull/14546) `deps` Bump github.com/gorilla/mux from 1.8.0 to 1.8.1 - [#14562](https://github.com/influxdata/telegraf/pull/14562) `deps` Bump github.com/intel/powertelemetry from 1.0.0 to 1.0.1 - [#14611](https://github.com/influxdata/telegraf/pull/14611) `deps` Bump github.com/nats-io/nats.go from 1.31.0 to 1.32.0 - [#14544](https://github.com/influxdata/telegraf/pull/14544) `deps` Bump github.com/prometheus/common from 0.44.0 to 0.45.0 - [#14608](https://github.com/influxdata/telegraf/pull/14608) `deps` Bump github.com/testcontainers/testcontainers-go from 0.26.0 to 0.27.0 - [#14573](https://github.com/influxdata/telegraf/pull/14573) `deps` Bump github.com/vapourismo/knx-go from v0.0.0-20220829185957-fb5458a5389d to 20240107135439-816b70397a00 - [#14574](https://github.com/influxdata/telegraf/pull/14574) `deps` Bump go.opentelemetry.io/collector/pdata from 1.0.0-rcv0016 to 1.0.1 - [#14541](https://github.com/influxdata/telegraf/pull/14541) `deps` Bump go.starlark.net from go.starlark.net v0.0.0-20220328144851-d1966c6b9fcd to v0.0.0-20231121155337-90ade8b19d09 - [#14543](https://github.com/influxdata/telegraf/pull/14543) `deps` Bump k8s.io/client-go from 0.28.3 to 0.29.0 - [#14610](https://github.com/influxdata/telegraf/pull/14610) `deps` Bump modernc.org/sqlite from 1.24.0 to 1.28.0 ## v1.29.2 [2024-01-08] ### Bugfixes - [#14522](https://github.com/influxdata/telegraf/pull/14522) `common.kafka` Correctly set gssapi username/password - [#14462](https://github.com/influxdata/telegraf/pull/14462) `inputs.phpfpm` Add pid field to differentiate metrics - [#14489](https://github.com/influxdata/telegraf/pull/14489) `inputs.phpfpm` Use logger without causing panic - [#14493](https://github.com/influxdata/telegraf/pull/14493) `inputs.procstat` Correctly set tags on procstat_lookup - [#14447](https://github.com/influxdata/telegraf/pull/14447) `inputs.upsd` Add additional fields to upsd from NUT - [#14463](https://github.com/influxdata/telegraf/pull/14463) `inputs.vsphere` Resolve occasional serverFault - [#14458](https://github.com/influxdata/telegraf/pull/14458) `outputs.bigquery` Ignore fields containing NaN or infinity - [#14481](https://github.com/influxdata/telegraf/pull/14481) `outputs.influxdb` Support setting Host header - [#14481](https://github.com/influxdata/telegraf/pull/14481) `outputs.influxdb_v2` Support setting Host header - [#14471](https://github.com/influxdata/telegraf/pull/14471) `outputs.prometheus_client` Always default to TCP - [#14460](https://github.com/influxdata/telegraf/pull/14460) `processors.filter` Rename processors.Filter -> processors.filter - [#14523](https://github.com/influxdata/telegraf/pull/14523) `processors.starlark` Use tracking ID to identify tracking metrics - [#14517](https://github.com/influxdata/telegraf/pull/14517) `systemd` Allow notify access from all ### Dependency Updates - [#14525](https://github.com/influxdata/telegraf/pull/14525) `deps` Bump collectd.org from v0.5.0 to v0.6.0 - [#14506](https://github.com/influxdata/telegraf/pull/14506) `deps` Bump github.com/Azure/azure-kusto-go from 0.13.1 to 0.15.0 - [#14483](https://github.com/influxdata/telegraf/pull/14483) `deps` Bump github.com/containerd/containerd from 1.7.7 to 1.7.11 - [#14476](https://github.com/influxdata/telegraf/pull/14476) `deps` Bump github.com/djherbis/times from 1.5.0 to 1.6.0 - [#14496](https://github.com/influxdata/telegraf/pull/14496) `deps` Bump github.com/dvsekhvalnov/jose2go from v1.5.0 to v1.5.1-0.20231206184617-48ba0b76bc88 - [#14478](https://github.com/influxdata/telegraf/pull/14478) `deps` Bump github.com/google/uuid from 1.4.0 to 1.5.0 - [#14477](https://github.com/influxdata/telegraf/pull/14477) `deps` Bump github.com/jhump/protoreflect from 1.15.3 to 1.15.4 - [#14504](https://github.com/influxdata/telegraf/pull/14504) `deps` Bump github.com/pion/dtls/v2 from 2.2.7 to 2.2.8 - [#14503](https://github.com/influxdata/telegraf/pull/14503) `deps` Bump github.com/prometheus/prometheus from 0.48.0 to 0.48.1 - [#14515](https://github.com/influxdata/telegraf/pull/14515) `deps` Bump github.com/sijms/go-ora/v2 from 2.7.18 to 2.8.4 - [#14475](https://github.com/influxdata/telegraf/pull/14475) `deps` Bump go.mongodb.org/mongo-driver from 1.12.1 to 1.13.1 - [#14480](https://github.com/influxdata/telegraf/pull/14480) `deps` Bump golang.org/x/crypto from 0.16.0 to 0.17.0 - [#14479](https://github.com/influxdata/telegraf/pull/14479) `deps` Bump golang.org/x/net from 0.17.0 to 0.19.0 - [#14505](https://github.com/influxdata/telegraf/pull/14505) `deps` Bump google.golang.org/protobuf from 1.31.1-0.20231027082548-f4a6c1f6e5c1 to 1.32.0 ## v1.29.1 [2023-12-13] ### Bugfixes - [#14443](https://github.com/influxdata/telegraf/pull/14443) `inputs.clickhouse` Omit zookeeper metrics on clickhouse cloud - [#14430](https://github.com/influxdata/telegraf/pull/14430) `inputs.php-fpm` Parse JSON output - [#14440](https://github.com/influxdata/telegraf/pull/14440) `inputs.procstat` Revert unintended renaming of systemd_unit option ### Dependency Updates - [#14435](https://github.com/influxdata/telegraf/pull/14435) `deps` Bump github.com/go-ldap/ldap/v3 from 3.4.5 to 3.4.6 - [#14433](https://github.com/influxdata/telegraf/pull/14433) `deps` Bump github.com/klauspost/compress from 1.17.3 to 1.17.4 - [#14432](https://github.com/influxdata/telegraf/pull/14432) `deps` Bump github.com/openzipkin/zipkin-go from 0.4.1 to 0.4.2 - [#14431](https://github.com/influxdata/telegraf/pull/14431) `deps` Bump github.com/tidwall/gjson from 1.14.4 to 1.17.0 - [#14441](https://github.com/influxdata/telegraf/pull/14441) `deps` Update all github.com/aws/aws-sdk-go-v2 dependencies ## v1.29.0 [2023-12-11] ### Important Changes - Removed useless, all-zero fields in `inputs.procstat`. Up to now, Telegraf reports the fields `cpu_time_guest`, `cpu_time_guest_nice`, `cpu_time_idle`, `cpu_time_irq`, `cpu_time_nice`, `cpu_time_soft_irq` and `cpu_time_steal` which are never set by the underlying library. As a consequence those fields were always zero. [#14224](https://github.com/influxdata/telegraf/pull/14224) removes those useless fields. In case you reference them, please adapt your queries! ### New Plugins - [#13995](https://github.com/influxdata/telegraf/pull/13995) `inputs.ldap` Add LDAP input plugin supporting OpenLDAP and 389ds - [#11958](https://github.com/influxdata/telegraf/pull/11958) `outputs.opensearch` Add OpenSearch output plugin - [#14330](https://github.com/influxdata/telegraf/pull/14330) `processors.filter` Add filter processor plugin - [#13657](https://github.com/influxdata/telegraf/pull/13657) `secretstores` Add systemd-credentials plugin ### Features - [#14361](https://github.com/influxdata/telegraf/pull/14361) `agent` Allow separators for namepass and namedrop filters - [#14062](https://github.com/influxdata/telegraf/pull/14062) `aggregators.final` Allow to specify output strategy - [#14103](https://github.com/influxdata/telegraf/pull/14103) `common.http` Add support for connecting over unix-socket - [#14345](https://github.com/influxdata/telegraf/pull/14345) `common.opcua` Add option to include OPC-UA DataType as a field - [#14012](https://github.com/influxdata/telegraf/pull/14012) `config` Deprecate `fieldpass` and `fielddrop` modifiers - [#14004](https://github.com/influxdata/telegraf/pull/14004) `input.intel_pmt` Add pci_bdf tag to uniquely identify GPUs and other peripherals - [#14001](https://github.com/influxdata/telegraf/pull/14001) `inputs.amqp_consumer` Add secretstore support for username and password - [#13894](https://github.com/influxdata/telegraf/pull/13894) `inputs.docker` Add disk usage - [#14308](https://github.com/influxdata/telegraf/pull/14308) `inputs.dpdk` Add options to customize error-behavior and metric layout - [#14207](https://github.com/influxdata/telegraf/pull/14207) `inputs.elasticsearch` Use HTTPClientConfig struct - [#14207](https://github.com/influxdata/telegraf/pull/14207) `inputs.elasticsearch_query` Use HTTPClientConfig struct - [#14091](https://github.com/influxdata/telegraf/pull/14091) `inputs.gnmi` Rework plugin - [#14189](https://github.com/influxdata/telegraf/pull/14189) `inputs.http_response` Add body form config option - [#14363](https://github.com/influxdata/telegraf/pull/14363) `inputs.intel_powerstat` Extract business logic to external library - [#13924](https://github.com/influxdata/telegraf/pull/13924) `inputs.kafka_consumer` Add message headers as metric tags - [#14320](https://github.com/influxdata/telegraf/pull/14320) `inputs.kafka_consumer` Add option to set metric name from message header - [#14207](https://github.com/influxdata/telegraf/pull/14207) `inputs.kibana` Use HTTPClientConfig struct - [#13993](https://github.com/influxdata/telegraf/pull/13993) `inputs.kube_inventory` Support filtering pods and nodes by node name - [#13996](https://github.com/influxdata/telegraf/pull/13996) `inputs.kube_inventory` Support using kubelet to get pods data - [#14092](https://github.com/influxdata/telegraf/pull/14092) `inputs.ldap` Collect additional fields - [#14207](https://github.com/influxdata/telegraf/pull/14207) `inputs.logstash` Use HTTPClientConfig struct - [#14145](https://github.com/influxdata/telegraf/pull/14145) `inputs.modbus` Add support for string fields - [#14375](https://github.com/influxdata/telegraf/pull/14375) `inputs.nats_consumer` Add nkey-seed-file authentication - [#13923](https://github.com/influxdata/telegraf/pull/13923) `inputs.opcua_listener` Add monitoring params - [#14214](https://github.com/influxdata/telegraf/pull/14214) `inputs.openweathermap` Add per-city query scheme for current weather - [#13417](https://github.com/influxdata/telegraf/pull/13417) `inputs.procstat` Obtain process information through supervisor - [#13991](https://github.com/influxdata/telegraf/pull/13991) `inputs.rabbitmq` Add secretstore support for username and password - [#14143](https://github.com/influxdata/telegraf/pull/14143) `inputs.redfish` Allow specifying which metrics to collect - [#14111](https://github.com/influxdata/telegraf/pull/14111) `inputs.snmp` Hint to use source tag - [#14172](https://github.com/influxdata/telegraf/pull/14172) `inputs.socket_listener` Add vsock support to socket listener and writer - [#13978](https://github.com/influxdata/telegraf/pull/13978) `inputs.sql` Add Oracle driver - [#14200](https://github.com/influxdata/telegraf/pull/14200) `inputs.sql` Add IBM Netezza driver - [#14073](https://github.com/influxdata/telegraf/pull/14073) `inputs.win_service` Reduce required rights to GENERIC_READ - [#14401](https://github.com/influxdata/telegraf/pull/14401) `migrations` Add migration for fieldpass and fielddrop - [#14114](https://github.com/influxdata/telegraf/pull/14114) `migrations` Add migration for inputs.jolokia - [#14122](https://github.com/influxdata/telegraf/pull/14122) `migrations` Add migration for inputs.kafka_consumer_legacy - [#14123](https://github.com/influxdata/telegraf/pull/14123) `migrations` Add migration for inputs.snmp_legacy - [#14119](https://github.com/influxdata/telegraf/pull/14119) `migrations` Add migration for inputs.tcp_listener - [#14120](https://github.com/influxdata/telegraf/pull/14120) `migrations` Add migration for inputs.udp_listener - [#14121](https://github.com/influxdata/telegraf/pull/14121) `migrations` Add migration for outputs.riemann_legacy - [#14141](https://github.com/influxdata/telegraf/pull/14141) `migrations` Add option migration for inputs.disk - [#14233](https://github.com/influxdata/telegraf/pull/14233) `migrations` Add option migration for inputs.mqtt_consumer - [#14234](https://github.com/influxdata/telegraf/pull/14234) `migrations` Add option migration for inputs.nats_consumer - [#14341](https://github.com/influxdata/telegraf/pull/14341) `migrations` Add option migration for outputs.influxdb - [#14047](https://github.com/influxdata/telegraf/pull/14047) `outputs.azure_data_explorer` Set user agent string - [#14342](https://github.com/influxdata/telegraf/pull/14342) `outputs.bigquery` Allow to add metrics in one compact table - [#14086](https://github.com/influxdata/telegraf/pull/14086) `outputs.bigquery` Make project no longer a required field - [#13672](https://github.com/influxdata/telegraf/pull/13672) `outputs.exec` Add ability to exec command once per metric - [#14108](https://github.com/influxdata/telegraf/pull/14108) `outputs.prometheus_client` Support listening on vsock - [#14172](https://github.com/influxdata/telegraf/pull/14172) `outputs.socket_writer` Add vsock support to socket listener and writer - [#14017](https://github.com/influxdata/telegraf/pull/14017) `outputs.stackdriver` Add metric type config options - [#14275](https://github.com/influxdata/telegraf/pull/14275) `outputs.stackdriver` Enable histogram support - [#14136](https://github.com/influxdata/telegraf/pull/14136) `outputs.wavefront` Use common/http to configure http client - [#13903](https://github.com/influxdata/telegraf/pull/13903) `parsers.avro` Allow connection to https schema registry - [#13914](https://github.com/influxdata/telegraf/pull/13914) `parsers.avro` Get metric name from the message field - [#13945](https://github.com/influxdata/telegraf/pull/13945) `parsers.avro` Support multiple modes for union handling - [#14065](https://github.com/influxdata/telegraf/pull/14065) `processors.dedup` Add state persistence between runs - [#13971](https://github.com/influxdata/telegraf/pull/13971) `processors.regex` Allow batch transforms using named groups - [#13998](https://github.com/influxdata/telegraf/pull/13998) `secrets` Add unprotected secret implementation ### Bugfixes - [#14331](https://github.com/influxdata/telegraf/pull/14331) `common.oauth` Initialize EndpointParams to avoid panic with audience settings - [#14350](https://github.com/influxdata/telegraf/pull/14350) `inputs.http` Use correct token variable - [#14420](https://github.com/influxdata/telegraf/pull/14420) `inputs.intel_powerstat` Fix unit tests to work on every CPU/platform - [#14388](https://github.com/influxdata/telegraf/pull/14388) `inputs.modbus` Split large request correctly at field borders - [#14373](https://github.com/influxdata/telegraf/pull/14373) `inputs.netflow` Handle malformed inputs gracefully - [#14394](https://github.com/influxdata/telegraf/pull/14394) `inputs.s7comm` Reconnect if query fails - [#14357](https://github.com/influxdata/telegraf/pull/14357) `inputs.tail` Retry opening file after permission denied - [#14419](https://github.com/influxdata/telegraf/pull/14419) `license` Correct spelling of jmhodges/clock license - [#14416](https://github.com/influxdata/telegraf/pull/14416) `outputs.bigquery` Correct use of auto-detected project ID - [#14340](https://github.com/influxdata/telegraf/pull/14340) `outputs.opensearch` Expose TLS setting correctly - [#14021](https://github.com/influxdata/telegraf/pull/14021) `outputs.opensearch` Migrate to new secrets API - [#14232](https://github.com/influxdata/telegraf/pull/14232) `outputs.prometheus_client` Ensure v1 collector data expires promptly - [#13961](https://github.com/influxdata/telegraf/pull/13961) `parsers.avro` Clean up Warnf error wrapping error - [#13939](https://github.com/influxdata/telegraf/pull/13939) `parsers.avro` Attempt to read CA cert file only if filename is not empty string - [#14351](https://github.com/influxdata/telegraf/pull/14351) `parsers.json v2` Correct wrong name of config option - [#14344](https://github.com/influxdata/telegraf/pull/14344) `parsers.json_v2` Reset state before parsing - [#14395](https://github.com/influxdata/telegraf/pull/14395) `processors.starlark` Avoid negative refcounts for tracking metrics - [#14137](https://github.com/influxdata/telegraf/pull/14137) `processors.starlark` Maintain tracking information post-apply ### Dependency Updates - [#14352](https://github.com/influxdata/telegraf/pull/14352) `deps` Bump cloud.google.com/go/bigquery from 1.56.0 to 1.57.1 - [#14324](https://github.com/influxdata/telegraf/pull/14324) `deps` Bump github.com/aws/aws-sdk-go-v2/service/cloudwatchlogs from 1.26.0 to 1.27.2 - [#14323](https://github.com/influxdata/telegraf/pull/14323) `deps` Bump github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/monitor/armmonitor from 0.10.1 to 0.10.2 - [#14354](https://github.com/influxdata/telegraf/pull/14354) `deps` Bump github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/monitor/armmonitor from 0.10.2 to 0.11.0 - [#14355](https://github.com/influxdata/telegraf/pull/14355) `deps` Bump github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/resources/armresources from 1.1.1 to 1.2.0 - [#14382](https://github.com/influxdata/telegraf/pull/14382) `deps` Bump github.com/golang-jwt/jwt/v5 from 5.0.0 to 5.2.0 - [#14385](https://github.com/influxdata/telegraf/pull/14385) `deps` Bump github.com/IBM/sarama from 1.41.3 to 1.42.1 - [#14384](https://github.com/influxdata/telegraf/pull/14384) `deps` Bump github.com/influxdata/tail from 1.0.1-0.20210707231403-b283181d1fa7 to 1.0.1-0.20221130111531-19b97bffd978 - [#14383](https://github.com/influxdata/telegraf/pull/14383) `deps` Bump github.com/jackc/pgconn from 1.14.0 to 1.14.1 - [#14386](https://github.com/influxdata/telegraf/pull/14386) `deps` Bump github.com/nats-io/nats-server/v2 from 2.9.23 to 2.10.6 - [#14321](https://github.com/influxdata/telegraf/pull/14321) `deps` Bump github.com/prometheus/prometheus from 0.46.0 to 0.48.0 - [#14325](https://github.com/influxdata/telegraf/pull/14325) `deps` Bump github.com/vmware/govmomi from 0.32.0 to 0.33.1 - [#14353](https://github.com/influxdata/telegraf/pull/14353) `deps` Bump golang.org/x/text from 0.13.0 to 0.14.0 - [#14322](https://github.com/influxdata/telegraf/pull/14322) `deps` Bump k8s.io/api from 0.28.3 to 0.28.4 - [#14349](https://github.com/influxdata/telegraf/pull/14349) `deps` Point kafka dependency to IBM organization ## v1.28.5 [2023-11-15] ### Bugfixes - [#14294](https://github.com/influxdata/telegraf/pull/14294) `inputs.ecs` Correct v4 metadata URLs - [#14274](https://github.com/influxdata/telegraf/pull/14274) `inputs.intel_rdt` Do not fail on missing PIDs - [#14283](https://github.com/influxdata/telegraf/pull/14283) `inputs.s7comm` Truncate strings to reported length - [#14296](https://github.com/influxdata/telegraf/pull/14296) `parsers.json_v2` Log inner errors ### Dependency Updates - [#14287](https://github.com/influxdata/telegraf/pull/14287) `deps` Bump github.com/gosnmp/gosnmp from 1.35.1-0.20230602062452-f30602b8dad6 to 1.36.1 - [#14286](https://github.com/influxdata/telegraf/pull/14286) `deps` Bump github.com/Masterminds/semver/v3 from 3.2.0 to 3.2.1 - [#14285](https://github.com/influxdata/telegraf/pull/14285) `deps` Bump golang.org/x/sync from 0.4.0 to 0.5.0 - [#14289](https://github.com/influxdata/telegraf/pull/14289) `deps` Bump golang.org/x/mod from 0.13.0 to 0.14.0 - [#14288](https://github.com/influxdata/telegraf/pull/14288) `deps` Bump google.golang.org/api from 0.149.0 to 0.150.0 ## v1.28.4 [2023-11-13] ### Bugfixes - [#14240](https://github.com/influxdata/telegraf/pull/14240) `config` Fix comment removal in TOML files - [#14187](https://github.com/influxdata/telegraf/pull/14187) `inputs.cgroup` Escape backslashes in path - [#14267](https://github.com/influxdata/telegraf/pull/14267) `inputs.disk` Add inodes_used_percent field - [#14197](https://github.com/influxdata/telegraf/pull/14197) `inputs.ecs` Fix cgroupv2 CPU metrics - [#14194](https://github.com/influxdata/telegraf/pull/14194) `inputs.ecs` Test for v4 metadata endpoint - [#14262](https://github.com/influxdata/telegraf/pull/14262) `inputs.ipset` Parse lines with timeout - [#14243](https://github.com/influxdata/telegraf/pull/14243) `inputs.mqtt_consumer` Resolve could not mark message delivered - [#14195](https://github.com/influxdata/telegraf/pull/14195) `inputs.netflow` Fix sFlow metric timestamp - [#14191](https://github.com/influxdata/telegraf/pull/14191) `inputs.prometheus` Read bearer token from file every time - [#14068](https://github.com/influxdata/telegraf/pull/14068) `inputs.s7comm` Fix bit queries - [#14241](https://github.com/influxdata/telegraf/pull/14241) `inputs.win_perf_counter` Do not rely on returned buffer size - [#14176](https://github.com/influxdata/telegraf/pull/14176) `inputs.zfs` Parse metrics correctly on FreeBSD 14 - [#14280](https://github.com/influxdata/telegraf/pull/14280) `inputs.zfs` Support gathering metrics on zfs 2.2.0 and later - [#14115](https://github.com/influxdata/telegraf/pull/14115) `outputs.elasticsearch` Print error status value - [#14213](https://github.com/influxdata/telegraf/pull/14213) `outputs.timestream` Clip uint64 values - [#14149](https://github.com/influxdata/telegraf/pull/14149) `parsers.json_v2` Prevent race condition in parse function ### Dependency Updates - [#14253](https://github.com/influxdata/telegraf/pull/14253) `deps` Bump cloud.google.com/go/storage from 1.30.1 to 1.34.1 - [#14218](https://github.com/influxdata/telegraf/pull/14218) `deps` Bump github.com/aws/aws-sdk-go-v2/config from 1.18.42 to 1.19.1 - [#14167](https://github.com/influxdata/telegraf/pull/14167) `deps` Bump github.com/aws/aws-sdk-go-v2/credentials from 1.13.40 to 1.13.43 - [#14249](https://github.com/influxdata/telegraf/pull/14249) `deps` Bump github.com/aws/aws-sdk-go-v2/service/cloudwatchlogs from 1.23.5 to 1.26.0 - [#14166](https://github.com/influxdata/telegraf/pull/14166) `deps` Bump github.com/antchfx/xmlquery from 1.3.17 to 1.3.18 - [#14217](https://github.com/influxdata/telegraf/pull/14217) `deps` Bump github.com/antchfx/xpath from 1.2.5-0.20230505064641-588960cceeac to 1.2.5 - [#14219](https://github.com/influxdata/telegraf/pull/14219) `deps` Bump github.com/benbjohnson/clock from 1.3.3 to 1.3.5 - [#14216](https://github.com/influxdata/telegraf/pull/14216) `deps` Bump github.com/compose-spec/compose-go from 1.16.0 to 1.20.0 - [#14211](https://github.com/influxdata/telegraf/pull/14211) `deps` Bump github.com/docker/docker from 24.0.6 to 24.0.7 - [#14164](https://github.com/influxdata/telegraf/pull/14164) `deps` Bump github.com/hashicorp/consul/api from 1.24.0 to 1.25.1 - [#14251](https://github.com/influxdata/telegraf/pull/14251) `deps` Bump github.com/hashicorp/consul/api from 1.25.1 to 1.26.1 - [#14225](https://github.com/influxdata/telegraf/pull/14225) `deps` Bump github.com/nats-io/nkeys from 0.4.5 to 0.4.6 - [#14168](https://github.com/influxdata/telegraf/pull/14168) `deps` Bump github.com/prometheus/client_golang from 1.16.0 to 1.17.0 - [#14252](https://github.com/influxdata/telegraf/pull/14252) `deps` Bump github.com/rabbitmq/amqp091-go from 1.8.1 to 1.9.0 - [#14250](https://github.com/influxdata/telegraf/pull/14250) `deps` Bump github.com/showwin/speedtest-go from 1.6.6 to 1.6.7 - [#14192](https://github.com/influxdata/telegraf/pull/14192) `deps` Bump google.golang.org/grpc from 1.58.2 to 1.58.3 - [#14165](https://github.com/influxdata/telegraf/pull/14165) `deps` Bump k8s.io/client-go from 0.28.2 to 0.28.3 ## v1.28.3 [2023-10-23] ### Bugfixes - [#14049](https://github.com/influxdata/telegraf/pull/14049) `inputs.infiniband` Handle devices without counters - [#14105](https://github.com/influxdata/telegraf/pull/14105) `inputs.jenkins` Filter after searching sub-folders - [#14132](https://github.com/influxdata/telegraf/pull/14132) `inputs.jolokia2_agent` Trim quotes around tags - [#14041](https://github.com/influxdata/telegraf/pull/14041) `inputs.mqtt` Reference correct password variable - [#14010](https://github.com/influxdata/telegraf/pull/14010) `inputs.postgresql_extensible` Restore default db name - [#14045](https://github.com/influxdata/telegraf/pull/14045) `inputs.s7comm` Allow PDU-size to be set as config option - [#14153](https://github.com/influxdata/telegraf/pull/14153) `inputs.vault` Use http client to handle redirects correctly - [#14131](https://github.com/influxdata/telegraf/pull/14131) `metricpass` Use correct logic expression in benchmark - [#14154](https://github.com/influxdata/telegraf/pull/14154) `outputs.kafka` Simplify send-error handling - [#14135](https://github.com/influxdata/telegraf/pull/14135) `outputs.nebius_cloud_monitoring` Use correct endpoint - [#14060](https://github.com/influxdata/telegraf/pull/14060) `outputs.redistimeseries` Handle string fields correctly - [#14150](https://github.com/influxdata/telegraf/pull/14150) `serializers.json` Append newline for batch-serialization ### Dependency Updates - [#14036](https://github.com/influxdata/telegraf/pull/14036) `deps` Bump github.com/apache/arrow/go/v13 from 13.0.0-git to 13.0.0 - [#14125](https://github.com/influxdata/telegraf/pull/14125) `deps` Bump github.com/google/cel-go from 0.14.1-git to 0.18.1 - [#14127](https://github.com/influxdata/telegraf/pull/14127) `deps` Bump github.com/google/go-cmp from 0.5.9 to 0.6.0 - [#14085](https://github.com/influxdata/telegraf/pull/14085) `deps` Bump github.com/jhump/protoreflect from 1.15.1 to 1.15.3 - [#14039](https://github.com/influxdata/telegraf/pull/14039) `deps` Bump github.com/klauspost/compress from 1.16.7 to 1.17.0 - [#14077](https://github.com/influxdata/telegraf/pull/14077) `deps` Bump github.com/miekg/dns from 1.1.55 to 1.1.56 - [#14124](https://github.com/influxdata/telegraf/pull/14124) `deps` Bump github.com/nats-io/nats.go from 1.28.0 to 1.31.0 - [#14146](https://github.com/influxdata/telegraf/pull/14146) `deps` Bump github.com/nats-io/nats-server/v2 from 2.9.9 to 2.9.23 - [#14037](https://github.com/influxdata/telegraf/pull/14037) `deps` Bump github.com/netsampler/goflow2 from 1.3.3 to 1.3.6 - [#14040](https://github.com/influxdata/telegraf/pull/14040) `deps` Bump github.com/signalfx/golib/v3 from 3.3.50 to 3.3.53 - [#14076](https://github.com/influxdata/telegraf/pull/14076) `deps` Bump github.com/testcontainers/testcontainers-go from 0.22.0 to 0.25.0 - [#14038](https://github.com/influxdata/telegraf/pull/14038) `deps` Bump github.com/yuin/goldmark from 1.5.4 to 1.5.6 - [#14075](https://github.com/influxdata/telegraf/pull/14075) `deps` Bump golang.org/x/mod from 0.12.0 to 0.13.0 - [#14095](https://github.com/influxdata/telegraf/pull/14095) `deps` Bump golang.org/x/net from 0.15.0 to 0.17.0 - [#14074](https://github.com/influxdata/telegraf/pull/14074) `deps` Bump golang.org/x/oauth2 from 0.11.0 to 0.13.0 - [#14078](https://github.com/influxdata/telegraf/pull/14078) `deps` Bump gonum.org/v1/gonum from 0.13.0 to 0.14.0 - [#14126](https://github.com/influxdata/telegraf/pull/14126) `deps` Bump google.golang.org/api from 0.139.0 to 0.147.0 ## v1.28.2 [2023-10-02] ### Bugfixes - [#13963](https://github.com/influxdata/telegraf/pull/13963) `inputs.cisco_telemetry_mdt` Print string message on decode failure - [#13937](https://github.com/influxdata/telegraf/pull/13937) `inputs.exec` Clean up grandchildren processes - [#13977](https://github.com/influxdata/telegraf/pull/13977) `inputs.intel_pmt` Handle telem devices without numa_node attribute - [#13958](https://github.com/influxdata/telegraf/pull/13958) `inputs.jti_openconfig_telemetry` Do not block gRPC dial - [#13997](https://github.com/influxdata/telegraf/pull/13997) `inputs.mock` Align plugin with documentation - [#13982](https://github.com/influxdata/telegraf/pull/13982) `inputs.nfsclient` Avoid panics, better error messages - [#13962](https://github.com/influxdata/telegraf/pull/13962) `inputs.nvidia_smi` Add legacy power readings to v12 schema - [#14011](https://github.com/influxdata/telegraf/pull/14011) `inputs.openstack` Handle dependencies between enabled services and available endpoints - [#13972](https://github.com/influxdata/telegraf/pull/13972) `inputs.postgresql_extensible` Restore outputaddress behavior - [#13927](https://github.com/influxdata/telegraf/pull/13927) `inputs.smart` Remove parsing error message - [#13915](https://github.com/influxdata/telegraf/pull/13915) `inputs.systemd_units` Add missing upstream states - [#13930](https://github.com/influxdata/telegraf/pull/13930) `outputs.cloudwatch` Increase number of metrics per write - [#14009](https://github.com/influxdata/telegraf/pull/14009) `outputs.stackdriver` Do not shallow copy map - [#13931](https://github.com/influxdata/telegraf/pull/13931) `outputs.stackdriver` Drop metrics on InvalidArgument gRPC error - [#14008](https://github.com/influxdata/telegraf/pull/14008) `parsers.json_v2` Handle optional fields properly - [#13947](https://github.com/influxdata/telegraf/pull/13947) `processors.template` Handle tracking metrics correctly ### Dependency Updates - [#13941](https://github.com/influxdata/telegraf/pull/13941) `deps` Bump github.com/aliyun/alibaba-cloud-sdk-go from 1.62.470 to 1.62.563 - [#13988](https://github.com/influxdata/telegraf/pull/13988) `deps` Bump github.com/aws/aws-sdk-go-v2/config from 1.18.27 to 1.18.42 - [#13943](https://github.com/influxdata/telegraf/pull/13943) `deps` Bump github.com/aws/aws-sdk-go-v2/service/cloudwatchlogs from 1.20.9 to 1.23.5 - [#13986](https://github.com/influxdata/telegraf/pull/13986) `deps` Bump github.com/aws/aws-sdk-go-v2/service/ec2 from 1.80.1 to 1.120.0 - [#13987](https://github.com/influxdata/telegraf/pull/13987) `deps` Bump github.com/aws/aws-sdk-go-v2/feature/ec2/imds from 1.13.8 to 1.13.11 - [#13985](https://github.com/influxdata/telegraf/pull/13985) `deps` Bump github.com/eclipse/paho.mqtt.golang from 1.4.2 to 1.4.3 - [#13989](https://github.com/influxdata/telegraf/pull/13989) `deps` Bump github.com/google/uuid from 1.3.0 to 1.3.1 - [#13942](https://github.com/influxdata/telegraf/pull/13942) `deps` Bump github.com/shirou/gopsutil/v3 from 3.23.6 to 3.23.8 - [#14022](https://github.com/influxdata/telegraf/pull/14022) `deps` Bump github.com/vmware/govmomi from 0.28.0 to 0.32.0 - [#13940](https://github.com/influxdata/telegraf/pull/13940) `deps` Bump golang.org/x/net from 0.14.0 to 0.15.0 - [#13944](https://github.com/influxdata/telegraf/pull/13944) `deps` Bump k8s.io/api from 0.28.1 to 0.28.2 ## v1.28.1 [2023-09-12] ### Bugfixes - [#13909](https://github.com/influxdata/telegraf/pull/13909) `packaging` Revert permission change on package configs - [#13910](https://github.com/influxdata/telegraf/pull/13910) `inputs.redis` Fix password typo - [#13907](https://github.com/influxdata/telegraf/pull/13907) `inputs.vsphere` Fix config name typo in example ## v1.28.0 [2023-09-11] ### Important Changes - [#13791](https://github.com/influxdata/telegraf/pull/13791) `metricpass` Removed the Python compatibility support for "not", "and", and "or" keywords. This support was incorrectly removing these keywords from actual data. Users should instead use the standard "!", "&&", and "||" operators. - [#13856](https://github.com/influxdata/telegraf/pull/13856) `parsers.avro` The avro processor will no longer create a timestamp field by default unless explicitly provided in the parser config. - [#13778](https://github.com/influxdata/telegraf/pull/13778) `packaging` The default permissions on `/etc/telegraf/telegraf.conf` and `/etc/telegraf/telegraf.d` on new installs will drop read access for other. Updates and upgrades do not change permissions. ### New Plugins - [#13801](https://github.com/influxdata/telegraf/pull/13801) `inputs.intel_pmt` Intel PMT - [#13731](https://github.com/influxdata/telegraf/pull/13731) `inputs.s7comm` S7comm - [#12747](https://github.com/influxdata/telegraf/pull/12747) `inputs.tacacs` Tacacs - [#13785](https://github.com/influxdata/telegraf/pull/13785) `processors.split` Split metrics - [#13621](https://github.com/influxdata/telegraf/pull/13621) `secretstores.oauth2` OAuth2 services - [#13656](https://github.com/influxdata/telegraf/pull/13656) `serializers.template` Template based serializer ### Features - [#13605](https://github.com/influxdata/telegraf/pull/13605) `agent` Add option to avoid filtering of global tags - [#13774](https://github.com/influxdata/telegraf/pull/13774) `agent` Watch default config files if none specified - [#13787](https://github.com/influxdata/telegraf/pull/13787) `cli` Add plugins subcommand to list available and deprecated - [#13496](https://github.com/influxdata/telegraf/pull/13496) `inputs.amqp_consumer` Add support to rabbitmq stream queue - [#13877](https://github.com/influxdata/telegraf/pull/13877) `inputs.cisco_telemetry_mdt` Add microbust support - [#13825](https://github.com/influxdata/telegraf/pull/13825) `inputs.couchbase` Add failover metrics - [#13452](https://github.com/influxdata/telegraf/pull/13452) `inputs.fail2ban` Allow specification of socket - [#13754](https://github.com/influxdata/telegraf/pull/13754) `inputs.fibaro` Support HC3 device types - [#13622](https://github.com/influxdata/telegraf/pull/13622) `inputs.http` Rework token options - [#13610](https://github.com/influxdata/telegraf/pull/13610) `inputs.influxdb_listener` Add token based authentication - [#13793](https://github.com/influxdata/telegraf/pull/13793) `inputs.internal` Add Go metric collection option - [#13649](https://github.com/influxdata/telegraf/pull/13649) `inputs.jenkins` Add option for node labels as tag - [#13709](https://github.com/influxdata/telegraf/pull/13709) `inputs.jti_openconfig_telemetry` Add keep-alive setting - [#13728](https://github.com/influxdata/telegraf/pull/13728) `inputs.kernel` Collect KSM metrics - [#13507](https://github.com/influxdata/telegraf/pull/13507) `inputs.modbus` Add per-metric configuration style - [#13733](https://github.com/influxdata/telegraf/pull/13733) `inputs.nvidia_smi` Add Nvidia DCGM MIG usage values - [#13783](https://github.com/influxdata/telegraf/pull/13783) `inputs.nvidia_smi` Add additional fields - [#13678](https://github.com/influxdata/telegraf/pull/13678) `inputs.nvidia_smi` Support newer data schema versions - [#13443](https://github.com/influxdata/telegraf/pull/13443) `inputs.openstack` Gather cinder services - [#13846](https://github.com/influxdata/telegraf/pull/13846) `inputs.opentelemetry` Add configurable log record dimensions - [#13436](https://github.com/influxdata/telegraf/pull/13436) `inputs.pgbouncer` Add show_commands to select the collected pgbouncer metrics - [#13620](https://github.com/influxdata/telegraf/pull/13620) `inputs.postgresql_extensible` Introduce max_version for query - [#13505](https://github.com/influxdata/telegraf/pull/13505) `inputs.procstat` Add status field - [#13624](https://github.com/influxdata/telegraf/pull/13624) `inputs.prometheus` Always apply kubernetes label and field selectors - [#13433](https://github.com/influxdata/telegraf/pull/13433) `inputs.ravendb` Add new disk metrics fields - [#13727](https://github.com/influxdata/telegraf/pull/13727) `inputs.redfish` Add additional chassis tags - [#13866](https://github.com/influxdata/telegraf/pull/13866) `inputs.redis` Add additional commandstat fields - [#13723](https://github.com/influxdata/telegraf/pull/13723) `inputs.redis` Support of redis 6.2 ERRORSTATS - [#13864](https://github.com/influxdata/telegraf/pull/13864) `inputs.redis_sentinel` Allow username and password - [#13699](https://github.com/influxdata/telegraf/pull/13699) `inputs.solr` Support version 7.x to 9.3 - [#13448](https://github.com/influxdata/telegraf/pull/13448) `inputs.sqlserver` Add IsHadrEnabled server property - [#13890](https://github.com/influxdata/telegraf/pull/13890) `inputs.vsphere` Allow to set vSAN sampling interval - [#13720](https://github.com/influxdata/telegraf/pull/13720) `inputs.vsphere` Support explicit proxy setting - [#13471](https://github.com/influxdata/telegraf/pull/13471) `internal` Add gather_timeouts metric - [#13423](https://github.com/influxdata/telegraf/pull/13423) `internal` Add zstd to internal content_coding - [#13411](https://github.com/influxdata/telegraf/pull/13411) `kafka` Set and send SASL extensions - [#13532](https://github.com/influxdata/telegraf/pull/13532) `migrations` Add migration for inputs.httpjson - [#13536](https://github.com/influxdata/telegraf/pull/13536) `migrations` Add migration for inputs.io - [#13673](https://github.com/influxdata/telegraf/pull/13673) `outputs.execd` Add option for batch format - [#13245](https://github.com/influxdata/telegraf/pull/13245) `outputs.file` Add compression - [#13651](https://github.com/influxdata/telegraf/pull/13651) `outputs.http` Allow PATCH method - [#13763](https://github.com/influxdata/telegraf/pull/13763) `outputs.postgresql` Add option to create time column with timezone - [#13750](https://github.com/influxdata/telegraf/pull/13750) `outputs.postgresql` Add option to rename time column - [#13899](https://github.com/influxdata/telegraf/pull/13899) `outputs.prometheus_client` Add secretstore support for basic_password - [#13857](https://github.com/influxdata/telegraf/pull/13857) `outputs.wavefront` Add more auth options and update SDK - [#13607](https://github.com/influxdata/telegraf/pull/13607) `parsers.avro` Add support for JSON format - [#13419](https://github.com/influxdata/telegraf/pull/13419) `parsers.influx` Allow a user to set the timestamp precision - [#13506](https://github.com/influxdata/telegraf/pull/13506) `parsers.value` Add support for automatic fallback for numeric types - [#13480](https://github.com/influxdata/telegraf/pull/13480) `parsers.xpath` Add Concise Binary Object Representation parser - [#13690](https://github.com/influxdata/telegraf/pull/13690) `parsers.xpath` Add option to store fields as base64 - [#13553](https://github.com/influxdata/telegraf/pull/13553) `processors.parser` Allow also non-string fields - [#13606](https://github.com/influxdata/telegraf/pull/13606) `processors.template` Unify template metric - [#13874](https://github.com/influxdata/telegraf/pull/13874) `prometheus` Allow to specify metric type ### Bugfixes - [#13849](https://github.com/influxdata/telegraf/pull/13849) Change the systemd KillMode from control-group to mixed - [#13777](https://github.com/influxdata/telegraf/pull/13777) `inputs.amqp_consumer` Print error on connection failure - [#13886](https://github.com/influxdata/telegraf/pull/13886) `inputs.kafka_consumer` Use per-message parser to avoid races - [#13840](https://github.com/influxdata/telegraf/pull/13840) `inputs.opcua` Verify groups or root nodes included in config - [#13602](https://github.com/influxdata/telegraf/pull/13602) `inputs.postgresql` Fix default database definition - [#13779](https://github.com/influxdata/telegraf/pull/13779) `inputs.procstat` Collect swap via /proc/$pid/smaps - [#13870](https://github.com/influxdata/telegraf/pull/13870) `inputs.sqlserver` Cast max_size to bigint - [#13833](https://github.com/influxdata/telegraf/pull/13833) `inputs.sysstat` Remove tmpfile to avoid file-descriptor leak - [#13791](https://github.com/influxdata/telegraf/pull/13791) `metricpass` Remove python logic compatibility - [#13875](https://github.com/influxdata/telegraf/pull/13875) `outputs.sql` Move conversion_style config option to the right place - [#13856](https://github.com/influxdata/telegraf/pull/13856) `parsers.avro` Do not force addition of timestamp as a field - [#13855](https://github.com/influxdata/telegraf/pull/13855) `parsers.avro` Handle timestamp format checking correctly - [#13865](https://github.com/influxdata/telegraf/pull/13865) `sql` Allow sqlite on Windows (amd64 and arm64) ### Dependency Updates - [#13808](https://github.com/influxdata/telegraf/pull/13808) `deps` Bump github.com/aws/aws-sdk-go-v2/service/kinesis from 1.18.2 to 1.18.5 - [#13811](https://github.com/influxdata/telegraf/pull/13811) `deps` Bump github.com/hashicorp/consul/api from 1.20.0 to 1.24.0 - [#13809](https://github.com/influxdata/telegraf/pull/13809) `deps` Bump github.com/nats-io/nats.go from 1.27.0 to 1.28.0 - [#13765](https://github.com/influxdata/telegraf/pull/13765) `deps` Bump github.com/prometheus/prometheus from 0.42.0 to 0.46.0 - [#13895](https://github.com/influxdata/telegraf/pull/13895) `deps` Bump github.com/showwin/speedtest-go from 1.6.2 to 1.6.6 - [#13810](https://github.com/influxdata/telegraf/pull/13810) `deps` Bump k8s.io/api from 0.27.4 to 0.28.1 ## v1.27.4 [2023-08-21] ### Bugfixes - [#13693](https://github.com/influxdata/telegraf/pull/13693) `inputs.cisco_telemetry_mdt` Fix MDT source field overwrite - [#13682](https://github.com/influxdata/telegraf/pull/13682) `inputs.opcua` Register node IDs again on reconnect - [#13742](https://github.com/influxdata/telegraf/pull/13742) `inputs.opcua_listener` Avoid segfault when subscription was not successful - [#13745](https://github.com/influxdata/telegraf/pull/13745) `outputs.stackdriver` Regenerate time interval for unknown metrics - [#13719](https://github.com/influxdata/telegraf/pull/13719) `parsers.xpath` Handle protobuf maps correctly - [#13722](https://github.com/influxdata/telegraf/pull/13722) `serializers.nowmetric` Add option for JSONv2 format ### Dependency Updates - [#13766](https://github.com/influxdata/telegraf/pull/13766) `deps` Bump cloud.google.com/go/pubsub from 1.32.0 to 1.33.0 - [#13767](https://github.com/influxdata/telegraf/pull/13767) `deps` Bump github.com/aws/aws-sdk-go-v2/credentials from 1.13.26 to 1.13.32 - [#13703](https://github.com/influxdata/telegraf/pull/13703) `deps` Bump github.com/aws/aws-sdk-go-v2/feature/ec2/imds from 1.13.4 to 1.13.7 - [#13702](https://github.com/influxdata/telegraf/pull/13702) `deps` Bump github.com/aws/aws-sdk-go-v2/service/kinesis from 1.17.14 to 1.18.0 - [#13769](https://github.com/influxdata/telegraf/pull/13769) `deps` Bump github.com/aws/aws-sdk-go-v2/service/kinesis from 1.18.0 to 1.18.2 - [#13734](https://github.com/influxdata/telegraf/pull/13734) `deps` Bump github.com/aws/aws-sdk-go-v2/service/sts from 1.19.3 to 1.21.2 - [#13735](https://github.com/influxdata/telegraf/pull/13735) `deps` Bump github.com/gophercloud/gophercloud from 1.2.0 to 1.5.0 - [#13737](https://github.com/influxdata/telegraf/pull/13737) `deps` Bump github.com/microsoft/go-mssqldb from 1.3.1-0.20230630170514-78ad89164253 to 1.5.0 - [#13768](https://github.com/influxdata/telegraf/pull/13768) `deps` Bump github.com/miekg/dns from 1.1.51 to 1.1.55 - [#13706](https://github.com/influxdata/telegraf/pull/13706) `deps` Bump github.com/openconfig/gnmi from 0.9.1 to 0.10.0 - [#13705](https://github.com/influxdata/telegraf/pull/13705) `deps` Bump github.com/santhosh-tekuri/jsonschema/v5 from 5.3.0 to 5.3.1 - [#13736](https://github.com/influxdata/telegraf/pull/13736) `deps` Bump go.mongodb.org/mongo-driver from 1.11.6 to 1.12.1 - [#13738](https://github.com/influxdata/telegraf/pull/13738) `deps` Bump golang.org/x/oauth2 from 0.10.0 to 0.11.0 - [#13704](https://github.com/influxdata/telegraf/pull/13704) `deps` Bump google.golang.org/api from 0.129.0 to 0.134.0 ## v1.27.3 [2023-07-31] ### Bugfixes - [#13614](https://github.com/influxdata/telegraf/pull/13614) `agent` Respect processor order in file - [#13675](https://github.com/influxdata/telegraf/pull/13675) `config` Handle escaping and quotation correctly - [#13671](https://github.com/influxdata/telegraf/pull/13671) `config` Setup logger for secret-stores - [#13646](https://github.com/influxdata/telegraf/pull/13646) `inputs.docker` Add restart count - [#13647](https://github.com/influxdata/telegraf/pull/13647) `inputs.jti_openconfig_telemetry` Reauthenticate connection on reconnect - [#13663](https://github.com/influxdata/telegraf/pull/13663) `inputs.mqtt_consumer` Add client trace logs via option - [#13629](https://github.com/influxdata/telegraf/pull/13629) `inputs.prometheus` Do not collect metrics from finished pods - [#13627](https://github.com/influxdata/telegraf/pull/13627) `inputs.prometheus` Fix missing metrics when multiple plugin instances specified - [#13597](https://github.com/influxdata/telegraf/pull/13597) `outputs.nebius_cloud_monitoring` Replace reserved label names - [#13292](https://github.com/influxdata/telegraf/pull/13292) `outputs.opentelemetry` Group metrics by age and timestamp - [#13575](https://github.com/influxdata/telegraf/pull/13575) `outputs.stackdriver` Add tag as resource label option - [#13662](https://github.com/influxdata/telegraf/pull/13662) `parsers.xpath` Ensure precedence of explicitly defined tags and fields - [#13665](https://github.com/influxdata/telegraf/pull/13665) `parsers.xpath` Fix field-names for arrays of simple types - [#13660](https://github.com/influxdata/telegraf/pull/13660) `parsers.xpath` Improve handling of complex-type nodes - [#13604](https://github.com/influxdata/telegraf/pull/13604) `tools.custom_builder` Ignore non-plugin sections during configuration ### Dependency Updates - [#13668](https://github.com/influxdata/telegraf/pull/13668) `deps` Bump github.com/aliyun/alibaba-cloud-sdk-go 1.62.389 to 1.62.470 - [#13640](https://github.com/influxdata/telegraf/pull/13640) `deps` Bump github.com/antchfx/jsonquery from 1.3.1 to 1.3.2 - [#13639](https://github.com/influxdata/telegraf/pull/13639) `deps` Bump github.com/antchfx/xmlquery from 1.3.15 to 1.3.17 - [#13679](https://github.com/influxdata/telegraf/pull/13679) `deps` Bump github.com/antchfx/xpath from v1.2.4 to latest master - [#13589](https://github.com/influxdata/telegraf/pull/13589) `deps` Bump github.com/aws/aws-sdk-go-v2/service/dynamodb from 1.17.3 to 1.20.0 - [#13669](https://github.com/influxdata/telegraf/pull/13669) `deps` Bump github.com/aws/aws-sdk-go-v2/service/sts from 1.19.2 to 1.19.3 - [#13670](https://github.com/influxdata/telegraf/pull/13670) `deps` Bump github.com/eclipse/paho.golang from 0.10.0 to 0.11.0 - [#13588](https://github.com/influxdata/telegraf/pull/13588) `deps` Bump github.com/go-ldap/ldap/v3 from 3.4.4 to 3.4.5 - [#13603](https://github.com/influxdata/telegraf/pull/13603) `deps` Bump github.com/jaegertracing/jaeger from 1.38.0 to 1.47.0 - [#13586](https://github.com/influxdata/telegraf/pull/13586) `deps` Bump github.com/opensearch-project/opensearch-go/v2 from 2.2.0 to 2.3.0 - [#13585](https://github.com/influxdata/telegraf/pull/13585) `deps` Bump github.com/prometheus-community/pro-bing from 0.2.0 to 0.3.0 - [#13666](https://github.com/influxdata/telegraf/pull/13666) `deps` Bump github.com/shirou/gopsutil/v3 from 3.23.5 to 3.23.6 - [#13638](https://github.com/influxdata/telegraf/pull/13638) `deps` Bump github.com/thomasklein94/packer-plugin-libvirt from 0.3.4 to 0.5.0 - [#13667](https://github.com/influxdata/telegraf/pull/13667) `deps` Bump k8s.io/api from 0.27.2 to 0.27.4 - [#13587](https://github.com/influxdata/telegraf/pull/13587) `deps` Bump k8s.io/apimachinery from 0.27.2 to 0.27.3 - [#13641](https://github.com/influxdata/telegraf/pull/13641) `deps` Bump modernc.org/sqlite from 1.23.1 to 1.24.0 ## v1.27.2 [2023-07-10] ### Bugfixes - [#13570](https://github.com/influxdata/telegraf/pull/13570) `config` Replace environment variables if existing but empty - [#13525](https://github.com/influxdata/telegraf/pull/13525) `inputs.cloud_pubsub` Properly lock for decompression - [#13517](https://github.com/influxdata/telegraf/pull/13517) `inputs.gnmi` Add option to explicitly trim field-names - [#13497](https://github.com/influxdata/telegraf/pull/13497) `inputs.internet_speed` Add location as a field - [#13485](https://github.com/influxdata/telegraf/pull/13485) `inputs.modbus` Check number of register for datatype - [#13486](https://github.com/influxdata/telegraf/pull/13486) `inputs.modbus` Fix optimization of overlapping requests and add warning - [#13478](https://github.com/influxdata/telegraf/pull/13478) `inputs.mqtt_consumer` Correctly handle semaphores on messages - [#13574](https://github.com/influxdata/telegraf/pull/13574) `inputs.mqtt_consumer` Print warning on no metrics generated - [#13514](https://github.com/influxdata/telegraf/pull/13514) `inputs.opcua` Ensure connection after reconnect - [#13495](https://github.com/influxdata/telegraf/pull/13495) `inputs.phpfpm` Check address length to avoid crash - [#13542](https://github.com/influxdata/telegraf/pull/13542) `inputs.snmp_trap` Copy GoSNMP global defaults to prevent side-effects - [#13557](https://github.com/influxdata/telegraf/pull/13557) `inputs.vpshere` Compare versions as a string - [#13527](https://github.com/influxdata/telegraf/pull/13527) `outputs.graphite` Rework connection handling - [#13562](https://github.com/influxdata/telegraf/pull/13562) `outputs.influxdb_v2` Expose HTTP/2 client timeouts - [#13454](https://github.com/influxdata/telegraf/pull/13454) `outputs.stackdriver` Options to use official path and types - [#13522](https://github.com/influxdata/telegraf/pull/13522) `outputs.sumologic` Unwrap serializer for type check - [#13547](https://github.com/influxdata/telegraf/pull/13547) `parsers.binary` Fix binary parser example in README.md - [#13526](https://github.com/influxdata/telegraf/pull/13526) `parsers.grok` Use UTC as the default timezone - [#13550](https://github.com/influxdata/telegraf/pull/13550) `parsers.xpath` Handle explicitly defined fields correctly - [#13564](https://github.com/influxdata/telegraf/pull/13564) `processors.printer` Convert output to string - [#13489](https://github.com/influxdata/telegraf/pull/13489) `secretstores` Skip dbus connection with kwallet - [#13511](https://github.com/influxdata/telegraf/pull/13511) `serializers.splunkmetric` Fix TOML option name for multi-metric - [#13563](https://github.com/influxdata/telegraf/pull/13563) `tools.custom_builder` Error out for unknown plugins in configuration ### Dependency Updates - [#13524](https://github.com/influxdata/telegraf/pull/13524) Replace github.com/denisenkom/go-mssqldb with github.com/microsoft/go-mssqldb - [#13501](https://github.com/influxdata/telegraf/pull/13501) `deps` Bump cloud.google.com/go/bigquery from 1.51.1 to 1.52.0 - [#13500](https://github.com/influxdata/telegraf/pull/13500) `deps` Bump github.com/aliyun/alibaba-cloud-sdk-go from 1.62.337 to 1.62.389 - [#13504](https://github.com/influxdata/telegraf/pull/13504) `deps` Bump github.com/aws/aws-sdk-go-v2/config from 1.18.8 to 1.18.27 - [#13537](https://github.com/influxdata/telegraf/pull/13537) `deps` Bump github.com/aws/aws-sdk-go-v2/service/kinesis from 1.17.8 to 1.17.14 - [#13509](https://github.com/influxdata/telegraf/pull/13509) `deps` Bump github.com/gopcua/opcua from 0.3.7 to 0.4.0 - [#13502](https://github.com/influxdata/telegraf/pull/13502) `deps` Bump github.com/prometheus/client_golang from 1.15.1 to 1.16.0 - [#13544](https://github.com/influxdata/telegraf/pull/13544) `deps` Bump github.com/snowflakedb/gosnowflake from 1.6.13 to 1.6.22 - [#13541](https://github.com/influxdata/telegraf/pull/13541) `deps` Bump github.com/urfave/cli/v2 from 2.25.5 to 2.25.7 - [#13538](https://github.com/influxdata/telegraf/pull/13538) `deps` Bump golang.org/x/text from 0.9.0 to 0.10.0 - [#13554](https://github.com/influxdata/telegraf/pull/13554) `deps` Bump golang.org/x/text from 0.10.0 to 0.11.0 - [#13540](https://github.com/influxdata/telegraf/pull/13540) `deps` Bump google.golang.org/api from 0.126.0 to 0.129.0 ## v1.27.1 [2023-06-21] ### Bugfixes - [#13434](https://github.com/influxdata/telegraf/pull/13434) Handle compression level correctly for different algorithms - [#13457](https://github.com/influxdata/telegraf/pull/13457) `config` Restore old environment var behavior with option - [#13446](https://github.com/influxdata/telegraf/pull/13446) `custom_builder` Correctly handle serializers and parsers ### Dependency Updates - [#13469](https://github.com/influxdata/telegraf/pull/13469) `deps` Bump github.com/aws/aws-sdk-go-v2/credentials from 1.13.20 to 1.13.26 - [#13468](https://github.com/influxdata/telegraf/pull/13468) `deps` Bump github.com/aws/aws-sdk-go-v2/service/cloudwatch from 1.25.9 to 1.26.2 - [#13465](https://github.com/influxdata/telegraf/pull/13465) `deps` Bump github.com/aws/aws-sdk-go-v2/service/timestreamwrite from 1.16.0 to 1.17.2 - [#13466](https://github.com/influxdata/telegraf/pull/13466) `deps` Bump github.com/go-sql-driver/mysql from 1.6.0 to 1.7.1 - [#13427](https://github.com/influxdata/telegraf/pull/13427) `deps` Bump github.com/jackc/pgx/v4 from 4.17.1 to 4.18.1 - [#13429](https://github.com/influxdata/telegraf/pull/13429) `deps` Bump github.com/nats-io/nats.go from 1.24.0 to 1.27.0 - [#13467](https://github.com/influxdata/telegraf/pull/13467) `deps` Bump github.com/prometheus-community/pro-bing from 0.1.0 to 0.2.0 - [#13428](https://github.com/influxdata/telegraf/pull/13428) `deps` Bump golang.org/x/crypto from 0.8.0 to 0.9.0 - [#13431](https://github.com/influxdata/telegraf/pull/13431) `deps` Bump golang.org/x/term from 0.8.0 to 0.9.0 - [#13430](https://github.com/influxdata/telegraf/pull/13430) `deps` Bump modernc.org/sqlite from 1.21.0 to 1.23.1 ## v1.27.0 [2023-06-12] ### Important Changes - Fix parsing of timezone abbreviations such as `MST`. Up to now, when parsing times with abbreviated timezones (i.e. the format ) the timezone information is ignored completely and the _timestamp_ is located in UTC. This is a golang issue (see [#9617](https://github.com/golang/go/issues/9617) or [#56528](https://github.com/golang/go/issues/56528)). If you worked around that issue, please remove the workaround before using v1.27+. In case you experience issues with abbreviated timezones please file an issue! - Removal of old-style parser creation. This should not directly affect users as it is an API change. All parsers in Telegraf are already ported to the new framework. If you experience any issues with not being able to create parsers let us know! ### New Plugins - [#11155](https://github.com/influxdata/telegraf/pull/11155) `inputs.ctrlx_datalayer` ctrlX Data Layer - [#13397](https://github.com/influxdata/telegraf/pull/13397) `inputs.intel_baseband` Intel Baseband Accelerator - [#13220](https://github.com/influxdata/telegraf/pull/13220) `outputs.clarify` Clarify - [#13379](https://github.com/influxdata/telegraf/pull/13379) `outputs.nebius_cloud_monitoring` Nebius Cloud Monitoring - [#13061](https://github.com/influxdata/telegraf/pull/13061) `processors.scale` Scale - [#13035](https://github.com/influxdata/telegraf/pull/13035) `secretstores.docker` Docker Store - [#13150](https://github.com/influxdata/telegraf/pull/13150) `secretstores.http` HTTP Store - [#13224](https://github.com/influxdata/telegraf/pull/13224) `serializers.cloudevents` CloudEvents ### Features - [#13144](https://github.com/influxdata/telegraf/pull/13144) Add common expression language metric filtering - [#13364](https://github.com/influxdata/telegraf/pull/13364) `agent` Add option to avoid filtering of explicit plugin tags - [#13118](https://github.com/influxdata/telegraf/pull/13118) `aggregators.basicstats` Add percentage change - [#13094](https://github.com/influxdata/telegraf/pull/13094) `cloud_pubsub` Add support for gzip compression - [#12863](https://github.com/influxdata/telegraf/pull/12863) `common.opcua` Add support for secret-store secrets - [#13262](https://github.com/influxdata/telegraf/pull/13262) `common.tls` Add support for passphrase-protected private key - [#13377](https://github.com/influxdata/telegraf/pull/13377) `config` Add framework for migrating deprecated plugins - [#13229](https://github.com/influxdata/telegraf/pull/13229) `config` Support shell like syntax for environment variable substitution - [#12448](https://github.com/influxdata/telegraf/pull/12448) `inputs.cloudwatch` Add support for cross account observability - [#13089](https://github.com/influxdata/telegraf/pull/13089) `inputs.directory_monitor` Improve internal stats - [#13163](https://github.com/influxdata/telegraf/pull/13163) `inputs.filecount` Add oldestFileTimestamp and newestFileTimestamp - [#13326](https://github.com/influxdata/telegraf/pull/13326) `inputs.gnmi` Allow canonical field names - [#13116](https://github.com/influxdata/telegraf/pull/13116) `inputs.gnmi` Support Juniper GNMI Extension Header - [#12797](https://github.com/influxdata/telegraf/pull/12797) `inputs.internet_speed` Support multi-server test - [#11831](https://github.com/influxdata/telegraf/pull/11831) `inputs.kafka_consumer` Add regular expression support for topics - [#13040](https://github.com/influxdata/telegraf/pull/13040) `inputs.kubernetes` Extend kube_inventory plugin to include and extend resource quota, secret, node, and pod measurement - [#13293](https://github.com/influxdata/telegraf/pull/13293) `inputs.nats_consumer` Add receiver subject as tag - [#13047](https://github.com/influxdata/telegraf/pull/13047) `inputs.netflow` Add sFlow decoder - [#13360](https://github.com/influxdata/telegraf/pull/13360) `inputs.netflow` Allow custom PEN field mappings - [#13133](https://github.com/influxdata/telegraf/pull/13133) `inputs.nvidia_smi` Add additional memory related fields - [#13404](https://github.com/influxdata/telegraf/pull/13404) `inputs.opentelemetry` Add configurable span dimensions - [#12851](https://github.com/influxdata/telegraf/pull/12851) `inputs.prometheus` Control which pod metadata is added as tags - [#13289](https://github.com/influxdata/telegraf/pull/13289) `inputs.sql` Add disconnected_servers_behavior field in the configuration - [#13091](https://github.com/influxdata/telegraf/pull/13091) `inputs.sql` Add FlightSQL support - [#13261](https://github.com/influxdata/telegraf/pull/13261) `inputs.sqlserver` Add Azure Arc-enabled SQL MI support - [#13284](https://github.com/influxdata/telegraf/pull/13284) `inputs.sqlserver` Check SQL Server encryptionEnforce with xp_instance_regread - [#13087](https://github.com/influxdata/telegraf/pull/13087) `inputs.statsd` Add optional temporality and start_time tag for statsd metrics - [#13048](https://github.com/influxdata/telegraf/pull/13048) `inputs.suricata` Add ability to parse drop or rejected - [#11955](https://github.com/influxdata/telegraf/pull/11955) `inputs.vsphere` Add vSAN extension - [#13316](https://github.com/influxdata/telegraf/pull/13316) `internal` Add additional faster compression options - [#13157](https://github.com/influxdata/telegraf/pull/13157) `outputs.loki` Add option for metric name label - [#13349](https://github.com/influxdata/telegraf/pull/13349) `outputs.wavefront` Add TLS and HTTP Timeout configuration fields - [#13167](https://github.com/influxdata/telegraf/pull/13167) `parsers.opentsdb` Add OpenTSDB data format parser - [#13075](https://github.com/influxdata/telegraf/pull/13075) `processors.aws_ec2` Add caching of imds and ec2 tags - [#13147](https://github.com/influxdata/telegraf/pull/13147) `processors.parser` Add merge with timestamp option - [#13227](https://github.com/influxdata/telegraf/pull/13227) `processors.scale` Add scaling by factor and offset - [#13253](https://github.com/influxdata/telegraf/pull/13253) `processors.template` Allow `tag` to be a template - [#12971](https://github.com/influxdata/telegraf/pull/12971) `serializer.prometheusremote` Improve performance - [#13275](https://github.com/influxdata/telegraf/pull/13275) `test` Allow to capture all messages during test ### Bugfixes - [#13238](https://github.com/influxdata/telegraf/pull/13238) `inputs.cloud_pubsub` Fix gzip decompression - [#13304](https://github.com/influxdata/telegraf/pull/13304) `inputs.gnmi` Allow optional origin for update path - [#13332](https://github.com/influxdata/telegraf/pull/13332) `inputs.gnmi` Handle canonical field-name correctly for non-explicit subscriptions - [#13350](https://github.com/influxdata/telegraf/pull/13350) `inputs.mqtt` ACK messages when persistence is enabled - [#13361](https://github.com/influxdata/telegraf/pull/13361) `inputs.mysql` Update MariaDB Dialect regex version check - [#13325](https://github.com/influxdata/telegraf/pull/13325) `inputs.netflow` Fix field mappings - [#13320](https://github.com/influxdata/telegraf/pull/13320) `inputs.netflow` Handle PEN messages correctly - [#13231](https://github.com/influxdata/telegraf/pull/13231) `inputs.prometheus` Avoid race when creating informer factory - [#13288](https://github.com/influxdata/telegraf/pull/13288) `inputs.socket_listener` Avoid noisy logs on closed connection - [#13307](https://github.com/influxdata/telegraf/pull/13307) `inputs.temp` Ignore warnings and instead return only errors - [#13412](https://github.com/influxdata/telegraf/pull/13412) `inputs.upsd` Handle float battery.runtime value - [#13363](https://github.com/influxdata/telegraf/pull/13363) `internal` Fix time parsing for abbreviated timezones - [#13408](https://github.com/influxdata/telegraf/pull/13408) `outputs.sql` Use config.duration to correctly to parse toml config - [#13252](https://github.com/influxdata/telegraf/pull/13252) `outputs.wavefront` Flush metric buffer before reaching overflow - [#13301](https://github.com/influxdata/telegraf/pull/13301) `processors.lookup` Do not strip tracking info - [#13164](https://github.com/influxdata/telegraf/pull/13164) `serializers.influx` Restore disabled uint support by default - [#13394](https://github.com/influxdata/telegraf/pull/13394) `tests` Replace last 'cat' instance in tests ### Dependency Updates - [#13359](https://github.com/influxdata/telegraf/pull/13359) `deps` Bump cloud.google.com/go/monitoring from 1.13.0 to 1.14.0 - [#13312](https://github.com/influxdata/telegraf/pull/13312) `deps` Bump github.com/aliyun/alibaba-cloud-sdk-go from 1.62.193 to 1.62.337 - [#13390](https://github.com/influxdata/telegraf/pull/13390) `deps` Bump github.com/aws/aws-sdk-go-v2/feature/ec2/imds from 1.13.2 to 1.13.3 - [#13391](https://github.com/influxdata/telegraf/pull/13391) `deps` Bump github.com/aws/aws-sdk-go-v2/service/sts from 1.18.9 to 1.19.0 - [#13313](https://github.com/influxdata/telegraf/pull/13313) `deps` Bump github.com/Azure/azure-event-hubs-go/v3 from 3.4.0 to 3.5.0 - [#13314](https://github.com/influxdata/telegraf/pull/13314) `deps` Bump github.com/Azure/go-autorest/autorest from 0.11.28 to 0.11.29 - [#13265](https://github.com/influxdata/telegraf/pull/13265) `deps` Bump github.com/influxdata/influxdb-observability libraries from 0.3.3 to 0.3.15 - [#13311](https://github.com/influxdata/telegraf/pull/13311) `deps` Bump github.com/jackc/pgconn from 1.13.0 to 1.14.0 - [#13357](https://github.com/influxdata/telegraf/pull/13357) `deps` Bump github.com/jackc/pgtype from 1.12.0 to 1.14.0 - [#13392](https://github.com/influxdata/telegraf/pull/13392) `deps` Bump github.com/Mellanox/rdmamap to 1.1.0 - [#13356](https://github.com/influxdata/telegraf/pull/13356) `deps` Bump github.com/pion/dtls/v2 from 2.2.6 to 2.2.7 - [#13389](https://github.com/influxdata/telegraf/pull/13389) `deps` Bump github.com/prometheus/common from 0.43.0 to 0.44.0 - [#13355](https://github.com/influxdata/telegraf/pull/13355) `deps` Bump github.com/rabbitmq/amqp091-go from 1.8.0 to 1.8.1 - [#13396](https://github.com/influxdata/telegraf/pull/13396) `deps` Bump github.com/shirou/gopsutil from 3.23.4 to 3.23.5 - [#13369](https://github.com/influxdata/telegraf/pull/13369) `deps` Bump github.com/showwin/speedtest-go from 1.5.2 to 1.6.2 - [#13388](https://github.com/influxdata/telegraf/pull/13388) `deps` Bump github.com/urfave/cli/v2 from 2.23.5 to 2.25.5 - [#13315](https://github.com/influxdata/telegraf/pull/13315) `deps` Bump k8s.io/client-go from 0.26.2 to 0.27.2 ## v1.26.3 [2023-05-22] ### Bugfixes - [#13149](https://github.com/influxdata/telegraf/pull/13149) `inputs.gnmi` Create selfstat to track connection state - [#13139](https://github.com/influxdata/telegraf/pull/13139) `inputs.intel_pmu` Fix handling of the json perfmon format - [#13056](https://github.com/influxdata/telegraf/pull/13056) `inputs.socket_listener` Fix loss of connection tracking - [#13300](https://github.com/influxdata/telegraf/pull/13300) `inputs.socket_listener` Fix race in tests - [#13286](https://github.com/influxdata/telegraf/pull/13286) `inputs.vsphere` Specify the correct option for disconnected_servers_behavior - [#13239](https://github.com/influxdata/telegraf/pull/13239) `outputs.graphite` Fix logic to reconnect with servers that were not up on agent startup - [#13169](https://github.com/influxdata/telegraf/pull/13169) `outputs.prometheus_client` Fix export_timestamp for v1 metric type - [#13168](https://github.com/influxdata/telegraf/pull/13168) `outputs.stackdriver` Allow for custom metric type prefix - [#12994](https://github.com/influxdata/telegraf/pull/12994) `outputs.stackdriver` Group batches by timestamp - [#13126](https://github.com/influxdata/telegraf/pull/13126) `outputs.warp10` Support Infinity/-Infinity/NaN values - [#13156](https://github.com/influxdata/telegraf/pull/13156) `processors.starlark` Do not reject tracking metrics twice ### Dependency Updates - [#13256](https://github.com/influxdata/telegraf/pull/13256) `deps` Bump cloud.google.com/go/pubsub from 1.30.0 to 1.30.1 - [#13258](https://github.com/influxdata/telegraf/pull/13258) `deps` Bump github.com/aerospike/aerospike-client-go/v5 from 5.10.0 to 5.11.0 - [#13242](https://github.com/influxdata/telegraf/pull/13242) `deps` Bump github.com/antchfx/xpath to latest master for string-join() - [#13255](https://github.com/influxdata/telegraf/pull/13255) `deps` Bump github.com/aws/aws-sdk-go-v2 from 1.17.8 to 1.18.0 - [#13215](https://github.com/influxdata/telegraf/pull/13215) `deps` Bump github.com/Azure/go-autorest/autorest/adal from 0.9.22 to 0.9.23 - [#13254](https://github.com/influxdata/telegraf/pull/13254) `deps` Bump github.com/benbjohnson/clock from 1.3.0 to 1.3.3 - [#13269](https://github.com/influxdata/telegraf/pull/13269) `deps` Bump github.com/docker/distribution from 2.8.1 to 2.8.2 - [#13216](https://github.com/influxdata/telegraf/pull/13216) `deps` Bump github.com/fatih/color from 1.13.0 to 1.15.0 - [#13104](https://github.com/influxdata/telegraf/pull/13104) `deps` Bump github.com/netsampler/goflow2 from 1.1.1 to 1.3.3 - [#13138](https://github.com/influxdata/telegraf/pull/13138) `deps` Bump github.com/yuin/goldmark from 1.5.3 to 1.5.4 - [#13257](https://github.com/influxdata/telegraf/pull/13257) `deps` Bump go.opentelemetry.io/collector/pdata from 1.0.0-rc7 to 1.0.0-rcv0011 - [#13137](https://github.com/influxdata/telegraf/pull/13137) `deps` Bump golang.org/x/net from 0.8.0 to 0.9.0 - [#13276](https://github.com/influxdata/telegraf/pull/13276) `deps` Bump golang.org/x/net from 0.9.0 to 0.10.0 - [#13217](https://github.com/influxdata/telegraf/pull/13217) `deps` Bump golang.org/x/oauth2 from 0.5.0 to 0.7.0 - [#13170](https://github.com/influxdata/telegraf/pull/13170) `deps` Bump google.golang.org/api from 0.106.0 to 0.120.0 - [#13223](https://github.com/influxdata/telegraf/pull/13223) `deps` Bump govulncheck-action from 0.10.0 to 0.10.1 - [#13225](https://github.com/influxdata/telegraf/pull/13225) `deps` Bump prometheus from v1.8.2 to v2.42.0 - [#13230](https://github.com/influxdata/telegraf/pull/13230) `deps` Bump signalfx/golib from 3.3.46 to 3.3.50 ## v1.26.2 [2023-04-24] ### Bugfixes - [#13020](https://github.com/influxdata/telegraf/pull/13020) `agent` Pass quiet flag earlier - [#13063](https://github.com/influxdata/telegraf/pull/13063) `inputs.prometheus` Add namespace option in k8s informer factory - [#13059](https://github.com/influxdata/telegraf/pull/13059) `inputs.socket_listener` Fix tracking of unix sockets - [#13078](https://github.com/influxdata/telegraf/pull/13078) `parsers.grok` Fix nil metric for multiline inputs - [#13092](https://github.com/influxdata/telegraf/pull/13092) `processors.lookup` Fix tracking metrics ### Dependency Updates - [#13106](https://github.com/influxdata/telegraf/pull/13106) `deps` Bump github.com/aws/aws-sdk-go-v2/credentials from 1.13.15 to 1.13.20 - [#13072](https://github.com/influxdata/telegraf/pull/13072) `deps` Bump github.com/aws/aws-sdk-go-v2/service/cloudwatch from 1.21.6 to 1.25.9 - [#13107](https://github.com/influxdata/telegraf/pull/13107) `deps` Bump github.com/aws/aws-sdk-go-v2/service/cloudwatchlogs from 1.15.13 to 1.20.9 - [#13027](https://github.com/influxdata/telegraf/pull/13027) `deps` Bump github.com/aws/aws-sdk-go-v2/service/kinesis from 1.15.19 to 1.17.8 - [#13069](https://github.com/influxdata/telegraf/pull/13069) `deps` Bump github.com/aws/aws-sdk-go-v2/service/sts from 1.18.5 to 1.18.9 - [#13105](https://github.com/influxdata/telegraf/pull/13105) `deps` Bump github.com/docker/docker from 23.0.0 to 23.0.4 - [#13024](https://github.com/influxdata/telegraf/pull/13024) `deps` Bump github.com/openconfig/gnmi from 0.0.0-20220920173703-480bf53a74d2 to 0.9.1 - [#13026](https://github.com/influxdata/telegraf/pull/13026) `deps` Bump github.com/prometheus/common from 0.41.0 to 0.42.0 - [#13025](https://github.com/influxdata/telegraf/pull/13025) `deps` Bump github.com/safchain/ethtool from 0.2.0 to 0.3.0 - [#13023](https://github.com/influxdata/telegraf/pull/13023) `deps` Bump github.com/tinylib/msgp from 1.1.6 to 1.1.8 - [#13071](https://github.com/influxdata/telegraf/pull/13071) `deps` Bump github.com/vishvananda/netns from 0.0.2 to 0.0.4 - [#13070](https://github.com/influxdata/telegraf/pull/13070) `deps` Bump github.com/wavefronthq/wavefront-sdk-go from 0.11.0 to 0.12.0 ## v1.26.1 [2023-04-03] ### Bugfixes - [#12880](https://github.com/influxdata/telegraf/pull/12880) `config` Return error on order set as string - [#12867](https://github.com/influxdata/telegraf/pull/12867) `inputs.ethtool` Check for nil - [#12935](https://github.com/influxdata/telegraf/pull/12935) `inputs.execd` Add option to set buffer size - [#12877](https://github.com/influxdata/telegraf/pull/12877) `inputs.internet_speed` Rename host tag to source - [#12918](https://github.com/influxdata/telegraf/pull/12918) `inputs.kubernetes` Apply timeout for the whole HTTP request - [#13006](https://github.com/influxdata/telegraf/pull/13006) `inputs.netflow` Use correct name in the build tag - [#13015](https://github.com/influxdata/telegraf/pull/13015) `inputs.procstat` Return tags of pids if lookup_error - [#12864](https://github.com/influxdata/telegraf/pull/12864) `inputs.prometheus` Correctly set timeout param - [#12907](https://github.com/influxdata/telegraf/pull/12907) `inputs.prometheus` Use set over add for custom headers - [#12961](https://github.com/influxdata/telegraf/pull/12961) `inputs.upsd` Include ups.real_power - [#12908](https://github.com/influxdata/telegraf/pull/12908) `outputs.graphite` Add custom regex to outputs - [#13012](https://github.com/influxdata/telegraf/pull/13012) `secrets` Add function to set a secret - [#13002](https://github.com/influxdata/telegraf/pull/13002) `secrets` Minimize secret holding time - [#12993](https://github.com/influxdata/telegraf/pull/12993) `secrets` Warn if OS limit for locked memory is too low - [#12919](https://github.com/influxdata/telegraf/pull/12919) `secrets` Handle array of secrets correctly - [#12835](https://github.com/influxdata/telegraf/pull/12835) `serializers.graphite` Allow for specifying regex to sanitize - [#12990](https://github.com/influxdata/telegraf/pull/12990) `systemd` Increase lock memory for service to 8192kb ### Dependency Updates - [#12857](https://github.com/influxdata/telegraf/pull/12857) `deps` Bump github.com/antchfx/xpath from 1.2.3 to 1.2.4 - [#12909](https://github.com/influxdata/telegraf/pull/12909) `deps` Bump github.com/apache/thrift from 0.16.0 to 0.18.1 - [#12856](https://github.com/influxdata/telegraf/pull/12856) `deps` Bump github.com/Azure/azure-event-hubs-go/v3 from 3.3.20 to 3.4.0 - [#12966](https://github.com/influxdata/telegraf/pull/12966) `deps` Bump github.com/Azure/go-autorest/autorest/azure/auth from 0.5.11 to 0.5.12 - [#12964](https://github.com/influxdata/telegraf/pull/12964) `deps` Bump github.com/golang-jwt/jwt/v4 from 4.4.2 to 4.5.0 - [#12967](https://github.com/influxdata/telegraf/pull/12967) `deps` Bump github.com/jhump/protoreflect from 1.8.3-0.20210616212123-6cc1efa697ca to 1.15.1 - [#12855](https://github.com/influxdata/telegraf/pull/12855) `deps` Bump github.com/nats-io/nats.go from 1.19.0 to 1.24.0 - [#12981](https://github.com/influxdata/telegraf/pull/12981) `deps` Bump github.com/opencontainers/runc from 1.1.4 to 1.1.5 - [#12913](https://github.com/influxdata/telegraf/pull/12913) `deps` Bump github.com/pion/dtls/v2 from 2.2.4 to 2.2.6 - [#12968](https://github.com/influxdata/telegraf/pull/12968) `deps` Bump github.com/rabbitmq/amqp091-go from 1.7.0 to 1.8.0 - [#13017](https://github.com/influxdata/telegraf/pull/13017) `deps` Bump github.com/shirou/gopsutil from 3.23.2 to 3.23.3 - [#12853](https://github.com/influxdata/telegraf/pull/12853) `deps` Bump github.com/Shopify/sarama from 1.37.2 to 1.38.1 - [#12854](https://github.com/influxdata/telegraf/pull/12854) `deps` Bump github.com/sensu/sensu-go/api/core/v2 from 2.15.0 to 2.16.0 - [#12911](https://github.com/influxdata/telegraf/pull/12911) `deps` Bump github.com/tidwall/gjson from 1.14.3 to 1.14.4 - [#12912](https://github.com/influxdata/telegraf/pull/12912) `deps` Bump golang.org/x/net from 0.7.0 to 0.8.0 - [#12910](https://github.com/influxdata/telegraf/pull/12910) `deps` Bump modernc.org/sqlite from 1.19.2 to 1.21.0 ## v1.26.0 [2023-03-13] ### Important Changes - Static Builds: Linux builds are now statically built. Other operating systems were cross-built in the past and as a result, already static. Users should not notice any change in behavior. The `_static` specific Linux binary is no longer produced as a result. - telegraf.d Behavior: The default behavior of reading `/etc/telegraf/telegraf.conf` now includes any .conf files under `/etc/telegraf/telegraf.d/`. This change will apply to the official Telegraf Docker image as well. This will simplify docker usage when using multiple configuration files. - Default Configuration: The `telegraf config` command and default config file provided by Telegraf now includes all plugins and produces the same output across all operating systems. Plugin comments specify what platforms are supported or not. - State Persistence: State persistence is now available in select plugins. This will allow plugins to start collecting data, where they left off. A configuration with state persistence cannot change or it will not be able to recover. ### New Plugins - [#12393](https://github.com/influxdata/telegraf/pull/12393) `inputs.opensearch_query` Opensearch Query - [#12473](https://github.com/influxdata/telegraf/pull/12473) `inputs.p4runtime` P4Runtime - [#12736](https://github.com/influxdata/telegraf/pull/12736) `inputs.radius` Radius Auth Response Time - [#11250](https://github.com/influxdata/telegraf/pull/11250) `inputs.win_wmi` Windows Management Instrumentation (WMI) - [#12809](https://github.com/influxdata/telegraf/pull/12809) `processors.lookup` Lookup ### Features - [#12600](https://github.com/influxdata/telegraf/pull/12600) Always disable cgo support (static builds) - [#12166](https://github.com/influxdata/telegraf/pull/12166) Plugin state-persistence - [#12608](https://github.com/influxdata/telegraf/pull/12608) `agent` Add /etc/telegraf/telegraf.d to default config locations - [#12827](https://github.com/influxdata/telegraf/pull/12827) `agent` Print loaded configs - [#12821](https://github.com/influxdata/telegraf/pull/12821) `common.oauth` Add audience parameter - [#12727](https://github.com/influxdata/telegraf/pull/12727) `common.tls` Add enable flag - [#12579](https://github.com/influxdata/telegraf/pull/12579) `config` Accept durations given in days (e.g. 7d) - [#12798](https://github.com/influxdata/telegraf/pull/12798) `inputs.cgroup` Added support for cpu.stat - [#12345](https://github.com/influxdata/telegraf/pull/12345) `inputs.cisco_telemetry_mdt` Include delete field - [#12696](https://github.com/influxdata/telegraf/pull/12696) `inputs.disk` Add label as tag - [#12519](https://github.com/influxdata/telegraf/pull/12519) `inputs.dns_query` Add IP field(s) - [#12775](https://github.com/influxdata/telegraf/pull/12775) `inputs.docker_log` Add state-persistence capabilities - [#12814](https://github.com/influxdata/telegraf/pull/12814) `inputs.ethtool` Add support for link speed, duplex, etc. - [#12550](https://github.com/influxdata/telegraf/pull/12550) `inputs.example` Add secret-store sample code - [#12495](https://github.com/influxdata/telegraf/pull/12495) `inputs.gnmi` Set max gRPC message size - [#12680](https://github.com/influxdata/telegraf/pull/12680) `inputs.haproxy` Add support for tcp endpoints in haproxy plugin - [#12645](https://github.com/influxdata/telegraf/pull/12645) `inputs.http_listener_v2` Add custom server http headers - [#12506](https://github.com/influxdata/telegraf/pull/12506) `inputs.icinga2` Support collecting hosts, services, and endpoint metrics - [#12493](https://github.com/influxdata/telegraf/pull/12493) `inputs.influxdb` Collect uptime statistics - [#12452](https://github.com/influxdata/telegraf/pull/12452) `inputs.intel_powerstat` Add CPU base frequency metric and add support for new platforms - [#12707](https://github.com/influxdata/telegraf/pull/12707) `inputs.internet_speed` Add the best server selection via latency and jitter field - [#12617](https://github.com/influxdata/telegraf/pull/12617) `inputs.internet_speed` Server ID include and exclude filter - [#12730](https://github.com/influxdata/telegraf/pull/12730) `inputs.jti_openconfig_telemetry` Set timestamp from data - [#12786](https://github.com/influxdata/telegraf/pull/12786) `inputs.modbus` Add RS485 specific config options - [#12408](https://github.com/influxdata/telegraf/pull/12408) `inputs.modbus` Add workaround to enforce reads from zero for coil registers - [#12825](https://github.com/influxdata/telegraf/pull/12825) `inputs.modbus` Allow to convert coil and discrete registers to boolean - [#12591](https://github.com/influxdata/telegraf/pull/12591) `inputs.mysql` Add secret-store support - [#12466](https://github.com/influxdata/telegraf/pull/12466) `inputs.openweathermap` Add snow parameter - [#12628](https://github.com/influxdata/telegraf/pull/12628) `inputs.processes` Add use_sudo option for BSD - [#12777](https://github.com/influxdata/telegraf/pull/12777) `inputs.prometheus` Use namespace annotations to filter pods to be scraped - [#12496](https://github.com/influxdata/telegraf/pull/12496) `inputs.redfish` Add power control metric - [#12400](https://github.com/influxdata/telegraf/pull/12400) `inputs.sqlserver` Get database pages performance counter - [#12377](https://github.com/influxdata/telegraf/pull/12377) `inputs.stackdriver` Allow filtering by resource metadata labels - [#12318](https://github.com/influxdata/telegraf/pull/12318) `inputs.statsd` Add pending messages stat and allow to configure number of threads - [#12828](https://github.com/influxdata/telegraf/pull/12828) `inputs.vsphere` Flag for more lenient behavior when connect fails on startup - [#12790](https://github.com/influxdata/telegraf/pull/12790) `inputs.win_eventlog` Add state-persistence capabilities - [#12556](https://github.com/influxdata/telegraf/pull/12556) `inputs.win_perf_counters` Add remote system support - [#12729](https://github.com/influxdata/telegraf/pull/12729) `inputs.wireguard` Add allowed_peer_cidr field - [#12444](https://github.com/influxdata/telegraf/pull/12444) `inputs.x509_cert` Add OCSP stapling information for leaf certificates (#10550) - [#12656](https://github.com/influxdata/telegraf/pull/12656) `inputs.x509_cert` Add tag for certificate type-classification - [#12697](https://github.com/influxdata/telegraf/pull/12697) `outputs.mqtt` Add option to specify topic layouts - [#12678](https://github.com/influxdata/telegraf/pull/12678) `outputs.mqtt` Add support for MQTT 5 publish properties - [#12224](https://github.com/influxdata/telegraf/pull/12224) `outputs.mqtt` Enhance routing capabilities - [#11816](https://github.com/influxdata/telegraf/pull/11816) `parsers.avro` Add Apache Avro parser - [#12820](https://github.com/influxdata/telegraf/pull/12820) `parsers.xpath` Add timezone handling - [#12767](https://github.com/influxdata/telegraf/pull/12767) `processors.converter` Convert tag or field as metric timestamp - [#12659](https://github.com/influxdata/telegraf/pull/12659) `processors.unpivot` Add mode to create new metrics - [#12812](https://github.com/influxdata/telegraf/pull/12812) `secretstores` Add command-line option to specify password - [#12067](https://github.com/influxdata/telegraf/pull/12067) `secretstores` Add support for additional input plugins - [#12497](https://github.com/influxdata/telegraf/pull/12497) `secretstores` Convert many output plugins ### Bugfixes - [#12781](https://github.com/influxdata/telegraf/pull/12781) `agent` Allow graceful shutdown on interrupt (e.g. Ctrl-C) - [#12740](https://github.com/influxdata/telegraf/pull/12740) `agent` Only rotate log on SIGHUP if needed - [#12818](https://github.com/influxdata/telegraf/pull/12818) `inputs.amqp_consumer` Avoid deprecations when handling defaults - [#12817](https://github.com/influxdata/telegraf/pull/12817) `inputs.amqp_consumer` Fix panic on Stop() if not connected successfully - [#12815](https://github.com/influxdata/telegraf/pull/12815) `inputs.ethtool` Close namespace file to prevent crash - [#12778](https://github.com/influxdata/telegraf/pull/12778) `inputs.statsd` On close, verify listener is not nil ### Dependency Updates - [#12805](https://github.com/influxdata/telegraf/pull/12805) `deps` Bump cloud.google.com/go/storage from 1.28.1 to 1.29.0 - [#12804](https://github.com/influxdata/telegraf/pull/12804) `deps` Bump github.com/Azure/go-autorest/autorest/adal from 0.9.21 to 0.9.22 - [#12757](https://github.com/influxdata/telegraf/pull/12757) `deps` Bump github.com/aliyun/alibaba-cloud-sdk-go from 1.62.77 to 1.62.193 - [#12808](https://github.com/influxdata/telegraf/pull/12808) `deps` Bump github.com/aws/aws-sdk-go-v2/credentials from 1.13.2 to 1.13.15 - [#12756](https://github.com/influxdata/telegraf/pull/12756) `deps` Bump github.com/aws/aws-sdk-go-v2/service/timestreamwrite from 1.14.5 to 1.16.0 - [#12754](https://github.com/influxdata/telegraf/pull/12754) `deps` Bump github.com/coocood/freecache from 1.2.2 to 1.2.3 - [#12852](https://github.com/influxdata/telegraf/pull/12852) `deps` Bump github.com/opencontainers/runc from 1.1.3 to 1.1.4 - [#12806](https://github.com/influxdata/telegraf/pull/12806) `deps` Bump github.com/opensearch-project/opensearch-go/v2 from 2.1.0 to 2.2.0 - [#12753](https://github.com/influxdata/telegraf/pull/12753) `deps` Bump github.com/openzipkin-contrib/zipkin-go-opentracing from 0.4.5 to 0.5.0 - [#12755](https://github.com/influxdata/telegraf/pull/12755) `deps` Bump github.com/rabbitmq/amqp091-go from 1.5.0 to 1.7.0 - [#12822](https://github.com/influxdata/telegraf/pull/12822) `deps` Bump github.com/shirou/gopsutil from v3.22.12 to v3.23.2 - [#12807](https://github.com/influxdata/telegraf/pull/12807) `deps` Bump github.com/stretchr/testify from 1.8.1 to 1.8.2 - [#12840](https://github.com/influxdata/telegraf/pull/12840) `deps` Bump OpenTelemetry from 0.3.1 to 0.3.3 - [#12801](https://github.com/influxdata/telegraf/pull/12801) `deps` Downgrade github.com/karrick/godirwalk from v1.17.0 to v1.16.2 ## v1.25.3 [2023-02-27] ### Bugfixes - [#12721](https://github.com/influxdata/telegraf/pull/12721) `agent` Fix reload config on config update/SIGHUP - [#12462](https://github.com/influxdata/telegraf/pull/12462) `inputs.bond` Reset slave stats for each interface - [#12677](https://github.com/influxdata/telegraf/pull/12677) `inputs.cloudwatch` Verify endpoint is not nil - [#12725](https://github.com/influxdata/telegraf/pull/12725) `inputs.lvm` Add options to specify path to binaries - [#12724](https://github.com/influxdata/telegraf/pull/12724) `parsers.xpath` Fix panic for JSON name expansion - [#12735](https://github.com/influxdata/telegraf/pull/12735) `serializers.json` Fix stateful transformations ### Dependency Updates - [#12714](https://github.com/influxdata/telegraf/pull/12714) `deps` Bump cloud.google.com/go/pubsub from 1.27.1 to 1.28.0 - [#12693](https://github.com/influxdata/telegraf/pull/12693) `deps` Bump github.com/containerd/containerd from 1.6.8 to 1.6.18 - [#12715](https://github.com/influxdata/telegraf/pull/12715) `deps` Bump github.com/go-logfmt/logfmt from 0.5.1 to 0.6.0 - [#12668](https://github.com/influxdata/telegraf/pull/12668) `deps` Bump github.com/gofrs/uuid from 4.3.1 to 5.0.0 - [#12712](https://github.com/influxdata/telegraf/pull/12712) `deps` Bump github.com/gophercloud/gophercloud from 1.0.0 to 1.2.0 - [#12667](https://github.com/influxdata/telegraf/pull/12667) `deps` Bump github.com/pion/dtls/v2 from 2.1.5 to 2.2.4 - [#12699](https://github.com/influxdata/telegraf/pull/12699) `deps` Bump golang.org/x/net from 0.5.0 to 0.7.0 - [#12670](https://github.com/influxdata/telegraf/pull/12670) `deps` Bump golang.org/x/sys from 0.4.0 to 0.5.0 - [#12713](https://github.com/influxdata/telegraf/pull/12713) `deps` Bump google.golang.org/grpc from 1.52.3 to 1.53.0 - [#12669](https://github.com/influxdata/telegraf/pull/12669) `deps` Bump k8s.io/apimachinery from 0.25.3 to 0.25.6 - [#12698](https://github.com/influxdata/telegraf/pull/12698) `deps` Bump testcontainers from 0.14.0 to 0.18.0 ## v1.25.2 [2023-02-13] ### Bugfixes - [#12607](https://github.com/influxdata/telegraf/pull/12607) `agent` Only read the config once - [#12586](https://github.com/influxdata/telegraf/pull/12586) `docs` Fix link to license for Google flatbuffers - [#12637](https://github.com/influxdata/telegraf/pull/12637) `inputs.cisco_telemetry_mdt` Check subfield sizes to avoid panics - [#12657](https://github.com/influxdata/telegraf/pull/12657) `inputs.cloudwatch` Enable custom endpoint support - [#12603](https://github.com/influxdata/telegraf/pull/12603) `inputs.conntrack` Resolve segfault when setting collect field - [#12512](https://github.com/influxdata/telegraf/pull/12512) `inputs.gnmi` Handle both new-style `tag_subscription` and old-style `tag_only` - [#12599](https://github.com/influxdata/telegraf/pull/12599) `inputs.mongodb` Improve error logging - [#12604](https://github.com/influxdata/telegraf/pull/12604) `inputs.mongodb` SIGSEGV when restarting MongoDB node - [#12576](https://github.com/influxdata/telegraf/pull/12576) `inputs.mysql` Avoid side-effects for TLS between plugin instances - [#12626](https://github.com/influxdata/telegraf/pull/12626) `inputs.prometheus` Deprecate and rename the timeout variable - [#12648](https://github.com/influxdata/telegraf/pull/12648) `inputs.tail` Fix typo in the README - [#12543](https://github.com/influxdata/telegraf/pull/12543) `inputs.upsd` Add additional fields - [#12629](https://github.com/influxdata/telegraf/pull/12629) `inputs.x509_cert` Fix Windows path handling - [#12560](https://github.com/influxdata/telegraf/pull/12560) `outputs.prometheus_client` Expire with ticker, not add/collect - [#12644](https://github.com/influxdata/telegraf/pull/12644) `secretstores` Check store id format and presence ### Dependency Updates - [#12630](https://github.com/influxdata/telegraf/pull/12630) `deps` Bump cloud.google.com/go/bigquery from 1.44.0 to 1.45.0 - [#12568](https://github.com/influxdata/telegraf/pull/12568) `deps` Bump github.com/99designs/keyring from 1.2.1 to 1.2.2 - [#12634](https://github.com/influxdata/telegraf/pull/12634) `deps` Bump github.com/antchfx/xmlquery from 1.3.12 to 1.3.15 - [#12633](https://github.com/influxdata/telegraf/pull/12633) `deps` Bump github.com/antchfx/xpath from 1.2.2 to 1.2.3 - [#12571](https://github.com/influxdata/telegraf/pull/12571) `deps` Bump github.com/coreos/go-semver from 0.3.0 to 0.3.1 - [#12632](https://github.com/influxdata/telegraf/pull/12632) `deps` Bump github.com/moby/ipvs from 1.0.2 to 1.1.0 - [#12572](https://github.com/influxdata/telegraf/pull/12572) `deps` Bump github.com/multiplay/go-ts3 from 1.0.1 to 1.1.0 - [#12581](https://github.com/influxdata/telegraf/pull/12581) `deps` Bump github.com/prometheus/client_golang from 1.13.1 to 1.14.0 - [#12580](https://github.com/influxdata/telegraf/pull/12580) `deps` Bump github.com/shirou/gopsutil from 3.22.9 to 3.22.12 - [#12570](https://github.com/influxdata/telegraf/pull/12570) `deps` Bump go.mongodb.org/mongo-driver from 1.11.0 to 1.11.1 - [#12582](https://github.com/influxdata/telegraf/pull/12582) `deps` Bump golang/x dependencies - [#12583](https://github.com/influxdata/telegraf/pull/12583) `deps` Bump google.golang.org/grpc from 1.51.0 to 1.52.0 - [#12631](https://github.com/influxdata/telegraf/pull/12631) `deps` Bump google.golang.org/grpc from 1.52.0 to 1.52.3 ## v1.25.1 [2023-01-30] ### Bugfixes - [#12549](https://github.com/influxdata/telegraf/pull/12549) `agent` Catch non-existing commands and error out - [#12453](https://github.com/influxdata/telegraf/pull/12453) `agent` Correctly reload configuration files - [#12491](https://github.com/influxdata/telegraf/pull/12491) `agent` Handle float time with fractions of seconds correctly - [#12457](https://github.com/influxdata/telegraf/pull/12457) `agent` Only set default snmp after reading all configs - [#12515](https://github.com/influxdata/telegraf/pull/12515) `common.cookie` Allow any 2xx status code - [#12459](https://github.com/influxdata/telegraf/pull/12459) `common.kafka` Add keep-alive period setting for input and output - [#12240](https://github.com/influxdata/telegraf/pull/12240) `inputs.cisco_telemetry_mdt` Add operation-metric and class-policy prefix - [#12533](https://github.com/influxdata/telegraf/pull/12533) `inputs.exec` Restore pre-v1.21 behavior for CSV data_format - [#12415](https://github.com/influxdata/telegraf/pull/12415) `inputs.gnmi` Update configuration documentation - [#12536](https://github.com/influxdata/telegraf/pull/12536) `inputs.logstash` Collect opensearch specific stats - [#12409](https://github.com/influxdata/telegraf/pull/12409) `inputs.mysql` Revert slice declarations with non-zero initial length - [#12529](https://github.com/influxdata/telegraf/pull/12529) `inputs.opcua` Fix opcua and opcua-listener for servers using password-based auth - [#12522](https://github.com/influxdata/telegraf/pull/12522) `inputs.prometheus` Correctly track deleted pods - [#12559](https://github.com/influxdata/telegraf/pull/12559) `inputs.prometheus` Set the timeout for slow running API endpoints correctly - [#12384](https://github.com/influxdata/telegraf/pull/12384) `inputs.sqlserver` Add more precise version check - [#12387](https://github.com/influxdata/telegraf/pull/12387) `inputs.sqlserver` Added own SPID filter - [#12386](https://github.com/influxdata/telegraf/pull/12386) `inputs.sqlserver` SqlRequests include sleeping sessions with open transactions - [#12528](https://github.com/influxdata/telegraf/pull/12528) `inputs.sqlserver` Suppress error on secondary replicas - [#12516](https://github.com/influxdata/telegraf/pull/12516) `inputs.upsd` Always convert to float - [#12486](https://github.com/influxdata/telegraf/pull/12486) `inputs.upsd` Ensure firmware is always a string - [#12375](https://github.com/influxdata/telegraf/pull/12375) `inputs.win_eventlog` Handle remote events more robustly - [#12404](https://github.com/influxdata/telegraf/pull/12404) `inputs.x509_cert` Fix off-by-one when adding intermediate certificates - [#12399](https://github.com/influxdata/telegraf/pull/12399) `outputs.loki` Return response body on error - [#12440](https://github.com/influxdata/telegraf/pull/12440) `parsers.json_v2` In case of invalid json, log message to debug log - [#12401](https://github.com/influxdata/telegraf/pull/12401) `secretstores` Cleanup duplicate printing - [#12468](https://github.com/influxdata/telegraf/pull/12468) `secretstores` Fix handling of "id" and print failing secret-store - [#12490](https://github.com/influxdata/telegraf/pull/12490) `secretstores` Fix handling of TOML strings ### Dependency Updates - [#12385](https://github.com/influxdata/telegraf/pull/12385) `deps` Bump cloud.google.com/go/storage from 1.23.0 to 1.28.1 - [#12511](https://github.com/influxdata/telegraf/pull/12511) `deps` Bump github.com/antchfx/jsonquery from 1.3.0 to 1.3.1 - [#12420](https://github.com/influxdata/telegraf/pull/12420) `deps` Bump github.com/aws/aws-sdk-go-v2 from 1.17.1 to 1.17.3 - [#12538](https://github.com/influxdata/telegraf/pull/12538) `deps` Bump github.com/aws/aws-sdk-go-v2/service/ec2 from 1.54.4 to 1.80.1 - [#12476](https://github.com/influxdata/telegraf/pull/12476) `deps` Bump github.com/denisenkom/go-mssqldb from 0.12.0 to 0.12.3 - [#12378](https://github.com/influxdata/telegraf/pull/12378) `deps` Bump github.com/eclipse/paho.mqtt.golang from 1.4.1 to 1.4.2 - [#12381](https://github.com/influxdata/telegraf/pull/12381) `deps` Bump github.com/hashicorp/consul/api from 1.15.2 to 1.18.0 - [#12417](https://github.com/influxdata/telegraf/pull/12417) `deps` Bump github.com/karrick/godirwalk from 1.16.1 to 1.17.0 - [#12418](https://github.com/influxdata/telegraf/pull/12418) `deps` Bump github.com/kardianos/service from 1.2.1 to 1.2.2 - [#12379](https://github.com/influxdata/telegraf/pull/12379) `deps` Bump github.com/nats-io/nats-server/v2 from 2.9.4 to 2.9.9 ## v1.25.0 [2022-12-12] ### New Plugins - [#10103](https://github.com/influxdata/telegraf/pull/10103) `inputs.azure_monitor` Azure Monitor - [#8413](https://github.com/influxdata/telegraf/pull/8413) `inputs.gcs` Google Cloud Storage - [#11824](https://github.com/influxdata/telegraf/pull/11824) `inputs.intel_dlb` Intel DLB - [#11814](https://github.com/influxdata/telegraf/pull/11814) `inputs.libvirt` libvirt - [#12108](https://github.com/influxdata/telegraf/pull/12108) `inputs.netflow` netflow v5, v9, and IPFIX - [#11786](https://github.com/influxdata/telegraf/pull/11786) `inputs.opcua_listener` OPC UA Event subscriptions ### Features - [#12130](https://github.com/influxdata/telegraf/pull/12130) Add arm64 Windows builds to nightly and CI - [#11987](https://github.com/influxdata/telegraf/pull/11987) `agent` Add method to inform of deprecated plugin option values - [#11232](https://github.com/influxdata/telegraf/pull/11232) `agent` Secret-store implementation - [#12358](https://github.com/influxdata/telegraf/pull/12358) `agent` Deprecate active usage of netsnmp translator - [#12302](https://github.com/influxdata/telegraf/pull/12302) `agent.tls` Allow setting renegotiation method - [#12111](https://github.com/influxdata/telegraf/pull/12111) `common.kafka` Add exponential backoff when connecting or reconnecting and allow plugin to start without making initial connection - [#11860](https://github.com/influxdata/telegraf/pull/11860) `inputs.amqp_consumer` Determine content encoding automatically - [#12014](https://github.com/influxdata/telegraf/pull/12014) `inputs.apcupsd` Add new fields - [#12342](https://github.com/influxdata/telegraf/pull/12342) `inputs.cgroups` Do not abort on first error, print message once - [#8958](https://github.com/influxdata/telegraf/pull/8958) `inputs.conntrack` Parse conntrack stats - [#11703](https://github.com/influxdata/telegraf/pull/11703) `inputs.diskio` Allow selecting devices by ID - [#11895](https://github.com/influxdata/telegraf/pull/11895) `inputs.ethtool` Gather statistics from namespaces - [#12087](https://github.com/influxdata/telegraf/pull/12087) `inputs.ethtool` Possibility to skip gathering metrics for downed interfaces - [#12324](https://github.com/influxdata/telegraf/pull/12324) `inputs.http_response` Add User-Agent header - [#12304](https://github.com/influxdata/telegraf/pull/12304) `inputs.kafka_consumer` Add sarama debug logs - [#11783](https://github.com/influxdata/telegraf/pull/11783) `inputs.knx_listener` Support TCP as transport protocol - [#12301](https://github.com/influxdata/telegraf/pull/12301) `inputs.kubernetes` Allow fetching kublet metrics remotely - [#12255](https://github.com/influxdata/telegraf/pull/12255) `inputs.modbus` Add 8-bit integer types - [#11983](https://github.com/influxdata/telegraf/pull/11983) `inputs.modbus` Add config option to pause after connect - [#12340](https://github.com/influxdata/telegraf/pull/12340) `inputs.modbus` Add support for half-precision float (float16) - [#11106](https://github.com/influxdata/telegraf/pull/11106) `inputs.modbus` Optimize grouped requests - [#11273](https://github.com/influxdata/telegraf/pull/11273) `inputs.modbus` Optimize requests - [#11630](https://github.com/influxdata/telegraf/pull/11630) `inputs.opcua` Add use regular reads workaround - [#9633](https://github.com/influxdata/telegraf/pull/9633) `inputs.powerdns_recursor` Support for new PowerDNS recursor control protocol - [#12050](https://github.com/influxdata/telegraf/pull/12050) `inputs.prometheus` Add support for custom header - [#11962](https://github.com/influxdata/telegraf/pull/11962) `inputs.prometheus` Allow explicit scrape configuration without annotations - [#11729](https://github.com/influxdata/telegraf/pull/11729) `inputs.prometheus` Use system wide proxy settings - [#12329](https://github.com/influxdata/telegraf/pull/12329) `inputs.smart` Add additional SMART metrics that indicate/predict device failure - [#11872](https://github.com/influxdata/telegraf/pull/11872) `inputs.snmp` Convert enum values - [#12187](https://github.com/influxdata/telegraf/pull/12187) `inputs.socket_ listener` Allow to specify message separator for streams - [#12351](https://github.com/influxdata/telegraf/pull/12351) `inputs.sqlserver` Add @@SERVICENAME and SERVERPROPERTY(IsClustered) in measurement sqlserver_server_properties - [#12126](https://github.com/influxdata/telegraf/pull/12126) `inputs.sqlserver` Add data and log used space metrics for Azure SQL DB - [#12292](https://github.com/influxdata/telegraf/pull/12292) `inputs.sqlserver` Add metric available_physical_memory_kb in sqlserver_server_properties - [#12319](https://github.com/influxdata/telegraf/pull/12319) `inputs.sqlserver` Introduce timeout for query execution - [#12147](https://github.com/influxdata/telegraf/pull/12147) `inputs.system` Collect unique user count logged in - [#12281](https://github.com/influxdata/telegraf/pull/12281) `inputs.tail` Add option to preserve newlines for multiline data - [#11762](https://github.com/influxdata/telegraf/pull/11762) `inputs.tail` Allow handling of quoted strings spanning multiple lines - [#12170](https://github.com/influxdata/telegraf/pull/12170) `inputs.tomcat` Add source tag - [#11874](https://github.com/influxdata/telegraf/pull/11874) `outputs.azure_data_explorer` Add support for streaming ingestion for ADX output plugin - [#11991](https://github.com/influxdata/telegraf/pull/11991) `outputs.event_hubs` Expose max message size batch option - [#11950](https://github.com/influxdata/telegraf/pull/11950) `outputs.graylog` Implement optional connection retries - [#11385](https://github.com/influxdata/telegraf/pull/11385) `outputs.timestream` Support ingesting multi-measures - [#12232](https://github.com/influxdata/telegraf/pull/12232) `parsers.binary` Handle hex-encoded inputs - [#12008](https://github.com/influxdata/telegraf/pull/12008) `parsers.csv` Add option for overwrite tags - [#12247](https://github.com/influxdata/telegraf/pull/12247) `parsers.csv` Support null delimiters - [#12320](https://github.com/influxdata/telegraf/pull/12320) `parsers.grok` Add option to allow multiline messages - [#11933](https://github.com/influxdata/telegraf/pull/11933) `parsers.xpath` Add option to skip (header) bytes - [#11999](https://github.com/influxdata/telegraf/pull/11999) `parsers.xpath` Allow to specify byte-array fields to encode in HEX - [#11552](https://github.com/influxdata/telegraf/pull/11552) `parsers` Add binary parser - [#12260](https://github.com/influxdata/telegraf/pull/12260) `serializers.json` Support serializing JSON nested in string fields ### Bugfixes - [#12113](https://github.com/influxdata/telegraf/pull/12113) `agent` Run processors in config order - [#12127](https://github.com/influxdata/telegraf/pull/12127) `agent` Watch for changes in configuration files in config directories - [#12062](https://github.com/influxdata/telegraf/pull/12062) `inputs.conntrack` Skip gather tests if conntrack kernel module is not loaded - [#12295](https://github.com/influxdata/telegraf/pull/12295) `inputs.filecount` Revert library version - [#12284](https://github.com/influxdata/telegraf/pull/12284) `inputs.kube_inventory` Change default token path, use in-cluster config by default - [#12235](https://github.com/influxdata/telegraf/pull/12235) `inputs.modbus` Add workaround to read field in separate requests - [#12339](https://github.com/influxdata/telegraf/pull/12339) `inputs.modbus` Fix Windows COM-port path - [#12367](https://github.com/influxdata/telegraf/pull/12367) `inputs.modbus` Fix default value of transmission mode - [#12330](https://github.com/influxdata/telegraf/pull/12330) `inputs.mongodb` Fix connection leak triggered by config reload - [#12101](https://github.com/influxdata/telegraf/pull/12101) `inputs.opcua` Add support for opcua datetime values - [#12376](https://github.com/influxdata/telegraf/pull/12376) `inputs.opcua` Parse full range of status codes with uint32 - [#12278](https://github.com/influxdata/telegraf/pull/12278) `inputs.promethes` Respect selectors when scraping pods - [#12323](https://github.com/influxdata/telegraf/pull/12323) `inputs.sql` Cast measurement_column to string - [#12259](https://github.com/influxdata/telegraf/pull/12259) `inputs.vsphere` Eliminated duplicate samples - [#12307](https://github.com/influxdata/telegraf/pull/12307) `inputs.zfs` Unbreak datasets stats gathering in case listsnaps is enabled on a zfs pool - [#12291](https://github.com/influxdata/telegraf/pull/12291) `outputs.azure_data_explorer` Update test call to NewSerializer - [#12357](https://github.com/influxdata/telegraf/pull/12357) `processors.parser` Handle empty metric names correctly ### Dependency Updates - [#12334](https://github.com/influxdata/telegraf/pull/12334) `deps` Update github.com/aliyun/alibaba-cloud-sdk-go from 1.61.1836 to 1.62.77 - [#12355](https://github.com/influxdata/telegraf/pull/12355) `deps` Update github.com/gosnmp/gosnmp from 1.34.0 to 1.35.0 - [#12372](https://github.com/influxdata/telegraf/pull/12372) `deps` Update OpenTelemetry from 0.2.30 to 0.2.33 ## v1.24.4 [2022-11-29] ### Bugfixes - [#12177](https://github.com/influxdata/telegraf/pull/12177) `inputs.cloudwatch` Correctly handle multiple namespaces - [#12294](https://github.com/influxdata/telegraf/pull/12294) `inputs.directory_monitor` Close input file before removal - [#12140](https://github.com/influxdata/telegraf/pull/12140) `inputs.gnmi` Handle decimal_val as per gnmi v0.8.0 - [#12275](https://github.com/influxdata/telegraf/pull/12275) `inputs.gnmi` Do not provide empty prefix for subscription request - [#12258](https://github.com/influxdata/telegraf/pull/12258) `inputs.gnmi` Fix empty name for Sonic devices - [#12171](https://github.com/influxdata/telegraf/pull/12171) `inputs.ping` Avoid -x/-X on FreeBSD 13 and newer with ping6 - [#12282](https://github.com/influxdata/telegraf/pull/12282) `inputs.prometheus` Correctly default to port 9102 - [#12229](https://github.com/influxdata/telegraf/pull/12229) `input.redis_sentinel` Fix sentinel and replica stats gathering - [#12280](https://github.com/influxdata/telegraf/pull/12280) `inputs.socket_listener` Ensure closed connection - [#12201](https://github.com/influxdata/telegraf/pull/12201) `output.datadog` Log response in case of non 2XX response from API - [#12160](https://github.com/influxdata/telegraf/pull/12160) `outputs.prometheus` Expire metrics correctly during adds - [#12156](https://github.com/influxdata/telegraf/pull/12156) `outputs.yandex_cloud_monitoring` Catch int64 values ### Dependency Updates - [#12132](https://github.com/influxdata/telegraf/pull/12132) `deps` Bump github.com/aliyun/alibaba-cloud-sdk-go from 1.61.1818 to 1.61.1836 - [#12197](https://github.com/influxdata/telegraf/pull/12197) `deps` Bump github.com/prometheus/client_golang from 1.13.0 to 1.13.1 - [#12196](https://github.com/influxdata/telegraf/pull/12196) `deps` Bump github.com/aws/aws-sdk-go-v2/service/timestreamwrite from 1.13.12 to 1.14.5 - [#12198](https://github.com/influxdata/telegraf/pull/12198) `deps` Bump github.com/aws/aws-sdk-go-v2/feature/ec2/imds from 1.12.17 to 1.12.19 - [#12236](https://github.com/influxdata/telegraf/pull/12236) `deps` Bump github.com/gofrs/uuid from v4.3.0 to v4.3.1 - [#12237](https://github.com/influxdata/telegraf/pull/12237) `deps` Bump github.com/aws/aws-sdk-go-v2/service/sts from 1.16.19 to 1.17.2 - [#12238](https://github.com/influxdata/telegraf/pull/12238) `deps` Bump github.com/urfave/cli/v2 from 2.16.3 to 2.23.5 - [#12239](https://github.com/influxdata/telegraf/pull/12239) `deps` Bump github.com/Azure/azure-event-hubs-go/v3 from 3.3.18 to 3.3.20 - [#12248](https://github.com/influxdata/telegraf/pull/12248) `deps` Bump github.com/showwin/speedtest-go from 1.1.5 to 1.2.1 - [#12269](https://github.com/influxdata/telegraf/pull/12269) `deps` Bump github.com/aws/aws-sdk-go-v2/credentials from 1.12.21 to 1.13.2 - [#12268](https://github.com/influxdata/telegraf/pull/12268) `deps` Bump github.com/yuin/goldmark from 1.5.2 to 1.5.3 - [#12267](https://github.com/influxdata/telegraf/pull/12267) `deps` Bump cloud.google.com/go/pubsub from 1.25.1 to 1.26.0 - [#12266](https://github.com/influxdata/telegraf/pull/12266) `deps` Bump go.mongodb.org/mongo-driver from 1.10.2 to 1.11.0 ## v1.24.3 [2022-11-02] ### Bugfixes - [#12063](https://github.com/influxdata/telegraf/pull/12063) Restore warning on unused config option(s) - [#11941](https://github.com/influxdata/telegraf/pull/11941) Setting `enable_tls` has incorrect default value - [#12093](https://github.com/influxdata/telegraf/pull/12093) Update systemd unit description - [#12077](https://github.com/influxdata/telegraf/pull/12077) `agent` Fix panic due to tickers slice was off-by-one in size - [#12076](https://github.com/influxdata/telegraf/pull/12076) `config` Set default parser - [#12124](https://github.com/influxdata/telegraf/pull/12124) `inputs.directory_monitor` Allow cross filesystem directories - [#12064](https://github.com/influxdata/telegraf/pull/12064) `inputs.kafka` Switch to sarama's new consumer group rebalance strategy setting - [#12038](https://github.com/influxdata/telegraf/pull/12038) `inputs.modbus` Add slave id to failing connection - [#12109](https://github.com/influxdata/telegraf/pull/12109) `inputs.modbus` Handle field-measurement definitions correctly on duplicate field check - [#11912](https://github.com/influxdata/telegraf/pull/11912) `inputs.modbus` Improve duplicate field checks - [#11993](https://github.com/influxdata/telegraf/pull/11993) `inputs.opcua` Add metric tags to node - [#11997](https://github.com/influxdata/telegraf/pull/11997) `inputs.syslog` Print error when no error or message given - [#12023](https://github.com/influxdata/telegraf/pull/12023) `inputs.zookeeper` Add the ability to parse floats as floats - [#11926](https://github.com/influxdata/telegraf/pull/11926) `parsers.json_v2` Remove BOM before parsing - [#12116](https://github.com/influxdata/telegraf/pull/12116) `processors.parser` Keep name of original metric if parser doesn't return one - [#12081](https://github.com/influxdata/telegraf/pull/12081) `processors` Correctly setup processors - [#12016](https://github.com/influxdata/telegraf/pull/12016) `regression` Fixes problem with metrics not exposed by plugins. - [#12024](https://github.com/influxdata/telegraf/pull/12024) `serializers.splunkmetric` Provide option to remove event metric tag ### Features - [#12075](https://github.com/influxdata/telegraf/pull/12075) `tools` Allow to markdown includes for sections ### Dependency Updates - [#11886](https://github.com/influxdata/telegraf/pull/11886) `deps` Bump github.com/snowflakedb/gosnowflake from 1.6.2 to 1.6.13 - [#11928](https://github.com/influxdata/telegraf/pull/11928) `deps` Bump github.com/sensu/sensu-go/api/core/v2 from 2.14.0 to 2.15.0 - [#11935](https://github.com/influxdata/telegraf/pull/11935) `deps` Bump github.com/gofrs/uuid from 4.2.0& to 4.3.0 - [#11894](https://github.com/influxdata/telegraf/pull/11894) `deps` Bump github.com/hashicorp/consul/api from 1.14.0 to 1.15.2 - [#11936](https://github.com/influxdata/telegraf/pull/11936) `deps` Bump github.com/aws/aws-sdk-go-v2/credentials from 1.12.5 to 1.12.21 - [#11972](https://github.com/influxdata/telegraf/pull/11972) `deps` Bump github.com/aws/aws-sdk-go-v2/service/cloudwatch - [#11979](https://github.com/influxdata/telegraf/pull/11979) `deps` Bump github.com/aws/aws-sdk-go-v2/config - [#11938](https://github.com/influxdata/telegraf/pull/11938) `deps` Bump k8s.io/apimachinery from 0.25.1 to 0.25.2 - [#12001](https://github.com/influxdata/telegraf/pull/12001) `deps` Bump k8s.io/api from 0.25.0 to 0.25.2 - [#12029](https://github.com/influxdata/telegraf/pull/12029) `deps` Bump k8s.io/api from 0.25.2 to 0.25.3 - [#12030](https://github.com/influxdata/telegraf/pull/12030) `deps` Bump modernc.org/sqlite from 1.17.3 to 1.19.2 - [#12034](https://github.com/influxdata/telegraf/pull/12034) `deps` Bump github.com/signalfx/golib/v3 from 3.3.45 to 3.3.46 - [#12035](https://github.com/influxdata/telegraf/pull/12035) `deps` Bump github.com/yuin/goldmark from 1.4.13 to 1.5.2 - [#11937](https://github.com/influxdata/telegraf/pull/11937) `deps` Bump cloud.google.com/go/bigquery from 1.40.0 to 1.42.0 - [#12037](https://github.com/influxdata/telegraf/pull/12037) `deps` Bump github.com/aws/aws-sdk-go-v2/service/kinesis - [#12036](https://github.com/influxdata/telegraf/pull/12036) `deps` Bump github.com/aliyun/alibaba-cloud-sdk-go - [#11980](https://github.com/influxdata/telegraf/pull/11980) `deps` Bump github.com/Shopify/sarama from 1.36.0 to 1.37.2 - [#12039](https://github.com/influxdata/telegraf/pull/12039) `deps` Bump testcontainers-go from 0.13.0 to 0.14.0 and address breaking change - [#12090](https://github.com/influxdata/telegraf/pull/12090) `deps` Bump modernc.org/libc from v1.20.3 to v1.21.2 - [#12098](https://github.com/influxdata/telegraf/pull/12098) `deps` Bump github.com/aws/aws-sdk-go-v2/service/dynamodb - [#12096](https://github.com/influxdata/telegraf/pull/12096) `deps` Bump google.golang.org/api from 0.95.0 to 0.100.0 - [#12095](https://github.com/influxdata/telegraf/pull/12095) `deps` Bump github.com/gopcua/opcua from 0.3.3 to 0.3.7 - [#12097](https://github.com/influxdata/telegraf/pull/12097) `deps` Bump github.com/prometheus/client_model from 0.2.0 to 0.3.0 - [#12135](https://github.com/influxdata/telegraf/pull/12135) `deps` Bump cloud.google.com/go/monitoring from 1.5.0 to 1.7.0 - [#12134](https://github.com/influxdata/telegraf/pull/12134) `deps` Bump github.com/nats-io/nats-server/v2 from 2.8.4 to 2.9.4 ## v1.24.2 [2022-10-03] ### Bugfixes - [#11806](https://github.com/influxdata/telegraf/pull/11806) Re-allow specifying the influx parser type - [#11896](https://github.com/influxdata/telegraf/pull/11896) `cli` Support old style of filtering sample configs - [#11519](https://github.com/influxdata/telegraf/pull/11519) `common.kafka` Enable TLS in Kafka plugins without custom config - [#11866](https://github.com/influxdata/telegraf/pull/11866) `inputs.influxdb_listener` Error on invalid precision - [#11877](https://github.com/influxdata/telegraf/pull/11877) `inputs.internet_speed` Rename enable_file_download to match upstream intent - [#11849](https://github.com/influxdata/telegraf/pull/11849) `inputs.mongodb` Start plugin correctly - [#10696](https://github.com/influxdata/telegraf/pull/10696) `inputs.mqtt_consumer` Rework connection and message tracking - [#11696](https://github.com/influxdata/telegraf/pull/11696) `internal.ethtool` Avoid internal name conflict with aws - [#11875](https://github.com/influxdata/telegraf/pull/11875) `parser.xpath` Handle floating-point times correctly ### Dependency Updates - [#11861](https://github.com/influxdata/telegraf/pull/11861) Update dependencies for OpenBSD support - [#11840](https://github.com/influxdata/telegraf/pull/11840) `deps` Bump k8s.io/apimachinery from 0.25.0 to 0.25.1 - [#11844](https://github.com/influxdata/telegraf/pull/11844) `deps` Bump github.com/aerospike/aerospike-client-go/v5 from 5.9.0 to 5.10.0 - [#11839](https://github.com/influxdata/telegraf/pull/11839) `deps` Bump github.com/nats-io/nats.go from 1.16.0 to 1.17.0 - [#11836](https://github.com/influxdata/telegraf/pull/11836) `deps` Replace go-ping by pro-bing - [#11887](https://github.com/influxdata/telegraf/pull/11887) `deps` Bump go.mongodb.org/mongo-driver from 1.10.1 to 1.10.2 - [#11890](https://github.com/influxdata/telegraf/pull/11890) `deps` Bump github.com/aws/smithy-go from 1.13.2 to 1.13.3 - [#11891](https://github.com/influxdata/telegraf/pull/11891) `deps` Bump github.com/rabbitmq/amqp091-go from 1.4.0 to 1.5.0 - [#11893](https://github.com/influxdata/telegraf/pull/11893) `deps` Bump github.com/docker/distribution from v2.7.1 to v2.8.1 ## v1.24.1 [2022-09-19] ### Bugfixes - [#11787](https://github.com/influxdata/telegraf/pull/11787) Clear error message when provided config is not a text file - [#11835](https://github.com/influxdata/telegraf/pull/11835) Enable global confirmation for installing mingw - [#10797](https://github.com/influxdata/telegraf/pull/10797) `inputs.ceph` Modernize Ceph input plugin metrics - [#11785](https://github.com/influxdata/telegraf/pull/11785) `inputs.modbus` Do not fail if a single slave reports errors - [#11827](https://github.com/influxdata/telegraf/pull/11827) `inputs.ntpq` Handle pools with "-" when - [#11825](https://github.com/influxdata/telegraf/pull/11825) `parsers.csv` Remove direct checks for the parser type - [#11781](https://github.com/influxdata/telegraf/pull/11781) `parsers.xpath` Add array index when expanding names. - [#11815](https://github.com/influxdata/telegraf/pull/11815) `parsers` Memory leak for plugins using ParserFunc. - [#11826](https://github.com/influxdata/telegraf/pull/11826) `parsers` Unwrap parser and remove some special handling ### Features - [#11228](https://github.com/influxdata/telegraf/pull/11228) `processors.parser` Add option to parse tags ### Dependency Updates - [#11788](https://github.com/influxdata/telegraf/pull/11788) `deps` Bump cloud.google.com/go/pubsub from 1.24.0 to 1.25.1 - [#11794](https://github.com/influxdata/telegraf/pull/11794) `deps` Bump github.com/urfave/cli/v2 from 2.14.1 to 2.16.3 - [#11789](https://github.com/influxdata/telegraf/pull/11789) `deps` Bump github.com/aws/aws-sdk-go-v2/service/ec2 - [#11799](https://github.com/influxdata/telegraf/pull/11799) `deps` Bump github.com/wavefronthq/wavefront-sdk-go - [#11796](https://github.com/influxdata/telegraf/pull/11796) `deps` Bump cloud.google.com/go/bigquery from 1.33.0 to 1.40.0 ## v1.24.0 [2022-09-12] ### Bugfixes - [#11779](https://github.com/influxdata/telegraf/pull/11779) Add missing entry json_transformation to missingTomlField - [#11288](https://github.com/influxdata/telegraf/pull/11288) Add reset-mode flag for CSV parser - [#11512](https://github.com/influxdata/telegraf/pull/11512) Add version number to MacOS packages - [#11489](https://github.com/influxdata/telegraf/pull/11489) Backport sync sample.conf and README.md files - [#11777](https://github.com/influxdata/telegraf/pull/11777) Do not error out for parsing errors in datadog mode - [#11521](https://github.com/influxdata/telegraf/pull/11521) Make docs & go.mod cleanup post-redis merge - [#11656](https://github.com/influxdata/telegraf/pull/11656) Refactor telegraf version - [#11563](https://github.com/influxdata/telegraf/pull/11563) Remove shell execution for license-checker - [#11755](https://github.com/influxdata/telegraf/pull/11755) Sort labels in prometheusremotewrite serializer - [#11440](https://github.com/influxdata/telegraf/pull/11440) Update prometheus parser to be a new style parser plugin - [#11456](https://github.com/influxdata/telegraf/pull/11456) Update prometheusremotewrite parser to be a new style parser plugin - [#10570](https://github.com/influxdata/telegraf/pull/10570) Use os-agnositc systemd detection, remove sysv in RPM packaging - [#11615](https://github.com/influxdata/telegraf/pull/11615) `agent` Add flushBatch method - [#11692](https://github.com/influxdata/telegraf/pull/11692) `inputs.jolokia2` Add optional origin header - [#11629](https://github.com/influxdata/telegraf/pull/11629) `inputs.mongodb` Add an option to bypass connection errors on start - [#11723](https://github.com/influxdata/telegraf/pull/11723) `inputs.opcua` Assign node id correctly - [#11673](https://github.com/influxdata/telegraf/pull/11673) `inputs.prometheus` Plugin run outside k8s cluster error - [#11701](https://github.com/influxdata/telegraf/pull/11701) `inputs.sqlserver` Fixing wrong filtering for sqlAzureMIRequests and sqlAzureDBRequests - [#11471](https://github.com/influxdata/telegraf/pull/11471) `inputs.upsd` Move to new sample.conf style - [#11613](https://github.com/influxdata/telegraf/pull/11613) `inputs.x509` Multiple sources with non-overlapping DNS entries - [#11767](https://github.com/influxdata/telegraf/pull/11767) `outputs.execd` Fixing the execd behavior to not throw error when partially unserializable metrics are written - [#11560](https://github.com/influxdata/telegraf/pull/11560) `outputs.wavefront` Update wavefront sdk and use non-deprecated APIs ### Features - [#11307](https://github.com/influxdata/telegraf/pull/11307) `serializers.csv` Add CSV serializer - [#11054](https://github.com/influxdata/telegraf/pull/11054) `outputs.redistimeseries` Add RedisTimeSeries plugin - [#7995](https://github.com/influxdata/telegraf/pull/7995) `outputs.stomp` Add Stomp (Active MQ) output plugin - [#11300](https://github.com/influxdata/telegraf/pull/11300) Add default appType as config option to groundwork output - [#11398](https://github.com/influxdata/telegraf/pull/11398) Add license checking tool - [#11399](https://github.com/influxdata/telegraf/pull/11399) Add proxy support for outputs/cloudwatch - [#11516](https://github.com/influxdata/telegraf/pull/11516) Added metrics for member and replica-set avg health of MongoDB - [#11233](https://github.com/influxdata/telegraf/pull/11233) Adding aws metric streams input plugin - [#9717](https://github.com/influxdata/telegraf/pull/9717) Allow collecting node-level metrics for Couchbase buckets - [#11282](https://github.com/influxdata/telegraf/pull/11282) Make the command config a subcommand - [#11367](https://github.com/influxdata/telegraf/pull/11367) Migrate collectd parser to new style - [#11371](https://github.com/influxdata/telegraf/pull/11371) Migrate dropwizard parser to new style - [#11381](https://github.com/influxdata/telegraf/pull/11381) Migrate form_urlencoded parser to new style - [#11405](https://github.com/influxdata/telegraf/pull/11405) Migrate graphite parser to new style - [#11408](https://github.com/influxdata/telegraf/pull/11408) Migrate grok to new parser style - [#11432](https://github.com/influxdata/telegraf/pull/11432) Migrate influx and influx_upstream parsers to new style - [#11226](https://github.com/influxdata/telegraf/pull/11226) Migrate json parser to new style - [#11343](https://github.com/influxdata/telegraf/pull/11343) Migrate json_v2 parser to new style - [#11366](https://github.com/influxdata/telegraf/pull/11366) Migrate logfmt parser to new style - [#11402](https://github.com/influxdata/telegraf/pull/11402) Migrate nagios parser to new style - [#11700](https://github.com/influxdata/telegraf/pull/11700) Migrate to urfave/cli - [#11407](https://github.com/influxdata/telegraf/pull/11407) Migrate value parser to new style - [#11374](https://github.com/influxdata/telegraf/pull/11374) Migrate wavefront parser to new style - [#11373](https://github.com/influxdata/telegraf/pull/11373) `inputs.nats_consumer` Add simple support for jetstream subjects - [#9015](https://github.com/influxdata/telegraf/pull/9015) `inputs.supervisor` Add Supervisord input plugin - [#11524](https://github.com/influxdata/telegraf/pull/11524) Tool to build custom Telegraf builds - [#11493](https://github.com/influxdata/telegraf/pull/11493) `common.tls` Implement minimum TLS version for clients - [#11619](https://github.com/influxdata/telegraf/pull/11619) `external` Add nsdp external plugin - [#9890](https://github.com/influxdata/telegraf/pull/9890) `inputs.upsd` Add upsd implementation - [#11458](https://github.com/influxdata/telegraf/pull/11458) `inputs.cisco_telemetry_mdt` Add GRPC Keepalive/timeout config options - [#11784](https://github.com/influxdata/telegraf/pull/11784) `inputs.directory_monitor` Support paths for files_to_ignore and files_to_monitor - [#11773](https://github.com/influxdata/telegraf/pull/11773) `inputs.directory_monitor` Traverse sub-directories - [#11220](https://github.com/influxdata/telegraf/pull/11220) `inputs.kafka_consumer` Option to set default fetch message bytes - [#8988](https://github.com/influxdata/telegraf/pull/8988) `inputs.linux_cpu` Add plugin to collect CPU metrics on Linux - [#9185](https://github.com/influxdata/telegraf/pull/9185) `inputs.logstash` Record number of failures - [#11469](https://github.com/influxdata/telegraf/pull/11469) `inputs.modbus` Error out on requests with no fields defined - [#11426](https://github.com/influxdata/telegraf/pull/11426) `inputs.mqtt_consumer` Add incoming mqtt message size calculation - [#10874](https://github.com/influxdata/telegraf/pull/10874) `inputs.nginx_plus_api` Gather limit_reqs metrics - [#11593](https://github.com/influxdata/telegraf/pull/11593) `inputs.ntpq` Add option to specify command flags - [#11592](https://github.com/influxdata/telegraf/pull/11592) `inputs.ntpq` Add possibility to query remote servers - [#11594](https://github.com/influxdata/telegraf/pull/11594) `inputs.ntpq` Allow to specify `reach` output format - [#11572](https://github.com/influxdata/telegraf/pull/11572) `inputs.openstack` Add allow_reauth config option for openstack client - [#11391](https://github.com/influxdata/telegraf/pull/11391) `inputs.smart` Collect SSD endurance information where available in smartctl - [#11688](https://github.com/influxdata/telegraf/pull/11688) `inputs.sqlserver` Add db name to io stats for MI - [#11709](https://github.com/influxdata/telegraf/pull/11709) `inputs.sqlserver` Improved filtering for active requests - [#11518](https://github.com/influxdata/telegraf/pull/11518) `inputs.statsd` Add median timing calculation to statsd input plugin - [#9440](https://github.com/influxdata/telegraf/pull/9440) `inputs.syslog` Log remote host as source tag - [#11271](https://github.com/influxdata/telegraf/pull/11271) `inputs.x509_cert` Add smtp protocol - [#11284](https://github.com/influxdata/telegraf/pull/11284) `output.mqtt` Add support for MQTT protocol version 5 - [#11649](https://github.com/influxdata/telegraf/pull/11649) `outputs.amqp` Add proxy support - [#11439](https://github.com/influxdata/telegraf/pull/11439) `outputs.graphite` Retry connecting to servers with failed send attempts - [#11443](https://github.com/influxdata/telegraf/pull/11443) `outputs.groundwork` Improve metric parsing to extend output - [#11557](https://github.com/influxdata/telegraf/pull/11557) `outputs.iotdb` Add new output plugin to support Apache IoTDB - [#11672](https://github.com/influxdata/telegraf/pull/11672) `outputs.postgresql` Add Postgresql output - [#11529](https://github.com/influxdata/telegraf/pull/11529) `outputs.redistimeseries` Add integration test - [#11551](https://github.com/influxdata/telegraf/pull/11551) `outputs.sql` Add settings for go sql.DB settings - [#11251](https://github.com/influxdata/telegraf/pull/11251) `parsers.json` Allow JSONata based transformations in JSON serializer - [#11558](https://github.com/influxdata/telegraf/pull/11558) `parsers.xpath` Add support for returning underlying data-types - [#11306](https://github.com/influxdata/telegraf/pull/11306) `processors.starlark` Add starlark benchmark for tag-concatenation - [#11475](https://github.com/influxdata/telegraf/pull/11475) `inputs.rabbitmq` Add support for head_message_timestamp metric - [#9333](https://github.com/influxdata/telegraf/pull/9333) `inputs.redis` Add Redis 6 ACL auth support - [#11690](https://github.com/influxdata/telegraf/pull/11690) `serializers.prometheus` Provide option to reduce payload size by removing HELP from payload - [#9319](https://github.com/influxdata/telegraf/pull/9319) `proxy.x509_cert` Add proxy support ### Dependency Updates - [#11671](https://github.com/influxdata/telegraf/pull/11671) Update github.com/jackc/pgx/v4 from 4.16.1 to 4.17.0 - [#11669](https://github.com/influxdata/telegraf/pull/11669) Update github.com/Azure/go-autorest/autorest from 0.11.24 to 0.11.28 - [#11670](https://github.com/influxdata/telegraf/pull/11670) Update github.com/aws/aws-sdk-go-v2/service/ec2 from 1.51.2 to 1.52.1 - [#11675](https://github.com/influxdata/telegraf/pull/11675) Update github.com/urfave/cli/v2 from 2.3.0 to 2.11.2 - [#11679](https://github.com/influxdata/telegraf/pull/11679) Update github.com/aws/aws-sdk-go-v2/service/timestreamwrite from 1.13.6 to 1.13.12 - [#11695](https://github.com/influxdata/telegraf/pull/11695) Update github.com/aliyun/alibaba-cloud-sdk-go from 1.61.1695 to 1.61.1727 - [#11676](https://github.com/influxdata/telegraf/pull/11676) Update go.mongodb.org/mongo-driver from 1.9.1 to 1.10.1 - [#11710](https://github.com/influxdata/telegraf/pull/11710) Update github.com/wavefronthq/wavefront-sdk-go from 0.10.1 to 0.10.2 - [#11711](https://github.com/influxdata/telegraf/pull/11711) Update github.com/aws/aws-sdk-go-v2/service/sts from 1.16.7 to 1.16.13 - [#11716](https://github.com/influxdata/telegraf/pull/11716) Update github.com/aerospike/aerospike-client-go/v5 from 5.7.0 to 5.9.0 - [#11717](https://github.com/influxdata/telegraf/pull/11717) Update github.com/hashicorp/consul/api from 1.13.1 to 1.14.0 - [#11721](https://github.com/influxdata/telegraf/pull/11721) Update github.com/tidwall/gjson from 1.14.1 to 1.14.3 - [#11699](https://github.com/influxdata/telegraf/pull/11699) Update github.com/rabbitmq/amqp091-go from 1.3.4 to 1.4.0 - [#11743](https://github.com/influxdata/telegraf/pull/11743) Update github.com/aws/aws-sdk-go-v2/service/dynamodb from 1.15.10 to 1.16.1 - [#11744](https://github.com/influxdata/telegraf/pull/11744) Update github.com/gophercloud/gophercloud from 0.25.0 to 1.0.0 - [#11745](https://github.com/influxdata/telegraf/pull/11745) Update k8s.io/client-go from 0.24.3 to 0.25.0 - [#11747](https://github.com/influxdata/telegraf/pull/11747) Update github.com/aws/aws-sdk-go-v2/feature/ec2/imds from 1.12.11 to 1.12.13 - [#11763](https://github.com/influxdata/telegraf/pull/11763) Update github.com/urfave/cli/v2 from 2.11.2 to 2.14.1 - [#11764](https://github.com/influxdata/telegraf/pull/11764) Update gonum.org/v1/gonum from 0.11.0 to 0.12.0 - [#11770](https://github.com/influxdata/telegraf/pull/11770) Update github.com/Azure/azure-kusto-go from 0.7.0 to 0.8.0 - [#11746](https://github.com/influxdata/telegraf/pull/11746) Update google.golang.org/grpc from 1.48.0 to 1.49.0 ### BREAKING CHANGES - [#11493](https://github.com/influxdata/telegraf/pull/11493) `common.tls` Set default minimum TLS version to v1.2 for security reasons on both server and client connections. This is a change from the previous defaults (TLS v1.0) on the server configuration and might break clients relying on older TLS versions. You can manually revert to older versions on a per-plugin basis using the `tls_min_version` option in the plugins required ## v1.23.4 [2022-08-16] ### Bugfixes - [#11647](https://github.com/influxdata/telegraf/pull/11647) Bump github.com/lxc/lxd to be able to run tests - [#11664](https://github.com/influxdata/telegraf/pull/11664) Sync sql output and input build constraints to handle loong64 in go1.19. - [#10841](https://github.com/influxdata/telegraf/pull/10841) Updating credentials file to not use endpoint_url parameter - [#10851](https://github.com/influxdata/telegraf/pull/10851) `inputs.cloudwatch` Customizable batch size when querying - [#11577](https://github.com/influxdata/telegraf/pull/11577) `inputs.kube_inventory` Send file location to enable token auto-refresh - [#11578](https://github.com/influxdata/telegraf/pull/11578) `inputs.kubernetes` Refresh token from file at each read - [#11635](https://github.com/influxdata/telegraf/pull/11635) `inputs.mongodb` Update version check for newer versions - [#11539](https://github.com/influxdata/telegraf/pull/11539) `inputs.opcua` Return an error with mismatched types - [#11548](https://github.com/influxdata/telegraf/pull/11548) `inputs.sqlserver` Set lower deadlock priority - [#11556](https://github.com/influxdata/telegraf/pull/11556) `inputs.stackdriver` Handle when no buckets available - [#11576](https://github.com/influxdata/telegraf/pull/11576) `inputs` Linter issues - [#11595](https://github.com/influxdata/telegraf/pull/11595) `outputs` Linter issues - [#11607](https://github.com/influxdata/telegraf/pull/11607) `parsers` Linter issues ### Features - [#11622](https://github.com/influxdata/telegraf/pull/11622) Add coralogix dialect to opentelemetry ### Dependency Updates - [#11412](https://github.com/influxdata/telegraf/pull/11412) `deps` Bump github.com/testcontainers/testcontainers-go from 0.12.0 to 0.13.0 - [#11565](https://github.com/influxdata/telegraf/pull/11565) `deps` Bump github.com/apache/thrift from 0.15.0 to 0.16.0 - [#11567](https://github.com/influxdata/telegraf/pull/11567) `deps` Bump github.com/aws/aws-sdk-go-v2/service/ec2 from 1.46.0 to 1.51.0 - [#11494](https://github.com/influxdata/telegraf/pull/11494) `deps` Update all go.opentelemetry.io dependencies - [#11569](https://github.com/influxdata/telegraf/pull/11569) `deps` Bump github.com/go-ldap/ldap/v3 from 3.4.1 to 3.4.4 - [#11574](https://github.com/influxdata/telegraf/pull/11574) `deps` Bump github.com/karrick/godirwalk from 1.16.1 to 1.17.0 - [#11568](https://github.com/influxdata/telegraf/pull/11568) `deps` Bump github.com/vmware/govmomi from 0.28.0 to 0.29.0 - [#11347](https://github.com/influxdata/telegraf/pull/11347) `deps` Bump github.com/eclipse/paho.mqtt.golang from 1.3.5 to 1.4.1 - [#11580](https://github.com/influxdata/telegraf/pull/11580) `deps` Bump github.com/shirou/gopsutil/v3 from 3.22.4 to 3.22.7 - [#11582](https://github.com/influxdata/telegraf/pull/11582) `deps` Bump github.com/aws/aws-sdk-go-v2/service/cloudwatchlogs - [#11583](https://github.com/influxdata/telegraf/pull/11583) `deps` Bump github.com/Azure/go-autorest/autorest/adal - [#11581](https://github.com/influxdata/telegraf/pull/11581) `deps` Bump github.com/pion/dtls/v2 from 2.0.13 to 2.1.5 - [#11590](https://github.com/influxdata/telegraf/pull/11590) `deps` Bump github.com/Azure/azure-event-hubs-go/v3 - [#11586](https://github.com/influxdata/telegraf/pull/11586) `deps` Bump github.com/aws/aws-sdk-go-v2/service/cloudwatch - [#11585](https://github.com/influxdata/telegraf/pull/11585) `deps` Bump github.com/aws/aws-sdk-go-v2/service/kinesis - [#11584](https://github.com/influxdata/telegraf/pull/11584) `deps` Bump github.com/aws/aws-sdk-go-v2/service/dynamodb - [#11598](https://github.com/influxdata/telegraf/pull/11598) `deps` Bump github.com/signalfx/golib/v3 from 3.3.43 to 3.3.45 - [#11605](https://github.com/influxdata/telegraf/pull/11605) `deps` Update github.com/BurntSushi/toml from 0.4.1 to 1.2.0 - [#11604](https://github.com/influxdata/telegraf/pull/11604) `deps` Update cloud.google.com/go/pubsub from 1.23.0 to 1.24.0 - [#11602](https://github.com/influxdata/telegraf/pull/11602) `deps` Update k8s.io/apimachinery from 0.24.2 to 0.24.3 - [#11603](https://github.com/influxdata/telegraf/pull/11603) `deps` Update github.com/Shopify/sarama from 1.34.1 to 1.35.0 - [#11616](https://github.com/influxdata/telegraf/pull/11616) `deps` Bump github.com/sirupsen/logrus from 1.8.1 to 1.9.0 - [#11636](https://github.com/influxdata/telegraf/pull/11636) `deps` Bump github.com/emicklei/go-restful from v2.9.5+incompatible to v3.8.0 - [#11641](https://github.com/influxdata/telegraf/pull/11641) `deps` Bump github.com/hashicorp/consul/api from 1.12.0 to 1.13.1 - [#11640](https://github.com/influxdata/telegraf/pull/11640) `deps` Bump github.com/prometheus/client_golang from 1.12.2 to 1.13.0 - [#11643](https://github.com/influxdata/telegraf/pull/11643) `deps` Bump google.golang.org/api from 0.85.0 to 0.91.0 - [#11644](https://github.com/influxdata/telegraf/pull/11644) `deps` Bump github.com/antchfx/xmlquery from 1.3.9 to 1.3.12 - [#11651](https://github.com/influxdata/telegraf/pull/11651) `deps` Bump github.com/aws/aws-sdk-go-v2/service/ec2 - [#11652](https://github.com/influxdata/telegraf/pull/11652) `deps` Bump github.com/aws/aws-sdk-go-v2/feature/ec2/imds - [#11653](https://github.com/influxdata/telegraf/pull/11653) `deps` Bump github.com/aws/aws-sdk-go-v2/service/cloudwatchlogs ## v1.23.3 [2022-07-25] ### Bugfixes - [#11481](https://github.com/influxdata/telegraf/pull/11481) `inputs.openstack` Use v3 volume library - [#11482](https://github.com/influxdata/telegraf/pull/11482) `common.cookie` Use reader over readcloser, regen cookie-jar at reauth - [#11527](https://github.com/influxdata/telegraf/pull/11527) `inputs.mqtt_consumer` Topic parsing error when topic having prefix '/' - [#11534](https://github.com/influxdata/telegraf/pull/11534) `inputs.snmp_trap` Nil map panic when use snmp_trap with netsnmp translator - [#11522](https://github.com/influxdata/telegraf/pull/11522) `inputs.sqlserver` Set lower deadlock priority on queries - [#11486](https://github.com/influxdata/telegraf/pull/11486) `parsers.prometheus` Histogram infinity bucket must be always present ### Dependency Updates - [#11461](https://github.com/influxdata/telegraf/pull/11461) Bump github.com/antchfx/jsonquery from 1.1.5 to 1.2.0 ## v1.23.2 [2022-07-11] ### Bugfixes - [#11460](https://github.com/influxdata/telegraf/pull/11460) Deprecation warnings for non-deprecated packages - [#11472](https://github.com/influxdata/telegraf/pull/11472) `common.http` Allow 201 for cookies, update header docs - [#11448](https://github.com/influxdata/telegraf/pull/11448) `inputs.sqlserver` Use bigint for backupsize in sqlserver - [#11011](https://github.com/influxdata/telegraf/pull/11011) `inputs.gnmi` Refactor tag-only subs for complex keys - [#10331](https://github.com/influxdata/telegraf/pull/10331) `inputs.snmp` Snmp UseUnconnectedUDPSocket when using udp ### Dependency Updates - [#11438](https://github.com/influxdata/telegraf/pull/11438) Bump github.com/docker/docker from 20.10.14 to 20.10.17 ## v1.23.1 [2022-07-05] ### Bugfixes - [#11335](https://github.com/influxdata/telegraf/pull/11335) Bring back old xpath section names - [#9315](https://github.com/influxdata/telegraf/pull/9315) `inputs.rabbitmq` Don't require listeners to be present in overview - [#11280](https://github.com/influxdata/telegraf/pull/11280) Filter out views in mongodb lookup - [#11311](https://github.com/influxdata/telegraf/pull/11311) Fix race condition in configuration and prevent concurrent map writes to c.UnusedFields - [#11397](https://github.com/influxdata/telegraf/pull/11397) Resolve jolokia2 panic on null response - [#11276](https://github.com/influxdata/telegraf/pull/11276) Restore sample configurations broken during initial migration - [#11413](https://github.com/influxdata/telegraf/pull/11413) Sync back sample.confs for inputs.couchbase and outputs.groundwork. ### Dependency Updates - [#11295](https://github.com/influxdata/telegraf/pull/11295) Bump cloud.google.com/go/monitoring from 1.2.0 to 1.5.0 - [#11297](https://github.com/influxdata/telegraf/pull/11297) Bump github.com/aws/aws-sdk-go-v2/credentials from 1.12.2 to 1.12.5 - [#11318](https://github.com/influxdata/telegraf/pull/11318) Bump google.golang.org/grpc from 1.46.2 to 1.47.0 - [#11223](https://github.com/influxdata/telegraf/pull/11223) Bump k8s.io/client-go from 0.23.3 to 0.24.1 - [#11299](https://github.com/influxdata/telegraf/pull/11299) Bump github.com/go-logfmt/logfmt from 0.5.0 to 0.5.1 - [#11328](https://github.com/influxdata/telegraf/pull/11328) Bump github.com/aws/aws-sdk-go-v2/service/dynamodb from 1.15.3 to 1.15.7 - [#11320](https://github.com/influxdata/telegraf/pull/11320) Bump go.mongodb.org/mongo-driver from 1.9.0 to 1.9.1 - [#11321](https://github.com/influxdata/telegraf/pull/11321) Bump github.com/gophercloud/gophercloud from 0.24.0 to 0.25.0 - [#11338](https://github.com/influxdata/telegraf/pull/11338) Bump google.golang.org/api from 0.74.0 to 0.84.0 - [#11340](https://github.com/influxdata/telegraf/pull/11340) Bump github.com/fatih/color from 1.10.0 to 1.13.0 - [#11322](https://github.com/influxdata/telegraf/pull/11322) Bump github.com/aws/aws-sdk-go-v2/service/timestreamwrite from 1.3.2 to 1.13.6 - [#11319](https://github.com/influxdata/telegraf/pull/11319) Bump github.com/Shopify/sarama from 1.32.0 to 1.34.1 - [#11342](https://github.com/influxdata/telegraf/pull/11342) Bump github.com/dynatrace-oss/dynatrace-metric-utils-go from 0.3.0 to 0.5.0 - [#11339](https://github.com/influxdata/telegraf/pull/11339) Bump github.com/nats-io/nats.go from 1.15.0 to 1.16.0 - [#11349](https://github.com/influxdata/telegraf/pull/11349) Bump cloud.google.com/go/pubsub from 1.18.0 to 1.22.2 - [#11369](https://github.com/influxdata/telegraf/pull/11369) Bump go.opentelemetry.io/collector/pdata from 0.52.0 to 0.54.0 - [#11346](https://github.com/influxdata/telegraf/pull/11346) Bump github.com/jackc/pgx/v4 from 4.15.0 to 4.16.1 - [#11379](https://github.com/influxdata/telegraf/pull/11379) Bump cloud.google.com/go/bigquery from 1.8.0 to 1.33.0 - [#11378](https://github.com/influxdata/telegraf/pull/11378) Bump github.com/Azure/azure-kusto-go from 0.6.0 to 0.7.0 - [#11394](https://github.com/influxdata/telegraf/pull/11394) Bump cloud.google.com/go/pubsub from 1.22.2 to 1.23.0 - [#11380](https://github.com/influxdata/telegraf/pull/11380) Bump github.com/aws/aws-sdk-go-v2/service/kinesis from 1.13.0 to 1.15.7 - [#11382](https://github.com/influxdata/telegraf/pull/11382) Bump github.com/aws/aws-sdk-go-v2/service/ec2 from 1.1.0 to 1.46.0 - [#11395](https://github.com/influxdata/telegraf/pull/11395) Bump github.com/golang-jwt/jwt/v4 from 4.4.1 to 4.4.2 - [#11396](https://github.com/influxdata/telegraf/pull/11396) Bump github.com/vmware/govmomi from 0.27.3 to 0.28.0 - [#11415](https://github.com/influxdata/telegraf/pull/11415) Bump github.com/aws/aws-sdk-go-v2/service/cloudwatchlogs from 1.15.4 to 1.15.8 - [#11416](https://github.com/influxdata/telegraf/pull/11416) Bump github.com/influxdata/influxdb-observability/otel2influx from 0.2.21 to 0.2.22 - [#11434](https://github.com/influxdata/telegraf/pull/11434) Bump k8s.io/api from 0.24.1 to 0.24.2 - [#11437](https://github.com/influxdata/telegraf/pull/11437) Bump github.com/prometheus/client_golang from 1.12.1 to 1.12.2 ## v1.23.0 [2022-06-13] ### Bugfixes - [#11272](https://github.com/influxdata/telegraf/pull/11272) Add missing build constraints for sqlite - [#11253](https://github.com/influxdata/telegraf/pull/11253) Always build README-embedder for host-architecture - [#11140](https://github.com/influxdata/telegraf/pull/11140) Avoid calling sadc with invalid 0 interval - [#11093](https://github.com/influxdata/telegraf/pull/11093) Check net.Listen() error in tests - [#11181](https://github.com/influxdata/telegraf/pull/11181) Convert slab plugin to new sample.conf. - [#10979](https://github.com/influxdata/telegraf/pull/10979) Datadog count metrics - [#11044](https://github.com/influxdata/telegraf/pull/11044) Deprecate useless database config option - [#11150](https://github.com/influxdata/telegraf/pull/11150) Doc interval setting for internet speed plugin - [#11120](https://github.com/influxdata/telegraf/pull/11120) Elasticsearch output float handling test - [#11151](https://github.com/influxdata/telegraf/pull/11151) Improve slab testing without sudo. - [#10995](https://github.com/influxdata/telegraf/pull/10995) Log instance name in skip warnings - [#11069](https://github.com/influxdata/telegraf/pull/11069) Output erroneous namespace and continue instead of error out - [#11237](https://github.com/influxdata/telegraf/pull/11237) Re-add event to splunk serializer - [#11143](https://github.com/influxdata/telegraf/pull/11143) Redis plugin goroutine leak triggered by auto reload config mechanism - [#11082](https://github.com/influxdata/telegraf/pull/11082) Remove any content type from prometheus accept header - [#11261](https://github.com/influxdata/telegraf/pull/11261) Remove full access permissions - [#11179](https://github.com/influxdata/telegraf/pull/11179) Search services file in /etc/services and fall back to /usr/etc/services - [#11217](https://github.com/influxdata/telegraf/pull/11217) Update sample.conf for prometheus - [#11241](https://github.com/influxdata/telegraf/pull/11241) Upgrade xpath and fix code - [#11083](https://github.com/influxdata/telegraf/pull/11083) Use readers over closers in http input - [#11149](https://github.com/influxdata/telegraf/pull/11149) `inputs.burrow` Move Dialer to variable and run `make fmt` - [#10812](https://github.com/influxdata/telegraf/pull/10812) `outputs.sql` Table existence cache ### Features - [#10880](https://github.com/influxdata/telegraf/pull/10880) Add ANSI color filter for tail input plugin - [#11188](https://github.com/influxdata/telegraf/pull/11188) Add constant 'algorithm' to the mock plugin - [#11159](https://github.com/influxdata/telegraf/pull/11159) Add external huebridge input plugin - [#11076](https://github.com/influxdata/telegraf/pull/11076) Add field key option to set event partition key - [#10818](https://github.com/influxdata/telegraf/pull/10818) Add fritzbox as external plugin - [#11037](https://github.com/influxdata/telegraf/pull/11037) Add influx semantic commits checker, checks only last commit. - [#11039](https://github.com/influxdata/telegraf/pull/11039) Add mount option filtering to disk plugin - [#11075](https://github.com/influxdata/telegraf/pull/11075) Add slab metrics input plugin - [#11056](https://github.com/influxdata/telegraf/pull/11056) Allow other fluentd metrics apart from retry_count, buffer_queu… - [#10918](https://github.com/influxdata/telegraf/pull/10918) Artifactory Webhook Receiver - [#11000](https://github.com/influxdata/telegraf/pull/11000) Create and push nightly docker images to quay.io - [#11102](https://github.com/influxdata/telegraf/pull/11102) Do not error if no nodes found for current config with xpath parser - [#10886](https://github.com/influxdata/telegraf/pull/10886) Generate the plugins sample config - [#11084](https://github.com/influxdata/telegraf/pull/11084) Google API Auth - [#10607](https://github.com/influxdata/telegraf/pull/10607) In Lustre input plugin, support collecting per-client stats. - [#10912](https://github.com/influxdata/telegraf/pull/10912) Migrate aggregator plugins to new sample config format - [#10924](https://github.com/influxdata/telegraf/pull/10924) Migrate input plugins to new sample config format (A-L) - [#10926](https://github.com/influxdata/telegraf/pull/10926) Migrate input plugins to new sample config format (M-Z) - [#10910](https://github.com/influxdata/telegraf/pull/10910) Migrate output plugins to new sample config format - [#10913](https://github.com/influxdata/telegraf/pull/10913) Migrate processor plugins to new sample config format - [#11218](https://github.com/influxdata/telegraf/pull/11218) Migrate xpath parser to new style - [#10885](https://github.com/influxdata/telegraf/pull/10885) Update etc/telegraf.conf and etc/telegraf_windows.conf - [#6948](https://github.com/influxdata/telegraf/pull/6948) `inputs.burrow` fill more http transport parameters - [#11141](https://github.com/influxdata/telegraf/pull/11141) `inputs.cpu` Add tags with core id or physical id to cpus - [#7896](https://github.com/influxdata/telegraf/pull/7896) `inputs.mongodb` Add metrics about files currently open and currently active data handles - [#10448](https://github.com/influxdata/telegraf/pull/10448) `inputs.nginx_plus_api` Gather slab metrics - [#11216](https://github.com/influxdata/telegraf/pull/11216) `inputs.sqlserver` Update query store and latch performance counters - [#10574](https://github.com/influxdata/telegraf/pull/10574) `inputs.vsphere` Collect resource pools metrics and add resource pool tag in VM metrics - [#11035](https://github.com/influxdata/telegraf/pull/11035) `inputs.intel_powerstat` Add Max Turbo Frequency and introduce improvements - [#11254](https://github.com/influxdata/telegraf/pull/11254) `inputs.intel_powerstat` Add uncore frequency metrics - [#10954](https://github.com/influxdata/telegraf/pull/10954) `outputs.http` Support configuration of `MaxIdleConns` and `MaxIdleConnsPerHost` - [#10853](https://github.com/influxdata/telegraf/pull/10853) `outputs.elasticsearch` Add healthcheck timeout ### Dependency Updates - [#10970](https://github.com/influxdata/telegraf/pull/10970) Update github.com/wavefronthq/wavefront-sdk-go from 0.9.10 to 0.9.11 - [#11166](https://github.com/influxdata/telegraf/pull/11166) Update github.com/aws/aws-sdk-go-v2/config from 1.15.3 to 1.15.7 - [#11021](https://github.com/influxdata/telegraf/pull/11021) Update github.com/sensu/sensu-go/api/core/v2 from 2.13.0 to 2.14.0 - [#11088](https://github.com/influxdata/telegraf/pull/11088) Update go.opentelemetry.io/otel/metric from 0.28.0 to 0.30.0 - [#11221](https://github.com/influxdata/telegraf/pull/11221) Update github.com/nats-io/nats-server/v2 from 2.7.4 to 2.8.4 - [#11191](https://github.com/influxdata/telegraf/pull/11191) Update golangci-lint from v1.45.2 to v1.46.2 - [#11107](https://github.com/influxdata/telegraf/pull/11107) Update gopsutil from v3.22.3 to v3.22.4 to allow for HOST_PROC_MOUNTINFO. - [#11242](https://github.com/influxdata/telegraf/pull/11242) Update moby/ipvs dependency from v1.0.1 to v1.0.2 - [#11260](https://github.com/influxdata/telegraf/pull/11260) Update modernc.org/sqlite from v1.10.8 to v1.17.3 - [#11266](https://github.com/influxdata/telegraf/pull/11266) Update github.com/containerd/containerd from v1.5.11 to v1.5.13 - [#11264](https://github.com/influxdata/telegraf/pull/11264) Update github.com/tidwall/gjson from 1.10.2 to 1.14.1 ## v1.22.4 [2022-05-16] ### Bugfixes - [#11045](https://github.com/influxdata/telegraf/pull/11045) `inputs.couchbase` Do not assume metrics will all be of the same length - [#11043](https://github.com/influxdata/telegraf/pull/11043) `inputs.statsd` Do not error when closing statsd network connection - [#11030](https://github.com/influxdata/telegraf/pull/11030) `outputs.azure_monitor` Re-init azure monitor http client on context deadline error - [#11078](https://github.com/influxdata/telegraf/pull/11078) `outputs.wavefront` If no "host" tag is provided do not add "telegraf.host" tag - [#11042](https://github.com/influxdata/telegraf/pull/11042) Have telegraf service wait for network up in systemd packaging ### Dependency Updates - [#10722](https://github.com/influxdata/telegraf/pull/10722) `inputs.internet_speed` Update github.com/showwin/speedtest-go from 1.1.4 to 1.1.5 - [#11085](https://github.com/influxdata/telegraf/pull/11085) Update OpenTelemetry plugins to v0.51.0 ## v1.22.3 [2022-04-28] ### Bugfixes - [#10961](https://github.com/influxdata/telegraf/pull/10961) Update Go to 1.18.1 - [#10976](https://github.com/influxdata/telegraf/pull/10976) `inputs.influxdb_listener` Remove duplicate influxdb listener writes with upstream parser - [#11024](https://github.com/influxdata/telegraf/pull/11024) `inputs.gnmi` Use external xpath parser for gnmi - [#10925](https://github.com/influxdata/telegraf/pull/10925) `inputs.system` Reduce log level in disk plugin back to original level ## v1.22.2 [2022-04-25] ### Bugfixes - [#11008](https://github.com/influxdata/telegraf/pull/11008) `inputs.gnmi` Add mutex to gnmi lookup map - [#11010](https://github.com/influxdata/telegraf/pull/11010) `inputs.gnmi` Use sprint to cast to strings in gnmi - [#11001](https://github.com/influxdata/telegraf/pull/11001) `inputs.consul_agent` Use correct auth token with consul_agent - [#10486](https://github.com/influxdata/telegraf/pull/10486) `inputs.mysql` Add mariadb_dialect to address the MariaDB differences in INNODB_METRICS - [#10923](https://github.com/influxdata/telegraf/pull/10923) `inputs.smart` Correctly parse various numeric forms - [#10850](https://github.com/influxdata/telegraf/pull/10850) `inputs.aliyuncms` Ensure aliyuncms metrics accept array, fix discovery - [#10930](https://github.com/influxdata/telegraf/pull/10930) `inputs.aerospike` Statistics query bug - [#10947](https://github.com/influxdata/telegraf/pull/10947) `inputs.cisco_telemetry_mdt` Align the default value for msg size - [#10959](https://github.com/influxdata/telegraf/pull/10959) `inputs.cisco_telemetry_mdt` Remove overly verbose info message from cisco mdt - [#10958](https://github.com/influxdata/telegraf/pull/10958) `outputs.influxdb_v2` Improve influxdb_v2 error message - [#10932](https://github.com/influxdata/telegraf/pull/10932) `inputs.prometheus` Moved from watcher to informer - [#11013](https://github.com/influxdata/telegraf/pull/11013) Also allow 0 outputs when using test-wait parameter - [#11015](https://github.com/influxdata/telegraf/pull/11015) Allow Makefile to work on Windows ### Dependency Updates - [#10966](https://github.com/influxdata/telegraf/pull/10966) Update github.com/Azure/azure-kusto-go from 0.5.0 to 0.60 - [#10963](https://github.com/influxdata/telegraf/pull/10963) Update opentelemetry from v0.2.10 to v0.2.17 - [#10984](https://github.com/influxdata/telegraf/pull/10984) Update go.opentelemetry.io/collector/pdata from v0.48.0 to v0.49.0 - [#10998](https://github.com/influxdata/telegraf/pull/10998) Update github.com/aws/aws-sdk-go-v2/config from 1.13.1 to 1.15.3 - [#10997](https://github.com/influxdata/telegraf/pull/10997) Update github.com/aws/aws-sdk-go-v2/service/cloudwatchlogs - [#10975](https://github.com/influxdata/telegraf/pull/10975) Update github.com/aws/aws-sdk-go-v2/credentials from 1.8.0 to 1.11.2 - [#10981](https://github.com/influxdata/telegraf/pull/10981) Update github.com/containerd/containerd from v1.5.9 to v1.5.11 - [#10973](https://github.com/influxdata/telegraf/pull/10973) Update github.com/miekg/dns from 1.1.46 to 1.1.48 - [#10974](https://github.com/influxdata/telegraf/pull/10974) Update github.com/gopcua/opcua from v0.3.1 to v0.3.3 - [#10972](https://github.com/influxdata/telegraf/pull/10972) Update github.com/aws/aws-sdk-go-v2/service/dynamodb - [#10773](https://github.com/influxdata/telegraf/pull/10773) Update github.com/xdg/scram from 1.0.3 to 1.0.5 - [#10971](https://github.com/influxdata/telegraf/pull/10971) Update go.mongodb.org/mongo-driver from 1.8.3 to 1.9.0 - [#10940](https://github.com/influxdata/telegraf/pull/10940) Update starlark 7a1108eaa012->d1966c6b9fcd ## v1.22.1 [2022-04-06] ### Bugfixes - [#10937](https://github.com/influxdata/telegraf/pull/10937) Update gonum.org/v1/gonum from 0.9.3 to 0.11.0 - [#10906](https://github.com/influxdata/telegraf/pull/10906) Update github.com/golang-jwt/jwt/v4 from 4.2.0 to 4.4.1 - [#10931](https://github.com/influxdata/telegraf/pull/10931) Update gopsutil and associated dependencies for improved OpenBSD support - [#10553](https://github.com/influxdata/telegraf/pull/10553) `inputs.sqlserver` Fix inconsistencies in sql*Requests queries - [#10883](https://github.com/influxdata/telegraf/pull/10883) `agent` Fix default value for logfile rotation interval - [#10871](https://github.com/influxdata/telegraf/pull/10871) `inputs.zfs` Fix redundant zfs pool tag - [#10903](https://github.com/influxdata/telegraf/pull/10903) `inputs.vsphere` Update vsphere info message to debug - [#10866](https://github.com/influxdata/telegraf/pull/10866) `outputs.azure_monitor` Include body in error message - [#10830](https://github.com/influxdata/telegraf/pull/10830) `processors.topk` Clarify the k and fields topk params - [#10858](https://github.com/influxdata/telegraf/pull/10858) `outputs.http` Switch HTTP 100 test case values - [#10859](https://github.com/influxdata/telegraf/pull/10859) `inputs.intel_pmu` Fix slow running intel-pmu test - [#10860](https://github.com/influxdata/telegraf/pull/10860) `inputs.cloud_pubsub` Skip longer/integration tests on -short mode - [#10861](https://github.com/influxdata/telegraf/pull/10861) `inputs.cloud_pubsub_push` Reduce timeouts and sleeps ### New External Plugins - [#10462](https://github.com/influxdata/telegraf/pull/10462) `external.psi` Add psi plugin ## v1.22.0 ### Influx Line Protocol Parser There is an option to use a faster, more memory-efficient implementation of the Influx Line Protocol parser. ### SNMP Translator This version introduces an agent setting to select the method of translating SNMP objects. The agent setting "snmp_translator" can be "netsnmp" which translates by calling external programs snmptranslate and snmptable, or "gosmi" which translates using the built-in gosmi library. Before version 1.21.0, Telegraf only used the netsnmp method. Versions 1.21.0 through 1.21.4 only used the gosmi method. Since the translation method is now configurable and "netsnmp" is the default, users who wish to continue using "gosmi" must add `snmp_translator = "gosmi"` in the agent section of their config file. See [#10802](https://github.com/influxdata/telegraf/pull/10802). ### New Input Plugins - [#3649](https://github.com/influxdata/telegraf/pull/3649) `inputs.socketstat` Add socketstat input plugin - [#9697](https://github.com/influxdata/telegraf/pull/9697) `inputs.xtremio` Add xtremio input - [#9782](https://github.com/influxdata/telegraf/pull/9782) `inputs.mock` Add mock input plugin - [#10042](https://github.com/influxdata/telegraf/pull/10042) `inputs.redis_sentinel` Add redis sentinel input plugin - [#10106](https://github.com/influxdata/telegraf/pull/10106) `inputs.nomad` Add nomad input plugin - [#10198](https://github.com/influxdata/telegraf/pull/10198) `inputs.vault` Add vault input plugin - [#10258](https://github.com/influxdata/telegraf/pull/10258) `inputs.consul_agent` Add consul agent input plugin - [#10763](https://github.com/influxdata/telegraf/pull/10763) `inputs.hugepages` Add hugepages input plugin ### New Processor Plugins - [#10057](https://github.com/influxdata/telegraf/pull/10057) `processors.noise` Add noise processor plugin ### Features - [#9332](https://github.com/influxdata/telegraf/pull/9332) `agent` HTTP basic auth for webhooks - [#10307](https://github.com/influxdata/telegraf/pull/10307) `agent` Improve error logging on plugin initialization - [#10341](https://github.com/influxdata/telegraf/pull/10341) `agent` Check TLSConfig early to catch missing certificates - [#10404](https://github.com/influxdata/telegraf/pull/10404) `agent` Support headers for http plugin with cookie auth - [#10545](https://github.com/influxdata/telegraf/pull/10545) `agent` Add a collection offset implementation - [#10559](https://github.com/influxdata/telegraf/pull/10559) `agent` Add autorestart and restartdelay flags to Windows service - [#10515](https://github.com/influxdata/telegraf/pull/10515) `aggregators.histogram` Add config option to push only updated values - [#10520](https://github.com/influxdata/telegraf/pull/10520) `aggregators.histogram` Add expiration option - [#10137](https://github.com/influxdata/telegraf/pull/10137) `inputs.bond` Add additional stats to bond collector - [#10382](https://github.com/influxdata/telegraf/pull/10382) `inputs.docker` Update docker client API version - [#10575](https://github.com/influxdata/telegraf/pull/10575) `inputs.file` Allow for stateful parser handling - [#7484](https://github.com/influxdata/telegraf/pull/7484) `inputs.gnmi` add dynamic tagging to gnmi plugin - [#10220](https://github.com/influxdata/telegraf/pull/10220) `inputs.graylog` Add timeout setting option - [#10530](https://github.com/influxdata/telegraf/pull/10530) `inputs.internet_speed` Add caching to internet_speed - [#10243](https://github.com/influxdata/telegraf/pull/10243) `inputs.kibana` Add heap_size_limit field - [#10641](https://github.com/influxdata/telegraf/pull/10641) `inputs.memcached` gather additional stats from memcached - [#10642](https://github.com/influxdata/telegraf/pull/10642) `inputs.memcached` Support client TLS origination - [#9279](https://github.com/influxdata/telegraf/pull/9279) `inputs.modbus` Support multiple slaves with gateway - [#10231](https://github.com/influxdata/telegraf/pull/10231) `inputs.modbus` Add per-request tags - [#10625](https://github.com/influxdata/telegraf/pull/10625) `inputs.mongodb` Add FsTotalSize and FsUsedSize fields - [#10787](https://github.com/influxdata/telegraf/pull/10787) `inputs.nfsclient` Add new rtt per op field - [#10705](https://github.com/influxdata/telegraf/pull/10705) `inputs.openweathermap` Add feels_like field - [#9710](https://github.com/influxdata/telegraf/pull/9710) `inputs.postgresql` Add option to disable prepared statements for PostgreSQL - [#10339](https://github.com/influxdata/telegraf/pull/10339) `inputs.snmp_trap` Deprecate unused snmp_trap timeout configuration option - [#9671](https://github.com/influxdata/telegraf/pull/9671) `inputs.sql` Add ClickHouse driver to sql inputs/outputs plugins - [#10466](https://github.com/influxdata/telegraf/pull/10466) `inputs.statsd` Add option to sanitize collected metric names - [#9432](https://github.com/influxdata/telegraf/pull/9432) `inputs.varnish` Create option to reduce potentially high cardinality - [#6501](https://github.com/influxdata/telegraf/pull/6501) `inputs.win_perf_counters` Implemented support for reading raw values, added tests and doc - [#10535](https://github.com/influxdata/telegraf/pull/10535) `inputs.win_perf_counters` Allow errors to be ignored - [#9822](https://github.com/influxdata/telegraf/pull/9822) `inputs.x509_cert` Add exclude_root_certs option to x509_cert plugin - [#9963](https://github.com/influxdata/telegraf/pull/9963) `outputs.datadog` Add the option to use compression - [#10505](https://github.com/influxdata/telegraf/pull/10505) `outputs.elasticsearch` Add elastic pipeline flags - [#10499](https://github.com/influxdata/telegraf/pull/10499) `outputs.groundwork` Process group tags - [#10186](https://github.com/influxdata/telegraf/pull/10186) `outputs.http` Add optional list of non retryable http status codes - [#10202](https://github.com/influxdata/telegraf/pull/10202) `outputs.http` Support AWS managed service for prometheus - [#8192](https://github.com/influxdata/telegraf/pull/8192) `outputs.kafka` Add socks5 proxy support - [#10673](https://github.com/influxdata/telegraf/pull/10673) `outputs.sql` Add unsigned style config option - [#10672](https://github.com/influxdata/telegraf/pull/10672) `outputs.websocket` Add socks5 proxy support - [#10267](https://github.com/influxdata/telegraf/pull/10267) `parsers.csv` Add option to skip errors during parsing - [#10749](https://github.com/influxdata/telegraf/pull/10749) `parsers.influx` Add new influx line protocol parser via feature flag - [#10585](https://github.com/influxdata/telegraf/pull/10585) `parsers.xpath` Add tag batch-processing to XPath parser - [#10316](https://github.com/influxdata/telegraf/pull/10316) `processors.template` Add more functionality to template processor - [#10252](https://github.com/influxdata/telegraf/pull/10252) `serializers.wavefront` Add option to disable Wavefront prefix conversion ### Bugfixes - [#10803](https://github.com/influxdata/telegraf/pull/10803) `agent` Update parsing logic of config.Duration to correctly require time and duration - [#10814](https://github.com/influxdata/telegraf/pull/10814) `agent` Update the precision parameter default value - [#10872](https://github.com/influxdata/telegraf/pull/10872) `agent` Change name of agent snmp translator setting - [#10876](https://github.com/influxdata/telegraf/pull/10876) `inputs.consul_agent` Rename consul_metrics -> consul_agent - [#10711](https://github.com/influxdata/telegraf/pull/10711) `inputs.docker` Keep data type of tasks_desired field consistent - [#10083](https://github.com/influxdata/telegraf/pull/10083) `inputs.http` Add metadata support to CSV parser plugin - [#10701](https://github.com/influxdata/telegraf/pull/10701) `inputs.mdstat` Fix parsing output when when sync is less than 10% - [#10385](https://github.com/influxdata/telegraf/pull/10385) `inputs.modbus` Re-enable OpenBSD modbus support - [#10790](https://github.com/influxdata/telegraf/pull/10790) `inputs.ntpq` Correctly read ntpq long poll output with extra characters - [#10384](https://github.com/influxdata/telegraf/pull/10384) `inputs.opcua` Accept non-standard OPC UA OK status by implementing a configurable workaround - [#10465](https://github.com/influxdata/telegraf/pull/10465) `inputs.opcua` Add additional data to error messages - [#10735](https://github.com/influxdata/telegraf/pull/10735) `inputs.snmp` Log err when loading mibs - [#10748](https://github.com/influxdata/telegraf/pull/10748) `inputs.snmp` Use the correct path when evaluating symlink - [#10802](https://github.com/influxdata/telegraf/pull/10802) `inputs.snmp` Add option to select translator - [#10527](https://github.com/influxdata/telegraf/pull/10527) `inputs.system` Remove verbose logging from disk input plugin - [#10706](https://github.com/influxdata/telegraf/pull/10706) `outputs.influxdb_v2` Include influxdb bucket name in error messages - [#10623](https://github.com/influxdata/telegraf/pull/10623) `outputs.groundwork` Set NextCheckTime to LastCheckTime to avoid GroundWork to invent a value - [#10749](https://github.com/influxdata/telegraf/pull/10749) `parsers.influx` Add new influx line protocol parser via feature flag - [#10777](https://github.com/influxdata/telegraf/pull/10777) `parsers.json_v2` Allow multiple optional objects - [#10799](https://github.com/influxdata/telegraf/pull/10799) `parsers.json_v2` Check if gpath exists and support optional in fields/tags - [#10798](https://github.com/influxdata/telegraf/pull/10798) `parsers.xpath` Correctly handling imports in protocol-buffer definitions - [#10602](https://github.com/influxdata/telegraf/pull/10602) Update github.com/aws/aws-sdk-go-v2/service/sts from 1.7.2 to 1.14.0 - [#10604](https://github.com/influxdata/telegraf/pull/10604) Update github.com/aerospike/aerospike-client-go from 1.27.0 to 5.7.0 - [#10686](https://github.com/influxdata/telegraf/pull/10686) Update github.com/sleepinggenius2/gosmi from v0.4.3 to v0.4.4 - [#10692](https://github.com/influxdata/telegraf/pull/10692) Update github.com/aws/aws-sdk-go-v2/service/dynamodb from 1.5.0 to 1.13.0 - [#10693](https://github.com/influxdata/telegraf/pull/10693) Update github.com/gophercloud/gophercloud from 0.16.0 to 0.24.0 - [#10702](https://github.com/influxdata/telegraf/pull/10702) Update github.com/jackc/pgx/v4 from 4.14.1 to 4.15.0 - [#10704](https://github.com/influxdata/telegraf/pull/10704) Update github.com/sensu/sensu-go/api/core/v2 from 2.12.0 to 2.13.0 - [#10713](https://github.com/influxdata/telegraf/pull/10713) Update k8s.io/api from 0.23.3 to 0.23.4 - [#10714](https://github.com/influxdata/telegraf/pull/10714) Update cloud.google.com/go/pubsub from 1.17.1 to 1.18.0 - [#10715](https://github.com/influxdata/telegraf/pull/10715) Update github.com/newrelic/newrelic-telemetry-sdk-go from 0.5.1 to 0.8.1 - [#10717](https://github.com/influxdata/telegraf/pull/10717) Update github.com/ClickHouse/clickhouse-go from 1.5.1 to 1.5.4 - [#10718](https://github.com/influxdata/telegraf/pull/10718) Update github.com/wavefronthq/wavefront-sdk-go from 0.9.9 to 0.9.10 - [#10719](https://github.com/influxdata/telegraf/pull/10719) Update github.com/aws/aws-sdk-go-v2/service/cloudwatchlogs from 1.12.0 to 1.13.0 - [#10720](https://github.com/influxdata/telegraf/pull/10720) Update github.com/aws/aws-sdk-go-v2/config from 1.8.3 to 1.13.1 - [#10721](https://github.com/influxdata/telegraf/pull/10721) Update github.com/aws/aws-sdk-go-v2/feature/ec2/imds from 1.6.0 to 1.10.0 - [#10728](https://github.com/influxdata/telegraf/pull/10728) Update github.com/testcontainers/testcontainers-go from 0.11.1 to 0.12.0 - [#10751](https://github.com/influxdata/telegraf/pull/10751) Update github.com/aws/aws-sdk-go-v2/service/dynamodb from 1.13.0 to 1.14.0 - [#10752](https://github.com/influxdata/telegraf/pull/10752) Update github.com/nats-io/nats-server/v2 from 2.7.2 to 2.7.3 - [#10757](https://github.com/influxdata/telegraf/pull/10757) Update github.com/miekg/dns from 1.1.43 to 1.1.46 - [#10758](https://github.com/influxdata/telegraf/pull/10758) Update github.com/shirou/gopsutil/v3 from 3.21.12 to 3.22.2 - [#10759](https://github.com/influxdata/telegraf/pull/10759) Update github.com/aws/aws-sdk-go-v2/feature/ec2/imds from 1.10.0 to 1.11.0 - [#10772](https://github.com/influxdata/telegraf/pull/10772) Update github.com/Shopify/sarama from 1.29.1 to 1.32.0 - [#10807](https://github.com/influxdata/telegraf/pull/10807) Update github.com/nats-io/nats-server/v2 from 2.7.3 to 2.7.4 ## v1.21.4 [2022-02-16] ### Bugfixes - [#10491](https://github.com/influxdata/telegraf/pull/10491) `inputs.docker` Update docker memory usage calculation - [#10636](https://github.com/influxdata/telegraf/pull/10636) `inputs.ecs` Use current time as timestamp - [#10551](https://github.com/influxdata/telegraf/pull/10551) `inputs.snmp` Ensure folders do not get loaded more than once - [#10579](https://github.com/influxdata/telegraf/pull/10579) `inputs.win_perf_counters` Add deprecated warning and version to win_perf_counters option - [#10635](https://github.com/influxdata/telegraf/pull/10635) `outputs.amqp` Check for nil client before closing in amqp - [#10179](https://github.com/influxdata/telegraf/pull/10179) `outputs.azure_data_explorer` Lower RAM usage - [#10513](https://github.com/influxdata/telegraf/pull/10513) `outputs.elasticsearch` Add scheme to fix error in sniffing option - [#10657](https://github.com/influxdata/telegraf/pull/10657) `parsers.json_v2` Fix timestamp change during execution of json_v2 parser - [#10618](https://github.com/influxdata/telegraf/pull/10618) `parsers.json_v2` Fix incorrect handling of json_v2 timestamp_path - [#10468](https://github.com/influxdata/telegraf/pull/10468) `parsers.json_v2` Allow optional paths and handle wrong paths correctly - [#10547](https://github.com/influxdata/telegraf/pull/10547) `serializers.prometheusremotewrite` Use the correct timestamp unit - [#10647](https://github.com/influxdata/telegraf/pull/10647) Update all go.opentelemetry.io from 0.24.0 to 0.27.0 - [#10652](https://github.com/influxdata/telegraf/pull/10652) Update github.com/signalfx/golib/v3 from 3.3.38 to 3.3.43 - [#10653](https://github.com/influxdata/telegraf/pull/10653) Update github.com/aliyun/alibaba-cloud-sdk-go from 1.61.1004 to 1.61.1483 - [#10503](https://github.com/influxdata/telegraf/pull/10503) Update github.com/denisenkom/go-mssqldb from 0.10.0 to 0.12.0 - [#10626](https://github.com/influxdata/telegraf/pull/10626) Update github.com/gopcua/opcua from 0.2.3 to 0.3.1 - [#10638](https://github.com/influxdata/telegraf/pull/10638) Update github.com/nats-io/nats-server/v2 from 2.6.5 to 2.7.2 - [#10589](https://github.com/influxdata/telegraf/pull/10589) Update k8s.io/client-go from 0.22.2 to 0.23.3 - [#10601](https://github.com/influxdata/telegraf/pull/10601) Update github.com/aws/aws-sdk-go-v2/service/kinesis from 1.6.0 to 1.13.0 - [#10588](https://github.com/influxdata/telegraf/pull/10588) Update github.com/benbjohnson/clock from 1.1.0 to 1.3.0 - [#10598](https://github.com/influxdata/telegraf/pull/10598) Update github.com/Azure/azure-kusto-go from 0.5.0 to 0.5.2 - [#10571](https://github.com/influxdata/telegraf/pull/10571) Update github.com/vmware/govmomi from 0.27.2 to 0.27.3 - [#10572](https://github.com/influxdata/telegraf/pull/10572) Update github.com/prometheus/client_golang from 1.11.0 to 1.12.1 - [#10564](https://github.com/influxdata/telegraf/pull/10564) Update go.mongodb.org/mongo-driver from 1.7.3 to 1.8.3 - [#10563](https://github.com/influxdata/telegraf/pull/10563) Update github.com/google/go-cmp from 0.5.6 to 0.5.7 - [#10562](https://github.com/influxdata/telegraf/pull/10562) Update go.opentelemetry.io/collector/model from 0.39.0 to 0.43.2 - [#10538](https://github.com/influxdata/telegraf/pull/10538) Update github.com/multiplay/go-ts3 from 1.0.0 to 1.0.1 - [#10454](https://github.com/influxdata/telegraf/pull/10454) Update cloud.google.com/go/monitoring from 0.2.0 to 1.2.0 - [#10536](https://github.com/influxdata/telegraf/pull/10536) Update github.com/vmware/govmomi from 0.26.0 to 0.27.2 ### New External Plugins - [apt](https://github.com/x70b1/telegraf-apt) - contributed by @x70b1 - [knot](https://github.com/x70b1/telegraf-knot) - contributed by @x70b1 ## v1.21.3 [2022-01-27] ### Bugfixes - [#10430](https://github.com/influxdata/telegraf/pull/10430) `inputs.snmp_trap` Fix translation of partially resolved OIDs - [#10529](https://github.com/influxdata/telegraf/pull/10529) Update deprecation notices - [#10525](https://github.com/influxdata/telegraf/pull/10525) Update grpc module to v1.44.0 - [#10434](https://github.com/influxdata/telegraf/pull/10434) Update google.golang.org/api module from 0.54.0 to 0.65.0 - [#10507](https://github.com/influxdata/telegraf/pull/10507) Update antchfx/xmlquery module from 1.3.6 to 1.3.9 - [#10521](https://github.com/influxdata/telegraf/pull/10521) Update nsqio/go-nsq module from 1.0.8 to 1.1.0 - [#10506](https://github.com/influxdata/telegraf/pull/10506) Update prometheus/common module from 0.31.1 to 0.32.1 - [#10474](https://github.com/influxdata/telegraf/pull/10474) `inputs.ipset` Fix panic when command not found - [#10504](https://github.com/influxdata/telegraf/pull/10504) Update cloud.google.com/go/pubsub module from 1.17.0 to 1.17.1 - [#10432](https://github.com/influxdata/telegraf/pull/10432) Update influxdata/influxdb-observability/influx2otel module from 0.2.8 to 0.2.10 - [#10478](https://github.com/influxdata/telegraf/pull/10478) `inputs.opcua` Remove duplicate fields - [#10473](https://github.com/influxdata/telegraf/pull/10473) `parsers.nagios` Log correct errors when executing commands - [#10463](https://github.com/influxdata/telegraf/pull/10463) `inputs.execd` Add newline in execd for prometheus parsing - [#10451](https://github.com/influxdata/telegraf/pull/10451) Update shirou/gopsutil/v3 module from 3.21.10 to 3.21.12 - [#10453](https://github.com/influxdata/telegraf/pull/10453) Update jackc/pgx/v4 module from 4.6.0 to 4.14.1 - [#10449](https://github.com/influxdata/telegraf/pull/10449) Update Azure/azure-event-hubs-go/v3 module from 3.3.13 to 3.3.17 - [#10450](https://github.com/influxdata/telegraf/pull/10450) Update gosnmp/gosnmp module from 1.33.0 to 1.34.0 - [#10442](https://github.com/influxdata/telegraf/pull/10442) `parsers.wavefront` Add missing setting wavefront_disable_prefix_conversion - [#10435](https://github.com/influxdata/telegraf/pull/10435) Update hashicorp/consul/api module from 1.9.1 to 1.12.0 - [#10436](https://github.com/influxdata/telegraf/pull/10436) Update antchfx/xpath module from 1.1.11 to 1.2.0 - [#10433](https://github.com/influxdata/telegraf/pull/10433) Update antchfx/jsonquery module from 1.1.4 to 1.1.5 - [#10414](https://github.com/influxdata/telegraf/pull/10414) Update prometheus/procfs module from 0.6.0 to 0.7.3 - [#10354](https://github.com/influxdata/telegraf/pull/10354) `inputs.snmp` Fix panic when mibs folder doesn't exist (#10346) - [#10393](https://github.com/influxdata/telegraf/pull/10393) `outputs.syslog` Correctly set ASCII trailer for syslog output - [#10415](https://github.com/influxdata/telegraf/pull/10415) Update aws/aws-sdk-go-v2/service/cloudwatchlogs module from 1.5.2 to 1.12.0 - [#10416](https://github.com/influxdata/telegraf/pull/10416) Update kardianos/service module from 1.0.0 to 1.2.1 - [#10396](https://github.com/influxdata/telegraf/pull/10396) `inputs.http` Allow empty http body - [#10417](https://github.com/influxdata/telegraf/pull/10417) Update couchbase/go-couchbase module from 0.1.0 to 0.1.1 - [#10413](https://github.com/influxdata/telegraf/pull/10413) `parsers.json_v2` Fix timestamp precision when using unix_ns format - [#10418](https://github.com/influxdata/telegraf/pull/10418) Update pion/dtls/v2 module from 2.0.9 to 2.0.13 - [#10402](https://github.com/influxdata/telegraf/pull/10402) Update containerd/containerd module to 1.5.9 - [#8947](https://github.com/influxdata/telegraf/pull/8947) `outputs.timestream` Fix batching logic with write records and introduce concurrent requests - [#10360](https://github.com/influxdata/telegraf/pull/10360) `outputs.amqp` Avoid connection leak when writing error - [#10097](https://github.com/influxdata/telegraf/pull/10097) `outputs.stackdriver` Send correct interval start times for counters ## v1.21.2 [2022-01-05] ### Release Notes Happy New Year! ### Features - Added arm64 MacOS builds - Added riscv64 Linux builds - Numerous changes to CircleCI config to ensure more timely completion and more clear execution flow ### Bugfixes - [#10318](https://github.com/influxdata/telegraf/pull/10318) `inputs.disk` Fix missing storage in containers - [#10324](https://github.com/influxdata/telegraf/pull/10324) `inputs.dpdk` Add note about dpdk and socket availability - [#10296](https://github.com/influxdata/telegraf/pull/10296) `inputs.logparser` Resolve panic in logparser due to missing Log - [#10322](https://github.com/influxdata/telegraf/pull/10322) `inputs.snmp` Ensure module load order to avoid snmp marshal error - [#10321](https://github.com/influxdata/telegraf/pull/10321) `inputs.snmp` Do not require networking during tests - [#10303](https://github.com/influxdata/telegraf/pull/10303) `inputs.snmp` Resolve SNMP panic due to no gosmi module - [#10295](https://github.com/influxdata/telegraf/pull/10295) `inputs.snmp` Grab MIB table columns more accurately - [#10299](https://github.com/influxdata/telegraf/pull/10299) `inputs.snmp` Check index before assignment when floating :: exists to avoid panic - [#10301](https://github.com/influxdata/telegraf/pull/10301) `inputs.snmp` Fix panic if no mibs folder is found - [#10373](https://github.com/influxdata/telegraf/pull/10373) `inputs.snmp_trap` Document deprecation of timeout parameter - [#10377](https://github.com/influxdata/telegraf/pull/10377) `parsers.csv` empty import tzdata for Windows binaries to correctly set timezone - [#10332](https://github.com/influxdata/telegraf/pull/10332) Update github.com/djherbis/times module from v1.2.0 to v1.5.0 - [#10343](https://github.com/influxdata/telegraf/pull/10343) Update github.com/go-ldap/ldap/v3 module from v3.1.0 to v3.4.1 - [#10255](https://github.com/influxdata/telegraf/pull/10255) Update github.com/gwos/tcg/sdk module from v0.0.0-20211130162655-32ad77586ccf to v0.0.0-20211223101342-35fbd1ae683c and improve logging ## v1.21.1 [2021-12-16] ### Bugfixes - [#10288](https://github.com/influxdata/telegraf/pull/10288) Fix panic in parsers due to missing Log for all plugins using SetParserFunc. - [#10288](https://github.com/influxdata/telegraf/pull/10288) Fix panic in parsers due to missing Log for all plugins using SetParserFunc - [#10247](https://github.com/influxdata/telegraf/pull/10247) Update go-sensu module to v2.12.0 - [#10284](https://github.com/influxdata/telegraf/pull/10284) `inputs.openstack` Fix typo in openstack neutron input plugin (newtron) ### Features - [#10239](https://github.com/influxdata/telegraf/pull/10239) Enable Darwin arm64 build - [#10150](https://github.com/influxdata/telegraf/pull/10150) `inputs.smart` Add SMART plugin concurrency configuration option, nvme-cli v1.14+ support and lint fixes. - [#10150](https://github.com/influxdata/telegraf/pull/10150) `inputs.smart` Add SMART plugin concurrency configuration option, nvme-cli v1.14+ support and lint fixes ## v1.21.0 [2021-12-15] ### Release Notes The signing for RPM digest has changed to use sha256 to improve security. Please see the pull request for more details: [#10272](https://github.com/influxdata/telegraf/pull/10272). Thank you to @zak-pawel for lots of linter fixes! ### Bugfixes - [#10268](https://github.com/influxdata/telegraf/pull/10268) `inputs.snmp` Update snmp plugin to respect number of retries configured - [#10225](https://github.com/influxdata/telegraf/pull/10225) `outputs.wavefront` Flush wavefront output sender on error to clean up broken connections - [#9970](https://github.com/influxdata/telegraf/pull/9970) Restart Telegraf service if it is already running and upgraded via RPM - [#10188](https://github.com/influxdata/telegraf/pull/10188) `parsers.xpath` Handle duplicate registration of protocol-buffer files gracefully - [#10132](https://github.com/influxdata/telegraf/pull/10132) `inputs.http_listener_v2` Fix panic on close to check that Telegraf is closing - [#10196](https://github.com/influxdata/telegraf/pull/10196) `outputs.elasticsearch` Implement NaN and inf handling for elasticsearch output - [#10205](https://github.com/influxdata/telegraf/pull/10205) Print loaded plugins and deprecations for once and test flags - [#10214](https://github.com/influxdata/telegraf/pull/10214) `processors.ifname` Eliminate MIB dependency for ifname processor - [#10206](https://github.com/influxdata/telegraf/pull/10206) `inputs.snmp` Optimize locking for SNMP MIBs loading - [#9975](https://github.com/influxdata/telegraf/pull/9975) `inputs.kube_inventory` Set TLS server name config properly - [#10230](https://github.com/influxdata/telegraf/pull/10230) Sudden close of Telegraf caused by OPC UA input plugin - [#9913](https://github.com/influxdata/telegraf/pull/9913) Update eclipse/paho.mqtt.golang module from 1.3.0 to 1.3.5 - [#10221](https://github.com/influxdata/telegraf/pull/10221) `parsers.json_v2` Parser timestamp setting order - [#10209](https://github.com/influxdata/telegraf/pull/10209) `outputs.graylog` Ensure graylog spec fields not prefixed with _ - [#10099](https://github.com/influxdata/telegraf/pull/10099) `inputs.zfs` Pool detection and metrics gathering for ZFS >= 2.1.x - [#10007](https://github.com/influxdata/telegraf/pull/10007) `processors.ifname` Parallelism fix for ifname processor - [#10208](https://github.com/influxdata/telegraf/pull/10208) `inputs.mqtt_consumer` Mqtt topic extracting no longer requires all three fields - [#9616](https://github.com/influxdata/telegraf/pull/9616) Windows Service - graceful shutdown of telegraf - [#10203](https://github.com/influxdata/telegraf/pull/10203) Revert unintended corruption of the Makefile - [#10112](https://github.com/influxdata/telegraf/pull/10112) `inputs.cloudwatch` Cloudwatch metrics collection - [#10178](https://github.com/influxdata/telegraf/pull/10178) `outputs.all` Register bigquery to output plugins - [#10165](https://github.com/influxdata/telegraf/pull/10165) `inputs.sysstat` Sysstat to use unique temp file vs hard-coded - [#10046](https://github.com/influxdata/telegraf/pull/10046) Update nats-sever to support openbsd - [#10091](https://github.com/influxdata/telegraf/pull/10091) `inputs.prometheus` Check error before defer in prometheus k8s - [#10101](https://github.com/influxdata/telegraf/pull/10101) `inputs.win_perf_counters` Add setting to win_perf_counters input to ignore localization - [#10136](https://github.com/influxdata/telegraf/pull/10136) `inputs.snmp_trap` Remove snmptranslate from readme and fix default path - [#10116](https://github.com/influxdata/telegraf/pull/10116) `inputs.statsd` Input plugin statsd parse error - [#10131](https://github.com/influxdata/telegraf/pull/10131) Skip knxlistener when writing the sample config - [#10119](https://github.com/influxdata/telegraf/pull/10119) `inputs.cpu` Update shirou/gopsutil from v2 to v3 - [#10074](https://github.com/influxdata/telegraf/pull/10074) `outputs.graylog` Failing test due to port already in use - [#9865](https://github.com/influxdata/telegraf/pull/9865) `inputs.directory_monitor` Directory monitor input plugin when data format is CSV and csv_skip_rows>0 and csv_header_row_count>=1 - [#9862](https://github.com/influxdata/telegraf/pull/9862) `outputs.graylog` Graylog plugin TLS support and message format - [#9908](https://github.com/influxdata/telegraf/pull/9908) `parsers.json_v2` Remove dead code - [#9881](https://github.com/influxdata/telegraf/pull/9881) `outputs.graylog` Mute graylog UDP/TCP tests by marking them as integration - [#9751](https://github.com/influxdata/telegraf/pull/9751) Update google.golang.org/grpc module from 1.39.1 to 1.40.0 ### Features - [#10200](https://github.com/influxdata/telegraf/pull/10200) `aggregators.deprecations.go` Implement deprecation infrastructure - [#9518](https://github.com/influxdata/telegraf/pull/9518) `inputs.snmp` Snmp to use gosmi - [#10130](https://github.com/influxdata/telegraf/pull/10130) `outputs.influxdb_v2` Add retry to 413 errors with InfluxDB output - [#10144](https://github.com/influxdata/telegraf/pull/10144) `inputs.win_services` Add exclude filter - [#9995](https://github.com/influxdata/telegraf/pull/9995) `inputs.mqtt_consumer` Enable extracting tag values from MQTT topics - [#9419](https://github.com/influxdata/telegraf/pull/9419) `aggregators.all` Add support of aggregator as Starlark script - [#9561](https://github.com/influxdata/telegraf/pull/9561) `processors.regex` Extend regexp processor do allow renaming of measurements, tags and fields - [#8184](https://github.com/influxdata/telegraf/pull/8184) `outputs.http` Add use_batch_format for HTTP output plugin - [#9988](https://github.com/influxdata/telegraf/pull/9988) `inputs.kafka_consumer` Add max_processing_time config to Kafka Consumer input - [#9841](https://github.com/influxdata/telegraf/pull/9841) `inputs.sqlserver` Add additional metrics to support elastic pool (sqlserver plugin) - [#9910](https://github.com/influxdata/telegraf/pull/9910) `common.tls` Filter client certificates by DNS names - [#9942](https://github.com/influxdata/telegraf/pull/9942) `outputs.azure_data_explorer` Add option to skip table creation in azure data explorer output - [#9984](https://github.com/influxdata/telegraf/pull/9984) `processors.ifname` Add more details to logmessages - [#9833](https://github.com/influxdata/telegraf/pull/9833) `common.kafka` Add metadata full to config - [#9876](https://github.com/influxdata/telegraf/pull/9876) Update etc/telegraf.conf and etc/telegraf_windows.conf - [#9256](https://github.com/influxdata/telegraf/pull/9256) `inputs.modbus` Modbus connection settings (serial) - [#9860](https://github.com/influxdata/telegraf/pull/9860) `inputs.directory_monitor` Adds the ability to create and name a tag containing the filename using the directory monitor input plugin - [#9740](https://github.com/influxdata/telegraf/pull/9740) `inputs.prometheus` Add ignore_timestamp option - [#9513](https://github.com/influxdata/telegraf/pull/9513) `processors.starlark` Starlark processor example for processing sparkplug_b messages - [#9449](https://github.com/influxdata/telegraf/pull/9449) `parsers.json_v2` Support defining field/tag tables within an object table - [#9827](https://github.com/influxdata/telegraf/pull/9827) `inputs.elasticsearch_query` Add debug query output to elasticsearch_query - [#9241](https://github.com/influxdata/telegraf/pull/9241) `inputs.snmp` Telegraf to merge tables with different indexes - [#9013](https://github.com/influxdata/telegraf/pull/9013) `inputs.opcua` Allow user to select the source for the metric timestamp. - [#9706](https://github.com/influxdata/telegraf/pull/9706) `inputs.puppetagent` Add measurements from puppet 5 - [#9644](https://github.com/influxdata/telegraf/pull/9644) `outputs.graylog` Add graylog plugin TCP support - [#8229](https://github.com/influxdata/telegraf/pull/8229) `outputs.azure_data_explorer` Add json_timestamp_layout option ### New Input Plugins - [#9724](https://github.com/influxdata/telegraf/pull/9724) Add intel_pmu plugin - [#9771](https://github.com/influxdata/telegraf/pull/9771) Add Linux Volume Manager input plugin - [#9236](https://github.com/influxdata/telegraf/pull/9236) Openstack input plugin ### New Output Plugins - [#9891](https://github.com/influxdata/telegraf/pull/9891) Add new groundwork output plugin - [#9923](https://github.com/influxdata/telegraf/pull/9923) Add mongodb output plugin - [#9346](https://github.com/influxdata/telegraf/pull/9346) Azure Event Hubs output plugin ## v1.20.4 [2021-11-17] ### Release Notes - [#10073](https://github.com/influxdata/telegraf/pull/10073) Update go version from 1.17.2 to 1.17.3 - [#10100](https://github.com/influxdata/telegraf/pull/10100) Update deprecated plugin READMEs to better indicate deprecation Thank you to @zak-pawel for lots of linter fixes! - [#9986](https://github.com/influxdata/telegraf/pull/9986) Linter fixes for plugins/inputs/[h-j]* - [#9999](https://github.com/influxdata/telegraf/pull/9999) Linter fixes for plugins/inputs/[k-l]* - [#10006](https://github.com/influxdata/telegraf/pull/10006) Linter fixes for plugins/inputs/m* - [#10011](https://github.com/influxdata/telegraf/pull/10011) Linter fixes for plugins/inputs/[n-o]* ### Bugfixes - [#10089](https://github.com/influxdata/telegraf/pull/10089) Update BurntSushi/toml from 0.3.1 to 0.4.1 - [#10075](https://github.com/influxdata/telegraf/pull/10075) `inputs.mongodb` Update readme with correct connection URI - [#10076](https://github.com/influxdata/telegraf/pull/10076) Update gosnmp module from 1.32 to 1.33 - [#9966](https://github.com/influxdata/telegraf/pull/9966) `inputs.mysql` Fix type conversion follow-up - [#10068](https://github.com/influxdata/telegraf/pull/10068) `inputs.proxmox` Changed VM ID from string to int - [#10047](https://github.com/influxdata/telegraf/pull/10047) `inputs.modbus` Do not build modbus on openbsd - [#10019](https://github.com/influxdata/telegraf/pull/10019) `inputs.cisco_telemetry_mdt` Move to new protobuf library - [#10001](https://github.com/influxdata/telegraf/pull/10001) `outputs.loki` Add metric name with label "__name" - [#9980](https://github.com/influxdata/telegraf/pull/9980) `inputs.nvidia_smi` Set the default path correctly - [#10010](https://github.com/influxdata/telegraf/pull/10010) Update go.opentelemetry.io/otel from v0.23.0 to v0.24.0 - [#10044](https://github.com/influxdata/telegraf/pull/10044) `inputs.sqlserver` Add elastic pool in supported versions in sqlserver - [#10029](https://github.com/influxdata/telegraf/pull/10029) `inputs.influxdb` Update influxdb input schema docs - [#10026](https://github.com/influxdata/telegraf/pull/10026) `inputs.intel_rdt` Correct timezone handling ## v1.20.3 [2021-10-27] ### Release Notes - [#9873](https://github.com/influxdata/telegraf/pull/9873) Update go to 1.17.2 ### Bugfixes - [#9948](https://github.com/influxdata/telegraf/pull/9948) Update github.com/aws/aws-sdk-go-v2/config module from 1.8.2 to 1.8.3 - [#9997](https://github.com/influxdata/telegraf/pull/9997) `inputs.ipmi_sensor` Redact IPMI password in logs - [#9978](https://github.com/influxdata/telegraf/pull/9978) `inputs.kube_inventory` Do not skip resources with zero s/ns timestamps - [#9998](https://github.com/influxdata/telegraf/pull/9998) Update gjson module to v1.10.2 - [#9973](https://github.com/influxdata/telegraf/pull/9973) `inputs.procstat` Revert and fix tag creation - [#9943](https://github.com/influxdata/telegraf/pull/9943) `inputs.sqlserver` Add sqlserver plugin integration tests - [#9647](https://github.com/influxdata/telegraf/pull/9647) `inputs.cloudwatch` Use the AWS SDK v2 library - [#9954](https://github.com/influxdata/telegraf/pull/9954) `processors.starlark` Starlark pop operation for non-existing keys - [#9956](https://github.com/influxdata/telegraf/pull/9956) `inputs.zfs` Check return code of zfs command for FreeBSD - [#9585](https://github.com/influxdata/telegraf/pull/9585) `inputs.kube_inventory` Fix segfault in ingress, persistentvolumeclaim, statefulset in kube_inventory - [#9901](https://github.com/influxdata/telegraf/pull/9901) `inputs.ethtool` Add normalization of tags for ethtool input plugin - [#9957](https://github.com/influxdata/telegraf/pull/9957) `inputs.internet_speed` Resolve missing latency field - [#9662](https://github.com/influxdata/telegraf/pull/9662) `inputs.prometheus` Decode Prometheus scrape path from Kubernetes labels - [#9933](https://github.com/influxdata/telegraf/pull/9933) `inputs.procstat` Correct conversion of int with specific bit size - [#9940](https://github.com/influxdata/telegraf/pull/9940) `inputs.webhooks` Provide more fields for papertrail event webhook - [#9892](https://github.com/influxdata/telegraf/pull/9892) `inputs.mongodb` Solve compatibility issue for mongodb inputs when using 5.x relicaset - [#9768](https://github.com/influxdata/telegraf/pull/9768) Update github.com/Azure/azure-kusto-go module from 0.3.2 to 0.4.0 - [#9904](https://github.com/influxdata/telegraf/pull/9904) Update github.com/golang-jwt/jwt/v4 module from 4.0.0 to 4.1.0 - [#9921](https://github.com/influxdata/telegraf/pull/9921) Update github.com/apache/thrift module from 0.14.2 to 0.15.0 - [#9403](https://github.com/influxdata/telegraf/pull/9403) `inputs.mysql`Fix inconsistent metric types in mysql - [#9905](https://github.com/influxdata/telegraf/pull/9905) Update github.com/docker/docker module from 20.10.7+incompatible to 20.10.9+incompatible - [#9920](https://github.com/influxdata/telegraf/pull/9920) `inputs.prometheus` Move err check to correct place - [#9869](https://github.com/influxdata/telegraf/pull/9869) Update github.com/prometheus/common module from 0.26.0 to 0.31.1 - [#9866](https://github.com/influxdata/telegraf/pull/9866) Update snowflake database driver module to 1.6.2 - [#9527](https://github.com/influxdata/telegraf/pull/9527) `inputs.intel_rdt` Allow sudo usage - [#9893](https://github.com/influxdata/telegraf/pull/9893) Update github.com/jaegertracing/jaeger module from 1.15.1 to 1.26.0 ### New External Plugins - [IBM DB2](https://github.com/bonitoo-io/telegraf-input-db2) - contributed by @sranka - [Oracle Database](https://github.com/bonitoo-io/telegraf-input-oracle) - contributed by @sranka ## v1.20.2 [2021-10-07] ### Bugfixes - [#9878](https://github.com/influxdata/telegraf/pull/9878) `inputs.cloudwatch` Use new session API - [#9872](https://github.com/influxdata/telegraf/pull/9872) `parsers.json_v2` Duplicate line_protocol when using object and fields - [#9787](https://github.com/influxdata/telegraf/pull/9787) `parsers.influx` Fix memory leak in influx parser - [#9880](https://github.com/influxdata/telegraf/pull/9880) `inputs.stackdriver` Migrate to cloud.google.com/go/monitoring/apiv3/v2 - [#9887](https://github.com/influxdata/telegraf/pull/9887) Fix makefile typo that prevented i386 tar and rpm packages from being built ## v1.20.1 [2021-10-06] ### Bugfixes - [#9776](https://github.com/influxdata/telegraf/pull/9776) Update k8s.io/apimachinery module from 0.21.1 to 0.22.2 - [#9864](https://github.com/influxdata/telegraf/pull/9864) Update containerd module to v1.5.7 - [#9863](https://github.com/influxdata/telegraf/pull/9863) Update consul module to v1.11.0 - [#9846](https://github.com/influxdata/telegraf/pull/9846) `inputs.mongodb` Fix panic due to nil dereference - [#9850](https://github.com/influxdata/telegraf/pull/9850) `inputs.intel_rdt` Prevent timeout when logging - [#9848](https://github.com/influxdata/telegraf/pull/9848) `outputs.loki` Update http_headers setting to match sample config - [#9808](https://github.com/influxdata/telegraf/pull/9808) `inputs.procstat` Add missing tags - [#9803](https://github.com/influxdata/telegraf/pull/9803) `outputs.mqtt` Add keep alive config option and documentation around issue with eclipse/mosquitto version - [#9800](https://github.com/influxdata/telegraf/pull/9800) Fix output buffer never completely flushing - [#9458](https://github.com/influxdata/telegraf/pull/9458) `inputs.couchbase` Fix insecure certificate validation - [#9797](https://github.com/influxdata/telegraf/pull/9797) `inputs.opentelemetry` Fix error returned to OpenTelemetry client - [#9789](https://github.com/influxdata/telegraf/pull/9789) Update github.com/testcontainers/testcontainers-go module from 0.11.0 to 0.11.1 - [#9791](https://github.com/influxdata/telegraf/pull/9791) Update github.com/Azure/go-autorest/autorest/adal module - [#9678](https://github.com/influxdata/telegraf/pull/9678) Update github.com/Azure/go-autorest/autorest/azure/auth module from 0.5.6 to 0.5.8 - [#9769](https://github.com/influxdata/telegraf/pull/9769) Update cloud.google.com/go/pubsub module from 1.15.0 to 1.17.0 - [#9770](https://github.com/influxdata/telegraf/pull/9770) Update github.com/aws/smithy-go module from 1.3.1 to 1.8.0 ### Features - [#9838](https://github.com/influxdata/telegraf/pull/9838) `inputs.elasticsearch_query` Add custom time/date format field ## v1.20.0 [2021-09-17] ### Release Notes - [#9642](https://github.com/influxdata/telegraf/pull/9642) Build with Golang 1.17 ### Bugfixes - [#9700](https://github.com/influxdata/telegraf/pull/9700) Update thrift module to 0.14.2 and zipkin-go-opentracing to 0.4.5 - [#9587](https://github.com/influxdata/telegraf/pull/9587) `outputs.opentelemetry` Use headers config in grpc requests - [#9713](https://github.com/influxdata/telegraf/pull/9713) Update runc module to v1.0.0-rc95 to address CVE-2021-30465 - [#9699](https://github.com/influxdata/telegraf/pull/9699) Migrate dgrijalva/jwt-go to golang-jwt/jwt/v4 - [#9139](https://github.com/influxdata/telegraf/pull/9139) `serializers.prometheus` Update timestamps and expiration time as new data arrives - [#9625](https://github.com/influxdata/telegraf/pull/9625) `outputs.graylog` Output timestamp with fractional seconds - [#9655](https://github.com/influxdata/telegraf/pull/9655) Update cloud.google.com/go/pubsub module from 1.2.0 to 1.15.0 - [#9674](https://github.com/influxdata/telegraf/pull/9674) `inputs.mongodb` Change command based on server version - [#9676](https://github.com/influxdata/telegraf/pull/9676) `outputs.dynatrace` Remove hardcoded int value - [#9619](https://github.com/influxdata/telegraf/pull/9619) `outputs.influxdb_v2` Increase accepted retry-after header values. - [#9652](https://github.com/influxdata/telegraf/pull/9652) Update tinylib/msgp module from 1.1.5 to 1.1.6 - [#9471](https://github.com/influxdata/telegraf/pull/9471) `inputs.sql` Make timeout apply to single query - [#9760](https://github.com/influxdata/telegraf/pull/9760) Update shirou/gopsutil module to 3.21.8 - [#9707](https://github.com/influxdata/telegraf/pull/9707) `inputs.logstash` Add additional logstash output plugin stats - [#9656](https://github.com/influxdata/telegraf/pull/9656) Update miekg/dns module from 1.1.31 to 1.1.43 - [#9750](https://github.com/influxdata/telegraf/pull/9750) Update antchfx/xmlquery module from 1.3.5 to 1.3.6 - [#9757](https://github.com/influxdata/telegraf/pull/9757) `parsers.registry.go` Fix panic for non-existing metric names - [#9677](https://github.com/influxdata/telegraf/pull/9677) Update Azure/azure-event-hubs-go/v3 module from 3.2.0 to 3.3.13 - [#9653](https://github.com/influxdata/telegraf/pull/9653) Update prometheus/client_golang module from 1.7.1 to 1.11.0 - [#9693](https://github.com/influxdata/telegraf/pull/9693) `inputs.cloudwatch` Fix pagination error - [#9727](https://github.com/influxdata/telegraf/pull/9727) `outputs.http` Add error message logging - [#9718](https://github.com/influxdata/telegraf/pull/9718) Update influxdata/influxdb-observability module from 0.2.4 to 0.2.7 - [#9560](https://github.com/influxdata/telegraf/pull/9560) Update gopcua/opcua module - [#9544](https://github.com/influxdata/telegraf/pull/9544) `inputs.couchbase` Fix memory leak - [#9588](https://github.com/influxdata/telegraf/pull/9588) `outputs.opentelemetry` Use attributes setting ### Features - [#9665](https://github.com/influxdata/telegraf/pull/9665) `inputs.systemd_units` feat(plugins/inputs/systemd_units): add pattern support - [#9598](https://github.com/influxdata/telegraf/pull/9598) `outputs.sql` Add bool datatype - [#9386](https://github.com/influxdata/telegraf/pull/9386) `inputs.cloudwatch` Pull metrics from multiple AWS CloudWatch namespaces - [#9411](https://github.com/influxdata/telegraf/pull/9411) `inputs.cloudwatch` Support AWS Web Identity Provider - [#9570](https://github.com/influxdata/telegraf/pull/9570) `inputs.modbus` Add support for RTU over TCP - [#9488](https://github.com/influxdata/telegraf/pull/9488) `inputs.procstat` Support cgroup globs and include systemd unit children - [#9322](https://github.com/influxdata/telegraf/pull/9322) `inputs.suricata` Support alert event type - [#5464](https://github.com/influxdata/telegraf/pull/5464) `inputs.prometheus` Add ability to query Consul Service catalog - [#8641](https://github.com/influxdata/telegraf/pull/8641) `outputs.prometheus_client` Add Landing page - [#9529](https://github.com/influxdata/telegraf/pull/9529) `inputs.http_listener_v2` Allows multiple paths and add path_tag - [#9395](https://github.com/influxdata/telegraf/pull/9395) Add cookie authentication to HTTP input and output plugins - [#8454](https://github.com/influxdata/telegraf/pull/8454) `inputs.syslog` Add RFC3164 support - [#9351](https://github.com/influxdata/telegraf/pull/9351) `inputs.jenkins` Add option to include nodes by name - [#9277](https://github.com/influxdata/telegraf/pull/9277) Add JSON, MessagePack, and Protocol-buffers format support to the XPath parser - [#9343](https://github.com/influxdata/telegraf/pull/9343) `inputs.snmp_trap` Improve MIB lookup performance - [#9342](https://github.com/influxdata/telegraf/pull/9342) `outputs.newrelic` Add option to override metric_url - [#9306](https://github.com/influxdata/telegraf/pull/9306) `inputs.smart` Add power mode status - [#9762](https://github.com/influxdata/telegraf/pull/9762) `inputs.bond` Add count of bonded slaves (for easier alerting) - [#9675](https://github.com/influxdata/telegraf/pull/9675) `outputs.dynatrace` Remove special handling from counters and update dynatrace-oss/dynatrace-metric-utils-go module to 0.3.0 ### New Input Plugins - [#9602](https://github.com/influxdata/telegraf/pull/9602) Add rocm_smi input to monitor AMD GPUs - [#9101](https://github.com/influxdata/telegraf/pull/9101) Add mdstat input to gather from /proc/mdstat collection - [#3536](https://github.com/influxdata/telegraf/pull/3536) Add Elasticsearch query input - [#9623](https://github.com/influxdata/telegraf/pull/9623) Add internet Speed Monitor Input Plugin ### New Output Plugins - [#9228](https://github.com/influxdata/telegraf/pull/9228) Add OpenTelemetry output - [#9426](https://github.com/influxdata/telegraf/pull/9426) Add Azure Data Explorer(ADX) output ## v1.19.3 [2021-08-18] ### Bugfixes - [#9639](https://github.com/influxdata/telegraf/pull/9639) Update sirupsen/logrus module from 1.7.0 to 1.8.1 - [#9638](https://github.com/influxdata/telegraf/pull/9638) Update testcontainers/testcontainers-go module from 0.11.0 to 0.11.1 - [#9637](https://github.com/influxdata/telegraf/pull/9637) Update golang/snappy module from 0.0.3 to 0.0.4 - [#9636](https://github.com/influxdata/telegraf/pull/9636) Update aws/aws-sdk-go-v2 module from 1.3.2 to 1.8.0 - [#9605](https://github.com/influxdata/telegraf/pull/9605) `inputs.prometheus` Fix prometheus kubernetes pod discovery - [#9606](https://github.com/influxdata/telegraf/pull/9606) `inputs.redis` Improve redis commands documentation - [#9566](https://github.com/influxdata/telegraf/pull/9566) `outputs.cratedb` Replace dots in tag keys with underscores - [#9401](https://github.com/influxdata/telegraf/pull/9401) `inputs.clickhouse` Fix panic, improve handling empty result set - [#9583](https://github.com/influxdata/telegraf/pull/9583) `inputs.opcua` Avoid closing session on a closed connection - [#9576](https://github.com/influxdata/telegraf/pull/9576) `processors.aws` Refactor ec2 init for config-api - [#9571](https://github.com/influxdata/telegraf/pull/9571) `outputs.loki` Sort logs by timestamp before writing to Loki - [#9524](https://github.com/influxdata/telegraf/pull/9524) `inputs.opcua` Fix reconnection regression introduced in 1.19.1 - [#9581](https://github.com/influxdata/telegraf/pull/9581) `inputs.kube_inventory` Fix k8s nodes and pods parsing error - [#9577](https://github.com/influxdata/telegraf/pull/9577) Update sensu/go module to v2.9.0 - [#9554](https://github.com/influxdata/telegraf/pull/9554) `inputs.postgresql` Normalize unix socket path - [#9565](https://github.com/influxdata/telegraf/pull/9565) Update hashicorp/consul/api module to 1.9.1 - [#9552](https://github.com/influxdata/telegraf/pull/9552) `inputs.vsphere` Update vmware/govmomi module to v0.26.0 in order to support vSphere 7.0 - [#9550](https://github.com/influxdata/telegraf/pull/9550) `inputs.opcua` Do not skip good quality nodes after a bad quality node is encountered ## v1.19.2 [2021-07-28] ### Release Notes - [#9542](https://github.com/influxdata/telegraf/pull/9542) Update Go to v1.16.6 ### Bugfixes - [#9363](https://github.com/influxdata/telegraf/pull/9363) `outputs.dynatrace` Update dynatrace output to allow optional default dimensions - [#9526](https://github.com/influxdata/telegraf/pull/9526) `outputs.influxdb` Fix metrics reported as written but not actually written - [#9549](https://github.com/influxdata/telegraf/pull/9549) `inputs.kube_inventory` Prevent segfault in persistent volume claims - [#9503](https://github.com/influxdata/telegraf/pull/9503) `inputs.nsq_consumer` Fix connection error when not using server setting - [#9540](https://github.com/influxdata/telegraf/pull/9540) `inputs.sql` Fix handling bool column - [#9387](https://github.com/influxdata/telegraf/pull/9387) Linter fixes for plugins/inputs/[fg]* - [#9438](https://github.com/influxdata/telegraf/pull/9438) `inputs.kubernetes` Attach the pod labels to kubernetes_pod_volume and kubernetes_pod_network metrics - [#9519](https://github.com/influxdata/telegraf/pull/9519) `processors.ifname` Fix SNMP empty metric name - [#8587](https://github.com/influxdata/telegraf/pull/8587) `inputs.sqlserver` Add tempdb troubleshooting stats and missing V2 query metrics - [#9323](https://github.com/influxdata/telegraf/pull/9323) `inputs.x509_cert` Prevent x509_cert from hanging on UDP connection - [#9504](https://github.com/influxdata/telegraf/pull/9504) `parsers.json_v2` Simplify how nesting is handled - [#9493](https://github.com/influxdata/telegraf/pull/9493) `inputs.mongodb` Switch to official mongo-go-driver module to fix SSL auth failure - [#9491](https://github.com/influxdata/telegraf/pull/9491) `outputs.dynatrace` Fix panic caused by uninitialized loggedMetrics map - [#9497](https://github.com/influxdata/telegraf/pull/9497) `inputs.prometheus` Fix prometheus cadvisor authentication - [#9520](https://github.com/influxdata/telegraf/pull/9520) `parsers.json_v2` Add support for large uint64 and int64 numbers - [#9447](https://github.com/influxdata/telegraf/pull/9447) `inputs.statsd` Fix regression that didn't allow integer percentiles - [#9466](https://github.com/influxdata/telegraf/pull/9466) `inputs.sqlserver` Provide detailed error message in telegraf log - [#9399](https://github.com/influxdata/telegraf/pull/9399) Update dynatrace-metric-utils-go module to v0.2.0 - [#8108](https://github.com/influxdata/telegraf/pull/8108) `inputs.cgroup` Allow multiple keys when parsing cgroups - [#9479](https://github.com/influxdata/telegraf/pull/9479) `parsers.json_v2` Fix json_v2 parser to handle nested objects in arrays properly ### Features - [#9485](https://github.com/influxdata/telegraf/pull/9485) Add option to automatically reload settings when config file is modified ## v1.19.1 [2021-07-07] ### Bugfixes - [#9388](https://github.com/influxdata/telegraf/pull/9388) `inputs.sqlserver` Require authentication method to be specified - [#9456](https://github.com/influxdata/telegraf/pull/9456) `inputs.kube_inventory` Fix segfault in kube_inventory - [#9448](https://github.com/influxdata/telegraf/pull/9448) `inputs.couchbase` Fix panic - [#9444](https://github.com/influxdata/telegraf/pull/9444) `inputs.knx_listener` Fix nil pointer panic - [#9446](https://github.com/influxdata/telegraf/pull/9446) `inputs.procstat` Update gopsutil module to fix panic - [#9443](https://github.com/influxdata/telegraf/pull/9443) `inputs.rabbitmq` Fix JSON unmarshall regression - [#9369](https://github.com/influxdata/telegraf/pull/9369) Update nat-server module to v2.2.6 - [#9429](https://github.com/influxdata/telegraf/pull/9429) `inputs.dovecot` Exclude read-timeout from being an error - [#9423](https://github.com/influxdata/telegraf/pull/9423) `inputs.statsd` Don't stop parsing after parsing error - [#9370](https://github.com/influxdata/telegraf/pull/9370) Update apimachinary module to v0.21.1 - [#9373](https://github.com/influxdata/telegraf/pull/9373) Update jwt module to v1.2.2 and jwt-go module to v3.2.3 - [#9412](https://github.com/influxdata/telegraf/pull/9412) Update couchbase Module to v0.1.0 - [#9366](https://github.com/influxdata/telegraf/pull/9366) `inputs.snmp` Add a check for oid and name to prevent empty metrics - [#9413](https://github.com/influxdata/telegraf/pull/9413) `outputs.http` Fix toml error when parsing insecure_skip_verify - [#9400](https://github.com/influxdata/telegraf/pull/9400) `inputs.x509_cert` Fix 'source' tag for https - [#9375](https://github.com/influxdata/telegraf/pull/9375) Update signalfx module to v3.3.34 - [#9406](https://github.com/influxdata/telegraf/pull/9406) `parsers.json_v2` Don't require tags to be added to included_keys - [#9289](https://github.com/influxdata/telegraf/pull/9289) `inputs.x509_cert` Fix SNI support - [#9372](https://github.com/influxdata/telegraf/pull/9372) Update gjson module to v1.8.0 - [#9379](https://github.com/influxdata/telegraf/pull/9379) Linter fixes for plugins/inputs/[de]* ## v1.19.0 [2021-06-17] ### Release Notes - Many linter fixes - thanks @zak-pawel and all! - [#9331](https://github.com/influxdata/telegraf/pull/9331) Update Go to 1.16.5 ### Bugfixes - [#9182](https://github.com/influxdata/telegraf/pull/9182) Update pgx to v4 - [#9275](https://github.com/influxdata/telegraf/pull/9275) Fix reading config files starting with http: - [#9196](https://github.com/influxdata/telegraf/pull/9196) `serializers.prometheusremotewrite` Update dependency and remove tags with empty values - [#9051](https://github.com/influxdata/telegraf/pull/9051) `outputs.kafka` Don't prevent telegraf from starting when there's a connection error - [#8795](https://github.com/influxdata/telegraf/pull/8795) `parsers.prometheusremotewrite` Update prometheus dependency to v2.21.0 - [#9295](https://github.com/influxdata/telegraf/pull/9295) `outputs.dynatrace` Use dynatrace-metric-utils - [#9368](https://github.com/influxdata/telegraf/pull/9368) `parsers.json_v2` Update json_v2 parser to handle null types - [#9359](https://github.com/influxdata/telegraf/pull/9359) `inputs.sql` Fix import of sqlite and ignore it on all platforms that require CGO. - [#9329](https://github.com/influxdata/telegraf/pull/9329) `inputs.kube_inventory` Fix connecting to the wrong url - [#9358](https://github.com/influxdata/telegraf/pull/9358) upgrade denisenkom go-mssql to v0.10.0 - [#9283](https://github.com/influxdata/telegraf/pull/9283) `processors.parser` Fix segfault - [#9243](https://github.com/influxdata/telegraf/pull/9243) `inputs.docker` Close all idle connections - [#9338](https://github.com/influxdata/telegraf/pull/9338) `inputs.suricata` Support new JSON format - [#9296](https://github.com/influxdata/telegraf/pull/9296) `outputs.influxdb` Fix endless retries ### Features - [#8987](https://github.com/influxdata/telegraf/pull/8987) Config file environment variable can be a URL - [#9297](https://github.com/influxdata/telegraf/pull/9297) `outputs.datadog` Add HTTP proxy to datadog output - [#9087](https://github.com/influxdata/telegraf/pull/9087) Add named timestamp formats - [#9276](https://github.com/influxdata/telegraf/pull/9276) `inputs.vsphere` Add config option for the historical interval duration - [#9274](https://github.com/influxdata/telegraf/pull/9274) `inputs.ping` Add an option to specify packet size - [#9007](https://github.com/influxdata/telegraf/pull/9007) Allow multiple "--config" and "--config-directory" flags - [#9249](https://github.com/influxdata/telegraf/pull/9249) `outputs.graphite` Allow more characters in graphite tags - [#8351](https://github.com/influxdata/telegraf/pull/8351) `inputs.sqlserver` Added login_name - [#9223](https://github.com/influxdata/telegraf/pull/9223) `inputs.dovecot` Add support for unix domain sockets - [#9118](https://github.com/influxdata/telegraf/pull/9118) `processors.strings` Add UTF-8 sanitizer - [#9156](https://github.com/influxdata/telegraf/pull/9156) `inputs.aliyuncms` Add config option list of regions to query - [#9138](https://github.com/influxdata/telegraf/pull/9138) `common.http` Add OAuth2 to HTTP input - [#8822](https://github.com/influxdata/telegraf/pull/8822) `inputs.sqlserver` Enable Azure Active Directory (AAD) authentication support - [#9136](https://github.com/influxdata/telegraf/pull/9136) `inputs.cloudwatch` Add wildcard support in dimensions configuration - [#5517](https://github.com/influxdata/telegraf/pull/5517) `inputs.mysql` Gather all mysql channels - [#8911](https://github.com/influxdata/telegraf/pull/8911) `processors.enum` Support float64 - [#9105](https://github.com/influxdata/telegraf/pull/9105) `processors.starlark` Support nanosecond resolution timestamp - [#9080](https://github.com/influxdata/telegraf/pull/9080) `inputs.logstash` Add support for version 7 queue stats - [#9074](https://github.com/influxdata/telegraf/pull/9074) `parsers.prometheusremotewrite` Add starlark script for renaming metrics - [#9032](https://github.com/influxdata/telegraf/pull/9032) `inputs.couchbase` Add ~200 more Couchbase metrics via Buckets endpoint - [#8596](https://github.com/influxdata/telegraf/pull/8596) `inputs.sqlserver` input/sqlserver: Add service and save connection pools - [#9042](https://github.com/influxdata/telegraf/pull/9042) `processors.starlark` Add math module - [#6952](https://github.com/influxdata/telegraf/pull/6952) `inputs.x509_cert` Wildcard support for cert filenames - [#9004](https://github.com/influxdata/telegraf/pull/9004) `processors.starlark` Add time module - [#8891](https://github.com/influxdata/telegraf/pull/8891) `inputs.kinesis_consumer` Add content_encoding option with gzip and zlib support - [#8996](https://github.com/influxdata/telegraf/pull/8996) `processors.starlark` Add an example showing how to obtain IOPS from diskio input - [#8966](https://github.com/influxdata/telegraf/pull/8966) `inputs.http_listener_v2` Add support for snappy compression - [#8661](https://github.com/influxdata/telegraf/pull/8661) `inputs.cisco_telemetry_mdt` Add support for events and class based query - [#8861](https://github.com/influxdata/telegraf/pull/8861) `inputs.mongodb` Optionally collect top stats - [#8979](https://github.com/influxdata/telegraf/pull/8979) `parsers.value` Add custom field name config option - [#8544](https://github.com/influxdata/telegraf/pull/8544) `inputs.sqlserver` Add an optional health metric ### New Input Plugins - [Alibaba CloudMonitor Service (Aliyun)](https://github.com/influxdata/telegraf/tree/master/plugins/inputs/aliyuncms) - contributed by @i-prudnikov - [OpenTelemetry](https://github.com/influxdata/telegraf/tree/master/plugins/inputs/opentelemetry) - contributed by @jacobmarble - [Intel Data Plane Development Kit (DPDK)](https://github.com/influxdata/telegraf/tree/master/plugins/inputs/dpdk) - contributed by @p-zak - [KNX](https://github.com/influxdata/telegraf/tree/master/plugins/inputs/knx_listener) - contributed by @DocLambda - [SQL](https://github.com/influxdata/telegraf/tree/master/plugins/inputs/sql) - contributed by @srebhan ### New Output Plugins - [Websocket](https://github.com/influxdata/telegraf/tree/master/plugins/outputs/websocket) - contributed by @FZambia - [SQL](https://github.com/influxdata/telegraf/tree/master/plugins/outputs/sql) - contributed by @illuusio - [AWS Cloudwatch logs](https://github.com/influxdata/telegraf/tree/master/plugins/outputs/cloudwatch_logs) - contributed by @i-prudnikov ### New Parser Plugins - [Prometheus Remote Write](https://github.com/influxdata/telegraf/tree/master/plugins/parsers/prometheusremotewrite) - contributed by @helenosheaa - [JSON V2](https://github.com/influxdata/telegraf/tree/master/plugins/parsers/json_v2) - contributed by @sspaink ### New External Plugins - [ldap_org and ds389](https://github.com/falon/CSI-telegraf-plugins) - contributed by @falon - [x509_crl](https://github.com/jcgonnard/telegraf-input-x590crl) - contributed by @jcgonnard - [dnsmasq](https://github.com/machinly/dnsmasq-telegraf-plugin) - contributed by @machinly - [Big Blue Button](https://github.com/bigblueswarm/bigbluebutton-telegraf-plugin) - contributed by @SLedunois ## v1.18.3 [2021-05-20] ### Release Notes - Added FreeBSD armv7 build ### Bugfixes - [#9271](https://github.com/influxdata/telegraf/pull/9271) `inputs.prometheus` Set user agent when scraping prom metrics - [#9203](https://github.com/influxdata/telegraf/pull/9203) Migrate from soniah/gosnmp to gosnmp/gosnmp and update to 1.32.0 - [#9169](https://github.com/influxdata/telegraf/pull/9169) `inputs.kinesis_consumer` Fix repeating parser error - [#9130](https://github.com/influxdata/telegraf/pull/9130) `inputs.sqlserver` Remove disallowed whitespace from sqlServerRingBufferCPU query - [#9238](https://github.com/influxdata/telegraf/pull/9238) Update hashicorp/consul/api module to v1.8.1 - [#9235](https://github.com/influxdata/telegraf/pull/9235) Migrate from docker/libnetwork/ipvs to moby/ipvs - [#9224](https://github.com/influxdata/telegraf/pull/9224) Update shirou/gopsutil to 3.21.3 - [#9209](https://github.com/influxdata/telegraf/pull/9209) Update microsoft/ApplicationInsights-Go to 0.4.4 - [#9190](https://github.com/influxdata/telegraf/pull/9190) Update gogo/protobuf to 1.3.2 - [#8746](https://github.com/influxdata/telegraf/pull/8746) Update Azure/go-autorest/autorest/azure/auth to 0.5.6 and Azure/go-autorest/autorest to 0.11.17 - [#8745](https://github.com/influxdata/telegraf/pull/8745) Update collectd.org to 0.5.0 - [#8716](https://github.com/influxdata/telegraf/pull/8716) Update nats-io/nats.go 1.10.0 - [#9039](https://github.com/influxdata/telegraf/pull/9039) Update golang/protobuf to v1.5.1 - [#8937](https://github.com/influxdata/telegraf/pull/8937) Migrate from ericchiang/k8s to kubernetes/client-go ### Features - [#8913](https://github.com/influxdata/telegraf/pull/8913) `outputs.elasticsearch` Add ability to enable gzip compression ## v1.18.2 [2021-04-28] ### Bugfixes - [#9160](https://github.com/influxdata/telegraf/pull/9160) `processors.converter` Add support for large hexadecimal strings - [#9195](https://github.com/influxdata/telegraf/pull/9195) `inputs.apcupsd` Fix apcupsd 'ALARMDEL' bug via forked repo - [#9110](https://github.com/influxdata/telegraf/pull/9110) `parsers.json` Make JSON format compatible with nulls - [#9128](https://github.com/influxdata/telegraf/pull/9128) `inputs.nfsclient` Fix nfsclient ops map to allow collection of metrics other than read and write - [#8917](https://github.com/influxdata/telegraf/pull/8917) `inputs.snmp` Log snmpv3 auth failures - [#8892](https://github.com/influxdata/telegraf/pull/8892) `common.shim` Accept larger inputs from scanner - [#9045](https://github.com/influxdata/telegraf/pull/9045) `inputs.vsphere` Add MetricLookback setting to handle reporting delays in vCenter 6.7 and later - [#9026](https://github.com/influxdata/telegraf/pull/9026) `outputs.sumologic` Carbon2 serializer: sanitize metric name - [#9086](https://github.com/influxdata/telegraf/pull/9086) `inputs.opcua` Fix error handling ## v1.18.1 [2021-04-07] ### Bugfixes - [#9082](https://github.com/influxdata/telegraf/pull/9082) `inputs.mysql` Fix 'binary logs' query for MySQL 8 - [#9069](https://github.com/influxdata/telegraf/pull/9069) `inputs.tail` Add configurable option for the 'path' tag override - [#9067](https://github.com/influxdata/telegraf/pull/9067) `inputs.nfsclient` Fix integer overflow in fields from mountstat - [#9050](https://github.com/influxdata/telegraf/pull/9050) `inputs.snmp` Fix init when no mibs are installed - [#9072](https://github.com/influxdata/telegraf/pull/9072) `inputs.ping` Always call SetPrivileged(true) in native mode - [#9043](https://github.com/influxdata/telegraf/pull/9043) `processors.ifname` Get interface name more efficiently - [#9056](https://github.com/influxdata/telegraf/pull/9056) `outputs.yandex_cloud_monitoring` Use correct compute metadata URL to get folder-id - [#9048](https://github.com/influxdata/telegraf/pull/9048) `outputs.azure_monitor` Handle error when initializing the auth object - [#8549](https://github.com/influxdata/telegraf/pull/8549) `inputs.sqlserver` Fix sqlserver_process_cpu calculation - [#9035](https://github.com/influxdata/telegraf/pull/9035) `inputs.ipmi_sensor` Fix panic - [#9009](https://github.com/influxdata/telegraf/pull/9009) `inputs.docker` Fix panic when parsing container stats - [#8333](https://github.com/influxdata/telegraf/pull/8333) `inputs.exec` Don't truncate messages in debug mode - [#8769](https://github.com/influxdata/telegraf/pull/8769) `agent` Close running outputs when reloadinlg ## v1.18.0 [2021-03-17] ### Release Notes - Support Go version 1.16.2 - Added support for code signing in Windows ### Bugfixes - [#7312](https://github.com/influxdata/telegraf/pull/7312) `inputs.docker` CPU stats respect perdevice - [#8397](https://github.com/influxdata/telegraf/pull/8397) `outputs.dynatrace` Dynatrace Plugin: Make conversion to counters possible / Changed large bulk handling - [#8655](https://github.com/influxdata/telegraf/pull/8655) `inputs.sqlserver` SqlServer - fix for default server list - [#8703](https://github.com/influxdata/telegraf/pull/8703) `inputs.docker` Use consistent container name in docker input plugin - [#8902](https://github.com/influxdata/telegraf/pull/8902) `inputs.snmp` Fix max_repetitions signedness issues - [#8817](https://github.com/influxdata/telegraf/pull/8817) `outputs.kinesis` outputs.kinesis - log record error count - [#8833](https://github.com/influxdata/telegraf/pull/8833) `inputs.sqlserver` Bug Fix - SQL Server HADR queries for SQL Versions - [#8628](https://github.com/influxdata/telegraf/pull/8628) `inputs.modbus` fix: reading multiple holding registers in modbus input plugin - [#8885](https://github.com/influxdata/telegraf/pull/8885) `inputs.statsd` Fix statsd concurrency bug - [#8393](https://github.com/influxdata/telegraf/pull/8393) `inputs.sqlserver` SQL Perfmon counters - synced queries from v2 to all db types - [#8873](https://github.com/influxdata/telegraf/pull/8873) `processors.ifname` Fix mutex locking around ifname cache - [#8720](https://github.com/influxdata/telegraf/pull/8720) `parsers.influx` fix: remove ambiguity on '\v' from line-protocol parser - [#8678](https://github.com/influxdata/telegraf/pull/8678) `inputs.redis` Fix Redis output field type inconsistencies - [#8953](https://github.com/influxdata/telegraf/pull/8953) `agent` Reset the flush interval timer when flush is requested or batch is ready. - [#8954](https://github.com/influxdata/telegraf/pull/8954) `common.kafka` Fix max open requests to one if idempotent writes is set to true - [#8721](https://github.com/influxdata/telegraf/pull/8721) `inputs.kube_inventory` Set $HOSTIP in default URL - [#8995](https://github.com/influxdata/telegraf/pull/8995) `inputs.sflow` fix segfaults in sflow plugin by checking if protocol headers are set - [#8986](https://github.com/influxdata/telegraf/pull/8986) `outputs.nats` nats_output: use the configured credentials file ### Features - [#8887](https://github.com/influxdata/telegraf/pull/8887) `inputs.procstat` Add PPID field to procstat input plugin - [#8852](https://github.com/influxdata/telegraf/pull/8852) `processors.starlark` Add Starlark script for estimating Line Protocol cardinality - [#8915](https://github.com/influxdata/telegraf/pull/8915) `inputs.cloudwatch` add proxy - [#8910](https://github.com/influxdata/telegraf/pull/8910) `agent` Display error message on badly formatted config string array (eg. namepass) - [#8785](https://github.com/influxdata/telegraf/pull/8785) `inputs.diskio` Non systemd support with unittest - [#8850](https://github.com/influxdata/telegraf/pull/8850) `inputs.snmp` Support more snmpv3 authentication protocols - [#8813](https://github.com/influxdata/telegraf/pull/8813) `inputs.redfish` added member_id as tag(as it is a unique value) for redfish plugin and added address of the server when the status is other than 200 for better debugging - [#8613](https://github.com/influxdata/telegraf/pull/8613) `inputs.phpfpm` Support exclamation mark to create non-matching list in tail plugin - [#8179](https://github.com/influxdata/telegraf/pull/8179) `inputs.statsd` Add support for datadog distributions metric - [#8803](https://github.com/influxdata/telegraf/pull/8803) `agent` Add default retry for load config via url - [#8816](https://github.com/influxdata/telegraf/pull/8816) Code Signing for Windows - [#8772](https://github.com/influxdata/telegraf/pull/8772) `processors.starlark` Allow to provide constants to a starlark script - [#8749](https://github.com/influxdata/telegraf/pull/8749) `outputs.newrelic` Add HTTP proxy setting to New Relic output plugin - [#8543](https://github.com/influxdata/telegraf/pull/8543) `inputs.elasticsearch` Add configurable number of 'most recent' date-stamped indices to gather in Elasticsearch input - [#8675](https://github.com/influxdata/telegraf/pull/8675) `processors.starlark` Add Starlark parsing example of nested JSON - [#8762](https://github.com/influxdata/telegraf/pull/8762) `inputs.prometheus` Optimize for bigger kubernetes clusters (500+ pods) - [#8950](https://github.com/influxdata/telegraf/pull/8950) `inputs.teamspeak` Teamspeak input plugin query clients - [#8849](https://github.com/influxdata/telegraf/pull/8849) `inputs.sqlserver` Filter data out from system databases for Azure SQL DB only ### New Inputs - [Beat Input Plugin](https://github.com/influxdata/telegraf/tree/master/plugins/inputs/beat) - Contributed by @nferch - [CS:GO Input Plugin](https://github.com/influxdata/telegraf/tree/master/plugins/inputs/csgo) - Contributed by @oofdog - [Directory Monitoring Input Plugin](https://github.com/influxdata/telegraf/tree/master/plugins/inputs/directory_monitor) - Contributed by @InfluxData - [RavenDB Input Plugin](https://github.com/influxdata/telegraf/tree/master/plugins/inputs/ravendb) - Contributed by @ml054 and @bartoncasey - [NFS Input Plugin](https://github.com/influxdata/telegraf/tree/master/plugins/inputs/nfsclient) - Contributed by @pmoranga ### New Outputs - [Grafana Loki Output Plugin](https://github.com/influxdata/telegraf/tree/master/plugins/outputs/loki) - Contributed by @Eraac - [Google BigQuery Output Plugin](https://github.com/influxdata/telegraf/tree/master/plugins/outputs/loki) - Contributed by @gkatzioura - [Sensu Output Plugin](https://github.com/influxdata/telegraf/blob/master/plugins/outputs/sensu) - Contributed by @calebhailey - [SignalFX Output Plugin](https://github.com/influxdata/telegraf/tree/master/plugins/outputs/signalfx) - Contributed by @keitwb ### New Aggregators - [Derivative Aggregator Plugin](https://github.com/influxdata/telegraf/tree/master/plugins/aggregators/derivative) - Contributed by @KarstenSchnitter - [Quantile Aggregator Plugin](https://github.com/influxdata/telegraf/tree/master/plugins/aggregators/quantile) - Contributed by @srebhan ### New Processors - [AWS EC2 Metadata Processor Plugin](https://github.com/influxdata/telegraf/tree/master/plugins/processors/aws/ec2) - Contributed by @pmalek-sumo ### New Parsers - [XML Parser Plugin](https://github.com/influxdata/telegraf/tree/master/plugins/parsers/xml) - Contributed by @srebhan ### New Serializers - [MessagePack Serializer Plugin](https://github.com/influxdata/telegraf/tree/master/plugins/serializers/msgpack) - Contributed by @dialogbox ### New External Plugins - [GeoIP Processor Plugin](https://github.com/a-bali/telegraf-geoip) - Contributed by @a-bali - [Plex Webhook Input Plugin](https://github.com/russorat/telegraf-webhooks-plex) - Contributed by @russorat - [SMCIPMITool Input Plugin](https://github.com/jhpope/smc_ipmi) - Contributed by @jhpope ## v1.17.3 [2021-02-17] ### Bugfixes - [#7316](https://github.com/influxdata/telegraf/pull/7316) `inputs.filestat` plugins/filestat: Skip missing files - [#8868](https://github.com/influxdata/telegraf/pull/8868) Update to Go 1.15.8 - [#8744](https://github.com/influxdata/telegraf/pull/8744) Bump github.com/gopcua/opcua from 0.1.12 to 0.1.13 - [#8657](https://github.com/influxdata/telegraf/pull/8657) `outputs.warp10` outputs/warp10: url encode comma in tags value - [#8824](https://github.com/influxdata/telegraf/pull/8824) `inputs.x509_cert` inputs.x509_cert: Fix timeout issue - [#8821](https://github.com/influxdata/telegraf/pull/8821) `inputs.mqtt_consumer` Fix reconnection issues mqtt - [#8775](https://github.com/influxdata/telegraf/pull/8775) `outputs.influxdb` Validate the response from InfluxDB after writing/creating a database to avoid json parsing panics/errors - [#8804](https://github.com/influxdata/telegraf/pull/8804) `inputs.snmp` Expose v4/v6-only connection-schemes through GosnmpWrapper - [#8838](https://github.com/influxdata/telegraf/pull/8838) `agent` fix issue with reading flush_jitter output from config - [#8839](https://github.com/influxdata/telegraf/pull/8839) `inputs.ping` fixes Sort and timeout around deadline - [#8787](https://github.com/influxdata/telegraf/pull/8787) `inputs.ping` Update README for inputs.ping with correct cmd for native ping on Linux - [#8771](https://github.com/influxdata/telegraf/pull/8771) Update go-ping to latest version ## v1.17.2 [2021-01-28] ### Bugfixes - [#8770](https://github.com/influxdata/telegraf/pull/8770) `inputs.ping` Set interface for native - [#8764](https://github.com/influxdata/telegraf/pull/8764) `inputs.ping` Resolve regression, re-add missing function ## v1.17.1 [2021-01-27] ### Release Notes Included a few more changes that add configuration options to plugins as it's been while since the last release - [#8335](https://github.com/influxdata/telegraf/pull/8335) `inputs.ipmi_sensor` Add setting to enable caching in ipmitool - [#8616](https://github.com/influxdata/telegraf/pull/8616) Add Event Log support for Windows - [#8602](https://github.com/influxdata/telegraf/pull/8602) `inputs.postgresql_extensible` Add timestamp column support to postgresql_extensible - [#8627](https://github.com/influxdata/telegraf/pull/8627) `parsers.csv` Added ability to define skip values in csv parser - [#8055](https://github.com/influxdata/telegraf/pull/8055) `outputs.http` outputs/http: add option to control idle connection timeout - [#7897](https://github.com/influxdata/telegraf/pull/7897) `common.tls` common/tls: Allow specifying SNI hostnames - [#8541](https://github.com/influxdata/telegraf/pull/8541) `inputs.snmp` Extended the internal snmp wrapper to support AES192, AES192C, AES256, and AES256C - [#6165](https://github.com/influxdata/telegraf/pull/6165) `inputs.procstat` Provide method to include core count when reporting cpu_usage in procstat input - [#8287](https://github.com/influxdata/telegraf/pull/8287) `inputs.jenkins` Add support for an inclusive job list in Jenkins plugin - [#8524](https://github.com/influxdata/telegraf/pull/8524) `inputs.ipmi_sensor` Add hex_key parameter for IPMI input plugin connection ### Bugfixes - [#8662](https://github.com/influxdata/telegraf/pull/8662) `outputs.influxdb_v2` [outputs.influxdb_v2] add exponential backoff, and respect client error responses - [#8748](https://github.com/influxdata/telegraf/pull/8748) `outputs.elasticsearch` Fix issue with elasticsearch output being really noisy about some errors - [#7533](https://github.com/influxdata/telegraf/pull/7533) `inputs.zookeeper` improve mntr regex to match user specific keys. - [#7967](https://github.com/influxdata/telegraf/pull/7967) `inputs.lustre2` Fix crash in lustre2 input plugin, when field name and value - [#8673](https://github.com/influxdata/telegraf/pull/8673) Update grok-library to v1.0.1 with dots and dash-patterns fixed. - [#8679](https://github.com/influxdata/telegraf/pull/8679) `inputs.ping` Use go-ping for "native" execution in Ping plugin - [#8741](https://github.com/influxdata/telegraf/pull/8741) `inputs.x509_cert` fix x509 cert timeout issue - [#8714](https://github.com/influxdata/telegraf/pull/8714) Bump github.com/nsqio/go-nsq from 1.0.7 to 1.0.8 - [#8715](https://github.com/influxdata/telegraf/pull/8715) Bump github.com/Shopify/sarama from 1.27.1 to 1.27.2 - [#8712](https://github.com/influxdata/telegraf/pull/8712) Bump github.com/newrelic/newrelic-telemetry-sdk-go from 0.2.0 to 0.5.1 - [#8659](https://github.com/influxdata/telegraf/pull/8659) `inputs.gnmi` GNMI plugin should not take off the first character of field keys when no 'alias path' exists. - [#8609](https://github.com/influxdata/telegraf/pull/8609) `inputs.webhooks` Use the 'measurement' json field from the particle webhook as the measurement name, or if it's blank, use the 'name' field of the event's json. - [#8658](https://github.com/influxdata/telegraf/pull/8658) `inputs.procstat` Procstat input plugin should use the same timestamp in all metrics in the same Gather() cycle. - [#8391](https://github.com/influxdata/telegraf/pull/8391) `aggregators.merge` Optimize SeriesGrouper & aggregators.merge - [#8545](https://github.com/influxdata/telegraf/pull/8545) `inputs.prometheus` Using mime-type in prometheus parser to handle protocol-buffer responses - [#8588](https://github.com/influxdata/telegraf/pull/8588) `inputs.snmp` Input SNMP plugin - upgrade gosnmp library to version 1.29.0 - [#8502](https://github.com/influxdata/telegraf/pull/8502) `inputs.http_listener_v2` Fix Stop() bug when plugin fails to start ### New External Plugins - [#8646](https://github.com/influxdata/telegraf/pull/8646) [Open Hardware Monitoring](https://github.com/marianob85/open_hardware_monitor-telegraf-plugin) Input Plugin ## v1.17.0 [2020-12-18] ### Release Notes - Starlark plugins can now store state between runs using a global state variable. This lets you make custom aggregators as well as custom processors that are state-aware. - New input plugins: Riemann-Protobuff Listener, Intel PowerStat - New output plugins: Yandex.Cloud monitoring, Logz.io - New parser plugin: Prometheus - New serializer: Prometheus remote write ### Bugfixes - [#8505](https://github.com/influxdata/telegraf/pull/8505) `inputs.vsphere` Fixed misspelled check for datacenter - [#8499](https://github.com/influxdata/telegraf/pull/8499) `processors.execd` Adding support for new lines in influx line protocol fields. - [#8254](https://github.com/influxdata/telegraf/pull/8254) `serializers.carbon2` Fix carbon2 tests - [#8498](https://github.com/influxdata/telegraf/pull/8498) `inputs.http_response` fixed network test - [#8414](https://github.com/influxdata/telegraf/pull/8414) `inputs.bcache` Fix tests for Windows - part 1 - [#8577](https://github.com/influxdata/telegraf/pull/8577) `inputs.ping` fix potential issue with race condition - [#8562](https://github.com/influxdata/telegraf/pull/8562) `inputs.mqtt_consumer` fix issue with mqtt concurrent map write - [#8574](https://github.com/influxdata/telegraf/pull/8574) `inputs.ecs` Remove duplicated field "revision" from ecs_task because it's already defined as a tag there - [#8551](https://github.com/influxdata/telegraf/pull/8551) `inputs.socket_listener` fix crash when socket_listener receiving invalid data - [#8564](https://github.com/influxdata/telegraf/pull/8564) `parsers.graphite` Graphite tags parser - [#8472](https://github.com/influxdata/telegraf/pull/8472) `inputs.kube_inventory` Fixing issue with missing metrics when pod has only pending containers - [#8542](https://github.com/influxdata/telegraf/pull/8542) `inputs.aerospike` fix edge case in aerospike plugin where an expected hex string was converted to integer if all digits - [#8512](https://github.com/influxdata/telegraf/pull/8512) `inputs.kube_inventory` Update string parsing of allocatable cpu cores in kube_inventory ### Features - [#8038](https://github.com/influxdata/telegraf/pull/8038) `inputs.jenkins` feat: add build number field to jenkins_job measurement - [#7345](https://github.com/influxdata/telegraf/pull/7345) `inputs.ping` Add percentiles to the ping plugin - [#8369](https://github.com/influxdata/telegraf/pull/8369) `inputs.sqlserver` Added tags for monitoring readable secondaries for Azure SQL MI - [#8379](https://github.com/influxdata/telegraf/pull/8379) `inputs.sqlserver` SQL Server HA/DR Availability Group queries - [#8520](https://github.com/influxdata/telegraf/pull/8520) Add initialization example to mock-plugin. - [#8426](https://github.com/influxdata/telegraf/pull/8426) `inputs.snmp` Add support to convert snmp hex strings to integers - [#8509](https://github.com/influxdata/telegraf/pull/8509) `inputs.statsd` Add configurable Max TTL duration for statsd input plugin entries - [#8508](https://github.com/influxdata/telegraf/pull/8508) `inputs.bind` Add configurable timeout to bind input plugin http call - [#8368](https://github.com/influxdata/telegraf/pull/8368) `inputs.sqlserver` Added is_primary_replica for monitoring readable secondaries for Azure SQL DB - [#8462](https://github.com/influxdata/telegraf/pull/8462) `inputs.sqlserver` sqlAzureMIRequests - remove duplicate column [session_db_name] - [#8464](https://github.com/influxdata/telegraf/pull/8464) `inputs.sqlserver` Add column measurement_db_type to output of all queries if not empty - [#8389](https://github.com/influxdata/telegraf/pull/8389) `inputs.opcua` Add node groups to opcua input plugin - [#8432](https://github.com/influxdata/telegraf/pull/8432) add support for linux/ppc64le - [#8474](https://github.com/influxdata/telegraf/pull/8474) `inputs.modbus` Add FLOAT64-IEEE support to inputs.modbus (#8361) (by @Nemecsek) - [#8447](https://github.com/influxdata/telegraf/pull/8447) `processors.starlark` Add the shared state to the global scope to get previous data - [#8383](https://github.com/influxdata/telegraf/pull/8383) `inputs.zfs` Add dataset metrics to zfs input - [#8429](https://github.com/influxdata/telegraf/pull/8429) `outputs.nats` Added "name" parameter to NATS output plugin - [#8477](https://github.com/influxdata/telegraf/pull/8477) `inputs.http` proxy support for http input - [#8466](https://github.com/influxdata/telegraf/pull/8466) `inputs.snmp` Translate snmp field values - [#8435](https://github.com/influxdata/telegraf/pull/8435) `common.kafka` Enable kafka zstd compression and idempotent writes - [#8056](https://github.com/influxdata/telegraf/pull/8056) `inputs.monit` Add response_time to monit plugin - [#8446](https://github.com/influxdata/telegraf/pull/8446) update to go 1.15.5 - [#8428](https://github.com/influxdata/telegraf/pull/8428) `aggregators.basicstats` Add rate and interval to the basicstats aggregator plugin - [#8575](https://github.com/influxdata/telegraf/pull/8575) `inputs.win_services` Added Glob pattern matching for "Windows Services" plugin - [#6132](https://github.com/influxdata/telegraf/pull/6132) `inputs.mysql` Add per user metrics to mysql input - [#8500](https://github.com/influxdata/telegraf/pull/8500) `inputs.github` [inputs.github] Add query of pull-request statistics - [#8598](https://github.com/influxdata/telegraf/pull/8598) `processors.enum` Allow globs (wildcards) in config for tags/fields in enum processor - [#8590](https://github.com/influxdata/telegraf/pull/8590) `inputs.ethtool` [ethtool] interface_up field added - [#8579](https://github.com/influxdata/telegraf/pull/8579) `parsers.json` Add wildcard tags json parser support ### New Parser Plugins - [#7778](https://github.com/influxdata/telegraf/pull/7778) `parsers.prometheus` Add a parser plugin for prometheus ### New Serializer Plugins - [#8360](https://github.com/influxdata/telegraf/pull/8360) `serializers.prometheusremotewrite` Add prometheus remote write serializer ### New Input Plugins - [#8163](https://github.com/influxdata/telegraf/pull/8163) `inputs.riemann` Support Riemann-Protobuff Listener - [#8488](https://github.com/influxdata/telegraf/pull/8488) `inputs.intel_powerstat` New Intel PowerStat input plugin ### New Output Plugins - [#8296](https://github.com/influxdata/telegraf/pull/8296) `outputs.yandex_cloud_monitoring` #8295 Initial Yandex.Cloud monitoring - [#8202](https://github.com/influxdata/telegraf/pull/8202) `outputs.logzio` A new Logz.io output plugin ## v1.16.3 [2020-12-01] ### Bugfixes - [#8483](https://github.com/influxdata/telegraf/pull/8483) `inputs.gnmi` Log SubscribeResponse_Error message and code. #8482 - [#7987](https://github.com/influxdata/telegraf/pull/7987) update godirwalk to v1.16.1 - [#8438](https://github.com/influxdata/telegraf/pull/8438) `processors.starlark` Starlark example dropbytype - [#8468](https://github.com/influxdata/telegraf/pull/8468) `inputs.sqlserver` Fix typo in column name - [#8461](https://github.com/influxdata/telegraf/pull/8461) `inputs.phpfpm` [php-fpm] Fix possible "index out of range" - [#8444](https://github.com/influxdata/telegraf/pull/8444) `inputs.apcupsd` Update mdlayher/apcupsd dependency - [#8439](https://github.com/influxdata/telegraf/pull/8439) `processors.starlark` Show how to return a custom error with the Starlark processor - [#8440](https://github.com/influxdata/telegraf/pull/8440) `parsers.csv` keep field name as is for csv timestamp column - [#8436](https://github.com/influxdata/telegraf/pull/8436) `inputs.nvidia_smi` Add DriverVersion and CUDA Version to output - [#8423](https://github.com/influxdata/telegraf/pull/8423) `processors.starlark` Show how to return several metrics with the Starlark processor - [#8408](https://github.com/influxdata/telegraf/pull/8408) `processors.starlark` Support logging in starlark - [#8315](https://github.com/influxdata/telegraf/pull/8315) add kinesis output to external plugins list - [#8406](https://github.com/influxdata/telegraf/pull/8406) `outputs.wavefront` #8405 add non-retryable debug logging - [#8404](https://github.com/influxdata/telegraf/pull/8404) `outputs.wavefront` Wavefront output should distinguish between retryable and non-retryable errors - [#8401](https://github.com/influxdata/telegraf/pull/8401) `processors.starlark` Allow to catch errors that occur in the apply function ## v1.16.2 [2020-11-13] ### Bugfixes - [#8400](https://github.com/influxdata/telegraf/pull/8400) `parsers.csv` Fix parsing of multiple files with different headers (#6318). - [#8326](https://github.com/influxdata/telegraf/pull/8326) `inputs.proxmox` proxmox: ignore QEMU templates and iron out a few bugs - [#7991](https://github.com/influxdata/telegraf/pull/7991) `inputs.systemd_units` systemd_units: add --plain to command invocation (#7990) - [#8307](https://github.com/influxdata/telegraf/pull/8307) fix links in external plugins readme - [#8370](https://github.com/influxdata/telegraf/pull/8370) `inputs.redis` Fix minor typos in readmes - [#8374](https://github.com/influxdata/telegraf/pull/8374) `inputs.smart` Fix SMART plugin to recognize all devices from config - [#8288](https://github.com/influxdata/telegraf/pull/8288) `inputs.redfish` Add OData-Version header to requests - [#8357](https://github.com/influxdata/telegraf/pull/8357) `inputs.vsphere` Prydin issue 8169 - [#8356](https://github.com/influxdata/telegraf/pull/8356) `inputs.sqlserver` On-prem fix for #8324 - [#8165](https://github.com/influxdata/telegraf/pull/8165) `outputs.wavefront` [output.wavefront] Introduced "immediate_flush" flag - [#7938](https://github.com/influxdata/telegraf/pull/7938) `inputs.gnmi` added support for bytes encoding - [#8337](https://github.com/influxdata/telegraf/pull/8337) `inputs.dcos` Update jwt-go module to address CVE-2020-26160 - [#8350](https://github.com/influxdata/telegraf/pull/8350) `inputs.ras` fix plugins/input/ras test - [#8329](https://github.com/influxdata/telegraf/pull/8329) `outputs.dynatrace` #8328 Fixed a bug with the state map in Dynatrace Plugin ## v1.16.1 [2020-10-28] ### Release Notes - [#8318](https://github.com/influxdata/telegraf/pull/8318) `common.kafka` kafka sasl-mechanism auth support for SCRAM-SHA-256, SCRAM-SHA-512, GSSAPI ### Bugfixes - [#8331](https://github.com/influxdata/telegraf/pull/8331) `inputs.sqlserver` SQL Server Azure PerfCounters Fix - [#8325](https://github.com/influxdata/telegraf/pull/8325) `inputs.sqlserver` SQL Server - PerformanceCounters - removed synthetic counters - [#8324](https://github.com/influxdata/telegraf/pull/8324) `inputs.sqlserver` SQL Server - server_properties added sql_version_desc - [#8317](https://github.com/influxdata/telegraf/pull/8317) `inputs.ras` Disable RAS input plugin on specific Linux architectures: mips64, mips64le, ppc64le, riscv64 - [#8309](https://github.com/influxdata/telegraf/pull/8309) `inputs.processes` processes: fix issue with stat no such file/dir - [#8308](https://github.com/influxdata/telegraf/pull/8308) `inputs.win_perf_counters` fix issue with PDH_CALC_NEGATIVE_DENOMINATOR error - [#8306](https://github.com/influxdata/telegraf/pull/8306) `inputs.ras` RAS plugin - fix for too many open files handlers ## v1.16.0 [2020-10-21] ### Release Notes - New [code examples](/plugins/processors/starlark/testdata) for the [Starlark processor](/plugins/processors/starlark/README.md) - [#7920](https://github.com/influxdata/telegraf/pull/7920) `inputs.rabbitmq` remove deprecated healthcheck - [#7953](https://github.com/influxdata/telegraf/pull/7953) Add details to connect to InfluxDB OSS 2 and Cloud 2 - [#8054](https://github.com/influxdata/telegraf/pull/8054) add guidelines run to external plugins with execd - [#8198](https://github.com/influxdata/telegraf/pull/8198) `inputs.influxdb_v2_listener` change default influxdb port from 9999 to 8086 to match OSS 2.0 release - [starlark](https://github.com/influxdata/telegraf/tree/release-1.16/plugins/processors/starlark/testdata) `processors.starlark` add various code examples for the Starlark processor ### Features - [#7814](https://github.com/influxdata/telegraf/pull/7814) `agent` Send metrics in FIFO order - [#7869](https://github.com/influxdata/telegraf/pull/7869) `inputs.modbus` extend support of fixed point values on input - [#7870](https://github.com/influxdata/telegraf/pull/7870) `inputs.mongodb` Added new metric "pages written from cache" - [#7875](https://github.com/influxdata/telegraf/pull/7875) `inputs.consul` input consul - added metric_version flag - [#7894](https://github.com/influxdata/telegraf/pull/7894) `inputs.cloudwatch` Implement AWS CloudWatch Input Plugin ListMetrics API calls to use Active Metric Filter - [#7904](https://github.com/influxdata/telegraf/pull/7904) `inputs.clickhouse` add additional metrics to clickhouse input plugin - [#7934](https://github.com/influxdata/telegraf/pull/7934) `inputs.sqlserver` Database_type config to Split up sql queries by engine type - [#8018](https://github.com/influxdata/telegraf/pull/8018) `processors.ifname` Add addTag debugging in ifname plugin - [#8019](https://github.com/influxdata/telegraf/pull/8019) `outputs.elasticsearch` added force_document_id option to ES output enable resend data and avoiding duplicated ES documents - [#8025](https://github.com/influxdata/telegraf/pull/8025) `inputs.aerospike` Add set, and histogram reporting to aerospike telegraf plugin - [#8082](https://github.com/influxdata/telegraf/pull/8082) `inputs.snmp` Add agent host tag configuration option - [#8113](https://github.com/influxdata/telegraf/pull/8113) `inputs.smart` Add more missing NVMe attributes to smart plugin - [#8120](https://github.com/influxdata/telegraf/pull/8120) `inputs.sqlserver` Added more performance counters to SqlServer input plugin - [#8127](https://github.com/influxdata/telegraf/pull/8127) `agent` Sort plugin name lists for output - [#8132](https://github.com/influxdata/telegraf/pull/8132) `outputs.sumologic` Sumo Logic output plugin: carbon2 default to include field in metric - [#8133](https://github.com/influxdata/telegraf/pull/8133) `inputs.influxdb_v2_listener` influxdb_v2_listener - add /ready route - [#8168](https://github.com/influxdata/telegraf/pull/8168) `processors.starlark` add json parsing support to starlark - [#8186](https://github.com/influxdata/telegraf/pull/8186) `inputs.sqlserver` New sql server queries (Azure) - [#8189](https://github.com/influxdata/telegraf/pull/8189) `inputs.snmp_trap` If the community string is available, add it as a tag - [#8190](https://github.com/influxdata/telegraf/pull/8190) `inputs.tail` Semigroupoid multiline (#8167) - [#8196](https://github.com/influxdata/telegraf/pull/8196) `inputs.redis` add functionality to get values from redis commands - [#8220](https://github.com/influxdata/telegraf/pull/8220) `build` update to Go 1.15 - [#8032](https://github.com/influxdata/telegraf/pull/8032) `inputs.http_response` http_response: match on status code - [#8172](https://github.com/influxdata/telegraf/pull/8172) `inputs.sqlserver` New sql server queries (on-prem) - refactoring and formatting ### Bugfixes - [#7816](https://github.com/influxdata/telegraf/pull/7816) `shim` fix bug with loading plugins in shim with no config - [#7818](https://github.com/influxdata/telegraf/pull/7818) `build` Fix darwin package build flags - [#7819](https://github.com/influxdata/telegraf/pull/7819) `inputs.tail` Close file to ensure it has been flushed - [#7853](https://github.com/influxdata/telegraf/pull/7853) Initialize aggregation processors - [#7865](https://github.com/influxdata/telegraf/pull/7865) `common.shim` shim logger improvements - [#7867](https://github.com/influxdata/telegraf/pull/7867) `inputs.execd` fix issue with execd restart_delay being ignored - [#7872](https://github.com/influxdata/telegraf/pull/7872) `inputs.gnmi` Recv next message after send returns EOF - [#7877](https://github.com/influxdata/telegraf/pull/7877) Fix arch name in deb/rpm builds - [#7909](https://github.com/influxdata/telegraf/pull/7909) fixes issue with rpm /var/log/telegraf permissions - [#7918](https://github.com/influxdata/telegraf/pull/7918) `inputs.net` fix broken link to proc.c - [#7927](https://github.com/influxdata/telegraf/pull/7927) `inputs.tail` Fix tail following on EOF - [#8005](https://github.com/influxdata/telegraf/pull/8005) Fix docker-image make target - [#8039](https://github.com/influxdata/telegraf/pull/8039) `serializers.splunkmetric` Remove Event field as it is causing issues with pre-trained source types - [#8048](https://github.com/influxdata/telegraf/pull/8048) `inputs.jenkins` Multiple escaping occurs on Jenkins URLs at certain folder depth - [#8071](https://github.com/influxdata/telegraf/pull/8071) `inputs.kubernetes` add missing error check for HTTP req failure - [#8145](https://github.com/influxdata/telegraf/pull/8145) `processors.execd` Increased the maximum serialized metric size in line protocol - [#8159](https://github.com/influxdata/telegraf/pull/8159) `outputs.dynatrace` Dynatrace Output: change handling of monotonic counters - [#8176](https://github.com/influxdata/telegraf/pull/8176) fix panic on streaming processers using logging - [#8177](https://github.com/influxdata/telegraf/pull/8177) `parsers.influx` fix: plugins/parsers/influx: avoid ParseError.Error panic - [#8199](https://github.com/influxdata/telegraf/pull/8199) `inputs.docker` Fix vulnerabilities found in BDBA scan - [#8200](https://github.com/influxdata/telegraf/pull/8200) `inputs.sqlserver` Fixed Query mapping - [#8201](https://github.com/influxdata/telegraf/pull/8201) `outputs.sumologic` Fix carbon2 serializer not falling through to field separate when carbon2_format field is unset - [#8210](https://github.com/influxdata/telegraf/pull/8210) update gopsutil: fix procstat performance regression - [#8162](https://github.com/influxdata/telegraf/pull/8162) Fix bool serialization when using carbon2 - [#8240](https://github.com/influxdata/telegraf/pull/8240) Fix bugs found by LGTM analysis platform - [#8251](https://github.com/influxdata/telegraf/pull/8251) `outputs.dynatrace` Dynatrace Output Plugin: Fixed behaviour when state map is cleared - [#8274](https://github.com/influxdata/telegraf/pull/8274) `common.shim` fix issue with loading processor config from execd ### New Input Plugins - [influxdb_v2_listener](/plugins/inputs/influxdb_v2_listener/README.md) Influxdb v2 listener - Contributed by @magichair - [intel_rdt](/plugins/inputs/intel_rdt/README.md) New input plugin for Intel RDT (Intel Resource Director Technology) - Contributed by @p-zak - [nsd](/plugins/inputs/nsd/README.md) add nsd input plugin - Contributed by @gearnode - [opcua](/plugins/inputs/opcua/README.md) Add OPC UA input plugin - Contributed by InfluxData - [proxmox](/plugins/inputs/proxmox/README.md) Proxmox plugin - Contributed by @effitient - [ras](/plugins/inputs/ras/README.md) New input plugin for RAS (Reliability, Availability and Serviceability) - Contributed by @p-zak - [win_eventlog](/plugins/inputs/win_eventlog/README.md) Windows eventlog input plugin - Contributed by @simnv ### New Output Plugins - [dynatrace](/plugins/outputs/dynatrace/README.md) Dynatrace output plugin - Contributed by @thschue - [sumologic](/plugins/outputs/sumologic/README.md) Sumo Logic output plugin - Contributed by @pmalek-sumo - [timestream](/plugins/outputs/timestream) Timestream Output Plugin - Contributed by @piotrwest ### New External Plugins See [EXTERNAL_PLUGINS.md](/EXTERNAL_PLUGINS.md) for a full list of external plugins - [awsalarms](https://github.com/vipinvkmenon/awsalarms) - Simple plugin to gather/monitor alarms generated in AWS. - [youtube-telegraf-plugin](https://github.com/inabagumi/youtube-telegraf-plugin) - Gather view and subscriber stats from your youtube videos - [octoprint](https://github.com/BattleBas/octoprint-telegraf-plugin) - Gather 3d print information from the octoprint API. - [systemd-timings](https://github.com/pdmorrow/telegraf-execd-systemd-timings) - Gather systemd boot and unit timestamp metrics. ## v1.15.4 [2020-10-20] ### Bugfixes - [#8274](https://github.com/influxdata/telegraf/pull/8274) `common.shim` fix issue with loading processor config from execd - [#8176](https://github.com/influxdata/telegraf/pull/8176) `agent` fix panic on streaming processers using logging ## v1.15.3 [2020-09-11] ### Release Notes - Many documentation updates - New [code examples](https://github.com/influxdata/telegraf/tree/master/plugins/processors/starlark/testdata) for the [Starlark processor](https://github.com/influxdata/telegraf/blob/master/plugins/processors/starlark/README.md) ### Bugfixes - [#7999](https://github.com/influxdata/telegraf/pull/7999) `agent` fix minor agent error message race condition - [#8051](https://github.com/influxdata/telegraf/pull/8051) `build` fix docker build. update dockerfiles to Go 1.14 - [#8052](https://github.com/influxdata/telegraf/pull/8052) `shim` fix bug in shim logger affecting AddError - [#7996](https://github.com/influxdata/telegraf/pull/7996) `shim` fix issue with shim use of config.Duration - [#8006](https://github.com/influxdata/telegraf/pull/8006) `inputs.eventhub_consumer` Fix string to int conversion in eventhub consumer - [#7986](https://github.com/influxdata/telegraf/pull/7986) `inputs.http_listener_v2` make http header tags case insensitive - [#7869](https://github.com/influxdata/telegraf/pull/7869) `inputs.modbus` extend support of fixed point values on input - [#7861](https://github.com/influxdata/telegraf/pull/7861) `inputs.ping` Fix Ping Input plugin for FreeBSD's ping6 - [#7808](https://github.com/influxdata/telegraf/pull/7808) `inputs.sqlserver` added new counter - Lock Timeouts (timeout > 0)/sec - [#8026](https://github.com/influxdata/telegraf/pull/8026) `inputs.vsphere` vSphere Fixed missing clustername issue 7878 - [#8020](https://github.com/influxdata/telegraf/pull/8020) `processors.starlark` improve the quality of starlark docs by executing them as tests - [#7976](https://github.com/influxdata/telegraf/pull/7976) `processors.starlark` add pivot example for starlark processor - [#7134](https://github.com/influxdata/telegraf/pull/7134) `outputs.application_insights` Added the ability to set the endpoint url - [#7908](https://github.com/influxdata/telegraf/pull/7908) `outputs.opentsdb` fix JSON handling of values NaN and Inf ## v1.15.2 [2020-07-31] ### Bug Fixes - [#7905](https://github.com/influxdata/telegraf/issues/7905): Fix RPM /var/log/telegraf permissions - [#7880](https://github.com/influxdata/telegraf/issues/7880): Fix tail following on EOF ## v1.15.1 [2020-07-22] ### Bug Fixes - [#7877](https://github.com/influxdata/telegraf/pull/7877): Fix architecture in non-amd64 deb and rpm packages. ## v1.15.0 [2020-07-22] ### Release Notes - The `logparser` input is deprecated, use the `tail` input with `data_format = "grok"` as a replacement. - The `cisco_telemetry_gnmi` input has been renamed to `gnmi` to better reflect its general support for gNMI devices. - Several fields used primarily for debugging have been removed from the `splunkmetric` serializer, if you are making use of these fields they can be added back with the `tag` option. - Telegraf's `--test` mode now runs processors and aggregators before printing metrics. - Official packages now built with Go 1.14.5. - When updating the Debian package you will no longer be prompted to merge the telegraf.conf file, instead the new version will be installed to `/etc/telegraf/telegraf.conf.sample`. The tar and zip packages now include the version in the top level directory. ### New Inputs - [nginx_sts](/plugins/inputs/nginx_sts/README.md) - Contributed by @zdmytriv - [redfish](/plugins/inputs/redfish/README.md) - Contributed by @sarvanikonda ### New Processors - [defaults](/plugins/processors/defaults/README.md) - Contributed by @jregistr - [execd](/plugins/processors/execd/README.md) - Contributed by @influxdata - [filepath](/plugins/processors/filepath/README.md) - Contributed by @kir4h - [ifname](/plugins/processors/ifname/README.md) - Contributed by @influxdata - [port_name](/plugins/processors/port_name/README.md) - Contributed by @influxdata - [reverse_dns](/plugins/processors/reverse_dns/README.md) - Contributed by @influxdata - [starlark](/plugins/processors/starlark/README.md) - Contributed by @influxdata ### New Outputs - [newrelic](/plugins/outputs/newrelic/README.md) - Contributed by @hsinghkalsi - [execd](/plugins/outputs/execd/README.md) - Contributed by @influxdata ### Features - [#7634](https://github.com/influxdata/telegraf/pull/7634): Add support for streaming processors. - [#6905](https://github.com/influxdata/telegraf/pull/6905): Add commands stats to mongodb input plugin. - [#7193](https://github.com/influxdata/telegraf/pull/7193): Add additional concurrent transaction information. - [#7223](https://github.com/influxdata/telegraf/pull/7223): Add ability to specify HTTP Headers in http_listener_v2 which will added as tags. - [#7140](https://github.com/influxdata/telegraf/pull/7140): Apply ping deadline to dns lookup. - [#7225](https://github.com/influxdata/telegraf/pull/7225): Add support for 64-bit integer types to modbus input. - [#7231](https://github.com/influxdata/telegraf/pull/7231): Add possibility to specify measurement per register. - [#7136](https://github.com/influxdata/telegraf/pull/7136): Support multiple templates for graphite serializers. - [#7250](https://github.com/influxdata/telegraf/pull/7250): Deploy telegraf configuration as a "non config" file. - [#7214](https://github.com/influxdata/telegraf/pull/7214): Add VolumeSpace query for sqlserver input with metric_version 2. - [#7304](https://github.com/influxdata/telegraf/pull/7304): Add reading bearer token from a file to http input. - [#7366](https://github.com/influxdata/telegraf/pull/7366): add support for SIGUSR1 to trigger flush. - [#7271](https://github.com/influxdata/telegraf/pull/7271): Add retry when slave is busy to modbus input. - [#7356](https://github.com/influxdata/telegraf/pull/7356): Add option to save retention policy as tag in influxdb_listener. - [#6915](https://github.com/influxdata/telegraf/pull/6915): Add support for MDS and RGW sockets to ceph input. - [#7391](https://github.com/influxdata/telegraf/pull/7391): Extract target as a tag for each rule in iptables input. - [#7434](https://github.com/influxdata/telegraf/pull/7434): Use docker log timestamp as metric time. - [#7359](https://github.com/influxdata/telegraf/pull/7359): Add cpu query to sqlserver input. - [#7464](https://github.com/influxdata/telegraf/pull/7464): Add field creation to date processor and integer unix time support. - [#7483](https://github.com/influxdata/telegraf/pull/7483): Add integer mapping support to enum processor. - [#7321](https://github.com/influxdata/telegraf/pull/7321): Add additional fields to mongodb input. - [#7491](https://github.com/influxdata/telegraf/pull/7491): Add authentication support to the http_response input plugin. - [#7503](https://github.com/influxdata/telegraf/pull/7503): Add truncate_tags setting to wavefront output. - [#7545](https://github.com/influxdata/telegraf/pull/7545): Add configurable separator graphite serializer and output. - [#7489](https://github.com/influxdata/telegraf/pull/7489): Add cluster state integer to mongodb input. - [#7515](https://github.com/influxdata/telegraf/pull/7515): Add option to disable mongodb cluster status. - [#7319](https://github.com/influxdata/telegraf/pull/7319): Add support for battery level monitoring to the fibaro input. - [#7405](https://github.com/influxdata/telegraf/pull/7405): Allow collection of HTTP Headers in http_response input. - [#7540](https://github.com/influxdata/telegraf/pull/7540): Add processor to look up service name by port. - [#7474](https://github.com/influxdata/telegraf/pull/7474): Add new once mode that write to outputs and exits. - [#7474](https://github.com/influxdata/telegraf/pull/7474): Run processors and aggregators during test mode. - [#7294](https://github.com/influxdata/telegraf/pull/7294): Add SNMPv3 trap support to snmp_trap input. - [#7646](https://github.com/influxdata/telegraf/pull/7646): Add video codec stats to nvidia-smi. - [#7651](https://github.com/influxdata/telegraf/pull/7651): Fix source field for icinga2 plugin and add tag for server hostname. - [#7619](https://github.com/influxdata/telegraf/pull/7619): Add timezone configuration to csv input data format. - [#7596](https://github.com/influxdata/telegraf/pull/7596): Add ability to collect response body as field with http_response. - [#7267](https://github.com/influxdata/telegraf/pull/7267): Add ability to add selectors as tags in kube_inventory. - [#7712](https://github.com/influxdata/telegraf/pull/7712): Add counter type to sqlserver perfmon collector. - [#7575](https://github.com/influxdata/telegraf/pull/7575): Add missing nvme attributes to smart plugin. - [#7726](https://github.com/influxdata/telegraf/pull/7726): Add laundry to mem plugin on FreeBSD. - [#7762](https://github.com/influxdata/telegraf/pull/7762): Allow per input overriding of collection_jitter and precision. - [#7686](https://github.com/influxdata/telegraf/pull/7686): Improve performance of procstat: Up to 40/120x better performance. - [#7677](https://github.com/influxdata/telegraf/pull/7677): Expand execd shim support for processor and outputs. - [#7154](https://github.com/influxdata/telegraf/pull/7154): Add v3 metadata support to ecs input. - [#7792](https://github.com/influxdata/telegraf/pull/7792): Support utf-16 in file and tail inputs. ### Bug Fixes - [#7371](https://github.com/influxdata/telegraf/issues/7371): Fix unable to write metrics to CloudWatch with IMDSv1 disabled. - [#7233](https://github.com/influxdata/telegraf/issues/7233): Fix vSphere 6.7 missing data issue. - [#7448](https://github.com/influxdata/telegraf/issues/7448): Remove debug fields from splunkmetric serializer. - [#7446](https://github.com/influxdata/telegraf/issues/7446): Fix gzip support in socket_listener with tcp sockets. - [#7390](https://github.com/influxdata/telegraf/issues/7390): Fix interval drift when round_interval is set in agent. - [#7524](https://github.com/influxdata/telegraf/pull/7524): Fix typo in total_elapsed_time_ms field of sqlserver input. - [#7203](https://github.com/influxdata/telegraf/issues/7203): Exclude csv_timestamp_column and csv_measurement_column from fields. - [#7018](https://github.com/influxdata/telegraf/issues/7018): Fix incorrect uptime when clock is adjusted. - [#6807](https://github.com/influxdata/telegraf/issues/6807): Fix memory leak when using procstat on Windows. - [#7495](https://github.com/influxdata/telegraf/issues/7495): Improve sqlserver input compatibility with older server versions. - [#7558](https://github.com/influxdata/telegraf/issues/7558): Remove trailing backslash from tag keys/values in influx serializer. - [#7715](https://github.com/influxdata/telegraf/issues/7715): Fix incorrect Azure SQL DB server properties. - [#7431](https://github.com/influxdata/telegraf/issues/7431): Fix json unmarshal error in the kibana input. - [#5633](https://github.com/influxdata/telegraf/issues/5633): Send metrics in FIFO order. ## v1.14.5 [2020-06-30] ### Bug Fixes - [#7686](https://github.com/influxdata/telegraf/pull/7686): Improve the performance of the procstat input. - [#7658](https://github.com/influxdata/telegraf/pull/7658): Fix ping exit code handling on non-Linux. - [#7718](https://github.com/influxdata/telegraf/pull/7718): Skip overs errors in the output of the sensors command. - [#7748](https://github.com/influxdata/telegraf/issues/7748): Prevent startup when tags have incorrect type in configuration file. - [#7699](https://github.com/influxdata/telegraf/issues/7699): Fix panic with GJSON multiselect query in json parser. - [#7754](https://github.com/influxdata/telegraf/issues/7754): Allow any key usage type on x509 certificate. - [#7705](https://github.com/influxdata/telegraf/issues/7705): Allow histograms and summary types without buckets or quantiles in prometheus_client output. ## v1.14.4 [2020-06-09] ### Bug Fixes - [#7325](https://github.com/influxdata/telegraf/issues/7325): Fix "cannot insert the value NULL error" with PerformanceCounters query. - [#7579](https://github.com/influxdata/telegraf/pull/7579): Fix numeric to bool conversion in converter processor. - [#7551](https://github.com/influxdata/telegraf/issues/7551): Fix typo in name of gc_cpu_fraction field of the influxdb input. - [#7617](https://github.com/influxdata/telegraf/issues/7617): Fix issue with influx stream parser blocking when data is in buffer. ## v1.14.3 [2020-05-19] ### Bug Fixes - [#7412](https://github.com/influxdata/telegraf/pull/7412): Use same timestamp for all objects in arrays in the json parser. - [#7343](https://github.com/influxdata/telegraf/issues/7343): Handle multiple metrics with the same timestamp in dedup processor. - [#5905](https://github.com/influxdata/telegraf/issues/5905): Fix reconnection of timed out HTTP2 connections influxdb outputs. - [#7468](https://github.com/influxdata/telegraf/issues/7468): Fix negative value parsing in impi_sensor input. ## v1.14.2 [2020-04-28] ### Bug Fixes - [#7241](https://github.com/influxdata/telegraf/issues/7241): Trim whitespace from instance tag in sqlserver input. - [#7322](https://github.com/influxdata/telegraf/issues/7322): Use increased AWS Cloudwatch GetMetricData limit of 500 metrics per call. - [#7318](https://github.com/influxdata/telegraf/issues/7318): Fix dimension limit on azure_monitor output. - [#7407](https://github.com/influxdata/telegraf/pull/7407): Fix 64-bit integer to string conversion in snmp input. - [#7327](https://github.com/influxdata/telegraf/issues/7327): Fix shard indices reporting in elasticsearch input. - [#7388](https://github.com/influxdata/telegraf/issues/7388): Ignore fields with NaN or Inf floats in the JSON serializer. - [#7402](https://github.com/influxdata/telegraf/issues/7402): Fix typo in name of gc_cpu_fraction field of the kapacitor input. - [#7235](https://github.com/influxdata/telegraf/issues/7235): Don't retry `create database` when using database_tag if forbidden by the server in influxdb output. - [#7406](https://github.com/influxdata/telegraf/issues/7406): Allow CR and FF inside of string fields in influx parser. ## v1.14.1 [2020-04-14] ### Bug Fixes - [#7236](https://github.com/influxdata/telegraf/issues/7236): Fix PerformanceCounter query performance degradation in sqlserver input. - [#7257](https://github.com/influxdata/telegraf/issues/7257): Fix error when using the Name field in template processor. - [#7289](https://github.com/influxdata/telegraf/pull/7289): Fix export timestamp not working for prometheus on v2. - [#7310](https://github.com/influxdata/telegraf/issues/7310): Fix exclude database and retention policy tags is shared. - [#7262](https://github.com/influxdata/telegraf/issues/7262): Fix status path when using globs in phpfpm. ## v1.14 [2020-03-26] ### Release Notes - In the `sqlserver` input, the `sqlserver_azurestats` measurement has been renamed to `sqlserver_azure_db_resource_stats` due to an issue where numeric metrics were previously being reported incorrectly as strings. - The `date` processor now uses the UTC timezone when creating its tag. In previous versions the local time was used. ### New Inputs - [clickhouse](/plugins/inputs/clickhouse/README.md) - Contributed by @kshvakov - [execd](/plugins/inputs/execd/README.md) - Contributed by @jgraichen - [eventhub_consumer](/plugins/inputs/eventhub_consumer/README.md) - Contributed by @R290 - [infiniband](/plugins/inputs/infiniband/README.md) - Contributed by @willfurnell - [lanz](/plugins/inputs/lanz/README.md): Contributed by @timhughes - [modbus](/plugins/inputs/modbus/README.md) - Contributed by @garciaolais - [monit](/plugins/inputs/monit/README.md) - Contributed by @SirishaGopigiri - [sflow](/plugins/inputs/sflow/README.md) - Contributed by @influxdata - [wireguard](/plugins/inputs/wireguard/README.md) - Contributed by @LINKIWI ### New Processors - [dedup](/plugins/processors/dedup/README.md) - Contributed by @igomura - [template](/plugins/processors/template/README.md) - Contributed by @RobMalvern - [s2geo](/plugins/processors/s2geo/README.md) - Contributed by @alespour ### New Outputs - [warp10](/plugins/outputs/warp10/README.md) - Contributed by @aurrelhebert ### Features - [#6730](https://github.com/influxdata/telegraf/pull/6730): Add page_faults for mongodb wired tiger. - [#6798](https://github.com/influxdata/telegraf/pull/6798): Add use_sudo option to ipmi_sensor input. - [#6764](https://github.com/influxdata/telegraf/pull/6764): Add ability to collect pod labels to kubernetes input. - [#6770](https://github.com/influxdata/telegraf/pull/6770): Expose unbound-control config file option. - [#6508](https://github.com/influxdata/telegraf/pull/6508): Add support for new nginx plus api endpoints. - [#6342](https://github.com/influxdata/telegraf/pull/6342): Add kafka SASL version control to support Azure Event Hub. - [#6869](https://github.com/influxdata/telegraf/pull/6869): Add RBPEX IO statistics to DatabaseIO query in sqlserver input. - [#6869](https://github.com/influxdata/telegraf/pull/6869): Add space on disk for each file to DatabaseIO query in the sqlserver input. - [#6869](https://github.com/influxdata/telegraf/pull/6869): Calculate DB Name instead of GUID in physical_db_name in the sqlserver input. - [#6733](https://github.com/influxdata/telegraf/pull/6733): Add latency stats to mongo input. - [#6844](https://github.com/influxdata/telegraf/pull/6844): Add source and port tags to jenkins_job metrics. - [#6886](https://github.com/influxdata/telegraf/pull/6886): Add date offset and timezone options to date processor. - [#6859](https://github.com/influxdata/telegraf/pull/6859): Exclude resources by inventory path in vsphere input. - [#6700](https://github.com/influxdata/telegraf/pull/6700): Allow a user defined field to be used as the graylog short_message. - [#6917](https://github.com/influxdata/telegraf/pull/6917): Add server_name override for x509_cert plugin. - [#6921](https://github.com/influxdata/telegraf/pull/6921): Add udp internal metrics for the statsd input. - [#6914](https://github.com/influxdata/telegraf/pull/6914): Add replica set tag to mongodb input. - [#6935](https://github.com/influxdata/telegraf/pull/6935): Add counters for merged reads and writes to diskio input. - [#6982](https://github.com/influxdata/telegraf/pull/6982): Add support for titlecase transformation to strings processor. - [#6993](https://github.com/influxdata/telegraf/pull/6993): Add support for MDB database information to openldap input. - [#6957](https://github.com/influxdata/telegraf/pull/6957): Add new fields for Jenkins total and busy executors. - [#7035](https://github.com/influxdata/telegraf/pull/7035): Fix dash to underscore replacement when handling embedded tags in Cisco MDT. - [#7039](https://github.com/influxdata/telegraf/pull/7039): Add process created_at time to procstat input. - [#7022](https://github.com/influxdata/telegraf/pull/7022): Add support for credentials file to nats_consumer and nats output. - [#7065](https://github.com/influxdata/telegraf/pull/7065): Add additional tags and fields to apcupsd. - [#7084](https://github.com/influxdata/telegraf/pull/7084): Add RabbitMQ slave_nodes and synchronized_slave_nodes metrics. - [#7089](https://github.com/influxdata/telegraf/pull/7089): Allow globs in FPM unix socket paths. - [#7071](https://github.com/influxdata/telegraf/pull/7071): Add non-cumulative histogram to histogram aggregator. - [#6969](https://github.com/influxdata/telegraf/pull/6969): Add label and field selectors to prometheus input k8s discovery. - [#7049](https://github.com/influxdata/telegraf/pull/7049): Add support for converting tag or field to measurement in converter processor. - [#7103](https://github.com/influxdata/telegraf/pull/7103): Add volume_mount_point to DatabaseIO query in sqlserver input. - [#7142](https://github.com/influxdata/telegraf/pull/7142): Add topic tag options to kafka output. - [#7141](https://github.com/influxdata/telegraf/pull/7141): Add support for setting InfluxDB retention policy using tag. - [#7163](https://github.com/influxdata/telegraf/pull/7163): Add Database IO Tempdb per Azure DB to sqlserver input. - [#7150](https://github.com/influxdata/telegraf/pull/7150): Add option for explicitly including queries in sqlserver input. - [#7173](https://github.com/influxdata/telegraf/pull/7173): Add support for GNMI DecimalVal type to cisco_telemetry_gnmi. ### Bug Fixes - [#6397](https://github.com/influxdata/telegraf/issues/6397): Fix conversion to floats in AzureDBResourceStats query in the sqlserver input. - [#6867](https://github.com/influxdata/telegraf/issues/6867): Fix case sensitive collation in sqlserver input. - [#7005](https://github.com/influxdata/telegraf/pull/7005): Search for chronyc only when chrony input plugin is enabled. - [#2280](https://github.com/influxdata/telegraf/issues/2280): Fix request to InfluxDB Listener failing with EOF. - [#6124](https://github.com/influxdata/telegraf/issues/6124): Fix InfluxDB listener to continue parsing after error. - [#7133](https://github.com/influxdata/telegraf/issues/7133): Fix log rotation to use actual file size instead of bytes written. - [#7103](https://github.com/influxdata/telegraf/pull/7103): Fix several issues with DatabaseIO query in sqlserver input. - [#7119](https://github.com/influxdata/telegraf/pull/7119): Fix internal metrics for output split into multiple lines. - [#7021](https://github.com/influxdata/telegraf/pull/7021): Fix schedulers query compatibility with pre SQL-2016. - [#7182](https://github.com/influxdata/telegraf/pull/7182): Set headers on influxdb_listener ping URL. - [#7165](https://github.com/influxdata/telegraf/issues/7165): Fix url encoding of job names in jenkins input plugin. ================================================ FILE: CODE_OF_CONDUCT.md ================================================ # Contributor Covenant Code of Conduct ## Our Pledge We as members, contributors, and leaders pledge to make participation in our community a harassment-free experience for everyone, regardless of age, body size, visible or invisible disability, ethnicity, sex characteristics, gender identity and expression, level of experience, education, socio-economic status, nationality, personal appearance, race, caste, color, religion, or sexual identity and orientation. We pledge to act and interact in ways that contribute to an open, welcoming, diverse, inclusive, and healthy community. ## Our Standards Examples of behavior that contributes to a positive environment for our community include: * Demonstrating empathy and kindness toward other people * Being respectful of differing opinions, viewpoints, and experiences * Giving and gracefully accepting constructive feedback * Accepting responsibility and apologizing to those affected by our mistakes, and learning from the experience * Focusing on what is best not just for us as individuals, but for the overall community Examples of unacceptable behavior include: * The use of sexualized language or imagery, and sexual attention or advances of any kind * Trolling, insulting or derogatory comments, and personal or political attacks * Public or private harassment * Publishing others' private information, such as a physical or email address, without their explicit permission * Other conduct which could reasonably be considered inappropriate in a professional setting ## Enforcement Responsibilities Community leaders are responsible for clarifying and enforcing our standards of acceptable behavior and will take appropriate and fair corrective action in response to any behavior that they deem inappropriate, threatening, offensive, or harmful. Community leaders have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions that are not aligned to this Code of Conduct, and will communicate reasons for moderation decisions when appropriate. ## Scope This Code of Conduct applies within all community spaces, and also applies when an individual is officially representing the community in public spaces. Examples of representing our community include using an official e-mail address, posting via an official social media account, or acting as an appointed representative at an online or offline event. ## Enforcement Instances of abusive, harassing, or otherwise unacceptable behavior may be reported to the community leaders responsible for enforcement at `community@influxdata.com`. All complaints will be reviewed and investigated promptly and fairly. All community leaders are obligated to respect the privacy and security of the reporter of any incident. ## Attribution This Code of Conduct is adapted from the [Contributor Covenant][homepage], [version 2.1][v2.1]. [homepage]: https://www.contributor-covenant.org [v2.1]: https://www.contributor-covenant.org/version/2/1/code_of_conduct.html ================================================ FILE: CONTRIBUTING.md ================================================ # Contributing to Telegraf There are many ways to get involved in the Telegraf project! From opening issues, creating pull requests, to joining the conversation in Slack. We would love to see you contribute your expertise and join our community. To get started review this document to learn best practices. ![tiger](assets/GopherAndTiger.png "tiger") ## Opening Issues ### Bug reports Before you file an issue, please search existing issues in case it has already been filed, or perhaps even fixed. If you file an issue, please ensure you include all the requested details (e.g. Telegraf config, logs, platform, etc.) Please note that issues are not the place to file general support requests such as "How do I use the mongoDB plugin?" Questions of this nature should be sent to the [Community Slack][slack] or [Community Page][forum], not filed as issues. [slack]: https://influxdata.com/slack [forum]: https://community.influxdata.com/ ### Feature requests We really like to receive feature requests as it helps us prioritize our work. Before you file a feature request, please search existing issues, you can filter issues that have the label `feature request`. Please be clear about your requirements and goals, help us to understand what you would like to see added to Telegraf with examples and the reasons why it is important to you. If you find your feature request already exists as a Github issue please indicate your support for that feature by using the "thumbs up" reaction. ### Support questions We recommend posting support questions in our [Community Slack][slack] or [Community Page][forum], we have a lot of talented community members there who could help answer your question more quickly. ## Contributing code ### AI Generated Code We currently cannot accept AI generated code contributions. Code contributed should be your own per the CLA. ### Creating a pull request 1. [Sign the CLA][cla]. 2. Open a [new issue][] to discuss the changes you would like to make. This is not strictly required but it may help reduce the amount of rework you need to do later. 3. Make changes or write plugin using the guidelines in the following documents: - [Input Plugins][inputs] - [Processor Plugins][processors] - [Aggregator Plugins][aggregators] - [Output Plugins][outputs] 4. Ensure you have added proper unit tests and documentation. 5. Open a new [pull request][]. 6. The pull request title needs to follow [conventional commit format][semcommit] > [!NOTE] > If you have a pull request with only one commit, then that commit needs to > follow the conventional commit format or the `Semantic Pull Request` check > will fail. This is because github will use the pull request title if there are > multiple commits, but if there is only one commit it will use it instead. [semcommit]: https://www.conventionalcommits.org/en/v1.0.0/#summary ### When will your contribution get released? We have two kinds of releases: patch releases, which happen every few weeks, and feature releases, which happen once a quarter. If your fix is a bug fix, it will be released in the next patch release after it is merged to master. If your release is a new plugin or other feature, it will be released in the next quarterly release after it is merged to master. Quarterly releases are on the third Wednesday of March, June, September, and December. ### Contributing an External Plugin Input, output, and processor plugins written for internal Telegraf can be run as externally-compiled plugins through the [Execd Input](/plugins/inputs/execd), [Execd Output](/plugins/outputs/execd), and [Execd Processor](/plugins/processors/execd) Plugins without having to change the plugin code. Follow the guidelines of how to integrate your plugin with the [Execd Go Shim](/plugins/common/shim) to easily compile it as a separate app and run it with the respective `execd` plugin. Check out our [guidelines](/docs/EXTERNAL_PLUGINS.md#external-plugin-guidelines) on how to build and set up your external plugins to run with `execd`. ## Security Vulnerability Reporting InfluxData takes security and our users' trust very seriously. If you believe you have found a security issue in any of our open source projects, please responsibly disclose it by contacting `security@influxdata.com`. More details about security vulnerability reporting, including our GPG key, [can be found here][gpg_key]. [gpg_key]: https://www.influxdata.com/how-to-report-security-vulnerabilities/ ## Common development tasks **Adding a dependency:** Telegraf uses Go modules. Assuming you can already build the project, run this in the telegraf directory: 1. `go get github.com/[dependency]/[new-package]` **Before opening a PR:** Before opening a pull request you should run the following checks locally to make sure the CI will pass. ```shell make lint make check make check-deps make test make docs ``` **Execute integration tests:** (Optional) To run only the integration tests use: ```shell make test-integration ``` To run the full test suite use: ```shell make test-all ``` ### For more developer resources - [Code Style][codestyle] - [Deprecation][deprecation] - [Logging][logging] - [Metric Format Changes][metricformat] - [Packaging][packaging] - [Profiling][profiling] - [Reviews][reviews] - [Sample Config][sample config] - [Code of Conduct][code of conduct] [cla]: https://www.influxdata.com/legal/cla/ [new issue]: https://github.com/influxdata/telegraf/issues/new/choose [pull request]: https://github.com/influxdata/telegraf/compare [inputs]: /docs/INPUTS.md [processors]: /docs/PROCESSORS.md [aggregators]: /docs/AGGREGATORS.md [outputs]: /docs/OUTPUTS.md [codestyle]: /docs/developers/CODE_STYLE.md [deprecation]: /docs/developers/DEPRECATION.md [logging]: /docs/developers/LOGGING.md [metricformat]: /docs/developers/METRIC_FORMAT_CHANGES.md [packaging]: /docs/developers/PACKAGING.md [profiling]: /docs/developers/PROFILING.md [reviews]: /docs/developers/REVIEWS.md [sample config]: /docs/developers/SAMPLE_CONFIG.md [code of conduct]: /CODE_OF_CONDUCT.md ================================================ FILE: EXTERNAL_PLUGINS.md ================================================ # External Plugins This is a list of plugins that can be compiled outside of Telegraf and used via the `execd` [input](/plugins/inputs/execd), [output](/plugins/outputs/execd), or [processor](/plugins/processors/execd). Check out the [external plugin documentation](/docs/EXTERNAL_PLUGINS.md) for more information on writing and contributing a plugin. Pull requests welcome. ## Inputs - [awsalarms](https://github.com/vipinvkmenon/awsalarms) - Simple plugin to gather/monitor alarms generated in AWS. - [octoprint](https://github.com/BattleBas/octoprint-telegraf-plugin) - Gather 3d print information from the octoprint API. - [opcda](https://github.com/lpc921/telegraf-execd-opcda) - Gather data from [OPC Foundation's Data Access (DA)](https://opcfoundation.org/about/opc-technologies/opc-classic/) protocol for industrial automation. - [open-hardware-monitor](https://github.com/marianob85/open_hardware_monitor-telegraf-plugin) - Gather sensors data provided by [Open Hardware Monitor](http://openhardwaremonitor.org) - [plex](https://github.com/russorat/telegraf-webhooks-plex) - Listens for events from Plex Media Server [Webhooks](https://support.plex.tv/articles/115002267687-webhooks/). - [rand](https://github.com/ssoroka/rand) - Generate random numbers - [SMCIPMITool](https://github.com/jhpope/smc_ipmi) - Python script to parse the output of [SMCIPMITool](https://www.supermicro.com/en/solutions/management-software/ipmi-utilities) into [InfluxDB line protocol](https://docs.influxdata.com/influxdb/latest/reference/syntax/line-protocol/). - [systemd-timings](https://github.com/pdmorrow/telegraf-execd-systemd-timings) - Gather systemd boot and unit timestamp metrics. - [twitter](https://github.com/inabagumi/twitter-telegraf-plugin) - Gather account information from Twitter accounts - [youtube](https://github.com/inabagumi/youtube-telegraf-plugin) - Gather account information from YouTube channels - [Big Blue Button](https://github.com/bigblueswarm/bigbluebutton-telegraf-plugin) - Gather meetings information from [Big Blue Button](https://bigbluebutton.org/) server - [dnsmasq](https://github.com/machinly/dnsmasq-telegraf-plugin) - Gather dnsmasq statistics from dnsmasq - [ldap_org and ds389](https://github.com/falon/CSI-telegraf-plugins) - Gather statistics from 389ds and from LDAP trees. - [x509_crl](https://github.com/jcgonnard/telegraf-input-x590crl) - Gather information from your X509 CRL files - [s7comm](https://github.com/nicolasme/s7comm) - Gather information from Siemens PLC - [net_irtt](https://github.com/iAnatoly/telegraf-input-net_irtt) - Gather information from IRTT network test - [dht_sensor](https://github.com/iAnatoly/telegraf-input-dht_sensor) - Gather temperature and humidity from DHTXX sensors - [oracle](https://github.com/bonitoo-io/telegraf-input-oracle) - Gather the statistic data from Oracle RDBMS - [db2](https://github.com/bonitoo-io/telegraf-input-db2) - Gather the statistic data from DB2 RDBMS - [apt](https://github.com/x70b1/telegraf-apt) - Check Debian for package updates. - [knot](https://github.com/x70b1/telegraf-knot) - Collect stats from Knot DNS. - [linux-psi-telegraf-plugin](https://github.com/gridscale/linux-psi-telegraf-plugin) - Gather pressure stall information ([PSI](https://facebookmicrosites.github.io/psi/)) from the Linux Kernel - [hwinfo](https://github.com/zachstence/hwinfo-telegraf-plugin) - Gather Windows system hardware information from [HWiNFO](https://www.hwinfo.com/) - [libvirt](https://gitlab.com/warrenio/tools/telegraf-input-libvirt) - Gather libvirt domain stats, based on a historical Telegraf implementation [libvirt](https://libvirt.org/) - [bacnet](https://github.com/JurajMarcin/telegraf-bacnet) - Gather statistics from BACnet devices, with support for device discovery and Change of Value subscriptions - [tado](https://github.com/zoeimogen/tado-telegraf-plugin) - Gather zone temperature settings and current temperature/humidity readings from Tado - [homekit](https://github.com/hdecarne-github/homekit-telegraf-plugin) - Gather smart home statistics from [HomeKit](https://en.wikipedia.org/wiki/HomeKit) devices via Home Hub automation ## Outputs - [kinesis](https://github.com/morfien101/telegraf-output-kinesis) - Aggregation and compression of metrics to send Amazon Kinesis. - [firehose](https://github.com/muhlba91/telegraf-output-kinesis-data-firehose) - Sends metrics in batches to Amazon Kinesis Data Firehose. - [playfab](https://github.com/dgkanatsios/telegraftoplayfab) - Sends metrics to [Azure PlayFab](https://learn.microsoft.com/en-us/gaming/playfab/). ## Processors - [geoip](https://github.com/a-bali/telegraf-geoip) - Add GeoIP information to IP addresses. - [metadata](https://github.com/lawdt/metadata) - Appends metadata gathered from Openstack to metrics. ================================================ FILE: LICENSE ================================================ The MIT License (MIT) Copyright (c) 2015-2025 InfluxData Inc. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ================================================ FILE: Makefile ================================================ ifneq (,$(filter $(OS),Windows_NT Windows)) EXEEXT=.exe endif cat := $(if $(filter $(OS),sh.exe),type,cat) next_version := $(shell $(cat) build_version.txt) tag := $(shell git describe --exact-match --tags 2>/dev/null) branch := $(shell git rev-parse --abbrev-ref HEAD) commit := $(shell git rev-parse --short=8 HEAD) ifdef NIGHTLY version := $(next_version) rpm_version := nightly rpm_iteration := 0 deb_version := nightly deb_iteration := 0 tar_version := nightly else ifeq ($(tag),) version := $(next_version) rpm_version := $(version)~$(commit)-0 rpm_iteration := 0 deb_version := $(version)~$(commit)-0 deb_iteration := 0 tar_version := $(version)~$(commit) else ifneq ($(findstring -rc,$(tag)),) version := $(word 1,$(subst -, ,$(tag))) version := $(version:v%=%) rc := $(word 2,$(subst -, ,$(tag))) rpm_version := $(version)-0.$(rc) rpm_iteration := 0.$(subst rc,,$(rc)) deb_version := $(version)~$(rc)-1 deb_iteration := 0 tar_version := $(version)~$(rc) else version := $(tag:v%=%) rpm_version := $(version)-1 rpm_iteration := 1 deb_version := $(version)-1 deb_iteration := 1 tar_version := $(version) endif MAKEFLAGS += --no-print-directory GOOS ?= $(shell go env GOOS) GOARCH ?= $(shell go env GOARCH) HOSTGO := env -u GOOS -u GOARCH -u GOARM -- go INTERNAL_PKG=github.com/influxdata/telegraf/internal LDFLAGS := $(LDFLAGS) -X $(INTERNAL_PKG).Commit=$(commit) -X $(INTERNAL_PKG).Branch=$(branch) ifneq ($(tag),) LDFLAGS += -X $(INTERNAL_PKG).Version=$(version) else LDFLAGS += -X $(INTERNAL_PKG).Version=$(version)-$(commit) endif # Go built-in race detector works only for 64 bits architectures. ifneq ($(GOARCH), 386) # Resolve macOS issue with Xcode 15 when running in race detector mode # https://github.com/golang/go/issues/61229 ifeq ($(GOOS), darwin) race_detector := -race -ldflags=-extldflags=-Wl,-ld_classic else race_detector := -race endif endif GOFILES ?= $(shell git ls-files '*.go') GOFMT ?= $(shell gofmt -l -s $(filter-out plugins/parsers/influx/machine.go, $(GOFILES))) prefix ?= /usr/local bindir ?= $(prefix)/bin sysconfdir ?= $(prefix)/etc localstatedir ?= $(prefix)/var pkgdir ?= build/dist .PHONY: all all: deps docs telegraf .PHONY: help help: @echo 'Targets:' @echo ' all - download dependencies and compile telegraf binary' @echo ' config - generate the config from current repo state' @echo ' deps - download dependencies' @echo ' docs - embed sample-configurations into READMEs' @echo ' telegraf - compile telegraf binary' @echo ' test - run short unit tests' @echo ' fmt - format source files' @echo ' tidy - tidy go modules' @echo ' lint - run linter' @echo ' lint-branch - run linter on changes in current branch since master' @echo ' lint-install - install linter' @echo ' check-deps - check docs/LICENSE_OF_DEPENDENCIES.md' @echo ' clean - delete build artifacts' @echo ' package - build all supported packages, override include_packages to only build a subset' @echo ' e.g.: make package include_packages="amd64.deb"' @echo '' @echo 'Possible values for include_packages variable' @$(foreach package,$(include_packages),echo " $(package)";) @echo '' @echo 'Resulting package name format (where arch will be the arch of the package):' @echo ' telegraf_$(deb_version)_arch.deb' @echo ' telegraf-$(rpm_version).arch.rpm' @echo ' telegraf-$(tar_version)_arch.tar.gz' @echo ' telegraf-$(tar_version)_arch.zip' .PHONY: deps deps: go mod download -x .PHONY: version version: @echo $(version)-$(commit) build_tools: $(HOSTGO) build -o ./tools/custom_builder/custom_builder$(EXEEXT) ./tools/custom_builder $(HOSTGO) build -o ./tools/license_checker/license_checker$(EXEEXT) ./tools/license_checker $(HOSTGO) build -o ./tools/readme_config_includer/generator$(EXEEXT) ./tools/readme_config_includer/generator.go $(HOSTGO) build -o ./tools/config_includer/generator$(EXEEXT) ./tools/config_includer/generator.go $(HOSTGO) build -o ./tools/readme_linter/readme_linter$(EXEEXT) ./tools/readme_linter embed_readme_%: go generate -run="tools/config_includer/generator" ./plugins/$*/... go generate -run="tools/readme_config_includer/generator" ./plugins/$*/... .PHONY: config config: @echo "generating default config" go run ./cmd/telegraf config > etc/telegraf.conf .PHONY: docs docs: build_tools embed_readme_common embed_readme_inputs embed_readme_outputs embed_readme_processors embed_readme_aggregators embed_readme_secretstores .PHONY: build build: CGO_ENABLED=0 go build -tags "$(BUILDTAGS)" -ldflags "$(LDFLAGS)" ./cmd/telegraf .PHONY: telegraf telegraf: build # Used by dockerfile builds .PHONY: go-install go-install: go install -mod=mod -ldflags "-w -s $(LDFLAGS)" ./cmd/telegraf .PHONY: test test: go test -short $(race_detector) ./... .PHONY: test-integration test-integration: go test -run Integration $(race_detector) ./... .PHONY: fmt fmt: @gofmt -s -w $(filter-out plugins/parsers/influx/machine.go, $(GOFILES)) .PHONY: fmtcheck fmtcheck: @if [ ! -z "$(GOFMT)" ]; then \ echo "[ERROR] gofmt has found errors in the following files:" ; \ echo "$(GOFMT)" ; \ echo "" ;\ echo "Run make fmt to fix them." ; \ exit 1 ;\ fi .PHONY: vet vet: @echo 'go vet $$(go list ./... | grep -v ./plugins/parsers/influx)' @go vet $$(go list ./... | grep -v ./plugins/parsers/influx) ; if [ $$? -ne 0 ]; then \ echo ""; \ echo "go vet has found suspicious constructs. Please remediate any reported errors"; \ echo "to fix them before submitting code for review."; \ exit 1; \ fi .PHONY: lint-install lint-install: @echo "Installing golangci-lint" go install github.com/golangci/golangci-lint/v2/cmd/golangci-lint@v2.7.2 @echo "Installing markdownlint" npm install -g markdownlint-cli .PHONY: lint lint: @which golangci-lint >/dev/null 2>&1 || { \ echo "golangci-lint not found, please run: make lint-install"; \ exit 1; \ } golangci-lint run @which markdownlint >/dev/null 2>&1 || { \ echo "markdownlint not found, please run: make lint-install"; \ exit 1; \ } markdownlint . .PHONY: lint-branch lint-branch: @which golangci-lint >/dev/null 2>&1 || { \ echo "golangci-lint not found, please run: make lint-install"; \ exit 1; \ } golangci-lint run .PHONY: vuln-install vuln-install: @echo "Installing govulncheck" go install golang.org/x/vuln/cmd/govulncheck@latest .PHONY: vuln vuln: @which govulncheck >/dev/null 2>&1 || { \ echo "govulncheck not found, please run: make vuln-install"; \ exit 1; \ } govulncheck ./... .PHONY: tidy tidy: go mod verify go mod tidy @if ! git diff --quiet go.mod go.sum; then \ echo "please run go mod tidy and check in changes, you might have to use the same version of Go as the CI"; \ exit 1; \ fi .PHONY: check check: fmtcheck vet .PHONY: test-all test-all: fmtcheck vet go test $(race_detector) ./... .PHONY: check-deps check-deps: ./scripts/check-deps.sh .PHONY: clean clean: rm -f telegraf rm -f telegraf.exe rm -f etc/telegraf.conf rm -rf build rm -rf cmd/telegraf/resource.syso rm -rf cmd/telegraf/versioninfo.json rm -rf tools/config_includer/generator rm -rf tools/config_includer/generator.exe rm -rf tools/custom_builder/custom_builder rm -rf tools/custom_builder/custom_builder.exe rm -rf tools/license_checker/license_checker rm -rf tools/license_checker/license_checker.exe rm -rf tools/package_incus_test/package_incus_test rm -rf tools/package_incus_test/package_incus_test.exe rm -rf tools/readme_config_includer/generator rm -rf tools/readme_config_includer/generator.exe rm -rf tools/readme_linter/readme_linter rm -rf tools/readme_linter/readme_linter.exe .PHONY: docker-image docker-image: docker build -f scripts/buster.docker -t "telegraf:$(commit)" . plugins/parsers/influx/machine.go: plugins/parsers/influx/machine.go.rl ragel -Z -G2 $^ -o $@ .PHONY: ci ci: docker build -t quay.io/influxdb/telegraf-ci:1.25.7 - < scripts/ci.docker docker push quay.io/influxdb/telegraf-ci:1.25.7 .PHONY: install install: $(buildbin) @mkdir -pv $(DESTDIR)$(bindir) @mkdir -pv $(DESTDIR)$(sysconfdir) @mkdir -pv $(DESTDIR)$(localstatedir) @if [ $(GOOS) != "windows" ]; then mkdir -pv $(DESTDIR)$(sysconfdir)/logrotate.d; fi @if [ $(GOOS) != "windows" ]; then mkdir -pv $(DESTDIR)$(localstatedir)/log/telegraf; fi @if [ $(GOOS) != "windows" ]; then mkdir -pv $(DESTDIR)$(sysconfdir)/telegraf/telegraf.d; fi @cp -fv $(buildbin) $(DESTDIR)$(bindir) @if [ $(GOOS) != "windows" ]; then cp -fv etc/telegraf.conf $(DESTDIR)$(sysconfdir)/telegraf/telegraf.conf$(conf_suffix); fi @if [ $(GOOS) != "windows" ]; then cp -fv etc/logrotate.d/telegraf $(DESTDIR)$(sysconfdir)/logrotate.d; fi @if [ $(GOOS) = "windows" ]; then cp -fv etc/telegraf.conf $(DESTDIR)/telegraf.conf; fi @if [ $(GOOS) = "linux" ]; then mkdir -pv $(DESTDIR)$(prefix)/lib/telegraf/scripts; fi @if [ $(GOOS) = "linux" ]; then cp -fv scripts/telegraf.service $(DESTDIR)$(prefix)/lib/telegraf/scripts; fi @if [ $(GOOS) = "linux" ]; then cp -fv scripts/init.sh $(DESTDIR)$(prefix)/lib/telegraf/scripts; fi # Telegraf build per platform. This improves package performance by sharing # the bin between deb/rpm/tar packages over building directly into the package # directory. .PHONY: $(buildbin) $(buildbin): echo $(GOOS) @mkdir -pv $(dir $@) CGO_ENABLED=0 go build -o $(dir $@) -tags "$(BUILDTAGS)" -ldflags "$(LDFLAGS)" ./cmd/telegraf # Define packages Telegraf supports, organized by architecture with a rule to echo the list to limit include_packages # e.g. make package include_packages="$(make amd64)" mips += linux_mips.tar.gz mips.deb .PHONY: mips mips: @ echo $(mips) mipsel += mipsel.deb linux_mipsel.tar.gz .PHONY: mipsel mipsel: @ echo $(mipsel) loong64 += linux_loong64.tar.gz loong64.deb loongarch64.rpm .PHONY: loong64 loong64: @ echo $(loong64) arm64 += linux_arm64.tar.gz arm64.deb aarch64.rpm .PHONY: arm64 arm64: @ echo $(arm64) amd64 += freebsd_amd64.tar.gz linux_amd64.tar.gz amd64.deb x86_64.rpm .PHONY: amd64 amd64: @ echo $(amd64) armel += linux_armel.tar.gz armel.rpm armel.deb .PHONY: armel armel: @ echo $(armel) armhf += linux_armhf.tar.gz freebsd_armv7.tar.gz armhf.deb armv6hl.rpm .PHONY: armhf armhf: @ echo $(armhf) s390x += linux_s390x.tar.gz s390x.deb s390x.rpm .PHONY: riscv64 riscv64: @ echo $(riscv64) riscv64 += linux_riscv64.tar.gz riscv64.rpm riscv64.deb .PHONY: s390x s390x: @ echo $(s390x) ppc64le += linux_ppc64le.tar.gz ppc64le.rpm ppc64el.deb .PHONY: ppc64le ppc64le: @ echo $(ppc64le) i386 += freebsd_i386.tar.gz i386.deb linux_i386.tar.gz i386.rpm .PHONY: i386 i386: @ echo $(i386) windows += windows_i386.zip windows_amd64.zip windows_arm64.zip .PHONY: windows windows: @ echo $(windows) darwin-amd64 += darwin_amd64.tar.gz .PHONY: darwin-amd64 darwin-amd64: @ echo $(darwin-amd64) darwin-arm64 += darwin_arm64.tar.gz .PHONY: darwin-arm64 darwin-arm64: @ echo $(darwin-arm64) include_packages := $(mips) $(mipsel) $(arm64) $(amd64) $(armel) $(armhf) $(riscv64) $(loong64) $(s390x) $(ppc64le) $(i386) $(windows) $(darwin-amd64) $(darwin-arm64) .PHONY: package package: docs config $(include_packages) .PHONY: $(include_packages) $(include_packages): if [ "$(suffix $@)" = ".zip" ]; then go generate cmd/telegraf/telegraf_windows.go; fi @$(MAKE) install @mkdir -p $(pkgdir) @if [ "$(suffix $@)" = ".rpm" ]; then \ echo "# DO NOT EDIT OR REMOVE" > $(DESTDIR)$(sysconfdir)/telegraf/telegraf.d/.ignore; \ echo "# This file prevents the rpm from changing permissions on this directory" >> $(DESTDIR)$(sysconfdir)/telegraf/telegraf.d/.ignore; \ fpm --force \ --log info \ --architecture $(basename $@) \ --input-type dir \ --output-type rpm \ --vendor InfluxData \ --url https://github.com/influxdata/telegraf \ --license MIT \ --maintainer support@influxdb.com \ --config-files /etc/telegraf/telegraf.conf \ --config-files /etc/telegraf/telegraf.d/.ignore \ --config-files /etc/logrotate.d/telegraf \ --after-install scripts/rpm/post-install.sh \ --before-install scripts/rpm/pre-install.sh \ --after-remove scripts/rpm/post-remove.sh \ --description "Plugin-driven server agent for reporting metrics into InfluxDB." \ --depends coreutils \ --rpm-digest sha256 \ --rpm-posttrans scripts/rpm/post-install.sh \ --rpm-os ${GOOS} \ --rpm-tag "Requires(pre): /usr/sbin/useradd" \ --rpm-tag "Recommends: influxdata-archive-keyring" \ --name telegraf \ --version $(version) \ --iteration $(rpm_iteration) \ --chdir $(DESTDIR) \ --package $(pkgdir)/telegraf-$(rpm_version).$@ ;\ elif [ "$(suffix $@)" = ".deb" ]; then \ fpm --force \ --log info \ --architecture $(basename $@) \ --input-type dir \ --output-type deb \ --vendor InfluxData \ --url https://github.com/influxdata/telegraf \ --license MIT \ --maintainer support@influxdb.com \ --config-files /etc/telegraf/telegraf.conf.sample \ --config-files /etc/logrotate.d/telegraf \ --after-install scripts/deb/post-install.sh \ --before-install scripts/deb/pre-install.sh \ --after-remove scripts/deb/post-remove.sh \ --before-remove scripts/deb/pre-remove.sh \ --description "Plugin-driven server agent for reporting metrics into InfluxDB." \ --deb-recommends "influxdata-archive-keyring" \ --name telegraf \ --version $(version) \ --iteration $(deb_iteration) \ --chdir $(DESTDIR) \ --package $(pkgdir)/telegraf_$(deb_version)_$@ ;\ elif [ "$(suffix $@)" = ".zip" ]; then \ (cd $(dir $(DESTDIR)) && zip -r - ./*) > $(pkgdir)/telegraf-$(tar_version)_$@ ;\ elif [ "$(suffix $@)" = ".gz" ]; then \ tar --owner 0 --group 0 -czvf $(pkgdir)/telegraf-$(tar_version)_$@ -C $(dir $(DESTDIR)) . ;\ fi amd64.deb x86_64.rpm linux_amd64.tar.gz: export GOOS := linux amd64.deb x86_64.rpm linux_amd64.tar.gz: export GOARCH := amd64 i386.deb i386.rpm linux_i386.tar.gz: export GOOS := linux i386.deb i386.rpm linux_i386.tar.gz: export GOARCH := 386 armel.deb armel.rpm linux_armel.tar.gz: export GOOS := linux armel.deb armel.rpm linux_armel.tar.gz: export GOARCH := arm armel.deb armel.rpm linux_armel.tar.gz: export GOARM := 5 armhf.deb armv6hl.rpm linux_armhf.tar.gz: export GOOS := linux armhf.deb armv6hl.rpm linux_armhf.tar.gz: export GOARCH := arm armhf.deb armv6hl.rpm linux_armhf.tar.gz: export GOARM := 6 arm64.deb aarch64.rpm linux_arm64.tar.gz: export GOOS := linux arm64.deb aarch64.rpm linux_arm64.tar.gz: export GOARCH := arm64 arm64.deb aarch64.rpm linux_arm64.tar.gz: export GOARM := 7 mips.deb linux_mips.tar.gz: export GOOS := linux mips.deb linux_mips.tar.gz: export GOARCH := mips mipsel.deb linux_mipsel.tar.gz: export GOOS := linux mipsel.deb linux_mipsel.tar.gz: export GOARCH := mipsle riscv64.deb riscv64.rpm linux_riscv64.tar.gz: export GOOS := linux riscv64.deb riscv64.rpm linux_riscv64.tar.gz: export GOARCH := riscv64 loong64.deb loongarch64.rpm linux_loong64.tar.gz: export GOOS := linux loong64.deb loongarch64.rpm linux_loong64.tar.gz: export GOARCH := loong64 s390x.deb s390x.rpm linux_s390x.tar.gz: export GOOS := linux s390x.deb s390x.rpm linux_s390x.tar.gz: export GOARCH := s390x ppc64el.deb ppc64le.rpm linux_ppc64le.tar.gz: export GOOS := linux ppc64el.deb ppc64le.rpm linux_ppc64le.tar.gz: export GOARCH := ppc64le freebsd_amd64.tar.gz: export GOOS := freebsd freebsd_amd64.tar.gz: export GOARCH := amd64 freebsd_i386.tar.gz: export GOOS := freebsd freebsd_i386.tar.gz: export GOARCH := 386 freebsd_armv7.tar.gz: export GOOS := freebsd freebsd_armv7.tar.gz: export GOARCH := arm freebsd_armv7.tar.gz: export GOARM := 7 windows_amd64.zip: export GOOS := windows windows_amd64.zip: export GOARCH := amd64 windows_arm64.zip: export GOOS := windows windows_arm64.zip: export GOARCH := arm64 darwin_amd64.tar.gz: export GOOS := darwin darwin_amd64.tar.gz: export GOARCH := amd64 darwin_arm64.tar.gz: export GOOS := darwin darwin_arm64.tar.gz: export GOARCH := arm64 windows_i386.zip: export GOOS := windows windows_i386.zip: export GOARCH := 386 windows_i386.zip windows_amd64.zip windows_arm64.zip: export prefix = windows_i386.zip windows_amd64.zip windows_arm64.zip: export bindir = $(prefix) windows_i386.zip windows_amd64.zip windows_arm64.zip: export sysconfdir = $(prefix) windows_i386.zip windows_amd64.zip windows_arm64.zip: export localstatedir = $(prefix) windows_i386.zip windows_amd64.zip windows_arm64.zip: export EXEEXT := .exe %.deb: export pkg := deb %.deb: export prefix := /usr %.deb: export conf_suffix := .sample %.deb: export sysconfdir := /etc %.deb: export localstatedir := /var %.rpm: export pkg := rpm %.rpm: export prefix := /usr %.rpm: export sysconfdir := /etc %.rpm: export localstatedir := /var %.tar.gz: export pkg := tar %.tar.gz: export prefix := /usr %.tar.gz: export sysconfdir := /etc %.tar.gz: export localstatedir := /var %.zip: export pkg := zip %.zip: export prefix := / %.deb %.rpm %.tar.gz %.zip: export DESTDIR = build/$(GOOS)-$(GOARCH)$(GOARM)-$(pkg)/telegraf-$(version) %.deb %.rpm %.tar.gz %.zip: export buildbin = build/$(GOOS)-$(GOARCH)$(GOARM)/telegraf$(EXEEXT) %.deb %.rpm %.tar.gz %.zip: export LDFLAGS = -w -s ================================================ FILE: README.md ================================================ # ![tiger](assets/TelegrafTigerSmall.png "tiger") Telegraf [![GoDoc](https://img.shields.io/badge/doc-reference-00ADD8.svg?logo=go)](https://godoc.org/github.com/influxdata/telegraf) [![Docker pulls](https://img.shields.io/docker/pulls/library/telegraf.svg)](https://hub.docker.com/_/telegraf/) [![Go Report Card](https://goreportcard.com/badge/github.com/influxdata/telegraf)](https://goreportcard.com/report/github.com/influxdata/telegraf) [![Circle CI](https://circleci.com/gh/influxdata/telegraf.svg?style=svg)](https://circleci.com/gh/influxdata/telegraf) Telegraf is an agent for collecting, processing, aggregating, and writing metrics, logs, and other arbitrary data. * Offers a comprehensive suite of over 300 plugins, covering a wide range of functionalities including system monitoring, cloud services, and message passing * Enables the integration of user-defined code to collect, transform, and transmit data efficiently * Compiles into a standalone static binary without any external dependencies, ensuring a streamlined deployment process * Utilizes TOML for configuration, providing a user-friendly and unambiguous setup experience * Developed with contributions from a diverse community of over 1,200 contributors Users can choose plugins from a wide range of topics, including but not limited to: * Devices: [OPC UA][], [Modbus][] * Logs: [File][], [Tail][], [Directory Monitor][] * Messaging: [AMQP][], [Kafka][], [MQTT][] * Monitoring: [OpenTelemetry][], [Prometheus][] * Networking: [Cisco TelemetryMDT][], [gNMI][] * System monitoring: [CPU][], [Memory][], [Disk][], [Network][], [SMART][], [Docker][], [Nvidia SMI][], etc. * Universal: [Exec][], [HTTP][], [HTTP Listener][], [SNMP][], [SQL][] * Windows: [Event Log][], [Management Instrumentation][], [Performance Counters][] ## 🔨 Installation For binary builds, Docker images, RPM & DEB packages, and other builds of Telegraf, please see the [install guide](/docs/INSTALL_GUIDE.md). See the [releases documentation](/docs/RELEASES.md) for details on versioning and when releases are made. ## 💻 Usage Users define a TOML configuration with the plugins and settings they wish to use, then pass that configuration to Telegraf. The Telegraf agent then collects data from inputs at each interval and sends data to outputs at each flush interval. For a basic walkthrough see [quick start](/docs/QUICK_START.md). ## 📖 Documentation For a full list of documentation including tutorials, reference and other material, start with the [/docs directory](/docs/README.md). Additionally, each plugin has its own README that includes details about how to configure, use, and sometimes debug or troubleshoot. Look under the [/plugins directory](/plugins/) for specific plugins. Here are some commonly used documents: * [Changelog](/CHANGELOG.md) * [Configuration](/docs/CONFIGURATION.md) * [FAQ](/docs/FAQ.md) * [Releases](https://github.com/influxdata/telegraf/releases) * [Security](/SECURITY.md) ## ❤️ Contribute [![Contribute](https://img.shields.io/badge/contribute-to_telegraf-blue.svg?logo=influxdb)](https://github.com/influxdata/telegraf/blob/master/CONTRIBUTING.md) We love our community of over 1,200 contributors! Many of the plugins included in Telegraf were originally contributed by community members. Check out our [contributing guide](CONTRIBUTING.md) if you are interested in helping out. Also, join us on our [Community Slack](https://influxdata.com/slack) or [Community Forums](https://community.influxdata.com/) if you have questions or comments for our engineering teams. If you are completely new to Telegraf and InfluxDB, you can also enroll for free at [InfluxDB university](https://www.influxdata.com/university/) to take courses to learn more. ## ℹ️ Support [![Slack](https://img.shields.io/badge/slack-join_chat-blue.svg?logo=slack)](https://www.influxdata.com/slack) [![Forums](https://img.shields.io/badge/discourse-join_forums-blue.svg?logo=discourse)](https://community.influxdata.com/) Please use the [Community Slack](https://influxdata.com/slack) or [Community Forums](https://community.influxdata.com/) if you have questions or comments for our engineering teams. GitHub issues are limited to actual issues and feature requests only. ## 📜 License [![MIT](https://img.shields.io/badge/license-MIT-blue)](https://github.com/influxdata/telegraf/blob/master/LICENSE) [OPC UA]: https://github.com/influxdata/telegraf/tree/master/plugins/inputs/opcua [Modbus]: https://github.com/influxdata/telegraf/tree/master/plugins/inputs/modbus [File]: https://github.com/influxdata/telegraf/tree/master/plugins/inputs/file [Tail]: https://github.com/influxdata/telegraf/tree/master/plugins/inputs/tail [Directory Monitor]: https://github.com/influxdata/telegraf/tree/master/plugins/inputs/directory_monitor [AMQP]: https://github.com/influxdata/telegraf/tree/master/plugins/inputs/amqp_consumer [Kafka]: https://github.com/influxdata/telegraf/tree/master/plugins/inputs/kafka_consumer [MQTT]: https://github.com/influxdata/telegraf/tree/master/plugins/inputs/mqtt_consumer [OpenTelemetry]: https://github.com/influxdata/telegraf/tree/master/plugins/inputs/opentelemetry [Prometheus]: https://github.com/influxdata/telegraf/tree/master/plugins/inputs/prometheus [Cisco TelemetryMDT]: https://github.com/influxdata/telegraf/tree/master/plugins/inputs/cisco_telemetry_mdt [gNMI]: https://github.com/influxdata/telegraf/tree/master/plugins/inputs/gnmi [CPU]: https://github.com/influxdata/telegraf/tree/master/plugins/inputs/cpu [Memory]: https://github.com/influxdata/telegraf/tree/master/plugins/inputs/mem [Disk]: https://github.com/influxdata/telegraf/tree/master/plugins/inputs/disk [Network]: https://github.com/influxdata/telegraf/tree/master/plugins/inputs/net [SMART]: https://github.com/influxdata/telegraf/tree/master/plugins/inputs/smartctl [Docker]: https://github.com/influxdata/telegraf/tree/master/plugins/inputs/docker [Nvidia SMI]: https://github.com/influxdata/telegraf/tree/master/plugins/inputs/nvidia_smi [Exec]: https://github.com/influxdata/telegraf/tree/master/plugins/inputs/exec [HTTP]: https://github.com/influxdata/telegraf/tree/master/plugins/inputs/http [HTTP Listener]: https://github.com/influxdata/telegraf/tree/master/plugins/inputs/http_listener_v2 [SNMP]: https://github.com/influxdata/telegraf/tree/master/plugins/inputs/snmp [SQL]: https://github.com/influxdata/telegraf/tree/master/plugins/inputs/sql [Event Log]: https://github.com/influxdata/telegraf/tree/master/plugins/inputs/win_eventlog [Management Instrumentation]: https://github.com/influxdata/telegraf/tree/master/plugins/inputs/win_wmi [Performance Counters]: https://github.com/influxdata/telegraf/tree/master/plugins/inputs/win_perf_counters ================================================ FILE: SECURITY.md ================================================ # Security Policy ## Reporting a Vulnerability InfluxData takes security and our users' trust seriously. If you believe you have found a security issue in any of our open source projects, please responsibly disclose it by contacting `security@influxdata.com`. More details about security vulnerability reporting can be found on the [InfluxData How to Report Vulnerabilities page][InfluxData Security]. [InfluxData Security]: https://www.influxdata.com/how-to-report-security-vulnerabilities/ ================================================ FILE: accumulator.go ================================================ package telegraf import ( "time" ) // Accumulator allows adding metrics to the processing flow. type Accumulator interface { // AddFields adds a metric to the accumulator with the given measurement // name, fields, and tags (and timestamp). If a timestamp is not provided, // then the accumulator sets it to "now". AddFields(measurement string, fields map[string]interface{}, tags map[string]string, t ...time.Time) // AddGauge is the same as AddFields, but will add the metric as a "Gauge" type AddGauge(measurement string, fields map[string]interface{}, tags map[string]string, t ...time.Time) // AddCounter is the same as AddFields, but will add the metric as a "Counter" type AddCounter(measurement string, fields map[string]interface{}, tags map[string]string, t ...time.Time) // AddSummary is the same as AddFields, but will add the metric as a "Summary" type AddSummary(measurement string, fields map[string]interface{}, tags map[string]string, t ...time.Time) // AddHistogram is the same as AddFields, but will add the metric as a "Histogram" type AddHistogram(measurement string, fields map[string]interface{}, tags map[string]string, t ...time.Time) // AddMetric adds a metric to the accumulator. AddMetric(Metric) // SetPrecision sets the timestamp rounding precision. All metrics // added to the accumulator will have their timestamp rounded to the // nearest multiple of precision. SetPrecision(precision time.Duration) // Report an error. AddError(err error) // Upgrade to a TrackingAccumulator with space for maxTracked // metrics/batches. WithTracking(maxTracked int) TrackingAccumulator } // TrackingID uniquely identifies a tracked metric group type TrackingID uint64 type TrackingData interface { // ID is the TrackingID ID() TrackingID // RefCount is the number of tracking metrics still persistent and referencing this tracking ID RefCount() int32 } // DeliveryInfo provides the results of a delivered metric group. type DeliveryInfo interface { // ID is the TrackingID ID() TrackingID // Delivered returns true if the metric was processed successfully. Delivered() bool } // TrackingAccumulator is an Accumulator that provides a signal when the // metric has been fully processed. Sending more metrics than the accumulator // has been allocated for without reading status from the Accepted or Rejected // channels is an error. type TrackingAccumulator interface { Accumulator // Add the Metric and arrange for tracking feedback after processing. AddTrackingMetric(m Metric) TrackingID // Add a group of Metrics and arrange for a signal when the group has been // processed. AddTrackingMetricGroup(group []Metric) TrackingID // Delivered returns a channel that will contain the tracking results. Delivered() <-chan DeliveryInfo } ================================================ FILE: agent/README.md ================================================ # Agent For a complete list of configuration options and details about the agent, please see the [configuration][] document's agent section. [configuration]: ../docs/CONFIGURATION.md#agent ================================================ FILE: agent/accumulator.go ================================================ package agent import ( "time" "github.com/influxdata/telegraf" "github.com/influxdata/telegraf/metric" ) type MetricMaker interface { LogName() string MakeMetric(m telegraf.Metric) telegraf.Metric Log() telegraf.Logger } type accumulator struct { maker MetricMaker metrics chan<- telegraf.Metric precision time.Duration } func NewAccumulator( maker MetricMaker, metrics chan<- telegraf.Metric, ) telegraf.Accumulator { acc := accumulator{ maker: maker, metrics: metrics, precision: time.Nanosecond, } return &acc } func (ac *accumulator) AddFields( measurement string, fields map[string]interface{}, tags map[string]string, t ...time.Time, ) { ac.addMeasurement(measurement, tags, fields, telegraf.Untyped, t...) } func (ac *accumulator) AddGauge( measurement string, fields map[string]interface{}, tags map[string]string, t ...time.Time, ) { ac.addMeasurement(measurement, tags, fields, telegraf.Gauge, t...) } func (ac *accumulator) AddCounter( measurement string, fields map[string]interface{}, tags map[string]string, t ...time.Time, ) { ac.addMeasurement(measurement, tags, fields, telegraf.Counter, t...) } func (ac *accumulator) AddSummary( measurement string, fields map[string]interface{}, tags map[string]string, t ...time.Time, ) { ac.addMeasurement(measurement, tags, fields, telegraf.Summary, t...) } func (ac *accumulator) AddHistogram( measurement string, fields map[string]interface{}, tags map[string]string, t ...time.Time, ) { ac.addMeasurement(measurement, tags, fields, telegraf.Histogram, t...) } func (ac *accumulator) AddMetric(m telegraf.Metric) { m.SetTime(m.Time().Round(ac.precision)) if m := ac.maker.MakeMetric(m); m != nil { ac.metrics <- m } } func (ac *accumulator) addMeasurement( measurement string, tags map[string]string, fields map[string]interface{}, tp telegraf.ValueType, t ...time.Time, ) { m := metric.New(measurement, tags, fields, ac.getTime(t), tp) if m := ac.maker.MakeMetric(m); m != nil { ac.metrics <- m } } // AddError passes a runtime error to the accumulator. // The error will be tagged with the plugin name and written to the log. func (ac *accumulator) AddError(err error) { if err == nil { return } ac.maker.Log().Errorf("Error in plugin: %v", err) } func (ac *accumulator) SetPrecision(precision time.Duration) { ac.precision = precision } func (ac *accumulator) getTime(t []time.Time) time.Time { var timestamp time.Time if len(t) > 0 { timestamp = t[0] } else { timestamp = time.Now() } return timestamp.Round(ac.precision) } func (ac *accumulator) WithTracking(maxTracked int) telegraf.TrackingAccumulator { return &trackingAccumulator{ Accumulator: ac, delivered: make(chan telegraf.DeliveryInfo, maxTracked), } } type trackingAccumulator struct { telegraf.Accumulator delivered chan telegraf.DeliveryInfo } func (a *trackingAccumulator) AddTrackingMetric(m telegraf.Metric) telegraf.TrackingID { dm, id := metric.WithTracking(m, a.onDelivery) a.AddMetric(dm) return id } func (a *trackingAccumulator) AddTrackingMetricGroup(group []telegraf.Metric) telegraf.TrackingID { db, id := metric.WithGroupTracking(group, a.onDelivery) for _, m := range db { a.AddMetric(m) } return id } func (a *trackingAccumulator) Delivered() <-chan telegraf.DeliveryInfo { return a.delivered } func (a *trackingAccumulator) onDelivery(info telegraf.DeliveryInfo) { select { case a.delivered <- info: default: // This is a programming error in the input. More items were sent for // tracking than space requested. panic("channel is full") } } ================================================ FILE: agent/accumulator_test.go ================================================ package agent import ( "bytes" "errors" "os" "testing" "time" "github.com/stretchr/testify/require" "github.com/influxdata/telegraf" "github.com/influxdata/telegraf/logger" "github.com/influxdata/telegraf/testutil" ) func TestAddFields(t *testing.T) { metrics := make(chan telegraf.Metric, 10) defer close(metrics) a := NewAccumulator(&TestMetricMaker{}, metrics) tags := map[string]string{"foo": "bar"} fields := map[string]interface{}{ "usage": float64(99), } now := time.Now() a.AddCounter("acctest", fields, tags, now) testm := <-metrics require.Equal(t, "acctest", testm.Name()) actual, ok := testm.GetField("usage") require.True(t, ok) require.InDelta(t, float64(99), actual, testutil.DefaultDelta) actual, ok = testm.GetTag("foo") require.True(t, ok) require.Equal(t, "bar", actual) tm := testm.Time() // okay if monotonic clock differs require.True(t, now.Equal(tm)) tp := testm.Type() require.Equal(t, telegraf.Counter, tp) } func TestAccAddError(t *testing.T) { errBuf := bytes.NewBuffer(nil) logger.RedirectLogging(errBuf) defer logger.RedirectLogging(os.Stderr) metrics := make(chan telegraf.Metric, 10) defer close(metrics) a := NewAccumulator(&TestMetricMaker{}, metrics) a.AddError(errors.New("foo")) a.AddError(errors.New("bar")) a.AddError(errors.New("baz")) errs := bytes.Split(errBuf.Bytes(), []byte{'\n'}) require.Len(t, errs, 4) // 4 because of trailing newline require.Contains(t, string(errs[0]), "TestPlugin") require.Contains(t, string(errs[0]), "foo") require.Contains(t, string(errs[1]), "TestPlugin") require.Contains(t, string(errs[1]), "bar") require.Contains(t, string(errs[2]), "TestPlugin") require.Contains(t, string(errs[2]), "baz") } func TestSetPrecision(t *testing.T) { tests := []struct { name string unset bool precision time.Duration timestamp time.Time expected time.Time }{ { name: "default precision is nanosecond", unset: true, timestamp: time.Date(2006, time.February, 10, 12, 0, 0, 82912748, time.UTC), expected: time.Date(2006, time.February, 10, 12, 0, 0, 82912748, time.UTC), }, { name: "second interval", precision: time.Second, timestamp: time.Date(2006, time.February, 10, 12, 0, 0, 82912748, time.UTC), expected: time.Date(2006, time.February, 10, 12, 0, 0, 0, time.UTC), }, { name: "microsecond interval", precision: time.Microsecond, timestamp: time.Date(2006, time.February, 10, 12, 0, 0, 82912748, time.UTC), expected: time.Date(2006, time.February, 10, 12, 0, 0, 82913000, time.UTC), }, { name: "2 second precision", precision: 2 * time.Second, timestamp: time.Date(2006, time.February, 10, 12, 0, 2, 4, time.UTC), expected: time.Date(2006, time.February, 10, 12, 0, 2, 0, time.UTC), }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { metrics := make(chan telegraf.Metric, 10) a := NewAccumulator(&TestMetricMaker{}, metrics) if !tt.unset { a.SetPrecision(tt.precision) } a.AddFields("acctest", map[string]interface{}{"value": float64(101)}, map[string]string{}, tt.timestamp, ) testm := <-metrics require.Equal(t, tt.expected, testm.Time()) close(metrics) }) } } func TestAddTrackingMetricGroupEmpty(t *testing.T) { ch := make(chan telegraf.Metric, 10) metrics := make([]telegraf.Metric, 0) acc := NewAccumulator(&TestMetricMaker{}, ch).WithTracking(1) id := acc.AddTrackingMetricGroup(metrics) select { case tracking := <-acc.Delivered(): require.Equal(t, tracking.ID(), id) default: t.Fatal("empty group should be delivered immediately") } } type TestMetricMaker struct { } func (*TestMetricMaker) Name() string { return "TestPlugin" } func (tm *TestMetricMaker) LogName() string { return tm.Name() } func (*TestMetricMaker) MakeMetric(metric telegraf.Metric) telegraf.Metric { return metric } func (*TestMetricMaker) Log() telegraf.Logger { return logger.New("TestPlugin", "test", "") } ================================================ FILE: agent/agent.go ================================================ package agent import ( "context" "errors" "fmt" "log" "os" "runtime" "sync" "time" "github.com/fatih/color" "github.com/influxdata/telegraf" "github.com/influxdata/telegraf/config" "github.com/influxdata/telegraf/internal" "github.com/influxdata/telegraf/internal/clock" "github.com/influxdata/telegraf/models" "github.com/influxdata/telegraf/plugins/common/snmp" "github.com/influxdata/telegraf/plugins/processors" "github.com/influxdata/telegraf/plugins/serializers/influx" ) // Agent runs a set of plugins. type Agent struct { Config *config.Config } // NewAgent returns an Agent for the given Config. func NewAgent(cfg *config.Config) *Agent { a := &Agent{ Config: cfg, } return a } // inputUnit is a group of input plugins and the shared channel they write to. // // ┌───────┐ // │ Input │───┐ // └───────┘ │ // ┌───────┐ │ ______ // │ Input │───┼──▶ ()_____) // └───────┘ │ // ┌───────┐ │ // │ Input │───┘ // └───────┘ type inputUnit struct { dst chan<- telegraf.Metric inputs []*models.RunningInput } // ______ ┌───────────┐ ______ // ()_____)──▶ │ Processor │──▶ ()_____) // └───────────┘ type processorUnit struct { src <-chan telegraf.Metric dst chan<- telegraf.Metric processor *models.RunningProcessor } // aggregatorUnit is a group of Aggregators and their source and sink channels. // Typically, the aggregators write to a processor channel and pass the original // metrics to the output channel. The sink channels may be the same channel. // ┌────────────┐ // ┌──▶ │ Aggregator │───┐ // │ └────────────┘ │ // ______ │ ┌────────────┐ │ ______ // ()_____)───┼──▶ │ Aggregator │───┼──▶ ()_____) // │ └────────────┘ │ // │ ┌────────────┐ │ // ├──▶ │ Aggregator │───┘ // │ └────────────┘ // │ ______ // └────────────────────────▶ ()_____) type aggregatorUnit struct { src <-chan telegraf.Metric aggC chan<- telegraf.Metric outputC chan<- telegraf.Metric aggregators []*models.RunningAggregator } // outputUnit is a group of Outputs and their source channel. Metrics on the // channel are written to all outputs. // ┌────────┐ // ┌──▶ │ Output │ // │ └────────┘ // ______ ┌─────┐ │ ┌────────┐ // ()_____)──▶ │ Fan │───┼──▶ │ Output │ // └─────┘ │ └────────┘ // │ ┌────────┐ // └──▶ │ Output │ // └────────┘ type outputUnit struct { src <-chan telegraf.Metric outputs []*models.RunningOutput } // Run starts and runs the Agent until the context is done. func (a *Agent) Run(ctx context.Context) error { log.Printf("I! [agent] Config: Interval:%s, Quiet:%#v, Hostname:%#v, "+ "Flush Interval:%s", time.Duration(a.Config.Agent.Interval), a.Config.Agent.Quiet, a.Config.Agent.Hostname, time.Duration(a.Config.Agent.FlushInterval)) // Set the default for processor skipping if a.Config.Agent.SkipProcessorsAfterAggregators == nil { msg := `The default value of 'skip_processors_after_aggregators' will change to 'true' with Telegraf v1.40.0! ` msg += `If you need the current default behavior, please explicitly set the option to 'false'!` log.Print("W! [agent] ", color.YellowString(msg)) skipProcessorsAfterAggregators := false a.Config.Agent.SkipProcessorsAfterAggregators = &skipProcessorsAfterAggregators } log.Printf("D! [agent] Initializing plugins") if err := a.InitPlugins(); err != nil { return err } if a.Config.Persister != nil { log.Printf("D! [agent] Initializing plugin states") if err := a.initPersister(); err != nil { return err } if err := a.Config.Persister.Load(); err != nil { if !errors.Is(err, os.ErrNotExist) { return err } log.Print("I! [agent] State file does not exist... Skip restoring states...") } } startTime := time.Now() log.Printf("D! [agent] Connecting outputs") next, ou, err := a.startOutputs(ctx, a.Config.Outputs) if err != nil { return err } var apu []*processorUnit var au *aggregatorUnit if len(a.Config.Aggregators) != 0 { aggC := next if len(a.Config.AggProcessors) != 0 && !*a.Config.Agent.SkipProcessorsAfterAggregators { aggC, apu, err = a.startProcessors(next, a.Config.AggProcessors) if err != nil { return err } } next, au = a.startAggregators(aggC, next, a.Config.Aggregators) } var pu []*processorUnit if len(a.Config.Processors) != 0 { next, pu, err = a.startProcessors(next, a.Config.Processors) if err != nil { return err } } iu, err := a.startInputs(next, a.Config.Inputs) if err != nil { return err } var wg sync.WaitGroup wg.Add(1) go func() { defer wg.Done() a.runOutputs(ou) }() if au != nil { wg.Add(1) go func() { defer wg.Done() a.runProcessors(apu) }() wg.Add(1) go func() { defer wg.Done() a.runAggregators(startTime, au) }() } if pu != nil { wg.Add(1) go func() { defer wg.Done() a.runProcessors(pu) }() } wg.Add(1) go func() { defer wg.Done() a.runInputs(ctx, startTime, iu) }() wg.Wait() if a.Config.Persister != nil { log.Printf("D! [agent] Persisting plugin states") if err := a.Config.Persister.Store(); err != nil { return err } } log.Printf("D! [agent] Stopped Successfully") return err } // InitPlugins runs the Init function on plugins. func (a *Agent) InitPlugins() error { for _, input := range a.Config.Inputs { // Share the snmp translator setting with plugins that need it. if tp, ok := input.Input.(snmp.TranslatorPlugin); ok { tp.SetTranslator(a.Config.Agent.SnmpTranslator) } err := input.Init() if err != nil { return fmt.Errorf("could not initialize input %s: %w", input.LogName(), err) } } for _, processor := range a.Config.Processors { err := processor.Init() if err != nil { return fmt.Errorf("could not initialize processor %s: %w", processor.LogName(), err) } } for _, aggregator := range a.Config.Aggregators { err := aggregator.Init() if err != nil { return fmt.Errorf("could not initialize aggregator %s: %w", aggregator.LogName(), err) } } if !*a.Config.Agent.SkipProcessorsAfterAggregators { for _, processor := range a.Config.AggProcessors { err := processor.Init() if err != nil { return fmt.Errorf("could not initialize processor %s: %w", processor.LogName(), err) } } } for _, output := range a.Config.Outputs { err := output.Init() if err != nil { return fmt.Errorf("could not initialize output %s: %w", output.LogName(), err) } } return nil } // initPersister initializes the persister and registers the plugins. func (a *Agent) initPersister() error { if err := a.Config.Persister.Init(); err != nil { return err } for _, input := range a.Config.Inputs { plugin, ok := input.Input.(telegraf.StatefulPlugin) if !ok { continue } name := input.LogName() id := input.ID() if err := a.Config.Persister.Register(id, plugin); err != nil { return fmt.Errorf("could not register input %s: %w", name, err) } } for _, processor := range a.Config.Processors { var plugin telegraf.StatefulPlugin if p, ok := processor.Processor.(processors.HasUnwrap); ok { plugin, ok = p.Unwrap().(telegraf.StatefulPlugin) if !ok { continue } } else { plugin, ok = processor.Processor.(telegraf.StatefulPlugin) if !ok { continue } } name := processor.LogName() id := processor.ID() if err := a.Config.Persister.Register(id, plugin); err != nil { return fmt.Errorf("could not register processor %s: %w", name, err) } } for _, aggregator := range a.Config.Aggregators { plugin, ok := aggregator.Aggregator.(telegraf.StatefulPlugin) if !ok { continue } name := aggregator.LogName() id := aggregator.ID() if err := a.Config.Persister.Register(id, plugin); err != nil { return fmt.Errorf("could not register aggregator %s: %w", name, err) } } for _, processor := range a.Config.AggProcessors { plugin, ok := processor.Processor.(telegraf.StatefulPlugin) if !ok { continue } name := processor.LogName() id := processor.ID() if err := a.Config.Persister.Register(id, plugin); err != nil { return fmt.Errorf("could not register aggregating processor %s: %w", name, err) } } for _, output := range a.Config.Outputs { plugin, ok := output.Output.(telegraf.StatefulPlugin) if !ok { continue } name := output.LogName() id := output.ID() if err := a.Config.Persister.Register(id, plugin); err != nil { return fmt.Errorf("could not register output %s: %w", name, err) } } return nil } func (*Agent) startInputs(dst chan<- telegraf.Metric, inputs []*models.RunningInput) (*inputUnit, error) { log.Printf("D! [agent] Starting service inputs") unit := &inputUnit{ dst: dst, } for _, input := range inputs { // Service input plugins are not normally subject to timestamp // rounding except for when precision is set on the input plugin. // // This only applies to the accumulator passed to Start(), the // Gather() accumulator does apply rounding according to the // precision and interval agent/plugin settings. var interval time.Duration var precision time.Duration if input.Config.Precision != 0 { precision = input.Config.Precision } acc := NewAccumulator(input, dst) acc.SetPrecision(getPrecision(precision, interval)) if err := input.Start(acc); err != nil { // If the model tells us to remove the plugin we do so without error var fatalErr *internal.FatalError if errors.As(err, &fatalErr) { log.Printf("I! [agent] Failed to start %s, shutting down plugin: %s", input.LogName(), err) continue } stopRunningInputs(unit.inputs) return nil, fmt.Errorf("starting input %s: %w", input.LogName(), err) } if err := input.Probe(); err != nil { // Probe failures are non-fatal to the agent but should only remove the plugin log.Printf("I! [agent] Failed to probe %s, shutting down plugin: %s", input.LogName(), err) input.Stop() continue } unit.inputs = append(unit.inputs, input) } return unit, nil } // runInputs starts and triggers the periodic gather for Inputs. // // When the context is done the timers are stopped and this function returns // after all ongoing Gather calls complete. func (a *Agent) runInputs(ctx context.Context, startTime time.Time, unit *inputUnit) { var wg sync.WaitGroup var options []clock.Option // Initialize time rounding if a.Config.Agent.RoundInterval { options = append(options, clock.WithAlignment(startTime)) } tickers := make([]*clock.Ticker, 0, len(unit.inputs)) for _, input := range unit.inputs { // Overwrite agent interval if this plugin has its own. interval := time.Duration(a.Config.Agent.Interval) if input.Config.Interval != 0 { interval = input.Config.Interval } // Overwrite agent precision if this plugin has its own. precision := time.Duration(a.Config.Agent.Precision) if input.Config.Precision != 0 { precision = input.Config.Precision } // Overwrite agent collection_jitter if this plugin has its own. jitter := time.Duration(a.Config.Agent.CollectionJitter) if input.Config.CollectionJitter != 0 { jitter = input.Config.CollectionJitter } // Overwrite agent collection_offset if this plugin has its own. offset := time.Duration(a.Config.Agent.CollectionOffset) if input.Config.CollectionOffset != 0 { offset = input.Config.CollectionOffset } ticker := clock.NewTicker(interval, jitter, offset, options...) tickers = append(tickers, ticker) acc := NewAccumulator(input, unit.dst) acc.SetPrecision(getPrecision(precision, interval)) wg.Add(1) go func(input *models.RunningInput) { defer wg.Done() a.gatherLoop(ctx, acc, input, ticker, interval) }(input) } defer stopTickers(tickers) wg.Wait() log.Printf("D! [agent] Stopping service inputs") stopRunningInputs(unit.inputs) close(unit.dst) log.Printf("D! [agent] Input channel closed") } // testStartInputs is a variation of startInputs for use in --test and --once mode. // It differs by logging Start errors and returning only plugins successfully started. func (*Agent) testStartInputs(dst chan<- telegraf.Metric, inputs []*models.RunningInput) *inputUnit { log.Printf("D! [agent] Starting service inputs") unit := &inputUnit{ dst: dst, } for _, input := range inputs { // Service input plugins are not subject to timestamp rounding. // This only applies to the accumulator passed to Start(), the // Gather() accumulator does apply rounding according to the // precision agent setting. acc := NewAccumulator(input, dst) acc.SetPrecision(time.Nanosecond) if err := input.Start(acc); err != nil { log.Printf("E! [agent] Starting input %s: %v", input.LogName(), err) continue } unit.inputs = append(unit.inputs, input) } return unit } // testRunInputs is a variation of runInputs for use in --test and --once mode. // Instead of using a ticker to run the inputs they are called once immediately. func (a *Agent) testRunInputs( ctx context.Context, wait time.Duration, unit *inputUnit, ) { var wg sync.WaitGroup nul := make(chan telegraf.Metric) go func() { //nolint:revive // empty block needed here for range nul { } }() for _, input := range unit.inputs { wg.Add(1) go func(input *models.RunningInput) { defer wg.Done() // Overwrite agent interval if this plugin has its own. interval := time.Duration(a.Config.Agent.Interval) if input.Config.Interval != 0 { interval = input.Config.Interval } // Overwrite agent precision if this plugin has its own. precision := time.Duration(a.Config.Agent.Precision) if input.Config.Precision != 0 { precision = input.Config.Precision } // Run plugins that require multiple gathers to calculate rate // and delta metrics twice. switch input.Config.Name { case "cpu", "mongodb", "procstat": nulAcc := NewAccumulator(input, nul) nulAcc.SetPrecision(getPrecision(precision, interval)) if err := input.Input.Gather(nulAcc); err != nil { nulAcc.AddError(err) } time.Sleep(500 * time.Millisecond) } acc := NewAccumulator(input, unit.dst) acc.SetPrecision(getPrecision(precision, interval)) if err := input.Input.Gather(acc); err != nil { acc.AddError(err) } }(input) } wg.Wait() if err := internal.SleepContext(ctx, wait); err != nil { log.Printf("E! [agent] SleepContext finished with: %v", err) } log.Printf("D! [agent] Stopping service inputs") stopRunningInputs(unit.inputs) close(unit.dst) log.Printf("D! [agent] Input channel closed") } // stopRunningInputs stops all service inputs. func stopRunningInputs(inputs []*models.RunningInput) { for _, input := range inputs { input.Stop() } } // stopRunningOutputs stops all running outputs. func stopRunningOutputs(outputs []*models.RunningOutput) { for _, output := range outputs { output.Close() } } // gather runs an input's gather function periodically until the context is // done. func (a *Agent) gatherLoop( ctx context.Context, acc telegraf.Accumulator, input *models.RunningInput, ticker *clock.Ticker, interval time.Duration, ) { for { select { case <-ticker.C: err := a.gatherOnce(acc, input, ticker, interval) if err != nil { acc.AddError(err) } case <-ctx.Done(): return } } } // gatherOnce runs the input's Gather function once, logging a warning each interval it fails to complete before. func (*Agent) gatherOnce(acc telegraf.Accumulator, input *models.RunningInput, ticker *clock.Ticker, interval time.Duration) error { done := make(chan error) go func() { defer panicRecover(input) done <- input.Gather(acc) }() // Only warn after interval seconds, even if the interval is started late. // Intervals can start late if the previous interval went over or due to // clock changes. slowWarning := time.NewTicker(interval) defer slowWarning.Stop() for { select { case err := <-done: return err case <-slowWarning.C: log.Printf("W! [%s] Collection took longer than expected; not complete after interval of %s", input.LogName(), interval) input.IncrGatherTimeouts() case <-ticker.C: log.Printf("D! [%s] Previous collection has not completed; scheduled collection skipped", input.LogName()) } } } // startProcessors sets up the processor chain and calls Start on all processors. If an error occurs any started processors are Stopped. func (*Agent) startProcessors(dst chan<- telegraf.Metric, runningProcessors models.RunningProcessors) (chan<- telegraf.Metric, []*processorUnit, error) { var src chan telegraf.Metric units := make([]*processorUnit, 0, len(runningProcessors)) // The processor chain is constructed from the output side starting from // the output(s) and walking the way back to the input(s). However, the // processor-list is sorted by order and/or by appearance in the config, // i.e. in input-to-output direction. Therefore, reverse the processor list // to reflect the order/definition order in the processing chain. for i := len(runningProcessors) - 1; i >= 0; i-- { processor := runningProcessors[i] src = make(chan telegraf.Metric, 100) acc := NewAccumulator(processor, dst) err := processor.Start(acc) if err != nil { for _, u := range units { u.processor.Stop() close(u.dst) } return nil, nil, fmt.Errorf("starting processor %s: %w", processor.LogName(), err) } units = append(units, &processorUnit{ src: src, dst: dst, processor: processor, }) dst = src } return src, units, nil } // runProcessors begins processing metrics and runs until the source channel is closed and all metrics have been written. func (*Agent) runProcessors(units []*processorUnit) { var wg sync.WaitGroup for _, unit := range units { wg.Add(1) go func(unit *processorUnit) { defer wg.Done() acc := NewAccumulator(unit.processor, unit.dst) for m := range unit.src { if err := unit.processor.Add(m, acc); err != nil { acc.AddError(err) m.Drop() } } unit.processor.Stop() close(unit.dst) log.Printf("D! [agent] Processor channel closed") }(unit) } wg.Wait() } // startAggregators sets up the aggregator unit and returns the source channel. func (*Agent) startAggregators(aggC, outputC chan<- telegraf.Metric, aggregators []*models.RunningAggregator) (chan<- telegraf.Metric, *aggregatorUnit) { src := make(chan telegraf.Metric, 100) unit := &aggregatorUnit{ src: src, aggC: aggC, outputC: outputC, aggregators: aggregators, } return src, unit } // runAggregators beings aggregating metrics and runs until the source channel // is closed and all metrics have been written. func (a *Agent) runAggregators( startTime time.Time, unit *aggregatorUnit, ) { ctx, cancel := context.WithCancel(context.Background()) // Before calling Add, initialize the aggregation window. This ensures // that any metric created after start time will be aggregated. for _, agg := range a.Config.Aggregators { since, until := updateWindow(startTime, a.Config.Agent.RoundInterval, agg.Period()) agg.UpdateWindow(since, until) } var wg sync.WaitGroup wg.Add(1) go func() { defer wg.Done() for metric := range unit.src { var dropOriginal bool for _, agg := range a.Config.Aggregators { if ok := agg.Add(metric); ok { dropOriginal = true } } if !dropOriginal { unit.outputC <- metric // keep original. } else { metric.Drop() } } cancel() }() for _, agg := range a.Config.Aggregators { wg.Add(1) go func(agg *models.RunningAggregator) { defer wg.Done() interval := time.Duration(a.Config.Agent.Interval) precision := time.Duration(a.Config.Agent.Precision) acc := NewAccumulator(agg, unit.aggC) acc.SetPrecision(getPrecision(precision, interval)) a.push(ctx, agg, acc) }(agg) } wg.Wait() // In the case that there are no processors, both aggC and outputC are the // same channel. If there are processors, we close the aggC and the // processor chain will close the outputC when it finishes processing. close(unit.aggC) log.Printf("D! [agent] Aggregator channel closed") } func updateWindow(start time.Time, roundInterval bool, period time.Duration) (since, until time.Time) { if roundInterval { until = internal.AlignTime(start, period) if until.Equal(start) { until = internal.AlignTime(start.Add(time.Nanosecond), period) } } else { until = start.Add(period) } since = until.Add(-period) return since, until } // push runs the push for a single aggregator every period. func (*Agent) push(ctx context.Context, aggregator *models.RunningAggregator, acc telegraf.Accumulator) { for { // Ensures that Push will be called for each period, even if it has // already elapsed before this function is called. This is guaranteed // because so long as only Push updates the EndPeriod. This method // also avoids drift by not using a ticker. until := time.Until(aggregator.EndPeriod()) select { case <-time.After(until): aggregator.Push(acc) case <-ctx.Done(): aggregator.Push(acc) return } } } // startOutputs calls Connect on all outputs and returns the source channel. // If an error occurs calling Connect, all started plugins have Close called. func (a *Agent) startOutputs( ctx context.Context, outputs []*models.RunningOutput, ) (chan<- telegraf.Metric, *outputUnit, error) { src := make(chan telegraf.Metric, 100) unit := &outputUnit{src: src} for _, output := range outputs { if err := a.connectOutput(ctx, output); err != nil { var fatalErr *internal.FatalError if errors.As(err, &fatalErr) { // If the model tells us to remove the plugin we do so without error log.Printf("I! [agent] Failed to connect to [%s], error was %q; shutting down plugin...", output.LogName(), err) output.Close() continue } for _, unitOutput := range unit.outputs { unitOutput.Close() } return nil, nil, fmt.Errorf("connecting output %s: %w", output.LogName(), err) } unit.outputs = append(unit.outputs, output) } return src, unit, nil } // connectOutput connects to all outputs. func (*Agent) connectOutput(ctx context.Context, output *models.RunningOutput) error { log.Printf("D! [agent] Attempting connection to [%s]", output.LogName()) if err := output.Connect(); err != nil { log.Printf("E! [agent] Failed to connect to [%s], retrying in 15s, error was %q", output.LogName(), err) if err := internal.SleepContext(ctx, 15*time.Second); err != nil { return err } if err = output.Connect(); err != nil { return fmt.Errorf("error connecting to output %q: %w", output.LogName(), err) } } log.Printf("D! [agent] Successfully connected to %s", output.LogName()) return nil } // runOutputs begins processing metrics and returns until the source channel is // closed and all metrics have been written. On shutdown metrics will be // written one last time and dropped if unsuccessful. func (a *Agent) runOutputs( unit *outputUnit, ) { var wg sync.WaitGroup // Start flush loop interval := time.Duration(a.Config.Agent.FlushInterval) jitter := time.Duration(a.Config.Agent.FlushJitter) ctx, cancel := context.WithCancel(context.Background()) for _, output := range unit.outputs { interval := interval // Overwrite agent flush_interval if this plugin has its own. if output.Config.FlushInterval != 0 { interval = output.Config.FlushInterval } jitter := jitter // Overwrite agent flush_jitter if this plugin has its own. if output.Config.FlushJitter != 0 { jitter = output.Config.FlushJitter } wg.Add(1) go func(output *models.RunningOutput) { defer wg.Done() timer := clock.NewTimer(interval, jitter) defer timer.Stop() a.flushLoop(ctx, output, timer) }(output) } for metric := range unit.src { for i, output := range unit.outputs { if i == len(unit.outputs)-1 { output.AddMetricNoCopy(metric) } else { output.AddMetric(metric) } } } log.Println("I! [agent] Hang on, flushing any cached metrics before shutdown") cancel() wg.Wait() log.Println("I! [agent] Stopping running outputs") stopRunningOutputs(unit.outputs) } // flushLoop runs an output's flush function periodically until the context is // done. func (a *Agent) flushLoop(ctx context.Context, output *models.RunningOutput, timer *clock.Timer) { logError := func(err error) { if err != nil { log.Printf("E! [agent] Error writing to %s: %v", output.LogName(), err) } } // watch for flush requests flushRequested := make(chan os.Signal, 1) watchForFlushSignal(flushRequested) defer stopListeningForFlushSignal(flushRequested) for { // Favor shutdown over other methods. select { case <-ctx.Done(): logError(a.flushOnce(output, timer, output.Write)) return default: } select { case <-ctx.Done(): logError(a.flushOnce(output, timer, output.Write)) return case <-timer.C: logError(a.flushOnce(output, timer, output.Write)) case <-flushRequested: logError(a.flushOnce(output, timer, output.Write)) case <-output.BatchReady: logError(a.flushBatch(output, output.WriteBatch)) } } } // flushOnce runs the output's Write function once, logging a warning each interval it fails to complete before the flush interval elapses. func (*Agent) flushOnce(output *models.RunningOutput, timer *clock.Timer, writeFunc func() error) error { done := make(chan error) go func() { done <- writeFunc() }() for { select { case err := <-done: output.LogBufferStatus() return err case <-timer.C: log.Printf("W! [agent] [%q] did not complete within its flush interval", output.LogName()) output.LogBufferStatus() } } } // flushBatch runs the output's Write function once Unlike flushOnce the interval elapsing is not considered during these flushes. func (*Agent) flushBatch(output *models.RunningOutput, writeFunc func() error) error { err := writeFunc() output.LogBufferStatus() return err } // Test runs the inputs, processors and aggregators for a single gather and // writes the metrics to stdout. func (a *Agent) Test(ctx context.Context, wait time.Duration) error { src := make(chan telegraf.Metric, 100) var wg sync.WaitGroup wg.Add(1) go func() { defer wg.Done() s := &influx.Serializer{SortFields: true, UintSupport: true} for metric := range src { octets, err := s.Serialize(metric) if err == nil { fmt.Print("> ", string(octets)) } metric.Reject() } }() err := a.runTest(ctx, wait, src) if err != nil { return err } wg.Wait() if models.GlobalGatherErrors.Get() != 0 { return fmt.Errorf("input plugins recorded %d errors", models.GlobalGatherErrors.Get()) } return nil } // runTest runs the agent and performs a single gather sending output to the // outputC. After gathering pauses for the wait duration to allow service // inputs to run. func (a *Agent) runTest(ctx context.Context, wait time.Duration, outputC chan<- telegraf.Metric) error { // Set the default for processor skipping if a.Config.Agent.SkipProcessorsAfterAggregators == nil { msg := `The default value of 'skip_processors_after_aggregators' will change to 'true' with Telegraf v1.40.0! ` msg += `If you need the current default behavior, please explicitly set the option to 'false'!` log.Print("W! [agent] ", color.YellowString(msg)) skipProcessorsAfterAggregators := false a.Config.Agent.SkipProcessorsAfterAggregators = &skipProcessorsAfterAggregators } log.Printf("D! [agent] Initializing plugins") if err := a.InitPlugins(); err != nil { return err } startTime := time.Now() next := outputC var apu []*processorUnit var au *aggregatorUnit if len(a.Config.Aggregators) != 0 { procC := next if len(a.Config.AggProcessors) != 0 && !*a.Config.Agent.SkipProcessorsAfterAggregators { var err error procC, apu, err = a.startProcessors(next, a.Config.AggProcessors) if err != nil { return err } } next, au = a.startAggregators(procC, next, a.Config.Aggregators) } var pu []*processorUnit if len(a.Config.Processors) != 0 { var err error next, pu, err = a.startProcessors(next, a.Config.Processors) if err != nil { return err } } iu := a.testStartInputs(next, a.Config.Inputs) var wg sync.WaitGroup if au != nil { wg.Add(1) go func() { defer wg.Done() a.runProcessors(apu) }() wg.Add(1) go func() { defer wg.Done() a.runAggregators(startTime, au) }() } if pu != nil { wg.Add(1) go func() { defer wg.Done() a.runProcessors(pu) }() } wg.Add(1) go func() { defer wg.Done() a.testRunInputs(ctx, wait, iu) }() wg.Wait() log.Printf("D! [agent] Stopped Successfully") return nil } // Once runs the full agent for a single gather. func (a *Agent) Once(ctx context.Context, wait time.Duration) error { err := a.runOnce(ctx, wait) if err != nil { return err } if models.GlobalGatherErrors.Get() != 0 { return fmt.Errorf("input plugins recorded %d errors", models.GlobalGatherErrors.Get()) } unsent := 0 for _, output := range a.Config.Outputs { unsent += output.BufferLength() } if unsent != 0 { return fmt.Errorf("output plugins unable to send %d metrics", unsent) } return nil } // runOnce runs the agent and performs a single gather sending output to the // outputC. After gathering pauses for the wait duration to allow service // inputs to run. func (a *Agent) runOnce(ctx context.Context, wait time.Duration) error { // Set the default for processor skipping if a.Config.Agent.SkipProcessorsAfterAggregators == nil { msg := `The default value of 'skip_processors_after_aggregators' will change to 'true' with Telegraf v1.40.0! ` msg += `If you need the current default behavior, please explicitly set the option to 'false'!` log.Print("W! [agent] ", color.YellowString(msg)) skipProcessorsAfterAggregators := false a.Config.Agent.SkipProcessorsAfterAggregators = &skipProcessorsAfterAggregators } log.Printf("D! [agent] Initializing plugins") if err := a.InitPlugins(); err != nil { return err } startTime := time.Now() log.Printf("D! [agent] Connecting outputs") next, ou, err := a.startOutputs(ctx, a.Config.Outputs) if err != nil { return err } var apu []*processorUnit var au *aggregatorUnit if len(a.Config.Aggregators) != 0 { procC := next if len(a.Config.AggProcessors) != 0 && !*a.Config.Agent.SkipProcessorsAfterAggregators { procC, apu, err = a.startProcessors(next, a.Config.AggProcessors) if err != nil { return err } } next, au = a.startAggregators(procC, next, a.Config.Aggregators) } var pu []*processorUnit if len(a.Config.Processors) != 0 { next, pu, err = a.startProcessors(next, a.Config.Processors) if err != nil { return err } } iu := a.testStartInputs(next, a.Config.Inputs) var wg sync.WaitGroup wg.Add(1) go func() { defer wg.Done() a.runOutputs(ou) }() if au != nil { wg.Add(1) go func() { defer wg.Done() a.runProcessors(apu) }() wg.Add(1) go func() { defer wg.Done() a.runAggregators(startTime, au) }() } if pu != nil { wg.Add(1) go func() { defer wg.Done() a.runProcessors(pu) }() } wg.Add(1) go func() { defer wg.Done() a.testRunInputs(ctx, wait, iu) }() wg.Wait() log.Printf("D! [agent] Stopped Successfully") return nil } // Returns the rounding precision for metrics. func getPrecision(precision, interval time.Duration) time.Duration { if precision > 0 { return precision } switch { case interval >= time.Second: return time.Second case interval >= time.Millisecond: return time.Millisecond case interval >= time.Microsecond: return time.Microsecond default: return time.Nanosecond } } // panicRecover displays an error if an input panics. func panicRecover(input *models.RunningInput) { //nolint:revive // recover is called inside a deferred function if err := recover(); err != nil { trace := make([]byte, 2048) runtime.Stack(trace, true) log.Printf("E! FATAL: [%s] panicked: %s, Stack:\n%s", input.LogName(), err, trace) log.Fatalln("E! PLEASE REPORT THIS PANIC ON GITHUB with " + "stack trace, configuration, and OS information: " + "https://github.com/influxdata/telegraf/issues/new/choose") } } func stopTickers(tickers []*clock.Ticker) { for _, ticker := range tickers { ticker.Stop() } } ================================================ FILE: agent/agent_posix.go ================================================ //go:build !windows package agent import ( "os" "os/signal" "syscall" ) const flushSignal = syscall.SIGUSR1 func watchForFlushSignal(flushRequested chan os.Signal) { signal.Notify(flushRequested, flushSignal) } func stopListeningForFlushSignal(flushRequested chan os.Signal) { signal.Stop(flushRequested) } ================================================ FILE: agent/agent_test.go ================================================ package agent import ( "context" "fmt" "os" "path/filepath" "sync" "testing" "time" "github.com/google/go-cmp/cmp" "github.com/stretchr/testify/require" "github.com/influxdata/telegraf" "github.com/influxdata/telegraf/config" "github.com/influxdata/telegraf/models" _ "github.com/influxdata/telegraf/plugins/aggregators/all" _ "github.com/influxdata/telegraf/plugins/inputs/all" _ "github.com/influxdata/telegraf/plugins/outputs/all" "github.com/influxdata/telegraf/plugins/parsers/influx" _ "github.com/influxdata/telegraf/plugins/processors/all" "github.com/influxdata/telegraf/testutil" ) func TestAgent_OmitHostname(t *testing.T) { c := config.NewConfig() c.Agent.OmitHostname = true _ = NewAgent(c) require.NotContains(t, c.Tags, "host") } func TestAgent_LoadPlugin(t *testing.T) { c := config.NewConfig() c.InputFilters = []string{"mysql"} err := c.LoadConfig("../config/testdata/telegraf-agent.toml") require.NoError(t, err) a := NewAgent(c) require.Len(t, a.Config.Inputs, 1) c = config.NewConfig() c.InputFilters = []string{"foo"} err = c.LoadConfig("../config/testdata/telegraf-agent.toml") require.NoError(t, err) a = NewAgent(c) require.Empty(t, a.Config.Inputs) c = config.NewConfig() c.InputFilters = []string{"mysql", "foo"} err = c.LoadConfig("../config/testdata/telegraf-agent.toml") require.NoError(t, err) a = NewAgent(c) require.Len(t, a.Config.Inputs, 1) c = config.NewConfig() c.InputFilters = []string{"mysql", "redis"} err = c.LoadConfig("../config/testdata/telegraf-agent.toml") require.NoError(t, err) a = NewAgent(c) require.Len(t, a.Config.Inputs, 2) c = config.NewConfig() c.InputFilters = []string{"mysql", "foo", "redis", "bar"} err = c.LoadConfig("../config/testdata/telegraf-agent.toml") require.NoError(t, err) a = NewAgent(c) require.Len(t, a.Config.Inputs, 2) } func TestAgent_LoadOutput(t *testing.T) { c := config.NewConfig() c.OutputFilters = []string{"influxdb"} err := c.LoadConfig("../config/testdata/telegraf-agent.toml") require.NoError(t, err) a := NewAgent(c) require.Len(t, a.Config.Outputs, 2) c = config.NewConfig() c.OutputFilters = []string{"kafka"} err = c.LoadConfig("../config/testdata/telegraf-agent.toml") require.NoError(t, err) a = NewAgent(c) require.Len(t, a.Config.Outputs, 1) c = config.NewConfig() err = c.LoadConfig("../config/testdata/telegraf-agent.toml") require.NoError(t, err) a = NewAgent(c) require.Len(t, a.Config.Outputs, 3) c = config.NewConfig() c.OutputFilters = []string{"foo"} err = c.LoadConfig("../config/testdata/telegraf-agent.toml") require.NoError(t, err) a = NewAgent(c) require.Empty(t, a.Config.Outputs) c = config.NewConfig() c.OutputFilters = []string{"influxdb", "foo"} err = c.LoadConfig("../config/testdata/telegraf-agent.toml") require.NoError(t, err) a = NewAgent(c) require.Len(t, a.Config.Outputs, 2) c = config.NewConfig() c.OutputFilters = []string{"influxdb", "kafka"} err = c.LoadConfig("../config/testdata/telegraf-agent.toml") require.NoError(t, err) require.Len(t, c.Outputs, 3) a = NewAgent(c) require.Len(t, a.Config.Outputs, 3) c = config.NewConfig() c.OutputFilters = []string{"influxdb", "foo", "kafka", "bar"} err = c.LoadConfig("../config/testdata/telegraf-agent.toml") require.NoError(t, err) a = NewAgent(c) require.Len(t, a.Config.Outputs, 3) } func TestWindow(t *testing.T) { parse := func(s string) time.Time { tm, err := time.Parse(time.RFC3339, s) if err != nil { panic(err) } return tm } tests := []struct { name string start time.Time roundInterval bool period time.Duration since time.Time until time.Time }{ { name: "round with exact alignment", start: parse("2018-03-27T00:00:00Z"), roundInterval: true, period: 30 * time.Second, since: parse("2018-03-27T00:00:00Z"), until: parse("2018-03-27T00:00:30Z"), }, { name: "round with alignment needed", start: parse("2018-03-27T00:00:05Z"), roundInterval: true, period: 30 * time.Second, since: parse("2018-03-27T00:00:00Z"), until: parse("2018-03-27T00:00:30Z"), }, { name: "no round with exact alignment", start: parse("2018-03-27T00:00:00Z"), roundInterval: false, period: 30 * time.Second, since: parse("2018-03-27T00:00:00Z"), until: parse("2018-03-27T00:00:30Z"), }, { name: "no found with alignment needed", start: parse("2018-03-27T00:00:05Z"), roundInterval: false, period: 30 * time.Second, since: parse("2018-03-27T00:00:05Z"), until: parse("2018-03-27T00:00:35Z"), }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { since, until := updateWindow(tt.start, tt.roundInterval, tt.period) require.Equal(t, tt.since, since, "since") require.Equal(t, tt.until, until, "until") }) } } func TestCases(t *testing.T) { // Get all directories in testcases folders, err := os.ReadDir("testcases") require.NoError(t, err) // Make sure tests contains data require.NotEmpty(t, folders) for _, f := range folders { // Only handle folders if !f.IsDir() { continue } fname := f.Name() testdataPath := filepath.Join("testcases", fname) configFilename := filepath.Join(testdataPath, "telegraf.conf") expectedFilename := filepath.Join(testdataPath, "expected.out") t.Run(fname, func(t *testing.T) { // Get parser to parse input and expected output parser := &influx.Parser{} require.NoError(t, parser.Init()) expected, err := testutil.ParseMetricsFromFile(expectedFilename, parser) require.NoError(t, err) require.NotEmpty(t, expected) // Load the config and inject the mock output to be able to verify // the resulting metrics cfg := config.NewConfig() require.NoError(t, cfg.LoadAll(configFilename)) require.Empty(t, cfg.Outputs, "No output(s) allowed in the config!") // Setup the agent and run the agent in "once" mode agent := NewAgent(cfg) ctx, cancel := context.WithTimeout(t.Context(), 5*time.Second) defer cancel() actual, err := collect(ctx, agent, 0) require.NoError(t, err) // Process expected metrics and compare with resulting metrics options := []cmp.Option{ testutil.IgnoreTags("host"), testutil.IgnoreTime(), } testutil.RequireMetricsEqual(t, expected, actual, options...) }) } } // Implement a "test-mode" like call but collect the metrics func collect(ctx context.Context, a *Agent, wait time.Duration) ([]telegraf.Metric, error) { var received []telegraf.Metric var mu sync.Mutex src := make(chan telegraf.Metric, 100) var wg sync.WaitGroup wg.Add(1) go func() { defer wg.Done() for m := range src { mu.Lock() received = append(received, m) mu.Unlock() m.Reject() } }() if err := a.runTest(ctx, wait, src); err != nil { return nil, err } wg.Wait() if models.GlobalGatherErrors.Get() != 0 { return received, fmt.Errorf("input plugins recorded %d errors", models.GlobalGatherErrors.Get()) } return received, nil } ================================================ FILE: agent/agent_windows.go ================================================ //go:build windows package agent import "os" func watchForFlushSignal(_ chan os.Signal) { // not supported } func stopListeningForFlushSignal(_ chan os.Signal) { // not supported } ================================================ FILE: agent/testcases/aggregators-rerun-processors/expected.out ================================================ metric value=420 metric value_min=4200,value_max=4200 ================================================ FILE: agent/testcases/aggregators-rerun-processors/input.influx ================================================ metric value=42.0 ================================================ FILE: agent/testcases/aggregators-rerun-processors/telegraf.conf ================================================ # Test for not skipping processors after running aggregators [agent] omit_hostname = true skip_processors_after_aggregators = false [[inputs.file]] files = ["testcases/aggregators-rerun-processors/input.influx"] data_format = "influx" [[processors.starlark]] source = ''' def apply(metric): for k, v in metric.fields.items(): if type(v) == "float": metric.fields[k] = v * 10 return metric ''' [[aggregators.minmax]] period = "1s" drop_original = false ================================================ FILE: agent/testcases/aggregators-skip-processors/expected.out ================================================ metric value=420 metric value_min=420,value_max=420 ================================================ FILE: agent/testcases/aggregators-skip-processors/input.influx ================================================ metric value=42.0 ================================================ FILE: agent/testcases/aggregators-skip-processors/telegraf.conf ================================================ # Test for skipping processors after running aggregators [agent] omit_hostname = true skip_processors_after_aggregators = true [[inputs.file]] files = ["testcases/aggregators-skip-processors/input.influx"] data_format = "influx" [[processors.starlark]] source = ''' def apply(metric): for k, v in metric.fields.items(): if type(v) == "float": metric.fields[k] = v * 10 return metric ''' [[aggregators.minmax]] period = "1s" drop_original = false ================================================ FILE: agent/testcases/processor-order-appearance/expected.out ================================================ new_metric_from_starlark,foo=bar baz=42i,timestamp="2023-07-13T12:53:54.197709713Z" 1689252834197709713 old_metric_from_mock,mood=good value=23i,timestamp="2023-07-13T13:10:34Z" 1689253834000000000 ================================================ FILE: agent/testcases/processor-order-appearance/input.influx ================================================ old_metric_from_mock,mood=good value=23i 1689253834000000000 ================================================ FILE: agent/testcases/processor-order-appearance/telegraf.conf ================================================ # Test for using the appearance order in the file for processor order [[inputs.file]] files = ["testcases/processor-order-appearance/input.influx"] data_format = "influx" [[processors.starlark]] source = ''' def apply(metric): metrics = [] m = Metric("new_metric_from_starlark") m.tags["foo"] = "bar" m.fields["baz"] = 42 m.time = 1689252834197709713 metrics.append(m) metrics.append(metric) return metrics ''' [[processors.date]] field_key = "timestamp" date_format = "2006-01-02T15:04:05.999999999Z" timezone = "UTC" ================================================ FILE: agent/testcases/processor-order-explicit/expected.out ================================================ new_metric_from_starlark,foo=bar baz=42i,timestamp="2023-07-13T12:53:54.197709713Z" 1689252834197709713 old_metric_from_mock,mood=good value=23i,timestamp="2023-07-13T13:10:34Z" 1689253834000000000 ================================================ FILE: agent/testcases/processor-order-explicit/input.influx ================================================ old_metric_from_mock,mood=good value=23i 1689253834000000000 ================================================ FILE: agent/testcases/processor-order-explicit/telegraf.conf ================================================ # Test for specifying an explicit processor order [[inputs.file]] files = ["testcases/processor-order-explicit/input.influx"] data_format = "influx" [[processors.date]] field_key = "timestamp" date_format = "2006-01-02T15:04:05.999999999Z" timezone = "UTC" order = 2 [[processors.starlark]] source = ''' def apply(metric): metrics = [] m = Metric("new_metric_from_starlark") m.tags["foo"] = "bar" m.fields["baz"] = 42 m.time = 1689252834197709713 metrics.append(m) metrics.append(metric) return metrics ''' order = 1 ================================================ FILE: agent/testcases/processor-order-mixed/expected.out ================================================ new_metric_from_starlark,foo=bar baz=42i,timestamp="2023-07-13T12:53:54.197709713Z" 1689252834197709713 old_metric_from_mock,mood=good value=23i,timestamp="2023-07-13T13:10:34Z" 1689253834000000000 ================================================ FILE: agent/testcases/processor-order-mixed/input.influx ================================================ old_metric_from_mock,mood=good value=23i 1689253834000000000 ================================================ FILE: agent/testcases/processor-order-mixed/telegraf.conf ================================================ # Test for using the appearance order in the file for processor order [[inputs.file]] files = ["testcases/processor-order-appearance/input.influx"] data_format = "influx" [[processors.starlark]] source = ''' def apply(metric): metrics = [] m = Metric("new_metric_from_starlark") m.tags["foo"] = "bar" m.fields["baz"] = 42 m.time = 1689252834197709713 metrics.append(m) metrics.append(metric) return metrics ''' [[processors.date]] field_key = "timestamp" date_format = "2006-01-02T15:04:05.999999999Z" timezone = "UTC" order = 1 ================================================ FILE: agent/testcases/processor-order-no-starlark/expected.out ================================================ new_metric_from_starlark,foo=bar baz=42i 1689252834197709713 old_metric_from_mock,mood=good value=23i,timestamp="2023-07-13T13:10:34Z" 1689253834000000000 ================================================ FILE: agent/testcases/processor-order-no-starlark/input.influx ================================================ old_metric_from_mock,mood=good value=23i 1689253834000000000 ================================================ FILE: agent/testcases/processor-order-no-starlark/telegraf.conf ================================================ # Test for using the appearance order in the file for processor order. # This will not add the "timestamp" field as the starlark processor runs _after_ # the date processor. [[inputs.file]] files = ["testcases/processor-order-no-starlark/input.influx"] data_format = "influx" [[processors.date]] field_key = "timestamp" date_format = "2006-01-02T15:04:05.999999999Z" timezone = "UTC" [[processors.starlark]] source = ''' def apply(metric): metrics = [] m = Metric("new_metric_from_starlark") m.tags["foo"] = "bar" m.fields["baz"] = 42 m.time = 1689252834197709713 metrics.append(m) metrics.append(metric) return metrics ''' ================================================ FILE: aggregator.go ================================================ package telegraf // Aggregator is an interface for implementing an Aggregator plugin. // the RunningAggregator wraps this interface and guarantees that // Add, Push, and Reset can not be called concurrently, so locking is not // required when implementing an Aggregator plugin. type Aggregator interface { PluginDescriber // Add the metric to the aggregator. Add(in Metric) // Push pushes the current aggregates to the accumulator. Push(acc Accumulator) // Reset resets the aggregators caches and aggregates. Reset() } ================================================ FILE: build_version.txt ================================================ 1.39.0 ================================================ FILE: cmd/telegraf/agent.conf ================================================ # Configuration for telegraf agent [agent] ## Default data collection interval for all inputs interval = "10s" ## Rounds collection interval to 'interval' ## ie, if interval="10s" then always collect on :00, :10, :20, etc. round_interval = true ## Telegraf will send metrics to outputs in batches of at most ## metric_batch_size metrics. ## This controls the size of writes that Telegraf sends to output plugins. metric_batch_size = 1000 ## Maximum number of unwritten metrics per output. Increasing this value ## allows for longer periods of output downtime without dropping metrics at the ## cost of higher maximum memory usage. metric_buffer_limit = 10000 ## Collection jitter is used to jitter the collection by a random amount. ## Each plugin will sleep for a random time within jitter before collecting. ## This can be used to avoid many plugins querying things like sysfs at the ## same time, which can have a measurable effect on the system. collection_jitter = "0s" ## Collection offset is used to shift the collection by the given amount. ## This can be be used to avoid many plugins querying constraint devices ## at the same time by manually scheduling them in time. # collection_offset = "0s" ## Default flushing interval for all outputs. Maximum flush_interval will be ## flush_interval + flush_jitter flush_interval = "10s" ## Jitter the flush interval by a random amount. This is primarily to avoid ## large write spikes for users running a large number of telegraf instances. ## ie, a jitter of 5s and interval 10s means flushes will happen every 10-15s flush_jitter = "0s" ## Collected metrics are rounded to the precision specified. Precision is ## specified as an interval with an integer + unit (e.g. 0s, 10ms, 2us, 4s). ## Valid time units are "ns", "us" (or "µs"), "ms", "s". ## ## By default or when set to "0s", precision will be set to the same ## timestamp order as the collection interval, with the maximum being 1s: ## ie, when interval = "10s", precision will be "1s" ## when interval = "250ms", precision will be "1ms" ## ## Precision will NOT be used for service inputs. It is up to each individual ## service input to set the timestamp at the appropriate precision. precision = "0s" ## Log at debug level. # debug = false ## Log only error level messages. # quiet = false ## Log format controls the way messages are logged and can be one of "text", ## "structured" or, on Windows, "eventlog". # logformat = "text" ## Message key for structured logs, to override the default of "msg". ## Ignored if `logformat` is not "structured". # structured_log_message_key = "message" ## Name of the file to be logged to or stderr if unset or empty. This ## setting is ignored for the "eventlog" format. # logfile = "" ## The logfile will be rotated after the time interval specified. When set ## to 0 no time based rotation is performed. Logs are rotated only when ## written to, if there is no log activity rotation may be delayed. # logfile_rotation_interval = "0h" ## The logfile will be rotated when it becomes larger than the specified ## size. When set to 0 no size based rotation is performed. # logfile_rotation_max_size = "0MB" ## Maximum number of rotated archives to keep, any older logs are deleted. ## If set to -1, no archives are removed. # logfile_rotation_max_archives = 5 ## Pick a timezone to use when logging or type 'local' for local time. ## Example: America/Chicago # log_with_timezone = "" ## Override default hostname, if empty use os.Hostname() # hostname = "" ## If set to true, do no set the "host" tag in the telegraf agent. # omit_hostname = false ## Method of translating SNMP objects. Can be "netsnmp" (deprecated) which ## translates by calling external programs snmptranslate and snmptable, ## or "gosmi" which translates using the built-in gosmi library. # snmp_translator = "netsnmp" ## Name of the file to load the state of plugins from and store the state to. ## If uncommented and not empty, this file will be used to save the state of ## stateful plugins on termination of Telegraf. If the file exists on start, ## the state in the file will be restored for the plugins. # statefile = "" ## Flag to skip running processors after aggregators ## By default, processors are run a second time after aggregators. Changing ## this setting to true will skip the second run of processors. # skip_processors_after_aggregators = false ================================================ FILE: cmd/telegraf/cmd_config.go ================================================ // Command handling for configuration "config" command package main import ( "errors" "fmt" "io" "log" "net/url" "os" "path/filepath" "github.com/fatih/color" "github.com/urfave/cli/v2" "github.com/influxdata/telegraf/agent" "github.com/influxdata/telegraf/config" "github.com/influxdata/telegraf/logger" "github.com/influxdata/telegraf/migrations" ) func getConfigCommands(configHandlingFlags []cli.Flag, outputBuffer io.Writer) []*cli.Command { return []*cli.Command{ { Name: "config", Usage: "commands for generating and migrating configurations", Flags: configHandlingFlags, Action: func(cCtx *cli.Context) error { // The sub_Filters are populated when the filter flags are set after the subcommand config // e.g. telegraf config --section-filter inputs filters := processFilterFlags(cCtx) printSampleConfig(outputBuffer, filters) return nil }, Subcommands: []*cli.Command{ { Name: "check", Usage: "check configuration file(s) for issues", Description: ` The 'check' command reads the configuration files specified via '--config' or '--config-directory' and tries to initialize, but not start, the plugins. Syntax and semantic errors detectable without starting the plugins will be reported. If no configuration file is explicitly specified the command reads the default locations and uses those configuration files. To check the file 'mysettings.conf' use > telegraf config check --config mysettings.conf `, Flags: configHandlingFlags, Action: func(cCtx *cli.Context) error { // Setup logging logConfig := &logger.Config{Debug: cCtx.Bool("debug")} if err := logger.SetupLogging(logConfig); err != nil { return err } // Set the environment variables handling mode if cCtx.Bool("strict-env-handling") && cCtx.Bool("non-strict-env-handling") { return errors.New("flags --strict-env-handling and --non-strict-env-handling cannot be used together") } if !cCtx.Bool("strict-env-handling") && !cCtx.Bool("non-strict-env-handling") { msg := "Strict environment variable handling will be the new default starting with v1.38.0! " + "If your configuration works with strict handling or you don't use environment variables it is safe " + "to ignore this warning. Otherwise please explicitly add the --non-strict-env-handling flag!" log.Println("W! " + color.YellowString(msg)) } config.NonStrictEnvVarHandling = !cCtx.Bool("strict-env-handling") // Collect the given configuration files configFiles := cCtx.StringSlice("config") configDir := cCtx.StringSlice("config-directory") for _, fConfigDirectory := range configDir { files, err := config.WalkDirectory(fConfigDirectory) if err != nil { return err } configFiles = append(configFiles, files...) } // If no "config" or "config-directory" flag(s) was // provided we should load default configuration files if len(configFiles) == 0 { paths, err := config.GetDefaultConfigPath() if err != nil { return err } configFiles = paths } // Load the config and try to initialize the plugins c := config.NewConfig() c.Agent.Quiet = cCtx.Bool("quiet") if err := c.LoadAll(configFiles...); err != nil { return err } ag := agent.NewAgent(c) // Set the default for processor skipping if c.Agent.SkipProcessorsAfterAggregators == nil { msg := `The default value of 'skip_processors_after_aggregators' will change to 'true' with Telegraf v1.40.0! ` msg += `If you need the current default behavior, please explicitly set the option to 'false'!` log.Print("W! [agent] ", color.YellowString(msg)) skipProcessorsAfterAggregators := false c.Agent.SkipProcessorsAfterAggregators = &skipProcessorsAfterAggregators } return ag.InitPlugins() }, }, { Name: "create", Usage: "create a full sample configuration and show it", Description: ` The 'create' produces a full configuration containing all plugins as an example and shows it on the console. You may apply 'section' or 'plugin' filtering to reduce the output to the plugins you need Create the full configuration > telegraf config create To produce a configuration only containing a Modbus input plugin and an InfluxDB v2 output plugin use > telegraf config create --section-filter "inputs:outputs" --input-filter "modbus" --output-filter "influxdb_v2" `, Flags: configHandlingFlags, Action: func(cCtx *cli.Context) error { filters := processFilterFlags(cCtx) printSampleConfig(outputBuffer, filters) return nil }, }, { Name: "migrate", Usage: "migrate deprecated plugins and options of the configuration(s)", Description: ` The 'migrate' command reads the configuration files specified via '--config' or '--config-directory' and tries to migrate plugins or options that are currently deprecated using the recommended replacements. If no configuration file is explicitly specified the command reads the default locations and uses those configuration files. Migrated files are stored with a '.migrated' suffix at the location of the inputs. If you are migrating remote configurations the migrated configurations is stored in the current directory using the filename of the URL with a '.migrated' suffix. It is highly recommended to test those migrated configurations before using those files unattended! To migrate the file 'mysettings.conf' use > telegraf config migrate --config mysettings.conf `, Flags: append(configHandlingFlags, &cli.BoolFlag{ Name: "force", Usage: "forces overwriting of an existing migration file", }, ), Action: func(cCtx *cli.Context) error { // Setup logging logConfig := &logger.Config{Debug: cCtx.Bool("debug")} if err := logger.SetupLogging(logConfig); err != nil { return err } // Check if we have migrations at all. There might be // none if you run a custom build without migrations // enabled. migrationsGeneral := len(migrations.GeneralMigrations) + len(migrations.GlobalMigrations) migrationsPlugins := len(migrations.PluginMigrations) migrationsOptions := len(migrations.PluginOptionMigrations) if migrationsGeneral+migrationsPlugins+migrationsOptions == 0 { return errors.New("no migrations available") } log.Printf( "%d general, %d plugin and %d plugin-option migrations available", migrationsGeneral, migrationsPlugins, migrationsOptions, ) // Collect the given configuration files configFiles := cCtx.StringSlice("config") configDir := cCtx.StringSlice("config-directory") for _, fConfigDirectory := range configDir { files, err := config.WalkDirectory(fConfigDirectory) if err != nil { return err } configFiles = append(configFiles, files...) } // If no "config" or "config-directory" flag(s) was // provided we should load default configuration files if len(configFiles) == 0 { paths, err := config.GetDefaultConfigPath() if err != nil { return err } configFiles = paths } for _, fn := range configFiles { log.Printf("D! Trying to migrate %q...", fn) // Read and parse the config file data, remote, err := config.LoadConfigFile(fn) if err != nil { return fmt.Errorf("opening input %q failed: %w", fn, err) } out, applied, err := config.ApplyMigrations(data) if err != nil { return err } // Do not write a migration file if nothing was done if applied == 0 { log.Printf("I! No migration applied for %q", fn) continue } // Construct the output filename // For remote locations we just save the filename // with the migrated suffix. outfn := fn + ".migrated" if remote { u, err := url.Parse(fn) if err != nil { return fmt.Errorf("parsing remote config URL %q failed: %w", fn, err) } outfn = filepath.Base(u.Path) + ".migrated" } log.Printf("I! %d migration applied for %q, writing result as %q", applied, fn, outfn) // Make sure the file does not exist yet if we should not overwrite if !cCtx.Bool("force") { if _, err := os.Stat(outfn); !errors.Is(err, os.ErrNotExist) { return fmt.Errorf("output file %q already exists", outfn) } } // Write the output file if err := os.WriteFile(outfn, out, 0640); err != nil { return fmt.Errorf("writing output %q failed: %w", outfn, err) } } return nil }, }, }, }, } } ================================================ FILE: cmd/telegraf/cmd_plugins.go ================================================ // Command handling for configuration "plugins" command package main import ( "fmt" "io" "sort" "strings" "github.com/urfave/cli/v2" "github.com/influxdata/telegraf/plugins/aggregators" "github.com/influxdata/telegraf/plugins/inputs" "github.com/influxdata/telegraf/plugins/outputs" "github.com/influxdata/telegraf/plugins/parsers" "github.com/influxdata/telegraf/plugins/processors" "github.com/influxdata/telegraf/plugins/secretstores" "github.com/influxdata/telegraf/plugins/serializers" ) func pluginNames[M ~map[string]V, V any](m M, prefix string) []byte { names := make([]string, 0, len(m)) for k := range m { names = append(names, fmt.Sprintf("%s.%s\n", prefix, k)) } sort.Strings(names) return []byte(strings.Join(names, "")) } func getPluginCommands(outputBuffer io.Writer) []*cli.Command { return []*cli.Command{ { Name: "plugins", Usage: "commands for printing available plugins", Flags: []cli.Flag{ &cli.BoolFlag{ Name: "deprecated", Usage: "print only deprecated plugins", }, }, Action: func(cCtx *cli.Context) error { if cCtx.Bool("deprecated") { outputBuffer.Write(pluginNames(inputs.Deprecations, "inputs")) outputBuffer.Write(pluginNames(outputs.Deprecations, "outputs")) outputBuffer.Write(pluginNames(processors.Deprecations, "processors")) outputBuffer.Write(pluginNames(aggregators.Deprecations, "aggregators")) outputBuffer.Write(pluginNames(secretstores.Deprecations, "secretstores")) outputBuffer.Write(pluginNames(parsers.Deprecations, "parsers")) outputBuffer.Write(pluginNames(serializers.Deprecations, "serializers")) } else { outputBuffer.Write(pluginNames(inputs.Inputs, "inputs")) outputBuffer.Write(pluginNames(outputs.Outputs, "outputs")) outputBuffer.Write(pluginNames(processors.Processors, "processors")) outputBuffer.Write(pluginNames(aggregators.Aggregators, "aggregators")) outputBuffer.Write(pluginNames(secretstores.SecretStores, "secretstores")) outputBuffer.Write(pluginNames(parsers.Parsers, "parsers")) outputBuffer.Write(pluginNames(serializers.Serializers, "serializers")) } return nil }, Subcommands: []*cli.Command{ { Name: "inputs", Usage: "Print available input plugins", Flags: []cli.Flag{ &cli.BoolFlag{ Name: "deprecated", Usage: "print only deprecated plugins", }, }, Action: func(cCtx *cli.Context) error { if cCtx.Bool("deprecated") { outputBuffer.Write(pluginNames(inputs.Deprecations, "inputs")) } else { outputBuffer.Write(pluginNames(inputs.Inputs, "inputs")) } return nil }, }, { Name: "outputs", Usage: "Print available output plugins", Flags: []cli.Flag{ &cli.BoolFlag{ Name: "deprecated", Usage: "print only deprecated plugins", }, }, Action: func(cCtx *cli.Context) error { if cCtx.Bool("deprecated") { outputBuffer.Write(pluginNames(outputs.Deprecations, "outputs")) } else { outputBuffer.Write(pluginNames(outputs.Outputs, "outputs")) } return nil }, }, { Name: "processors", Usage: "Print available processor plugins", Flags: []cli.Flag{ &cli.BoolFlag{ Name: "deprecated", Usage: "print only deprecated plugins", }, }, Action: func(cCtx *cli.Context) error { if cCtx.Bool("deprecated") { outputBuffer.Write(pluginNames(processors.Deprecations, "processors")) } else { outputBuffer.Write(pluginNames(processors.Processors, "processors")) } return nil }, }, { Name: "aggregators", Usage: "Print available aggregator plugins", Flags: []cli.Flag{ &cli.BoolFlag{ Name: "deprecated", Usage: "print only deprecated plugins", }, }, Action: func(cCtx *cli.Context) error { if cCtx.Bool("deprecated") { outputBuffer.Write(pluginNames(aggregators.Deprecations, "aggregators")) } else { outputBuffer.Write(pluginNames(aggregators.Aggregators, "aggregators")) } return nil }, }, { Name: "secretstores", Usage: "Print available secretstore plugins", Flags: []cli.Flag{ &cli.BoolFlag{ Name: "deprecated", Usage: "print only deprecated plugins", }, }, Action: func(cCtx *cli.Context) error { if cCtx.Bool("deprecated") { outputBuffer.Write(pluginNames(secretstores.Deprecations, "secretstores")) } else { outputBuffer.Write(pluginNames(secretstores.SecretStores, "secretstores")) } return nil }, }, { Name: "parsers", Usage: "Print available parser plugins", Flags: []cli.Flag{ &cli.BoolFlag{ Name: "deprecated", Usage: "print only deprecated plugins", }, }, Action: func(cCtx *cli.Context) error { if cCtx.Bool("deprecated") { outputBuffer.Write(pluginNames(parsers.Deprecations, "parsers")) } else { outputBuffer.Write(pluginNames(parsers.Parsers, "parsers")) } return nil }, }, { Name: "serializers", Usage: "Print available serializer plugins", Flags: []cli.Flag{ &cli.BoolFlag{ Name: "deprecated", Usage: "print only deprecated plugins", }, }, Action: func(cCtx *cli.Context) error { if cCtx.Bool("deprecated") { outputBuffer.Write(pluginNames(serializers.Deprecations, "serializers")) } else { outputBuffer.Write(pluginNames(serializers.Serializers, "serializers")) } return nil }, }, }, }, } } ================================================ FILE: cmd/telegraf/cmd_secretstore.go ================================================ // Command handling for secret-stores' "secrets" command package main import ( "errors" "fmt" "os" "sort" "strings" "github.com/awnumar/memguard" "github.com/urfave/cli/v2" "golang.org/x/term" ) func processFilterOnlySecretStoreFlags(ctx *cli.Context) Filters { sectionFilters := []string{"inputs", "outputs", "processors", "aggregators"} inputFilters := []string{"-"} outputFilters := []string{"-"} processorFilters := []string{"-"} aggregatorFilters := []string{"-"} // Only load the secret-stores var secretstore string if len(ctx.Lineage()) >= 2 { parent := ctx.Lineage()[1] // ancestor contexts in order from child to parent secretstore = parent.String("secretstore-filter") } // If both the parent and command filters are defined, append them together secretstore = appendFilter(secretstore, ctx.String("secretstore-filter")) secretstoreFilters := deleteEmpty(strings.Split(secretstore, ":")) return Filters{sectionFilters, inputFilters, outputFilters, aggregatorFilters, processorFilters, secretstoreFilters} } func getSecretStoreCommands(m App) []*cli.Command { return []*cli.Command{ { Name: "secrets", Usage: "commands for listing, adding and removing secrets on all known secret-stores", Subcommands: []*cli.Command{ { Name: "list", Usage: "list known secrets and secret-stores", Description: ` The 'list' command requires passing in your configuration file containing the secret-store definitions you want to access. To get a list of available secret-store plugins, please have a look at https://github.com/influxdata/telegraf/tree/master/plugins/secretstores. For help on how to define secret-stores, check the documentation of the different plugins. Assuming you use the default configuration file location, you can run the following command to list the keys of all known secrets in ALL available stores > telegraf secrets list To get the keys of all known secrets in a particular store, you can run > telegraf secrets list mystore To also reveal the actual secret, i.e. the value, you can pass the '--reveal-secret' flag. `, ArgsUsage: "[secret-store ID]...[secret-store ID]", Flags: []cli.Flag{ &cli.BoolFlag{ Name: "reveal-secret", Usage: "also print the secret value", }, }, Action: func(cCtx *cli.Context) error { // Only load the secret-stores filters := processFilterOnlySecretStoreFlags(cCtx) g := GlobalFlags{ config: cCtx.StringSlice("config"), configDir: cCtx.StringSlice("config-directory"), plugindDir: cCtx.String("plugin-directory"), password: cCtx.String("password"), debug: cCtx.Bool("debug"), } w := WindowFlags{} m.Init(nil, filters, g, w) args := cCtx.Args() var storeIDs []string if args.Present() { storeIDs = args.Slice() } else { ids, err := m.ListSecretStores() if err != nil { return fmt.Errorf("unable to determine secret-store IDs: %w", err) } storeIDs = ids } sort.Strings(storeIDs) reveal := cCtx.Bool("reveal-secret") for _, storeID := range storeIDs { store, err := m.GetSecretStore(storeID) if err != nil { return fmt.Errorf("unable to get secret-store %q: %w", storeID, err) } keys, err := store.List() if err != nil { return fmt.Errorf("unable to get secrets from store %q: %w", storeID, err) } sort.Strings(keys) fmt.Printf("Known secrets for store %q:\n", storeID) for _, k := range keys { var v []byte if reveal { if v, err = store.Get(k); err != nil { return fmt.Errorf("unable to get value of secret %q from store %q: %w", k, storeID, err) } } fmt.Printf(" %-30s %s\n", k, string(v)) memguard.WipeBytes(v) } } return nil }, }, { Name: "get", Usage: "retrieves value of given secret from given store", Description: ` The 'get' command requires passing in your configuration file containing the secret-store definitions you want to access. To get a list of available secret-store plugins, please have a look at https://github.com/influxdata/telegraf/tree/master/plugins/secretstores. and use the 'secrets list' command to get the IDs of available stores and key(s) of available secrets. For help on how to define secret-stores, check the documentation of the different plugins. Assuming you use the default configuration file location, you can run the following command to retrieve a secret from a secret store available stores > telegraf secrets get mystore mysecretkey This will fetch the secret with the key 'mysecretkey' from the secret-store with the ID 'mystore'. `, ArgsUsage: " ", Action: func(cCtx *cli.Context) error { // Only load the secret-stores filters := processFilterOnlySecretStoreFlags(cCtx) g := GlobalFlags{ config: cCtx.StringSlice("config"), configDir: cCtx.StringSlice("config-directory"), plugindDir: cCtx.String("plugin-directory"), password: cCtx.String("password"), debug: cCtx.Bool("debug"), } w := WindowFlags{} m.Init(nil, filters, g, w) args := cCtx.Args() if !args.Present() || args.Len() != 2 { return errors.New("invalid number of arguments") } storeID := args.First() key := args.Get(1) store, err := m.GetSecretStore(storeID) if err != nil { return fmt.Errorf("unable to get secret-store: %w", err) } value, err := store.Get(key) if err != nil { return fmt.Errorf("unable to get secret: %w", err) } fmt.Printf("%s:%s = %s\n", storeID, key, value) return nil }, }, { Name: "set", Usage: "create or modify a secret in the given store", Description: ` The 'set' command requires passing in your configuration file containing the secret-store definitions you want to access. To get a list of available secret-store plugins, please have a look at https://github.com/influxdata/telegraf/tree/master/plugins/secretstores. and use the 'secrets list' command to get the IDs of available stores and keys. For help on how to define secret-stores, check the documentation of the different plugins. Assuming you use the default configuration file location, you can run the following command to create a secret in anm available secret-store > telegraf secrets set mystore mysecretkey mysecretvalue This will create a secret with the key 'mysecretkey' in the secret-store with the ID 'mystore' with the value being set to 'mysecretvalue'. If a secret with that key ('mysecretkey') already existed in that store, its value will be modified. When you leave out the value of the secret like > telegraf secrets set mystore mysecretkey you will be prompted to enter the value of the secret. `, ArgsUsage: " ", Action: func(cCtx *cli.Context) error { // Only load the secret-stores filters := processFilterOnlySecretStoreFlags(cCtx) g := GlobalFlags{ config: cCtx.StringSlice("config"), configDir: cCtx.StringSlice("config-directory"), plugindDir: cCtx.String("plugin-directory"), password: cCtx.String("password"), debug: cCtx.Bool("debug"), } w := WindowFlags{} m.Init(nil, filters, g, w) args := cCtx.Args() if !args.Present() || args.Len() < 2 { return errors.New("invalid number of arguments") } storeID := args.First() key := args.Get(1) value := args.Get(2) if value == "" { fmt.Printf("Enter secret value: ") b, err := term.ReadPassword(int(os.Stdin.Fd())) if err != nil { return err } fmt.Println() value = string(b) } store, err := m.GetSecretStore(storeID) if err != nil { return fmt.Errorf("unable to get secret-store: %w", err) } if err := store.Set(key, value); err != nil { return fmt.Errorf("unable to set secret: %w", err) } return nil }, }, }, }, } } ================================================ FILE: cmd/telegraf/cmd_win_service.go ================================================ //go:build windows // Command handling for configuration "service" command package main import ( "errors" "fmt" "io" "github.com/urfave/cli/v2" "golang.org/x/sys/windows" ) func cliFlags() []cli.Flag { return []cli.Flag{ &cli.StringFlag{ Name: "service", Usage: "operate on the service (windows only)", }, &cli.StringFlag{ Name: "service-name", Value: "telegraf", Usage: "service name (windows only)", }, &cli.StringFlag{ Name: "service-display-name", Value: "Telegraf Data Collector Service", Usage: "service display name (windows only)", }, &cli.StringFlag{ Name: "service-restart-delay", Value: "5m", }, &cli.BoolFlag{ Name: "service-auto-restart", Usage: "auto restart service on failure (windows only)", }, &cli.BoolFlag{ Name: "console", Usage: "run as console application (windows only)", }, } } func getServiceCommands(outputBuffer io.Writer) []*cli.Command { return []*cli.Command{ { Name: "service", Usage: "commands for operate on the Windows service", Flags: nil, Subcommands: []*cli.Command{ { Name: "install", Usage: "install Telegraf as a Windows service", Description: ` The 'install' command with create a Windows service for automatically starting Telegraf with the specified configuration and service parameters. If no configuration(s) is specified the service will use the file in "C:\Program Files\Telegraf\telegraf.conf". To install Telegraf as a service use > telegraf service install In case you are planning to start multiple Telegraf instances as a service, you must use distinctive service-names for each instance. To install two services with different configurations use > telegraf --config "C:\Program Files\Telegraf\telegraf-machine.conf" --service-name telegraf-machine service install > telegraf --config "C:\Program Files\Telegraf\telegraf-service.conf" --service-name telegraf-service service install `, Flags: []cli.Flag{ &cli.StringFlag{ Name: "display-name", Value: "Telegraf Data Collector Service", Usage: "service name as displayed in the service manager", }, &cli.StringFlag{ Name: "restart-delay", Value: "5m", Usage: "duration for delaying the service restart on failure", }, &cli.BoolFlag{ Name: "auto-restart", Usage: "enable automatic service restart on failure", }, }, Action: func(cCtx *cli.Context) error { cfg := &serviceConfig{ displayName: cCtx.String("display-name"), restartDelay: cCtx.String("restart-delay"), autoRestart: cCtx.Bool("auto-restart"), configs: cCtx.StringSlice("config"), configDirs: cCtx.StringSlice("config-directory"), } name := cCtx.String("service-name") if err := installService(name, cfg); err != nil { return err } fmt.Fprintf(outputBuffer, "Successfully installed service %q\n", name) return nil }, }, { Name: "uninstall", Usage: "remove the Telegraf Windows service", Description: ` The 'uninstall' command removes the Telegraf service with the given name. To remove a service use > telegraf service uninstall In case you specified a custom service-name during install use > telegraf --service-name telegraf-machine service uninstall `, Action: func(cCtx *cli.Context) error { name := cCtx.String("service-name") if err := uninstallService(name); err != nil { return err } fmt.Fprintf(outputBuffer, "Successfully uninstalled service %q\n", name) return nil }, }, { Name: "start", Usage: "start the Telegraf Windows service", Description: ` The 'start' command triggers the start of the Windows service with the given name. To start the service either use the Windows service manager or run > telegraf service start In case you specified a custom service-name during install use > telegraf --service-name telegraf-machine service start `, Action: func(cCtx *cli.Context) error { name := cCtx.String("service-name") if err := startService(name); err != nil { return err } fmt.Fprintf(outputBuffer, "Successfully started service %q\n", name) return nil }, }, { Name: "stop", Usage: "stop the Telegraf Windows service", Description: ` The 'stop' command triggers the stop of the Windows service with the given name and will wait until the service is actually stopped. To stop the service either use the Windows service manager or run > telegraf service stop In case you specified a custom service-name during install use > telegraf --service-name telegraf-machine service stop `, Action: func(cCtx *cli.Context) error { name := cCtx.String("service-name") if err := stopService(name); err != nil { if errors.Is(err, windows.ERROR_SERVICE_NOT_ACTIVE) { fmt.Fprintf(outputBuffer, "Service %q not started\n", name) return nil } return err } fmt.Fprintf(outputBuffer, "Successfully stopped service %q\n", name) return nil }, }, { Name: "status", Usage: "query the Telegraf Windows service status", Description: ` The 'status' command queries the current state of the Windows service with the given name. To query the service either check the Windows service manager or run > telegraf service status In case you specified a custom service-name during install use > telegraf --service-name telegraf-machine service status `, Action: func(cCtx *cli.Context) error { name := cCtx.String("service-name") status, err := queryService(name) if err != nil { return err } fmt.Fprintf(outputBuffer, "Service %q is in %q state\n", name, status) return nil }, }, }, }, } } ================================================ FILE: cmd/telegraf/cmd_win_service_notwindows.go ================================================ //go:build !windows package main import ( "io" "github.com/urfave/cli/v2" ) func cliFlags() []cli.Flag { return make([]cli.Flag, 0) } func getServiceCommands(io.Writer) []*cli.Command { return nil } ================================================ FILE: cmd/telegraf/main.go ================================================ package main import ( "errors" "fmt" "io" "log" "os" "sort" "strings" "github.com/awnumar/memguard" "github.com/fatih/color" "github.com/urfave/cli/v2" "github.com/influxdata/telegraf/config" "github.com/influxdata/telegraf/internal" "github.com/influxdata/telegraf/internal/goplugin" "github.com/influxdata/telegraf/logger" _ "github.com/influxdata/telegraf/plugins/aggregators/all" "github.com/influxdata/telegraf/plugins/inputs" _ "github.com/influxdata/telegraf/plugins/inputs/all" "github.com/influxdata/telegraf/plugins/outputs" _ "github.com/influxdata/telegraf/plugins/outputs/all" _ "github.com/influxdata/telegraf/plugins/parsers/all" _ "github.com/influxdata/telegraf/plugins/processors/all" _ "github.com/influxdata/telegraf/plugins/secretstores/all" _ "github.com/influxdata/telegraf/plugins/serializers/all" ) type TelegrafConfig interface { CollectDeprecationInfos([]string, []string, []string, []string) map[string][]config.PluginDeprecationInfo PrintDeprecationList([]config.PluginDeprecationInfo) } type Filters struct { section []string input []string output []string aggregator []string processor []string secretstore []string } func appendFilter(a, b string) string { if a != "" && b != "" { return fmt.Sprintf("%s:%s", a, b) } if a != "" { return a } return b } func processFilterFlags(ctx *cli.Context) Filters { var section, input, output, aggregator, processor, secretstore string // Support defining filters before and after the command // The old style was: // ./telegraf --section-filter inputs --input-filter cpu config >test.conf // The new style is: // ./telegraf config --section-filter inputs --input-filter cpu >test.conf // To support the old style, check if the parent context has the filter flags defined if len(ctx.Lineage()) >= 2 { parent := ctx.Lineage()[1] // ancestor contexts in order from child to parent section = parent.String("section-filter") input = parent.String("input-filter") output = parent.String("output-filter") aggregator = parent.String("aggregator-filter") processor = parent.String("processor-filter") secretstore = parent.String("secretstore-filter") } // If both the parent and command filters are defined, append them together section = appendFilter(section, ctx.String("section-filter")) input = appendFilter(input, ctx.String("input-filter")) output = appendFilter(output, ctx.String("output-filter")) aggregator = appendFilter(aggregator, ctx.String("aggregator-filter")) processor = appendFilter(processor, ctx.String("processor-filter")) secretstore = appendFilter(secretstore, ctx.String("secretstore-filter")) sectionFilters := deleteEmpty(strings.Split(section, ":")) inputFilters := deleteEmpty(strings.Split(input, ":")) outputFilters := deleteEmpty(strings.Split(output, ":")) aggregatorFilters := deleteEmpty(strings.Split(aggregator, ":")) processorFilters := deleteEmpty(strings.Split(processor, ":")) secretstoreFilters := deleteEmpty(strings.Split(secretstore, ":")) return Filters{sectionFilters, inputFilters, outputFilters, aggregatorFilters, processorFilters, secretstoreFilters} } func deleteEmpty(s []string) []string { var r []string for _, str := range s { if str != "" { r = append(r, str) } } return r } // runApp defines all the subcommands and flags for Telegraf // this abstraction is used for testing, so outputBuffer and args can be changed func runApp(args []string, outputBuffer io.Writer, pprof Server, c TelegrafConfig, m App) error { configHandlingFlags := []cli.Flag{ &cli.StringSliceFlag{ Name: "config", Usage: "configuration file to load", }, &cli.StringSliceFlag{ Name: "config-directory", Usage: "directory containing additional *.conf files", }, &cli.StringFlag{ Name: "section-filter", Usage: "filter the sections to print, separator is ':'. " + "Valid values are 'agent', 'global_tags', 'outputs', 'processors', 'aggregators' and 'inputs'", }, &cli.StringFlag{ Name: "input-filter", Usage: "filter the inputs to enable, separator is ':'", }, &cli.StringFlag{ Name: "output-filter", Usage: "filter the outputs to enable, separator is ':'", }, &cli.StringFlag{ Name: "aggregator-filter", Usage: "filter the aggregators to enable, separator is ':'", }, &cli.StringFlag{ Name: "processor-filter", Usage: "filter the processors to enable, separator is ':'", }, &cli.StringFlag{ Name: "secretstore-filter", Usage: "filter the secret-stores to enable, separator is ':'", }, &cli.BoolFlag{ Name: "strict-env-handling", Usage: "enforces strict and secure handling of environment variables; will not work with non-string settings", }, &cli.BoolFlag{ Name: "non-strict-env-handling", Usage: "allow unsafe non-strict handling of environment variables to replace non-string settings", }, } mainFlags := append(configHandlingFlags, cliFlags()...) // This function is used when Telegraf is run with only flags action := func(cCtx *cli.Context) error { // We do not expect any arguments this is likely a misspelling of // a command... if cCtx.NArg() > 0 { return fmt.Errorf("unknown command %q", cCtx.Args().First()) } // Deprecated: Use execd instead // Load external plugins, if requested. if cCtx.String("plugin-directory") != "" { log.Printf("I! Loading external plugins from: %s", cCtx.String("plugin-directory")) if err := goplugin.LoadExternalPlugins(cCtx.String("plugin-directory")); err != nil { return err } } // switch for flags which just do something and exit immediately switch { // print available input plugins case cCtx.Bool("deprecation-list"): filters := processFilterFlags(cCtx) infos := c.CollectDeprecationInfos( filters.input, filters.output, filters.aggregator, filters.processor, ) outputBuffer.Write([]byte("Deprecated Input Plugins:\n")) c.PrintDeprecationList(infos["inputs"]) outputBuffer.Write([]byte("Deprecated Output Plugins:\n")) c.PrintDeprecationList(infos["outputs"]) outputBuffer.Write([]byte("Deprecated Processor Plugins:\n")) c.PrintDeprecationList(infos["processors"]) outputBuffer.Write([]byte("Deprecated Aggregator Plugins:\n")) c.PrintDeprecationList(infos["aggregators"]) return nil // print available output plugins case cCtx.Bool("output-list"): outputBuffer.Write([]byte("DEPRECATED: use telegraf plugins outputs\n")) outputBuffer.Write([]byte("Available Output Plugins:\n")) names := make([]string, 0, len(outputs.Outputs)) for k := range outputs.Outputs { names = append(names, k) } sort.Strings(names) for _, k := range names { fmt.Fprintf(outputBuffer, " %s\n", k) } return nil // print available input plugins case cCtx.Bool("input-list"): outputBuffer.Write([]byte("DEPRECATED: use telegraf plugins inputs\n")) outputBuffer.Write([]byte("Available Input Plugins:\n")) names := make([]string, 0, len(inputs.Inputs)) for k := range inputs.Inputs { names = append(names, k) } sort.Strings(names) for _, k := range names { fmt.Fprintf(outputBuffer, " %s\n", k) } return nil // print usage for a plugin, ie, 'telegraf --usage mysql' case cCtx.String("usage") != "": err := PrintInputConfig(cCtx.String("usage"), outputBuffer) err2 := PrintOutputConfig(cCtx.String("usage"), outputBuffer) if err != nil && err2 != nil { return fmt.Errorf("%w and %w", err, err2) } return nil // DEPRECATED case cCtx.Bool("version"): fmt.Fprintf(outputBuffer, "%s\n", internal.FormatFullVersion()) return nil // DEPRECATED case cCtx.Bool("sample-config"): filters := processFilterFlags(cCtx) printSampleConfig(outputBuffer, filters) return nil } if cCtx.String("pprof-addr") != "" { pprof.Start(cCtx.String("pprof-addr")) } if cCtx.Bool("strict-env-handling") && cCtx.Bool("non-strict-env-handling") { return errors.New("flags --strict-env-handling and --non-strict-env-handling cannot be used together") } if !cCtx.Bool("strict-env-handling") && !cCtx.Bool("non-strict-env-handling") { msg := "Strict environment variable handling is the new default starting with v1.38.0! " + "If your configuration does not work with strict handling please explicitly add " + "the --non-strict-env-handling flag to switch to the previous behavior!" log.Println("W! " + color.YellowString(msg)) } if err := config.SetPluginLabelSelections(cCtx.StringSlice("select")); err != nil { return err } filters := processFilterFlags(cCtx) g := GlobalFlags{ config: cCtx.StringSlice("config"), configDir: cCtx.StringSlice("config-directory"), testWait: cCtx.Int("test-wait"), configURLRetryAttempts: cCtx.Int("config-url-retry-attempts"), configURLWatchInterval: cCtx.Duration("config-url-watch-interval"), watchConfig: cCtx.String("watch-config"), watchInterval: cCtx.Duration("watch-interval"), watchDebounceInterval: cCtx.Duration("watch-debounce-interval"), pidFile: cCtx.String("pidfile"), plugindDir: cCtx.String("plugin-directory"), password: cCtx.String("password"), oldEnvBehavior: cCtx.Bool("old-env-behavior"), nonStrictEnvVars: cCtx.Bool("non-strict-env-handling"), printPluginConfigSource: cCtx.Bool("print-plugin-config-source"), test: cCtx.Bool("test"), debug: cCtx.Bool("debug"), once: cCtx.Bool("once"), quiet: cCtx.Bool("quiet"), unprotected: cCtx.Bool("unprotected"), } w := WindowFlags{ service: cCtx.String("service"), serviceName: cCtx.String("service-name"), serviceDisplayName: cCtx.String("service-display-name"), serviceRestartDelay: cCtx.String("service-restart-delay"), serviceAutoRestart: cCtx.Bool("service-auto-restart"), console: cCtx.Bool("console"), } m.Init(pprof.ErrChan(), filters, g, w) return m.Run() } commands := append( getConfigCommands(configHandlingFlags, outputBuffer), getSecretStoreCommands(m)..., ) commands = append(commands, getPluginCommands(outputBuffer)...) commands = append(commands, getServiceCommands(outputBuffer)...) app := &cli.App{ Name: "Telegraf", Usage: "The plugin-driven server agent for collecting & reporting metrics.", Writer: outputBuffer, Flags: append( []cli.Flag{ // Int flags &cli.IntFlag{ Name: "test-wait", Usage: "wait up to this many seconds for service inputs to complete in test mode", }, &cli.IntFlag{ Name: "config-url-retry-attempts", Usage: "Number of attempts to obtain a remote configuration via a URL during startup. " + "Set to -1 for unlimited attempts.", DefaultText: "3", }, // // String flags &cli.StringFlag{ Name: "usage", Usage: "print usage for a plugin, ie, 'telegraf --usage mysql'", }, &cli.StringFlag{ Name: "pprof-addr", Usage: "pprof host/IP and port to listen on (e.g. 'localhost:6060')", }, &cli.StringFlag{ Name: "watch-config", Usage: "monitoring config changes [notify, poll] of --config and --config-directory options. " + "Notify supports linux, *bsd, and macOS. Poll is required for Windows and checks every 250ms.", }, &cli.DurationFlag{ Name: "watch-debounce-interval", Usage: "Time duration to wait after a config change before reloading", DefaultText: "0s", Value: 0, }, &cli.StringFlag{ Name: "pidfile", Usage: "file to write our pid to", }, &cli.StringFlag{ Name: "password", Usage: "password to unlock secret-stores", }, // // Bool flags &cli.BoolFlag{ Name: "old-env-behavior", Usage: "switch back to pre v1.27 environment replacement behavior", }, &cli.BoolFlag{ Name: "print-plugin-config-source", Usage: "print the source for a given plugin", }, &cli.BoolFlag{ Name: "once", Usage: "run one gather and exit", }, &cli.BoolFlag{ Name: "debug", Usage: "turn on debug logging", }, &cli.BoolFlag{ Name: "quiet", Usage: "run in quiet mode", }, &cli.BoolFlag{ Name: "unprotected", Usage: "do not protect secrets in memory", }, &cli.BoolFlag{ Name: "test", Usage: "enable test mode: gather metrics, print them out, and exit. " + "Note: Test mode only runs inputs, processors, and aggregators, but not outputs", }, &cli.StringSliceFlag{ Name: "select", Usage: "enable only plugins with labels matching the given key-value selection. " + "If no selectors are provided, all plugins are enabled. Multiple key-value pairs " + "in an option will be combined by AND, multiple options are combined by OR. " + "Key and value are separated by an equal sign, multiple pairs are separated by " + "semi-colon, values do accept wildcards.", }, // // Duration flags &cli.DurationFlag{ Name: "watch-interval", Usage: "Time duration to check for updates to config files specified by --config and " + "--config-directory options. Use with '--watch-config poll'", DefaultText: "disabled", }, &cli.DurationFlag{ Name: "config-url-watch-interval", Usage: "Time duration to check for updates to URL based configuration files", DefaultText: "disabled", }, // TODO: Change "deprecation-list, input-list, output-list" flags to become a subcommand "list" that takes // "input,output,aggregator,processor, deprecated" as parameters &cli.BoolFlag{ Name: "deprecation-list", Usage: "print all deprecated plugins or plugin options", }, &cli.BoolFlag{ Name: "input-list", Usage: "print available input plugins", }, &cli.BoolFlag{ Name: "output-list", Usage: "print available output plugins", }, // // !!! The following flags are DEPRECATED !!! // Already covered with the subcommand `./telegraf version` &cli.BoolFlag{ Name: "version", Usage: "DEPRECATED: display the version and exit", }, // Already covered with the subcommand `./telegraf config` &cli.BoolFlag{ Name: "sample-config", Usage: "DEPRECATED: print out full sample configuration", }, // Using execd plugin to add external plugins is preferred (less size impact, easier for end user) &cli.StringFlag{ Name: "plugin-directory", Usage: "DEPRECATED: path to directory containing external plugins", }, // !!! }, mainFlags...), Action: action, Commands: append([]*cli.Command{ { Name: "version", Usage: "print current version to stdout", Action: func(*cli.Context) error { fmt.Fprintf(outputBuffer, "%s\n", internal.FormatFullVersion()) return nil }, }, }, commands...), } // Make sure we safely erase secrets defer memguard.Purge() defer logger.CloseLogging() if err := app.Run(args); err != nil { log.Printf("E! %s", err) return err } return nil } func main() { // #13481: disables gh:99designs/keyring kwallet.go from connecting to dbus os.Setenv("DISABLE_KWALLET", "1") agent := Telegraf{} pprof := NewPprofServer() c := config.NewConfig() if err := runApp(os.Args, os.Stdout, pprof, c, &agent); err != nil { os.Exit(1) } } ================================================ FILE: cmd/telegraf/main_test.go ================================================ package main import ( "bytes" "errors" "fmt" "io" "os" "strconv" "strings" "testing" "github.com/stretchr/testify/require" "github.com/influxdata/telegraf" "github.com/influxdata/telegraf/config" "github.com/influxdata/telegraf/internal" "github.com/influxdata/telegraf/plugins/inputs" "github.com/influxdata/telegraf/plugins/outputs" ) var secrets = map[string]map[string][]byte{ "yoda": { "episode1": []byte("member"), "episode2": []byte("member"), "episode3": []byte("member"), }, "mace_windu": { "episode1": []byte("member"), "episode2": []byte("member"), "episode3": []byte("member"), }, "oppo_rancisis": { "episode1": []byte("member"), "episode2": []byte("member"), }, "coleman_kcaj": { "episode3": []byte("member"), }, } type MockTelegraf struct { GlobalFlags WindowFlags } func NewMockTelegraf() *MockTelegraf { return &MockTelegraf{} } func (m *MockTelegraf) Init(_ <-chan error, _ Filters, g GlobalFlags, w WindowFlags) { m.GlobalFlags = g m.WindowFlags = w } func (*MockTelegraf) Run() error { return nil } func (*MockTelegraf) ListSecretStores() ([]string, error) { ids := make([]string, 0, len(secrets)) for k := range secrets { ids = append(ids, k) } return ids, nil } func (*MockTelegraf) GetSecretStore(id string) (telegraf.SecretStore, error) { v, found := secrets[id] if !found { return nil, errors.New("unknown secret store") } s := &MockSecretStore{Secrets: v} return s, nil } type MockSecretStore struct { Secrets map[string][]byte } func (*MockSecretStore) Init() error { return nil } func (*MockSecretStore) SampleConfig() string { return "I'm just a dummy" } func (s *MockSecretStore) Get(key string) ([]byte, error) { v, found := s.Secrets[key] if !found { return nil, errors.New("not found") } return v, nil } func (s *MockSecretStore) Set(key, value string) error { if strings.HasPrefix(key, "darth") { return errors.New("don't join the dark side") } s.Secrets[key] = []byte(value) return nil } func (s *MockSecretStore) List() ([]string, error) { keys := make([]string, 0, len(s.Secrets)) for k := range s.Secrets { keys = append(keys, k) } return keys, nil } func (s *MockSecretStore) GetResolver(key string) (telegraf.ResolveFunc, error) { return func() ([]byte, bool, error) { v, err := s.Get(key) return v, false, err }, nil } type MockConfig struct { Buffer io.Writer ExpectedDeprecatedPlugins map[string][]config.PluginDeprecationInfo } func NewMockConfig(buffer io.Writer) *MockConfig { return &MockConfig{ Buffer: buffer, } } func (m *MockConfig) CollectDeprecationInfos(_, _, _, _ []string) map[string][]config.PluginDeprecationInfo { return m.ExpectedDeprecatedPlugins } func (m *MockConfig) PrintDeprecationList(plugins []config.PluginDeprecationInfo) { for _, p := range plugins { fmt.Fprintf(m.Buffer, "plugin name: %s\n", p.Name) } } type MockServer struct { Address string } func NewMockServer() *MockServer { return &MockServer{} } func (m *MockServer) Start(_ string) { m.Address = "localhost:6060" } func (*MockServer) ErrChan() <-chan error { return nil } func TestUsageFlag(t *testing.T) { tests := []struct { PluginName string ExpectedError string ExpectedOutput string }{ { PluginName: "example", ExpectedError: "input example not found and output example not found", }, { PluginName: "temp", ExpectedOutput: ` # Read metrics about temperature [[inputs.temp]] ## Desired output format (Linux only) ## Available values are ## v1 -- use pre-v1.22.4 sensor naming, e.g. coretemp_core0_input ## v2 -- use v1.22.4+ sensor naming, e.g. coretemp_core_0_input # metric_format = "v2" ## Add device tag to distinguish devices with the same name (Linux only) # add_device_tag = false `, }, } for _, test := range tests { buf := new(bytes.Buffer) args := os.Args[0:1] args = append(args, "--usage", test.PluginName) err := runApp(args, buf, NewMockServer(), NewMockConfig(buf), NewMockTelegraf()) if test.ExpectedError != "" { require.ErrorContains(t, err, test.ExpectedError) continue } require.NoError(t, err) // To run this test on windows and linux, remove windows carriage return o := strings.Replace(buf.String(), "\r", "", -1) require.Equal(t, test.ExpectedOutput, o) } } func TestInputListFlag(t *testing.T) { buf := new(bytes.Buffer) args := os.Args[0:1] args = append(args, "--input-list") temp := inputs.Inputs inputs.Inputs = map[string]inputs.Creator{ "test": func() telegraf.Input { return nil }, } err := runApp(args, buf, NewMockServer(), NewMockConfig(buf), NewMockTelegraf()) require.NoError(t, err) expectedOutput := `DEPRECATED: use telegraf plugins inputs Available Input Plugins: test ` require.Equal(t, expectedOutput, buf.String()) inputs.Inputs = temp } func TestOutputListFlag(t *testing.T) { buf := new(bytes.Buffer) args := os.Args[0:1] args = append(args, "--output-list") temp := outputs.Outputs outputs.Outputs = map[string]outputs.Creator{ "test": func() telegraf.Output { return nil }, } err := runApp(args, buf, NewMockServer(), NewMockConfig(buf), NewMockTelegraf()) require.NoError(t, err) expectedOutput := `DEPRECATED: use telegraf plugins outputs Available Output Plugins: test ` require.Equal(t, expectedOutput, buf.String()) outputs.Outputs = temp } func TestDeprecationListFlag(t *testing.T) { buf := new(bytes.Buffer) args := os.Args[0:1] args = append(args, "--deprecation-list") mS := NewMockServer() mC := NewMockConfig(buf) mC.ExpectedDeprecatedPlugins = make(map[string][]config.PluginDeprecationInfo) mC.ExpectedDeprecatedPlugins["inputs"] = []config.PluginDeprecationInfo{ { DeprecationInfo: config.DeprecationInfo{ Name: "test", }, }, } err := runApp(args, buf, mS, mC, NewMockTelegraf()) require.NoError(t, err) expectedOutput := `Deprecated Input Plugins: plugin name: test Deprecated Output Plugins: Deprecated Processor Plugins: Deprecated Aggregator Plugins: ` require.Equal(t, expectedOutput, buf.String()) } func TestPprofAddressFlag(t *testing.T) { buf := new(bytes.Buffer) args := os.Args[0:1] address := "localhost:6060" args = append(args, "--pprof-addr", address) m := NewMockServer() err := runApp(args, buf, m, NewMockConfig(buf), NewMockTelegraf()) require.NoError(t, err) require.Equal(t, address, m.Address) } // !!! DEPRECATED !!! // TestPluginDirectoryFlag tests `--plugin-directory` func TestPluginDirectoryFlag(t *testing.T) { buf := new(bytes.Buffer) args := os.Args[0:1] args = append(args, "--plugin-directory", ".") err := runApp(args, buf, NewMockServer(), NewMockConfig(buf), NewMockTelegraf()) require.ErrorContains(t, err, "go plugin support is not enabled") } func TestCommandConfig(t *testing.T) { tests := []struct { name string commands []string expectedHeaders []string removedHeaders []string expectedPlugins []string removedPlugins []string }{ { name: "deprecated flag --sample-config", commands: []string{"--sample-config"}, expectedHeaders: []string{ outputHeader, inputHeader, aggregatorHeader, processorHeader, serviceInputHeader, }, }, { name: "no filters", commands: []string{"config"}, expectedHeaders: []string{ outputHeader, inputHeader, aggregatorHeader, processorHeader, serviceInputHeader, }, }, { name: "filter sections for inputs", commands: []string{"config", "--section-filter", "inputs"}, expectedHeaders: []string{ inputHeader, }, removedHeaders: []string{ outputHeader, aggregatorHeader, processorHeader, }, }, { name: "filter sections for inputs,outputs", commands: []string{"config", "--section-filter", "inputs:outputs"}, expectedHeaders: []string{ inputHeader, outputHeader, }, removedHeaders: []string{ aggregatorHeader, processorHeader, }, }, { name: "filter input plugins", commands: []string{"config", "--input-filter", "cpu:file"}, expectedPlugins: []string{ "[[inputs.cpu]]", "[[inputs.file]]", }, removedPlugins: []string{ "[[inputs.disk]]", }, }, { name: "filter output plugins", commands: []string{"config", "--output-filter", "influxdb:http"}, expectedPlugins: []string{ "[[outputs.influxdb]]", "[[outputs.http]]", }, removedPlugins: []string{ "[[outputs.file]]", }, }, { name: "filter processor plugins", commands: []string{"config", "--processor-filter", "date:enum"}, expectedPlugins: []string{ "[[processors.date]]", "[[processors.enum]]", }, removedPlugins: []string{ "[[processors.parser]]", }, }, { name: "filter aggregator plugins", commands: []string{"config", "--aggregator-filter", "basicstats:starlark"}, expectedPlugins: []string{ "[[aggregators.basicstats]]", "[[aggregators.starlark]]", }, removedPlugins: []string{ "[[aggregators.minmax]]", }, }, { name: "test filters before config", commands: []string{"--input-filter", "cpu:file", "config"}, expectedPlugins: []string{ "[[inputs.cpu]]", "[[inputs.file]]", }, removedPlugins: []string{ "[[inputs.disk]]", }, }, { name: "test filters before and after config", commands: []string{"--input-filter", "file", "config", "--input-filter", "cpu"}, expectedPlugins: []string{ "[[inputs.cpu]]", "[[inputs.file]]", }, removedPlugins: []string{ "[[inputs.disk]]", }, }, } for _, test := range tests { t.Run(test.name, func(t *testing.T) { buf := new(bytes.Buffer) args := os.Args[0:1] args = append(args, test.commands...) err := runApp(args, buf, NewMockServer(), NewMockConfig(buf), NewMockTelegraf()) require.NoError(t, err) output := buf.String() for _, e := range test.expectedHeaders { require.Contains(t, output, e, "expected header not found") } for _, r := range test.removedHeaders { require.NotContains(t, output, r, "removed header found") } for _, e := range test.expectedPlugins { require.Contains(t, output, e, "expected plugin not found") } for _, r := range test.removedPlugins { require.NotContains(t, output, r, "removed plugin found") } }) } } func TestCommandVersion(t *testing.T) { tests := []struct { Version string Branch string Commit string ExpectedOutput string }{ { Version: "v2.0.0", ExpectedOutput: "Telegraf v2.0.0\n", }, { ExpectedOutput: "Telegraf unknown\n", }, { Version: "v2.0.0", Branch: "master", ExpectedOutput: "Telegraf v2.0.0 (git: master@unknown)\n", }, { Version: "v2.0.0", Branch: "master", Commit: "123", ExpectedOutput: "Telegraf v2.0.0 (git: master@123)\n", }, { Version: "v2.0.0", Commit: "123", ExpectedOutput: "Telegraf v2.0.0 (git: unknown@123)\n", }, } for _, test := range tests { buf := new(bytes.Buffer) args := os.Args[0:1] args = append(args, "version") internal.Version = test.Version internal.Branch = test.Branch internal.Commit = test.Commit err := runApp(args, buf, NewMockServer(), NewMockConfig(buf), NewMockTelegraf()) require.NoError(t, err) require.Equal(t, test.ExpectedOutput, buf.String()) } } // Users should use the version subcommand func TestFlagVersion(t *testing.T) { tests := []struct { Version string Branch string Commit string ExpectedOutput string }{ { Version: "v2.0.0", ExpectedOutput: "Telegraf v2.0.0\n", }, { ExpectedOutput: "Telegraf unknown\n", }, { Version: "v2.0.0", Branch: "master", ExpectedOutput: "Telegraf v2.0.0 (git: master@unknown)\n", }, { Version: "v2.0.0", Branch: "master", Commit: "123", ExpectedOutput: "Telegraf v2.0.0 (git: master@123)\n", }, { Version: "v2.0.0", Commit: "123", ExpectedOutput: "Telegraf v2.0.0 (git: unknown@123)\n", }, } for _, test := range tests { buf := new(bytes.Buffer) args := os.Args[0:1] args = append(args, "--version") internal.Version = test.Version internal.Branch = test.Branch internal.Commit = test.Commit err := runApp(args, buf, NewMockServer(), NewMockConfig(buf), NewMockTelegraf()) require.NoError(t, err) require.Equal(t, test.ExpectedOutput, buf.String()) } } func TestGlobablBoolFlags(t *testing.T) { commands := []string{ "--debug", "--test", "--quiet", "--once", } buf := new(bytes.Buffer) args := os.Args[0:1] args = append(args, commands...) m := NewMockTelegraf() err := runApp(args, buf, NewMockServer(), NewMockConfig(buf), m) require.NoError(t, err) require.True(t, m.debug) require.True(t, m.test) require.True(t, m.once) require.True(t, m.quiet) } func TestFlagsAreSet(t *testing.T) { expectedInt := 1 expectedString := "test" commands := []string{ "--config", expectedString, "--config-directory", expectedString, "--debug", "--test", "--quiet", "--once", "--test-wait", strconv.Itoa(expectedInt), "--watch-config", expectedString, "--pidfile", expectedString, } buf := new(bytes.Buffer) args := os.Args[0:1] args = append(args, commands...) m := NewMockTelegraf() err := runApp(args, buf, NewMockServer(), NewMockConfig(buf), m) require.NoError(t, err) require.Equal(t, []string{expectedString}, m.config) require.Equal(t, []string{expectedString}, m.configDir) require.True(t, m.debug) require.True(t, m.test) require.True(t, m.once) require.True(t, m.quiet) require.Equal(t, expectedInt, m.testWait) require.Equal(t, expectedString, m.watchConfig) require.Equal(t, expectedString, m.pidFile) } ================================================ FILE: cmd/telegraf/main_win_test.go ================================================ //go:build windows package main import ( "bytes" "os" "testing" "github.com/stretchr/testify/require" ) func TestWindowsFlagsAreSet(t *testing.T) { expectedString := "test" commands := []string{ "--service", expectedString, "--service-name", expectedString, "--service-display-name", expectedString, "--service-restart-delay", expectedString, "--service-auto-restart", "--console", } buf := new(bytes.Buffer) args := os.Args[0:1] args = append(args, commands...) m := NewMockTelegraf() err := runApp(args, buf, NewMockServer(), NewMockConfig(buf), m) require.NoError(t, err) require.Equal(t, expectedString, m.service) require.Equal(t, expectedString, m.serviceName) require.Equal(t, expectedString, m.serviceDisplayName) require.Equal(t, expectedString, m.serviceRestartDelay) require.True(t, m.serviceAutoRestart) require.True(t, m.console) } ================================================ FILE: cmd/telegraf/pprof.go ================================================ package main import ( "log" "net/http" _ "net/http/pprof" //nolint:gosec // Import for pprof, only enabled via CLI flag "strings" "time" ) type Server interface { Start(string) ErrChan() <-chan error } type PprofServer struct { err chan error } func NewPprofServer() *PprofServer { return &PprofServer{ err: make(chan error), } } func (p *PprofServer) Start(address string) { go func() { pprofHostPort := address parts := strings.Split(pprofHostPort, ":") if len(parts) == 2 && parts[0] == "" { pprofHostPort = "localhost:" + parts[1] } pprofHostPort = "http://" + pprofHostPort + "/debug/pprof" log.Printf("I! Starting pprof HTTP server at: %s", pprofHostPort) server := &http.Server{ Addr: address, ReadTimeout: 10 * time.Second, WriteTimeout: 10 * time.Second, } if err := server.ListenAndServe(); err != nil { p.err <- err } close(p.err) }() } func (p *PprofServer) ErrChan() <-chan error { return p.err } ================================================ FILE: cmd/telegraf/printer.go ================================================ package main import ( _ "embed" "fmt" "io" "sort" "strings" "github.com/influxdata/telegraf" "github.com/influxdata/telegraf/internal/choice" "github.com/influxdata/telegraf/plugins/aggregators" "github.com/influxdata/telegraf/plugins/inputs" "github.com/influxdata/telegraf/plugins/outputs" "github.com/influxdata/telegraf/plugins/processors" "github.com/influxdata/telegraf/plugins/secretstores" ) var ( // Default sections sectionDefaults = []string{"global_tags", "agent", "secretstores", "outputs", "processors", "aggregators", "inputs"} // Default input plugins inputDefaults = []string{"cpu", "mem", "swap", "system", "kernel", "processes", "disk", "diskio"} // Default output plugins outputDefaults = make([]string, 0) ) var header = `# Telegraf Configuration # # Telegraf is entirely plugin driven. All metrics are gathered from the # declared inputs, and sent to the declared outputs. # # Plugins must be declared in here to be active. # To deactivate a plugin, comment out the name and any variables. # # Use 'telegraf -config telegraf.conf -test' to see what metrics a config # file would generate. # # Environment variables can be used anywhere in this config file, simply surround # them with ${}. For strings the variable must be within quotes (ie, "${STR_VAR}"), # for numbers and booleans they should be plain (ie, ${INT_VAR}, ${BOOL_VAR}) ` var globalTagsConfig = ` # Global tags can be specified here in key="value" format. [global_tags] # dc = "us-east-1" # will tag all metrics with dc=us-east-1 # rack = "1a" ## Environment variables can be used as tags, and throughout the config file # user = "$USER" ` // DO NOT REMOVE THE NEXT TWO LINES! This is required to embed the agentConfig data. // //go:embed agent.conf var agentConfig string var secretstoreHeader = ` ############################################################################### # SECRETSTORE PLUGINS # ############################################################################### ` var outputHeader = ` ############################################################################### # OUTPUT PLUGINS # ############################################################################### ` var processorHeader = ` ############################################################################### # PROCESSOR PLUGINS # ############################################################################### ` var aggregatorHeader = ` ############################################################################### # AGGREGATOR PLUGINS # ############################################################################### ` var inputHeader = ` ############################################################################### # INPUT PLUGINS # ############################################################################### ` var serviceInputHeader = ` ############################################################################### # SERVICE INPUT PLUGINS # ############################################################################### ` // printSampleConfig prints the sample config func printSampleConfig(outputBuffer io.Writer, filters Filters) { sectionFilters := filters.section inputFilters := filters.input outputFilters := filters.output aggregatorFilters := filters.aggregator processorFilters := filters.processor secretstoreFilters := filters.secretstore // print headers outputBuffer.Write([]byte(header)) if len(sectionFilters) == 0 { sectionFilters = sectionDefaults } printFilteredGlobalSections(sectionFilters, outputBuffer) // print secretstore plugins if choice.Contains("secretstores", sectionFilters) { if len(secretstoreFilters) != 0 { if len(secretstoreFilters) >= 3 && secretstoreFilters[1] != "none" { fmt.Print(secretstoreHeader) } printFilteredSecretstores(secretstoreFilters, false, outputBuffer) } else { fmt.Print(secretstoreHeader) snames := make([]string, 0, len(secretstores.SecretStores)) for sname := range secretstores.SecretStores { snames = append(snames, sname) } sort.Strings(snames) printFilteredSecretstores(snames, true, outputBuffer) } } // print output plugins if choice.Contains("outputs", sectionFilters) { if len(outputFilters) != 0 { if len(outputFilters) >= 3 && outputFilters[1] != "none" { outputBuffer.Write([]byte(outputHeader)) } printFilteredOutputs(outputFilters, false, outputBuffer) } else { outputBuffer.Write([]byte(outputHeader)) printFilteredOutputs(outputDefaults, false, outputBuffer) // Print non-default outputs, commented var pnames []string for pname := range outputs.Outputs { if !choice.Contains(pname, outputDefaults) { pnames = append(pnames, pname) } } printFilteredOutputs(pnames, true, outputBuffer) } } // print processor plugins if choice.Contains("processors", sectionFilters) { if len(processorFilters) != 0 { if len(processorFilters) >= 3 && processorFilters[1] != "none" { outputBuffer.Write([]byte(processorHeader)) } printFilteredProcessors(processorFilters, false, outputBuffer) } else { outputBuffer.Write([]byte(processorHeader)) pnames := make([]string, 0, len(processors.Processors)) for pname := range processors.Processors { pnames = append(pnames, pname) } printFilteredProcessors(pnames, true, outputBuffer) } } // print aggregator plugins if choice.Contains("aggregators", sectionFilters) { if len(aggregatorFilters) != 0 { if len(aggregatorFilters) >= 3 && aggregatorFilters[1] != "none" { outputBuffer.Write([]byte(aggregatorHeader)) } printFilteredAggregators(aggregatorFilters, false, outputBuffer) } else { outputBuffer.Write([]byte(aggregatorHeader)) pnames := make([]string, 0, len(aggregators.Aggregators)) for pname := range aggregators.Aggregators { pnames = append(pnames, pname) } printFilteredAggregators(pnames, true, outputBuffer) } } // print input plugins if choice.Contains("inputs", sectionFilters) { if len(inputFilters) != 0 { if len(inputFilters) >= 3 && inputFilters[1] != "none" { outputBuffer.Write([]byte(inputHeader)) } printFilteredInputs(inputFilters, false, outputBuffer) } else { outputBuffer.Write([]byte(inputHeader)) printFilteredInputs(inputDefaults, false, outputBuffer) // Print non-default inputs, commented var pnames []string for pname := range inputs.Inputs { if !choice.Contains(pname, inputDefaults) { pnames = append(pnames, pname) } } printFilteredInputs(pnames, true, outputBuffer) } } } func printFilteredProcessors(processorFilters []string, commented bool, outputBuffer io.Writer) { // Filter processors var pnames []string for pname := range processors.Processors { if choice.Contains(pname, processorFilters) { pnames = append(pnames, pname) } } sort.Strings(pnames) // Print Outputs for _, pname := range pnames { creator := processors.Processors[pname] output := creator() printConfig(pname, output, "processors", commented, processors.Deprecations[pname], outputBuffer) } } func printFilteredAggregators(aggregatorFilters []string, commented bool, outputBuffer io.Writer) { // Filter outputs var anames []string for aname := range aggregators.Aggregators { if choice.Contains(aname, aggregatorFilters) { anames = append(anames, aname) } } sort.Strings(anames) // Print Outputs for _, aname := range anames { creator := aggregators.Aggregators[aname] output := creator() printConfig(aname, output, "aggregators", commented, aggregators.Deprecations[aname], outputBuffer) } } func printFilteredInputs(inputFilters []string, commented bool, outputBuffer io.Writer) { // Filter inputs var pnames []string for pname := range inputs.Inputs { if choice.Contains(pname, inputFilters) { pnames = append(pnames, pname) } } sort.Strings(pnames) // cache service inputs to print them at the end servInputs := make(map[string]telegraf.ServiceInput) // for alphabetical looping: servInputNames := make([]string, 0, len(pnames)) // Print Inputs for _, pname := range pnames { // Skip inputs that are registered twice for backward compatibility switch pname { case "cisco_telemetry_gnmi", "http_listener", "io": continue } creator := inputs.Inputs[pname] input := creator() if p, ok := input.(telegraf.ServiceInput); ok { servInputs[pname] = p servInputNames = append(servInputNames, pname) continue } printConfig(pname, input, "inputs", commented, inputs.Deprecations[pname], outputBuffer) } // Print Service Inputs if len(servInputs) == 0 { return } sort.Strings(servInputNames) outputBuffer.Write([]byte(serviceInputHeader)) for _, name := range servInputNames { printConfig(name, servInputs[name], "inputs", commented, inputs.Deprecations[name], outputBuffer) } } func printFilteredOutputs(outputFilters []string, commented bool, outputBuffer io.Writer) { // Filter outputs var onames []string var influxdbV2 string for oname := range outputs.Outputs { if choice.Contains(oname, outputFilters) { // Make influxdb_v2 the exception and have it be first in the list // Store it and add it later if oname == "influxdb_v2" { influxdbV2 = oname continue } onames = append(onames, oname) } } sort.Strings(onames) if influxdbV2 != "" { onames = append([]string{influxdbV2}, onames...) } // Print Outputs for _, oname := range onames { creator := outputs.Outputs[oname] output := creator() printConfig(oname, output, "outputs", commented, outputs.Deprecations[oname], outputBuffer) } } func printFilteredSecretstores(secretstoreFilters []string, commented bool, outputBuffer io.Writer) { // Filter secretstores var snames []string for sname := range secretstores.SecretStores { if choice.Contains(sname, secretstoreFilters) { snames = append(snames, sname) } } sort.Strings(snames) // Print SecretStores for _, sname := range snames { creator := secretstores.SecretStores[sname] store := creator("dummy") printConfig(sname, store, "secretstores", commented, secretstores.Deprecations[sname], outputBuffer) } } func printFilteredGlobalSections(sectionFilters []string, outputBuffer io.Writer) { if choice.Contains("global_tags", sectionFilters) { outputBuffer.Write([]byte(globalTagsConfig)) } if choice.Contains("agent", sectionFilters) { outputBuffer.Write([]byte(agentConfig)) } } func printConfig(name string, p telegraf.PluginDescriber, op string, commented bool, di telegraf.DeprecationInfo, outputBuffer io.Writer) { comment := "" if commented { comment = "# " } if di.Since != "" { removalNote := "" if di.RemovalIn != "" { removalNote = " and will be removed in " + di.RemovalIn } fmt.Fprintf(outputBuffer, "\n%s## DEPRECATED: The %q plugin is deprecated in version %s%s, %s.", comment, name, di.Since, removalNote, di.Notice) } sample := p.SampleConfig() if sample == "" { fmt.Fprintf(outputBuffer, "\n#[[%s.%s]]", op, name) fmt.Fprintf(outputBuffer, "\n%s # no configuration\n\n", comment) } else { lines := strings.Split(sample, "\n") outputBuffer.Write([]byte("\n")) for i, line := range lines { if i == len(lines)-1 { outputBuffer.Write([]byte("\n")) continue } outputBuffer.Write([]byte(strings.TrimRight(comment+line, " ") + "\n")) } } } // PrintInputConfig prints the config usage of a single input. func PrintInputConfig(name string, outputBuffer io.Writer) error { creator, ok := inputs.Inputs[name] if !ok { return fmt.Errorf("input %s not found", name) } printConfig(name, creator(), "inputs", false, inputs.Deprecations[name], outputBuffer) return nil } // PrintOutputConfig prints the config usage of a single output. func PrintOutputConfig(name string, outputBuffer io.Writer) error { creator, ok := outputs.Outputs[name] if !ok { return fmt.Errorf("output %s not found", name) } printConfig(name, creator(), "outputs", false, outputs.Deprecations[name], outputBuffer) return nil } ================================================ FILE: cmd/telegraf/telegraf.go ================================================ package main import ( "context" "errors" "fmt" "log" "net/http" "net/url" "os" "os/signal" "strings" "syscall" "time" "github.com/coreos/go-systemd/v22/daemon" "github.com/fatih/color" "github.com/influxdata/tail/watch" "gopkg.in/tomb.v1" "github.com/influxdata/telegraf" "github.com/influxdata/telegraf/agent" "github.com/influxdata/telegraf/config" "github.com/influxdata/telegraf/internal" "github.com/influxdata/telegraf/logger" "github.com/influxdata/telegraf/plugins/aggregators" "github.com/influxdata/telegraf/plugins/inputs" "github.com/influxdata/telegraf/plugins/outputs" "github.com/influxdata/telegraf/plugins/parsers" "github.com/influxdata/telegraf/plugins/processors" "github.com/influxdata/telegraf/plugins/secretstores" ) var stop chan struct{} type GlobalFlags struct { config []string configDir []string testWait int configURLRetryAttempts int configURLWatchInterval time.Duration watchConfig string watchInterval time.Duration watchDebounceInterval time.Duration pidFile string plugindDir string password string oldEnvBehavior bool nonStrictEnvVars bool printPluginConfigSource bool test bool debug bool once bool quiet bool unprotected bool } type WindowFlags struct { service string serviceName string serviceDisplayName string serviceRestartDelay string serviceAutoRestart bool console bool } type App interface { Init(<-chan error, Filters, GlobalFlags, WindowFlags) Run() error // Secret store commands ListSecretStores() ([]string, error) GetSecretStore(string) (telegraf.SecretStore, error) } type Telegraf struct { pprofErr <-chan error inputFilters []string outputFilters []string configFiles []string secretstoreFilters []string cfg *config.Config GlobalFlags WindowFlags } func (t *Telegraf) Init(pprofErr <-chan error, f Filters, g GlobalFlags, w WindowFlags) { t.pprofErr = pprofErr t.inputFilters = f.input t.outputFilters = f.output t.secretstoreFilters = f.secretstore t.GlobalFlags = g t.WindowFlags = w // Disable secret protection before performing any other operation if g.unprotected { log.Println("W! Running without secret protection!") config.DisableSecretProtection() } // Set global password if g.password != "" { config.Password = config.NewSecret([]byte(g.password)) } // Set environment replacement behavior config.OldEnvVarReplacement = g.oldEnvBehavior config.NonStrictEnvVarHandling = g.nonStrictEnvVars config.PrintPluginConfigSource = g.printPluginConfigSource } func (t *Telegraf) ListSecretStores() ([]string, error) { c, err := t.loadConfiguration() if err != nil { return nil, err } ids := make([]string, 0, len(c.SecretStores)) for k := range c.SecretStores { ids = append(ids, k) } return ids, nil } func (t *Telegraf) GetSecretStore(id string) (telegraf.SecretStore, error) { t.quiet = true c, err := t.loadConfiguration() if err != nil { return nil, err } store, found := c.SecretStores[id] if !found { return nil, errors.New("unknown secret store") } return store, nil } func (t *Telegraf) reloadLoop() error { reloadConfig := false reload := make(chan bool, 1) reload <- true for <-reload { reload <- false ctx, cancel := context.WithCancel(context.Background()) signals := make(chan os.Signal, 1) signal.Notify(signals, os.Interrupt, syscall.SIGHUP, syscall.SIGTERM, syscall.SIGINT) if t.watchConfig != "" { for _, fConfig := range t.configFiles { if isURL(fConfig) { continue } if _, err := os.Stat(fConfig); err != nil { log.Printf("W! Cannot watch config %s: %s", fConfig, err) } else { go t.watchLocalConfig(ctx, signals, fConfig) } } for _, fConfigDirectory := range t.configDir { if _, err := os.Stat(fConfigDirectory); err != nil { log.Printf("W! Cannot watch config directory %s: %s", fConfigDirectory, err) } else { go t.watchLocalConfig(ctx, signals, fConfigDirectory) } } } if t.configURLWatchInterval > 0 { remoteConfigs := make([]string, 0) for _, fConfig := range t.configFiles { if isURL(fConfig) { remoteConfigs = append(remoteConfigs, fConfig) } } if len(remoteConfigs) > 0 { go t.watchRemoteConfigs(ctx, signals, t.configURLWatchInterval, remoteConfigs) } } go func() { select { case sig := <-signals: if sig == syscall.SIGHUP { log.Println("I! Reloading Telegraf config") // May need to update the list of known config files // if a delete or create occured. That way on the reload // we ensure we watch the correct files. if err := t.getConfigFiles(); err != nil { log.Println("E! Error loading config files: ", err) } <-reload reload <- true } cancel() case err := <-t.pprofErr: log.Printf("E! pprof server failed: %v", err) cancel() case <-stop: cancel() } }() err := t.runAgent(ctx, reloadConfig) if err != nil && !errors.Is(err, context.Canceled) { return fmt.Errorf("[telegraf] Error running agent: %w", err) } reloadConfig = true } return nil } func (t *Telegraf) watchLocalConfig(ctx context.Context, signals chan os.Signal, fConfig string) { var mytomb tomb.Tomb var watcher watch.FileWatcher if t.watchConfig == "poll" { if t.watchInterval > 0 { watcher = watch.NewPollingFileWatcherWithDuration(fConfig, t.watchInterval) } else { watcher = watch.NewPollingFileWatcher(fConfig) } } else { watcher = watch.NewInotifyFileWatcher(fConfig) } changes, err := watcher.ChangeEvents(&mytomb, 0) if err != nil { log.Printf("E! Error watching config file/directory %q: %s\n", fConfig, err) return } log.Printf("I! Config watcher started for %s\n", fConfig) // Setup debounce timer var reloadTimer *time.Timer var reloadPending bool if t.watchDebounceInterval > 0 { reloadTimer = time.NewTimer(t.watchDebounceInterval) if !reloadTimer.Stop() { <-reloadTimer.C // Drain if already fired } } // Update resetTimer function: resetTimer := func(reason string) { log.Printf("%s", reason) if t.watchDebounceInterval == 0 { // No debouncing - trigger immediately select { case signals <- syscall.SIGHUP: case <-ctx.Done(): return } return } if !reloadPending { reloadPending = true } // Properly drain and reset timer if !reloadTimer.Stop() { select { case <-reloadTimer.C: default: } } reloadTimer.Reset(t.watchDebounceInterval) } for { select { case <-ctx.Done(): if reloadTimer != nil { reloadTimer.Stop() } mytomb.Done() return case <-changes.Modified: resetTimer(fmt.Sprintf("I! Config file/directory %q modified\n", fConfig)) case <-changes.Deleted: // Use select with timeout instead of blocking wait timer := time.NewTimer(time.Second) select { case <-timer.C: // Proceed with file existence check case <-ctx.Done(): timer.Stop() return } var reason string if _, err := os.Stat(fConfig); err == nil { reason = fmt.Sprintf("I! Config file/directory %q overwritten\n", fConfig) } else { reason = fmt.Sprintf("W! Config file/directory %q deleted\n", fConfig) } resetTimer(reason) case <-changes.Truncated: resetTimer(fmt.Sprintf("I! Config file/directory %q truncated\n", fConfig)) case <-changes.Created: resetTimer(fmt.Sprintf("I! Config directory %q has new file(s)\n", fConfig)) case <-func() <-chan time.Time { if reloadTimer != nil { return reloadTimer.C } // Return a channel that never fires when debouncing is disabled return make(<-chan time.Time) }(): if reloadPending { log.Printf("I! Debounce period elapsed, triggering config reload for %q\n", fConfig) select { case signals <- syscall.SIGHUP: case <-ctx.Done(): return } reloadPending = false } case <-mytomb.Dying(): if reloadTimer != nil { reloadTimer.Stop() } log.Printf("I! Config watcher %q ended\n", fConfig) return } } } func (*Telegraf) watchRemoteConfigs(ctx context.Context, signals chan os.Signal, interval time.Duration, remoteConfigs []string) { configs := strings.Join(remoteConfigs, ", ") log.Printf("I! Remote config watcher started for: %s\n", configs) ticker := time.NewTicker(interval) defer ticker.Stop() lastModified := make(map[string]string, len(remoteConfigs)) for { select { case <-ctx.Done(): return case <-signals: return case <-ticker.C: for _, configURL := range remoteConfigs { req, err := http.NewRequest("HEAD", configURL, nil) if err != nil { log.Printf("W! Creating request for fetching config from %q failed: %v\n", configURL, err) continue } if v, exists := os.LookupEnv("INFLUX_TOKEN"); exists { req.Header.Add("Authorization", "Token "+v) } req.Header.Set("User-Agent", internal.ProductToken()) resp, err := http.DefaultClient.Do(req) if err != nil { log.Printf("W! Fetching config from %q failed: %v\n", configURL, err) continue } resp.Body.Close() modified := resp.Header.Get("Last-Modified") if modified == "" { log.Printf("E! Last-Modified header not found, stopping the watcher for %s\n", configURL) delete(lastModified, configURL) } if lastModified[configURL] == "" { lastModified[configURL] = modified } else if lastModified[configURL] != modified { log.Printf("I! Remote config modified: %s\n", configURL) signals <- syscall.SIGHUP return } } } } } func (t *Telegraf) loadConfiguration() (*config.Config, error) { // If no other options are specified, load the config file and run. c := config.NewConfig() c.Agent.Quiet = t.quiet c.Agent.ConfigURLRetryAttempts = t.configURLRetryAttempts c.OutputFilters = t.outputFilters c.InputFilters = t.inputFilters c.SecretStoreFilters = t.secretstoreFilters if err := t.getConfigFiles(); err != nil { return c, err } if err := c.LoadAll(t.configFiles...); err != nil { return c, err } return c, nil } func (t *Telegraf) getConfigFiles() error { var configFiles []string configFiles = append(configFiles, t.config...) for _, fConfigDirectory := range t.configDir { files, err := config.WalkDirectory(fConfigDirectory) if err != nil { return err } configFiles = append(configFiles, files...) } // load default config paths if none are found if len(configFiles) == 0 { defaultFiles, err := config.GetDefaultConfigPath() if err != nil { return fmt.Errorf("unable to load default config paths: %w", err) } configFiles = append(configFiles, defaultFiles...) } t.configFiles = configFiles return nil } func (t *Telegraf) runAgent(ctx context.Context, reloadConfig bool) error { c := t.cfg var err error if reloadConfig { if c, err = t.loadConfiguration(); err != nil { return err } } if !t.test && t.testWait == 0 && len(c.Outputs) == 0 { return errors.New("no outputs found, probably invalid config file provided") } if t.plugindDir == "" && len(c.Inputs) == 0 { return errors.New("no inputs found, probably invalid config file provided") } if int64(c.Agent.Interval) <= 0 { return fmt.Errorf("agent interval must be positive, found %v", c.Agent.Interval) } if int64(c.Agent.FlushInterval) <= 0 { return fmt.Errorf("agent flush_interval must be positive; found %v", c.Agent.Interval) } // Setup logging as configured. logConfig := &logger.Config{ Debug: c.Agent.Debug || t.debug, Quiet: c.Agent.Quiet || t.quiet, LogTarget: c.Agent.LogTarget, LogFormat: c.Agent.LogFormat, Logfile: c.Agent.Logfile, StructuredLogMessageKey: c.Agent.StructuredLogMessageKey, RotationInterval: time.Duration(c.Agent.LogfileRotationInterval), RotationMaxSize: int64(c.Agent.LogfileRotationMaxSize), RotationMaxArchives: c.Agent.LogfileRotationMaxArchives, LogWithTimezone: c.Agent.LogWithTimezone, } if err := logger.SetupLogging(logConfig); err != nil { return err } log.Printf("I! Starting Telegraf %s%s brought to you by InfluxData the makers of InfluxDB", internal.Version, internal.Customized) log.Printf("I! Available plugins: %d inputs, %d aggregators, %d processors, %d parsers, %d outputs, %d secret-stores", len(inputs.Inputs), len(aggregators.Aggregators), len(processors.Processors), len(parsers.Parsers), len(outputs.Outputs), len(secretstores.SecretStores), ) log.Printf("I! Loaded inputs: %s\n%s", strings.Join(c.InputNames(), " "), c.InputNamesWithSources()) log.Printf("I! Loaded aggregators: %s\n%s", strings.Join(c.AggregatorNames(), " "), c.AggregatorNamesWithSources()) log.Printf("I! Loaded processors: %s\n%s", strings.Join(c.ProcessorNames(), " "), c.ProcessorNamesWithSources()) log.Printf("I! Loaded secretstores: %s\n%s", strings.Join(c.SecretstoreNames(), " "), c.SecretstoreNamesWithSources()) if !t.once && (t.test || t.testWait != 0) { log.Print("W! " + color.RedString("Outputs are not used in testing mode!")) } else { log.Printf("I! Loaded outputs: %s\n%s", strings.Join(c.OutputNames(), " "), c.OutputNamesWithSources()) } log.Printf("I! Tags enabled: %s", c.ListTags()) if count, found := c.Deprecations["inputs"]; found && (count[0] > 0 || count[1] > 0) { log.Printf("W! Deprecated inputs: %d and %d options", count[0], count[1]) } if count, found := c.Deprecations["aggregators"]; found && (count[0] > 0 || count[1] > 0) { log.Printf("W! Deprecated aggregators: %d and %d options", count[0], count[1]) } if count, found := c.Deprecations["processors"]; found && (count[0] > 0 || count[1] > 0) { log.Printf("W! Deprecated processors: %d and %d options", count[0], count[1]) } if count, found := c.Deprecations["outputs"]; found && (count[0] > 0 || count[1] > 0) { log.Printf("W! Deprecated outputs: %d and %d options", count[0], count[1]) } if count, found := c.Deprecations["secretstores"]; found && (count[0] > 0 || count[1] > 0) { log.Printf("W! Deprecated secretstores: %d and %d options", count[0], count[1]) } // Compute the amount of locked memory needed for the secrets if !t.GlobalFlags.unprotected { required := 3 * c.NumberSecrets * uint64(os.Getpagesize()) available := getLockedMemoryLimit() if required > available { required /= 1024 available /= 1024 log.Printf("I! Found %d secrets...", c.NumberSecrets) msg := fmt.Sprintf("Insufficient lockable memory %dkb when %dkb is required.", available, required) msg += " Please increase the limit for Telegraf in your Operating System!" log.Print("W! " + color.RedString(msg)) } } ag := agent.NewAgent(c) // Notify systemd that telegraf is ready // SdNotify() only tries to notify if the NOTIFY_SOCKET environment is set, so it's safe to call when systemd isn't present. // Ignore the return values here because they're not valid for platforms that don't use systemd. // For platforms that use systemd, telegraf doesn't log if the notification failed. //nolint:errcheck // see above daemon.SdNotify(false, daemon.SdNotifyReady) if t.once { wait := time.Duration(t.testWait) * time.Second return ag.Once(ctx, wait) } if t.test || t.testWait != 0 { wait := time.Duration(t.testWait) * time.Second return ag.Test(ctx, wait) } if t.pidFile != "" { f, err := os.OpenFile(t.pidFile, os.O_CREATE|os.O_WRONLY, 0640) if err != nil { log.Printf("E! Unable to create pidfile: %s", err) } else { fmt.Fprintf(f, "%d\n", os.Getpid()) err = f.Close() if err != nil { return err } defer func() { err := os.Remove(t.pidFile) if err != nil { log.Printf("E! Unable to remove pidfile: %s", err) } }() } } return ag.Run(ctx) } // isURL checks if string is valid url func isURL(str string) bool { u, err := url.Parse(str) return err == nil && u.Scheme != "" && u.Host != "" } ================================================ FILE: cmd/telegraf/telegraf_posix.go ================================================ //go:build !windows package main import ( "log" "runtime" "syscall" ) func (t *Telegraf) Run() error { stop = make(chan struct{}) defer close(stop) cfg, err := t.loadConfiguration() if err != nil { return err } t.cfg = cfg return t.reloadLoop() } func getLockedMemoryLimit() uint64 { var rLimitMemlock int switch runtime.GOOS { case "dragonfly", "freebsd", "netbsd", "openbsd": // From https://cgit.freebsd.org/src/tree/sys/sys/resource.h#n107 rLimitMemlock = 6 default: // From https://elixir.bootlin.com/linux/latest/source/include/uapi/asm-generic/resource.h#L35 rLimitMemlock = 8 } var limit syscall.Rlimit if err := syscall.Getrlimit(rLimitMemlock, &limit); err != nil { log.Printf("E! Cannot get limit for locked memory: %v", err) return 0 } //nolint:unconvert // required for e.g. FreeBSD that has the field as int64 return uint64(limit.Max) } ================================================ FILE: cmd/telegraf/telegraf_windows.go ================================================ //go:build windows //go:generate ../../scripts/windows-gen-syso.sh $GOARCH package main import ( "errors" "fmt" "log" "os" "path/filepath" "strings" "syscall" "time" "golang.org/x/sys/windows" "golang.org/x/sys/windows/svc" "golang.org/x/sys/windows/svc/eventlog" "golang.org/x/sys/windows/svc/mgr" ) func getLockedMemoryLimit() uint64 { handle := windows.CurrentProcess() var low, high uintptr var flag uint32 windows.GetProcessWorkingSetSizeEx(handle, &low, &high, &flag) return uint64(high) } func (t *Telegraf) Run() error { // Process the service commands if t.service != "" { fmt.Println("The use of --service is deprecated, please use the 'service' command instead!") switch t.service { case "install": cfg := &serviceConfig{ displayName: t.serviceDisplayName, restartDelay: t.serviceRestartDelay, autoRestart: t.serviceAutoRestart, configs: t.config, configDirs: t.configDir, watchConfig: t.watchConfig, } if err := installService(t.serviceName, cfg); err != nil { return err } fmt.Printf("Successfully installed service %q\n", t.serviceName) case "uninstall": if err := uninstallService(t.serviceName); err != nil { return err } fmt.Printf("Successfully uninstalled service %q\n", t.serviceName) case "start": if err := startService(t.serviceName); err != nil { return err } fmt.Printf("Successfully started service %q\n", t.serviceName) case "stop": if err := stopService(t.serviceName); err != nil { return err } fmt.Printf("Successfully stopped service %q\n", t.serviceName) case "status": status, err := queryService(t.serviceName) if err != nil { return err } fmt.Printf("Service %q is in %q state\n", t.serviceName, status) default: return fmt.Errorf("invalid service command %q", t.service) } return nil } // Determine if Telegraf is started as a Windows service. isWinService, err := svc.IsWindowsService() if err != nil { return fmt.Errorf("cannot determine if run as Windows service: %w", err) } if !t.console && isWinService { return svc.Run(t.serviceName, t) } // Load the configuration file(s) cfg, err := t.loadConfiguration() if err != nil { return err } t.cfg = cfg stop = make(chan struct{}) defer close(stop) return t.reloadLoop() } // Execute is the handler for the Windows service framework func (t *Telegraf) Execute(_ []string, r <-chan svc.ChangeRequest, changes chan<- svc.Status) (bool, uint32) { // Mark the status as startup pending until we are fully started const accepted = svc.AcceptStop | svc.AcceptShutdown changes <- svc.Status{State: svc.StartPending} defer func() { changes <- svc.Status{State: svc.Stopped} }() // Create a eventlog logger for all service related things svclog, err := eventlog.Open(t.serviceName) if err != nil { log.Printf("E! Initializing the service logger failed: %s", err) return true, 1 } defer svclog.Close() // Load the configuration file(s) cfg, err := t.loadConfiguration() if err != nil { if lerr := svclog.Error(100, err.Error()); lerr != nil { log.Printf("E! Logging error %q failed: %s", err, lerr) } return true, 2 } t.cfg = cfg // Actually start the processing loop in the background to be able to // react to service change requests loopErr := make(chan error) stop = make(chan struct{}) defer close(loopErr) defer close(stop) go func() { loopErr <- t.reloadLoop() }() changes <- svc.Status{State: svc.Running, Accepts: accepted} for { select { case err := <-loopErr: if err != nil { if lerr := svclog.Error(100, err.Error()); lerr != nil { log.Printf("E! Logging error %q failed: %s", err, lerr) } return true, 3 } return false, 0 case c := <-r: switch c.Cmd { case svc.Interrogate: changes <- c.CurrentStatus // Testing deadlock from https://code.google.com/p/winsvc/issues/detail?id=4 time.Sleep(100 * time.Millisecond) changes <- c.CurrentStatus case svc.Stop, svc.Shutdown: changes <- svc.Status{State: svc.StopPending} var empty struct{} stop <- empty // signal reloadLoop to finish (context cancel) default: msg := fmt.Sprintf("Unexpected control request #%d", c) if lerr := svclog.Error(100, msg); lerr != nil { log.Printf("E! Logging error %q failed: %s", msg, lerr) } } } } } type serviceConfig struct { displayName string restartDelay string autoRestart bool // Telegraf parameters configs []string configDirs []string watchConfig string } func installService(name string, cfg *serviceConfig) error { // Determine the executable to use in the service executable, err := os.Executable() if err != nil { return fmt.Errorf("determining executable failed: %w", err) } // Determine the program files directory name programFiles := os.Getenv("ProgramFiles") if programFiles == "" { // Should never happen programFiles = "C:\\Program Files" } // Collect the command line arguments args := make([]string, 0, 2*(len(cfg.configs)+len(cfg.configDirs))+2) for _, fn := range cfg.configs { args = append(args, "--config", fn) } for _, dn := range cfg.configDirs { args = append(args, "--config-directory", dn) } if len(args) == 0 { args = append(args, "--config", filepath.Join(programFiles, "Telegraf", "telegraf.conf")) } if cfg.watchConfig != "" { args = append(args, "--watch-config", cfg.watchConfig) } // Pass the service name to the command line, to have a custom name when relaunching as a service args = append(args, "--service-name", name) // Create a configuration for the service svccfg := mgr.Config{ DisplayName: cfg.displayName, Description: "Collects, processes and publishes data using a series of plugins.", StartType: mgr.StartAutomatic, ServiceType: windows.SERVICE_WIN32_OWN_PROCESS, } // Connect to the service manager and try to install the service if it // doesn't exist. Fail on existing service and stop installation. svcmgr, err := mgr.Connect() if err != nil { return fmt.Errorf("connecting to service manager failed: %w", err) } defer svcmgr.Disconnect() if service, err := svcmgr.OpenService(name); err == nil { service.Close() return fmt.Errorf("service %q is already installed", name) } service, err := svcmgr.CreateService(name, executable, svccfg, args...) if err != nil { return fmt.Errorf("creating service failed: %w", err) } defer service.Close() // Set the recovery strategy to restart with a fixed period of 10 seconds // and the user specified delay if requested if cfg.autoRestart { delay, err := time.ParseDuration(cfg.restartDelay) if err != nil { return fmt.Errorf("cannot parse restart delay %q: %w", cfg.restartDelay, err) } recovery := []mgr.RecoveryAction{{Type: mgr.ServiceRestart, Delay: delay}} if err := service.SetRecoveryActions(recovery, 10); err != nil { return err } } // Register the event as a source of eventlog events events := uint32(eventlog.Error | eventlog.Warning | eventlog.Info) if err := eventlog.InstallAsEventCreate(name, events); err != nil && !strings.Contains(err.Error(), "key already exists") { //nolint:errcheck // Try to remove the service on best effort basis as we cannot handle any error here service.Delete() return fmt.Errorf("setting up eventlog source failed: %w", err) } return nil } func uninstallService(name string) error { // Connect to the service manager and try to open the service. In case the // service is not installed, return with the corresponding error. svcmgr, err := mgr.Connect() if err != nil { return fmt.Errorf("connecting to service manager failed: %w", err) } defer svcmgr.Disconnect() service, err := svcmgr.OpenService(name) if err != nil { if !errors.Is(err, windows.ERROR_SERVICE_DOES_NOT_EXIST) { return fmt.Errorf("opening service failed: %w", err) } } else { defer service.Close() // Uninstall the service if err := service.Delete(); err != nil { return fmt.Errorf("uninstalling service failed: %w", err) } } // Remove the eventlog source if there is any if err := eventlog.Remove(name); err != nil && !errors.Is(err, syscall.ERROR_FILE_NOT_FOUND) { return fmt.Errorf("removing eventlog source failed: %w", err) } return nil } func startService(name string) error { nameUTF16, err := syscall.UTF16PtrFromString(name) if err != nil { return fmt.Errorf("conversion of service name %q to UTF16 failed: %w", name, err) } // Open the service manager and service with the least privileges required to start the service mgrhandle, err := windows.OpenSCManager(nil, nil, windows.SC_MANAGER_CONNECT|windows.SC_MANAGER_ENUMERATE_SERVICE) if err != nil { return fmt.Errorf("opening service manager failed: %w", err) } defer windows.CloseServiceHandle(mgrhandle) svchandle, err := windows.OpenService(mgrhandle, nameUTF16, windows.SERVICE_QUERY_STATUS|windows.SERVICE_START) if err != nil { return fmt.Errorf("opening service failed: %w", err) } service := &mgr.Service{Handle: svchandle, Name: name} defer service.Close() // Check if the service is actually stopped status, err := service.Query() if err != nil { return fmt.Errorf("querying service state failed: %w", err) } if status.State != svc.Stopped { return fmt.Errorf("service is not stopped but in state %q", stateDescription(status.State)) } return service.Start() } func stopService(name string) error { nameUTF16, err := syscall.UTF16PtrFromString(name) if err != nil { return fmt.Errorf("conversion of service name %q to UTF16 failed: %w", name, err) } // Open the service manager and service with the least privileges required to start the service mgrhandle, err := windows.OpenSCManager(nil, nil, windows.SC_MANAGER_CONNECT|windows.SC_MANAGER_ENUMERATE_SERVICE) if err != nil { return fmt.Errorf("opening service manager failed: %w", err) } defer windows.CloseServiceHandle(mgrhandle) svchandle, err := windows.OpenService(mgrhandle, nameUTF16, windows.SERVICE_QUERY_STATUS|windows.SERVICE_STOP) if err != nil { return fmt.Errorf("opening service failed: %w", err) } service := &mgr.Service{Handle: svchandle, Name: name} defer service.Close() // Stop the service and wait for it to finish status, err := service.Control(svc.Stop) if err != nil { return fmt.Errorf("stopping service failed: %w", err) } for status.State != svc.Stopped { // Wait for the hinted time, but clip it to prevent stalling operation wait := time.Duration(status.WaitHint) * time.Millisecond if wait < 100*time.Millisecond { wait = 100 * time.Millisecond } else if wait > 10*time.Second { wait = 10 * time.Second } time.Sleep(wait) status, err = service.Query() if err != nil { return fmt.Errorf("querying service state failed: %w", err) } } return nil } func queryService(name string) (string, error) { nameUTF16, err := syscall.UTF16PtrFromString(name) if err != nil { return "", fmt.Errorf("conversion of service name %q to UTF16 failed: %w", name, err) } // Open the service manager and service with the least privileges required to start the service mgrhandle, err := windows.OpenSCManager(nil, nil, windows.SC_MANAGER_CONNECT|windows.SC_MANAGER_ENUMERATE_SERVICE) if err != nil { return "", fmt.Errorf("opening service manager failed: %w", err) } defer windows.CloseServiceHandle(mgrhandle) svchandle, err := windows.OpenService(mgrhandle, nameUTF16, windows.SERVICE_QUERY_STATUS) if err != nil { return "", fmt.Errorf("opening service failed: %w", err) } service := &mgr.Service{Handle: svchandle, Name: name} defer service.Close() // Query the service state and report it to the user status, err := service.Query() if err != nil { return "", fmt.Errorf("querying service state failed: %w", err) } return stateDescription(status.State), nil } func stateDescription(state svc.State) string { switch state { case svc.Stopped: return "stopped" case svc.StartPending: return "start pending" case svc.StopPending: return "stop pending" case svc.Running: return "running" case svc.ContinuePending: return "continue pending" case svc.PausePending: return "pause pending" case svc.Paused: return "paused" } return fmt.Sprintf("unknown %v", state) } ================================================ FILE: config/config.go ================================================ package config import ( "bytes" "crypto/tls" "errors" "fmt" "io" "log" "net/http" "net/url" "os" "path/filepath" "reflect" "regexp" "runtime" "slices" "sort" "strconv" "strings" "sync" "time" "github.com/coreos/go-semver/semver" "github.com/influxdata/toml" "github.com/influxdata/toml/ast" "github.com/influxdata/telegraf" "github.com/influxdata/telegraf/internal" logging "github.com/influxdata/telegraf/logger" "github.com/influxdata/telegraf/models" "github.com/influxdata/telegraf/persister" "github.com/influxdata/telegraf/plugins/aggregators" "github.com/influxdata/telegraf/plugins/inputs" "github.com/influxdata/telegraf/plugins/outputs" "github.com/influxdata/telegraf/plugins/parsers" "github.com/influxdata/telegraf/plugins/parsers/csv" "github.com/influxdata/telegraf/plugins/processors" "github.com/influxdata/telegraf/plugins/secretstores" "github.com/influxdata/telegraf/plugins/serializers" ) var ( httpLoadConfigRetryInterval = 10 * time.Second // fetchURLRe is a regex to determine whether the requested file should // be fetched from a remote or read from the filesystem. fetchURLRe = regexp.MustCompile(`^\w+://`) // oldVarRe is a regex to reproduce pre v1.27.0 environment variable // replacement behavior oldVarRe = regexp.MustCompile(`\$(?i:(?P[_a-z][_a-z0-9]*)|{(?:(?P[_a-z][_a-z0-9]*(?::?[-+?](.*))?)}|(?P)))`) // OldEnvVarReplacement is a switch to allow going back to pre v1.27.0 // environment variable replacement behavior OldEnvVarReplacement = false // NonStrictEnvVarHandling allows to disable strict and safe environment // variables handling. Strict handling cannot replace non-string settings // so this option must be used in those use-cases. NonStrictEnvVarHandling = false // PrintPluginConfigSource is a switch to enable printing of plugin sources PrintPluginConfigSource = false // Password specified via command-line Password Secret // telegrafVersion contains the parsed semantic Telegraf version telegrafVersion *semver.Version = semver.New("0.0.0-unknown") // List of (redacted) configuration Sources sources []string sourcesMu sync.Mutex ) const EmptySourcePath string = "" // Config specifies the URL/user/password for the database that telegraf // will be logging to, as well as all the plugins that the user has // specified type Config struct { toml *toml.Config errs []error // config load errors. UnusedFields map[string]bool unusedFieldsMutex *sync.Mutex Tags map[string]string InputFilters []string OutputFilters []string SecretStoreFilters []string SecretStores map[string]telegraf.SecretStore secretStoreSource map[string][]string Agent *AgentConfig Inputs []*models.RunningInput Outputs []*models.RunningOutput Aggregators []*models.RunningAggregator // Processors have a slice wrapper type because they need to be sorted Processors models.RunningProcessors AggProcessors models.RunningProcessors fileProcessors OrderedPlugins fileAggProcessors OrderedPlugins // Parsers are created by their inputs during gather. Config doesn't keep track of them // like the other plugins because they need to be garbage collected (See issue #11809) Deprecations map[string][]int64 Persister *persister.Persister NumberSecrets uint64 seenAgentTable bool seenAgentTableOnce sync.Once } // OrderedPlugin is used to keep the order in which they appear in a file type OrderedPlugin struct { Line int plugin any } type OrderedPlugins []*OrderedPlugin func (op OrderedPlugins) Len() int { return len(op) } func (op OrderedPlugins) Swap(i, j int) { op[i], op[j] = op[j], op[i] } func (op OrderedPlugins) Less(i, j int) bool { return op[i].Line < op[j].Line } // NewConfig creates a new struct to hold the Telegraf config. // For historical reasons, It holds the actual instances of the running plugins // once the configuration is parsed. func NewConfig() *Config { c := &Config{ UnusedFields: make(map[string]bool), unusedFieldsMutex: &sync.Mutex{}, // Agent defaults: Agent: &AgentConfig{ Interval: Duration(10 * time.Second), RoundInterval: true, FlushInterval: Duration(10 * time.Second), LogfileRotationMaxArchives: 5, }, Tags: make(map[string]string), Inputs: make([]*models.RunningInput, 0), Outputs: make([]*models.RunningOutput, 0), Processors: make([]*models.RunningProcessor, 0), AggProcessors: make([]*models.RunningProcessor, 0), SecretStores: make(map[string]telegraf.SecretStore), secretStoreSource: make(map[string][]string), fileProcessors: make([]*OrderedPlugin, 0), fileAggProcessors: make([]*OrderedPlugin, 0), InputFilters: make([]string, 0), OutputFilters: make([]string, 0), SecretStoreFilters: make([]string, 0), Deprecations: make(map[string][]int64), } // Handle unknown version if internal.Version != "" && internal.Version != "unknown" { telegrafVersion = semver.New(internal.Version) } tomlCfg := &toml.Config{ NormFieldName: toml.DefaultConfig.NormFieldName, FieldToKey: toml.DefaultConfig.FieldToKey, MissingField: c.missingTomlField, } c.toml = tomlCfg // Initialize the configuration source list sourcesMu.Lock() sources = make([]string, 0) sourcesMu.Unlock() return c } // AgentConfig defines configuration that will be used by the Telegraf agent type AgentConfig struct { // Interval at which to gather information Interval Duration // RoundInterval rounds collection interval to 'interval'. // ie, if Interval=10s then always collect on :00, :10, :20, etc. RoundInterval bool // Collected metrics are rounded to the precision specified. Precision is // specified as an interval with an integer + unit (e.g. 0s, 10ms, 2us, 4s). // Valid time units are "ns", "us" (or "µs"), "ms", "s". // // By default, or when set to "0s", precision will be set to the same // timestamp order as the collection interval, with the maximum being 1s: // ie, when interval = "10s", precision will be "1s" // when interval = "250ms", precision will be "1ms" // // Precision will NOT be used for service inputs. It is up to each individual // service input to set the timestamp at the appropriate precision. Precision Duration // CollectionJitter is used to jitter the collection by a random amount. // Each plugin will sleep for a random time within jitter before collecting. // This can be used to avoid many plugins querying things like sysfs at the // same time, which can have a measurable effect on the system. CollectionJitter Duration // CollectionOffset is used to shift the collection by the given amount. // This can be used to avoid many plugins querying constraint devices // at the same time by manually scheduling them in time. CollectionOffset Duration // FlushInterval is the Interval at which to flush data FlushInterval Duration // FlushJitter Jitters the flush interval by a random amount. // This is primarily to avoid large write spikes for users running a large // number of telegraf instances. // ie, a jitter of 5s and interval 10s means flushes will happen every 10-15s FlushJitter Duration // MetricBatchSize is the maximum number of metrics that is written to an // output plugin in one call. MetricBatchSize int // MetricBufferLimit is the max number of metrics that each output plugin // will cache. The buffer is cleared when a successful write occurs. When // full, the oldest metrics will be overwritten. This number should be a // multiple of MetricBatchSize. Due to current implementation, this could // not be less than 2 times MetricBatchSize. MetricBufferLimit int // Debug is the option for running in debug mode Debug bool `toml:"debug"` // Quiet is the option for running in quiet mode Quiet bool `toml:"quiet"` // Log target controls the destination for logs and can be one of "file", // "stderr" or, on Windows, "eventlog". When set to "file", the output file // is determined by the "logfile" setting LogTarget string `toml:"logtarget" deprecated:"1.32.0;1.40.0;use 'logformat' and 'logfile' instead"` // Log format controls the way messages are logged and can be one of "text", // "structured" or, on Windows, "eventlog". LogFormat string `toml:"logformat"` // Name of the file to be logged to or stderr if empty. Ignored for "eventlog" format. Logfile string `toml:"logfile"` // Message key for structured logs, to override the default of "msg". // Ignored if "logformat" is not "structured". StructuredLogMessageKey string `toml:"structured_log_message_key"` // The file will be rotated after the time interval specified. When set // to 0 no time based rotation is performed. LogfileRotationInterval Duration `toml:"logfile_rotation_interval"` // The logfile will be rotated when it becomes larger than the specified // size. When set to 0 no size based rotation is performed. LogfileRotationMaxSize Size `toml:"logfile_rotation_max_size"` // Maximum number of rotated archives to keep, any older logs are deleted. // If set to -1, no archives are removed. LogfileRotationMaxArchives int `toml:"logfile_rotation_max_archives"` // Pick a timezone to use when logging or type 'local' for local time. LogWithTimezone string `toml:"log_with_timezone"` Hostname string OmitHostname bool // Method for translating SNMP objects. 'netsnmp' to call external programs, // 'gosmi' to use the built-in library. SnmpTranslator string `toml:"snmp_translator"` // Name of the file to load the state of plugins from and store the state to. // If uncommented and not empty, this file will be used to save the state of // stateful plugins on termination of Telegraf. If the file exists on start, // the state in the file will be restored for the plugins. Statefile string `toml:"statefile"` // Flag to always keep tags explicitly defined in the plugin itself and // ensure those tags always pass filtering. AlwaysIncludeLocalTags bool `toml:"always_include_local_tags"` // Flag to always keep tags explicitly defined in the global tags section // and ensure those tags always pass filtering. AlwaysIncludeGlobalTags bool `toml:"always_include_global_tags"` // Flag to skip running processors after aggregators // By default, processors are run a second time after aggregators. Changing // this setting to true will skip the second run of processors. SkipProcessorsAfterAggregators *bool `toml:"skip_processors_after_aggregators"` // Number of attempts to obtain a remote configuration via a URL during // startup. Set to -1 for unlimited attempts. ConfigURLRetryAttempts int `toml:"config_url_retry_attempts"` // BufferStrategy is the metric buffer type to use for a given output plugin. // Supported types currently are "memory" and "disk_write_through" (alias: "disk"). BufferStrategy string `toml:"buffer_strategy"` // BufferDirectory is the directory to store buffer files for serialized // to disk metrics when using the "disk_write_through" buffer strategy. BufferDirectory string `toml:"buffer_directory"` // BufferDiskSync controls writes durability when "disk" buffer strategy // is used. No sync offers better write performance at the risk of losing // metrics buffered in the last `flush_interval` in the event of a power // cut. BufferDiskSync *bool `toml:"buffer_disk_sync"` } // InputNames returns a list of strings of the configured inputs. func (c *Config) InputNames() []string { name := make([]string, 0, len(c.Inputs)) for _, input := range c.Inputs { name = append(name, input.Config.Name) } return PluginNameCounts(name) } // InputNamesWithSources returns a table representation of input names and their sources. func (c *Config) InputNamesWithSources() string { plugins := make(pluginNames, 0, len(c.Inputs)) for _, input := range c.Inputs { plugins = append(plugins, pluginPrinter{ name: input.Config.Name, source: input.Config.Source, }) } return getPluginSourcesTable(plugins) } // AggregatorNames returns a list of strings of the configured aggregators. func (c *Config) AggregatorNames() []string { name := make([]string, 0, len(c.Aggregators)) for _, aggregator := range c.Aggregators { name = append(name, aggregator.Config.Name) } return PluginNameCounts(name) } // AggregatorNamesWithSources returns a table representation of aggregator names and their sources. func (c *Config) AggregatorNamesWithSources() string { plugins := make(pluginNames, 0, len(c.Aggregators)) for _, aggregator := range c.Aggregators { plugins = append(plugins, pluginPrinter{ name: aggregator.Config.Name, source: aggregator.Config.Source, }) } return getPluginSourcesTable(plugins) } // ProcessorNames returns a list of strings of the configured processors. func (c *Config) ProcessorNames() []string { name := make([]string, 0, len(c.Processors)) for _, processor := range c.Processors { name = append(name, processor.Config.Name) } return PluginNameCounts(name) } // ProcessorNamesWithSources returns a table representation of processor names and their sources. func (c *Config) ProcessorNamesWithSources() string { plugins := make(pluginNames, 0, len(c.Processors)) for _, processor := range c.Processors { plugins = append(plugins, pluginPrinter{ name: processor.Config.Name, source: processor.Config.Source, }) } return getPluginSourcesTable(plugins) } // OutputNames returns a list of strings of the configured outputs. func (c *Config) OutputNames() []string { name := make([]string, 0, len(c.Outputs)) for _, output := range c.Outputs { name = append(name, output.Config.Name) } return PluginNameCounts(name) } // OutputNamesWithSources returns a table representation of output names and their sources. func (c *Config) OutputNamesWithSources() string { plugins := make(pluginNames, 0, len(c.Outputs)) for _, output := range c.Outputs { plugins = append(plugins, pluginPrinter{ name: output.Config.Name, source: output.Config.Source, }) } return getPluginSourcesTable(plugins) } // SecretstoreNames returns a list of strings of the configured secret-stores. func (c *Config) SecretstoreNames() []string { names := make([]string, 0, len(c.SecretStores)) for name := range c.SecretStores { names = append(names, name) } return PluginNameCounts(names) } // SecretstoreNamesWithSources returns a table representation of secret store names and their sources. func (c *Config) SecretstoreNamesWithSources() string { plugins := make(pluginNames, 0, len(c.SecretStores)) for name, sources := range c.secretStoreSource { for _, source := range sources { plugins = append(plugins, pluginPrinter{ name: name, source: source, }) } } return getPluginSourcesTable(plugins) } // PluginNameCounts returns a string of plugin names and their counts. // PluginNameCounts returns a list of sorted plugin names and their count func PluginNameCounts(plugins []string) []string { names := make(map[string]int) for _, plugin := range plugins { names[plugin]++ } var namecount []string for name, count := range names { if count == 1 { namecount = append(namecount, name) } else { namecount = append(namecount, fmt.Sprintf("%s (%dx)", name, count)) } } sort.Strings(namecount) return namecount } // ListTags returns a string of tags specified in the config, // line-protocol style func (c *Config) ListTags() string { tags := make([]string, 0, len(c.Tags)) for k, v := range c.Tags { tags = append(tags, fmt.Sprintf("%s=%s", k, v)) } sort.Strings(tags) return strings.Join(tags, " ") } func sliceContains(name string, list []string) bool { for _, b := range list { if b == name { return true } } return false } // WalkDirectory collects all toml files that need to be loaded func WalkDirectory(path string) ([]string, error) { var files []string walkfn := func(thispath string, info os.FileInfo, _ error) error { if info == nil { log.Printf("W! Telegraf is not permitted to read %s", thispath) return nil } if info.IsDir() { if strings.HasPrefix(info.Name(), "..") { // skip Kubernetes mounts, preventing loading the same config twice return filepath.SkipDir } return nil } name := info.Name() if len(name) < 6 || name[len(name)-5:] != ".conf" { return nil } files = append(files, thispath) return nil } return files, filepath.Walk(path, walkfn) } // GetDefaultConfigPath will try to find a default config file at these locations (in order): // 1. $TELEGRAF_CONFIG_PATH // 2. $HOME/.telegraf/telegraf.conf // 3. /etc/telegraf/telegraf.conf and /etc/telegraf/telegraf.d/*.conf func GetDefaultConfigPath() ([]string, error) { envfile := os.Getenv("TELEGRAF_CONFIG_PATH") homefile := os.ExpandEnv("${HOME}/.telegraf/telegraf.conf") etcfile := "/etc/telegraf/telegraf.conf" etcfolder := "/etc/telegraf/telegraf.d" if runtime.GOOS == "windows" { programFiles := os.Getenv("ProgramFiles") if programFiles == "" { // Should never happen programFiles = `C:\Program Files` } etcfile = programFiles + `\Telegraf\telegraf.conf` etcfolder = programFiles + `\Telegraf\telegraf.d\` } for _, path := range []string{envfile, homefile} { if isURL(path) { return []string{path}, nil } if _, err := os.Stat(path); err == nil { return []string{path}, nil } } // At this point we need to check if the files under /etc/telegraf are // populated and return them all. confFiles := make([]string, 0) if _, err := os.Stat(etcfile); err == nil { confFiles = append(confFiles, etcfile) } if _, err := os.Stat(etcfolder); err == nil { files, err := WalkDirectory(etcfolder) if err != nil { log.Printf("W! unable walk %q: %s", etcfolder, err) } confFiles = append(confFiles, files...) } if len(confFiles) > 0 { return confFiles, nil } // if we got here, we didn't find a file in a default location return nil, fmt.Errorf("no config file specified, and could not find one"+ " in $TELEGRAF_CONFIG_PATH, %s, %s, or %s/*.conf", homefile, etcfile, etcfolder) } // isURL checks if string is valid url func isURL(str string) bool { u, err := url.Parse(str) return err == nil && u.Scheme != "" && u.Host != "" } // LoadConfig loads the given config files and applies it to c func (c *Config) LoadConfig(path string) error { if !c.Agent.Quiet { log.Printf("I! Loading config: %s", path) } data, _, err := LoadConfigFileWithRetries(path, c.Agent.ConfigURLRetryAttempts) if err != nil { return fmt.Errorf("loading config file %s failed: %w", path, err) } if err = c.LoadConfigData(data, path); err != nil { return fmt.Errorf("loading config file %s failed: %w", path, err) } return nil } func (c *Config) LoadAll(configFiles ...string) error { for _, fConfig := range configFiles { if err := c.LoadConfig(fConfig); err != nil { return err } } // Sort the processors according to their `order` setting while // using a stable sort to keep the file loading / file position order. sort.Stable(c.Processors) sort.Stable(c.AggProcessors) // Set snmp agent translator default if c.Agent.SnmpTranslator == "" { c.Agent.SnmpTranslator = "netsnmp" } // Check if there is enough lockable memory for the secret count := secretCount.Load() if count < 0 { log.Printf("E! Invalid secret count %d, please report this incident including your configuration!", count) count = 0 } c.NumberSecrets = uint64(count) // Let's link all secrets to their secret-stores return c.LinkSecrets() } type cfgDataOptions struct { sourcePath string } type cfgDataOption func(*cfgDataOptions) func WithSourcePath(path string) cfgDataOption { return func(o *cfgDataOptions) { o.sourcePath = path } } // LoadConfigData loads TOML-formatted config data func (c *Config) LoadConfigData(data []byte, path string) error { tbl, err := parseConfig(data) if err != nil { return fmt.Errorf("error parsing data: %w", err) } // Parse tags tables first: for _, tableName := range []string{"tags", "global_tags"} { if val, ok := tbl.Fields[tableName]; ok { subTable, ok := val.(*ast.Table) if !ok { return fmt.Errorf("invalid configuration, bad table name %q", tableName) } if err = c.toml.UnmarshalTable(subTable, c.Tags); err != nil { return fmt.Errorf("error parsing table name %q: %w", tableName, err) } } } // Parse agent table: if val, ok := tbl.Fields["agent"]; ok { if c.seenAgentTable { c.seenAgentTableOnce.Do(func() { log.Printf("W! Overlapping settings in multiple agent tables are not supported: may cause undefined behavior") }) } c.seenAgentTable = true subTable, ok := val.(*ast.Table) if !ok { return errors.New("invalid configuration, error parsing agent table") } if err = c.toml.UnmarshalTable(subTable, c.Agent); err != nil { return fmt.Errorf("error parsing [agent]: %w", err) } } if !c.Agent.OmitHostname { if c.Agent.Hostname == "" { hostname, err := os.Hostname() if err != nil { return err } c.Agent.Hostname = hostname } c.Tags["host"] = c.Agent.Hostname } // Warn when explicitly setting the old snmp translator if c.Agent.SnmpTranslator == "netsnmp" { PrintOptionValueDeprecationNotice("agent", "snmp_translator", "netsnmp", telegraf.DeprecationInfo{ Since: "1.25.0", RemovalIn: "1.40.0", Notice: "Use 'gosmi' instead", }) } // Set up the persister if requested if c.Agent.Statefile != "" { c.Persister = &persister.Persister{ Filename: c.Agent.Statefile, } } if len(c.UnusedFields) > 0 { return fmt.Errorf( "line %d: configuration specified the fields %q, but they were not used; "+ "this is either a typo or this config option does not exist in this version", tbl.Line, keys(c.UnusedFields)) } // Initialize the file-sorting slices c.fileProcessors = make(OrderedPlugins, 0) c.fileAggProcessors = make(OrderedPlugins, 0) // Parse all the rest of the plugins: for name, val := range tbl.Fields { subTable, ok := val.(*ast.Table) if !ok { return fmt.Errorf("invalid configuration, error parsing field %q as table", name) } switch name { case "agent", "global_tags", "tags": case "outputs": for pluginName, pluginVal := range subTable.Fields { switch pluginSubTable := pluginVal.(type) { // legacy [outputs.influxdb] support case *ast.Table: if err = c.addOutput(pluginName, path, pluginSubTable); err != nil { return fmt.Errorf("error parsing %s, %w", pluginName, err) } case []*ast.Table: for _, t := range pluginSubTable { if err = c.addOutput(pluginName, path, t); err != nil { return fmt.Errorf("error parsing %s array, %w", pluginName, err) } } default: return fmt.Errorf("unsupported config format: %s", pluginName) } if len(c.UnusedFields) > 0 { return fmt.Errorf( "plugin %s.%s: line %d: configuration specified the fields %q, but they were not used; "+ "this is either a typo or this config option does not exist in this version", name, pluginName, subTable.Line, keys(c.UnusedFields)) } } case "inputs", "plugins": for pluginName, pluginVal := range subTable.Fields { switch pluginSubTable := pluginVal.(type) { // legacy [inputs.cpu] support case *ast.Table: if err = c.addInput(pluginName, path, pluginSubTable); err != nil { return fmt.Errorf("error parsing %s, %w", pluginName, err) } case []*ast.Table: for _, t := range pluginSubTable { if err = c.addInput(pluginName, path, t); err != nil { return fmt.Errorf("error parsing %s, %w", pluginName, err) } } default: return fmt.Errorf("unsupported config format: %s", pluginName) } if len(c.UnusedFields) > 0 { return fmt.Errorf( "plugin %s.%s: line %d: configuration specified the fields %q, but they were not used; "+ "this is either a typo or this config option does not exist in this version", name, pluginName, subTable.Line, keys(c.UnusedFields)) } } case "processors": for pluginName, pluginVal := range subTable.Fields { switch pluginSubTable := pluginVal.(type) { case []*ast.Table: for _, t := range pluginSubTable { if err = c.addProcessor(pluginName, path, t); err != nil { return fmt.Errorf("error parsing %s, %w", pluginName, err) } } default: return fmt.Errorf("unsupported config format: %s", pluginName) } if len(c.UnusedFields) > 0 { return fmt.Errorf( "plugin %s.%s: line %d: configuration specified the fields %q, but they were not used; "+ "this is either a typo or this config option does not exist in this version", name, pluginName, subTable.Line, keys(c.UnusedFields), ) } } case "aggregators": for pluginName, pluginVal := range subTable.Fields { switch pluginSubTable := pluginVal.(type) { case []*ast.Table: for _, t := range pluginSubTable { if err = c.addAggregator(pluginName, path, t); err != nil { return fmt.Errorf("error parsing %s, %w", pluginName, err) } } default: return fmt.Errorf("unsupported config format: %s", pluginName) } if len(c.UnusedFields) > 0 { return fmt.Errorf( "plugin %s.%s: line %d: configuration specified the fields %q, but they were not used; "+ "this is either a typo or this config option does not exist in this version", name, pluginName, subTable.Line, keys(c.UnusedFields)) } } case "secretstores": for pluginName, pluginVal := range subTable.Fields { switch pluginSubTable := pluginVal.(type) { case []*ast.Table: for _, t := range pluginSubTable { if err = c.addSecretStore(pluginName, path, t); err != nil { return fmt.Errorf("error parsing %s, %w", pluginName, err) } } default: return fmt.Errorf("unsupported config format: %s", pluginName) } if len(c.UnusedFields) > 0 { msg := "plugin %s.%s: line %d: configuration specified the fields %q, but they were not used; " + "this is either a typo or this config option does not exist in this version" return fmt.Errorf(msg, name, pluginName, subTable.Line, keys(c.UnusedFields)) } } // Assume it's an input for legacy config file support if no other // identifiers are present default: if err = c.addInput(name, path, subTable); err != nil { return fmt.Errorf("error parsing %s, %w", name, err) } } } // Sort the processor according to the order they appeared in this file // In a later stage, we sort them using the `order` option. sort.Sort(c.fileProcessors) for _, op := range c.fileProcessors { c.Processors = append(c.Processors, op.plugin.(*models.RunningProcessor)) } sort.Sort(c.fileAggProcessors) for _, op := range c.fileAggProcessors { c.AggProcessors = append(c.AggProcessors, op.plugin.(*models.RunningProcessor)) } return nil } // trimBOM trims the Byte-Order-Marks from the beginning of the file. // this is for Windows compatibility only. // see https://github.com/influxdata/telegraf/issues/1378 func trimBOM(f []byte) []byte { return bytes.TrimPrefix(f, []byte("\xef\xbb\xbf")) } // LoadConfigFile loads the content of a configuration file and returns it // together with a flag denoting if the file is from a remote location such // as a web server. func LoadConfigFile(config string) ([]byte, bool, error) { return LoadConfigFileWithRetries(config, 0) } func LoadConfigFileWithRetries(config string, urlRetryAttempts int) ([]byte, bool, error) { if fetchURLRe.MatchString(config) { u, err := url.Parse(config) if err != nil { return nil, true, err } switch u.Scheme { case "https", "http": data, err := fetchConfig(u, urlRetryAttempts) if err != nil { return nil, true, err } sourcesMu.Lock() sources = append(sources, u.Redacted()) sourcesMu.Unlock() return data, true, nil default: return nil, true, fmt.Errorf("scheme %q not supported", u.Scheme) } } // If it isn't a https scheme, try it as a file buffer, err := os.ReadFile(config) if err != nil { return nil, false, err } sourcesMu.Lock() sources = append(sources, config) sourcesMu.Unlock() mimeType := http.DetectContentType(buffer) if !strings.Contains(mimeType, "text/plain") { return nil, false, fmt.Errorf("provided config is not a TOML file: %s", config) } return buffer, false, nil } // GetSources returns the redacted list of configuration sources func GetSources() []string { sourcesMu.Lock() defer sourcesMu.Unlock() return slices.Clone(sources) } func fetchConfig(u *url.URL, urlRetryAttempts int) ([]byte, error) { req, err := http.NewRequest("GET", u.String(), nil) if err != nil { return nil, err } if v, exists := os.LookupEnv("INFLUX_TOKEN"); exists { req.Header.Add("Authorization", "Token "+v) } req.Header.Add("Accept", "application/toml") req.Header.Set("User-Agent", internal.ProductToken()) var totalAttempts int if urlRetryAttempts == -1 { totalAttempts = -1 log.Printf("Using unlimited number of attempts to fetch HTTP config") } else if urlRetryAttempts == 0 { totalAttempts = 3 } else if urlRetryAttempts > 0 { totalAttempts = urlRetryAttempts } else { return nil, fmt.Errorf("invalid number of attempts: %d", urlRetryAttempts) } attempt := 0 for { body, err := requestURLConfig(req) if err == nil { return body, nil } log.Printf("Error getting HTTP config (attempt %d of %d): %s", attempt, totalAttempts, err) if urlRetryAttempts != -1 && attempt >= totalAttempts { return nil, err } time.Sleep(httpLoadConfigRetryInterval) attempt++ } } func requestURLConfig(req *http.Request) ([]byte, error) { resp, err := http.DefaultClient.Do(req) if err != nil { return nil, fmt.Errorf("failed to connect to HTTP config server: %w", err) } defer resp.Body.Close() if resp.StatusCode != http.StatusOK { return nil, fmt.Errorf("failed to fetch HTTP config: %s", resp.Status) } body, err := io.ReadAll(resp.Body) if err != nil { return nil, fmt.Errorf("failed to read response body: %w", err) } return body, nil } // parseConfig loads a TOML configuration from a provided path and // returns the AST produced from the TOML parser. When loading the file, it // will find environment variables and replace them. func parseConfig(contents []byte) (*ast.Table, error) { contents = trimBOM(contents) var err error contents, err = removeComments(contents) if err != nil { return nil, err } // Use non-strict mode if NonStrictEnvVarHandling { output, err := substituteEnvironmentNonStrict(contents, OldEnvVarReplacement) if err != nil { return nil, err } return toml.Parse(output) } // Use strict mode (default) return substituteEnvironmentStrict(contents, OldEnvVarReplacement) } func (c *Config) addAggregator(name, source string, table *ast.Table) error { enabled, err := c.matchesLabelSelection(table) if err != nil { return fmt.Errorf("invalid label in plugin aggregators.%s: %w", name, err) } if !enabled { return nil } creator, ok := aggregators.Aggregators[name] if !ok { // Handle removed, deprecated plugins if di, deprecated := aggregators.Deprecations[name]; deprecated { printHistoricPluginDeprecationNotice("aggregators", name, di) return errors.New("plugin deprecated") } return fmt.Errorf("undefined but requested aggregator: %s", name) } aggregator := creator() conf, err := c.buildAggregator(name, source, table) if err != nil { return err } if err := c.toml.UnmarshalTable(table, aggregator); err != nil { return err } if err := c.printUserDeprecation("aggregators", name, aggregator); err != nil { return err } c.Aggregators = append(c.Aggregators, models.NewRunningAggregator(aggregator, conf)) return nil } func (c *Config) addSecretStore(name, source string, table *ast.Table) error { if len(c.SecretStoreFilters) > 0 && !sliceContains(name, c.SecretStoreFilters) { return nil } enabled, err := c.matchesLabelSelection(table) if err != nil { return fmt.Errorf("invalid label in plugin secretstores.%s: %w", name, err) } if !enabled { return nil } storeID := c.getFieldString(table, "id") if storeID == "" { return fmt.Errorf("%q secret-store without ID", name) } if !secretStorePattern.MatchString(storeID) { return fmt.Errorf("invalid secret-store ID %q, must only contain letters, numbers or underscore", storeID) } tags := map[string]string{ "_id": storeID, "secretstore": name, } creator, ok := secretstores.SecretStores[name] if !ok { // Handle removed, deprecated plugins if di, deprecated := secretstores.Deprecations[name]; deprecated { printHistoricPluginDeprecationNotice("secretstores", name, di) return errors.New("plugin deprecated") } return fmt.Errorf("undefined but requested secretstores: %s", name) } store := creator(storeID) if err := c.toml.UnmarshalTable(table, store); err != nil { return err } if err := c.printUserDeprecation("secretstores", name, store); err != nil { return err } logger := logging.New("secretstores", name, "") models.SetLoggerOnPlugin(store, logger) models.SetStatisticsOnPlugin(store, logger, tags) if err := store.Init(); err != nil { return fmt.Errorf("error initializing secret-store %q: %w", storeID, err) } if _, found := c.SecretStores[storeID]; found { return fmt.Errorf("duplicate ID %q for secretstore %q", storeID, name) } c.SecretStores[storeID] = store if _, found := c.secretStoreSource[name]; !found { c.secretStoreSource[name] = make([]string, 0) } c.secretStoreSource[name] = append(c.secretStoreSource[name], source) return nil } func (c *Config) LinkSecrets() error { for _, s := range unlinkedSecrets { resolvers := make(map[string]telegraf.ResolveFunc) for _, ref := range s.GetUnlinked() { // Split the reference and lookup the resolver storeID, key := splitLink(ref) store, found := c.SecretStores[storeID] if !found { return fmt.Errorf("unknown secret-store for %q", ref) } resolver, err := store.GetResolver(key) if err != nil { return fmt.Errorf("retrieving resolver for %q failed: %w", ref, err) } resolvers[ref] = resolver } // Inject the resolver list into the secret if err := s.Link(resolvers); err != nil { return fmt.Errorf("retrieving resolver failed: %w", err) } } return nil } func (c *Config) probeParser(parentCategory, parentName string, table *ast.Table) bool { dataFormat := c.getFieldString(table, "data_format") if dataFormat == "" { dataFormat = setDefaultParser(parentCategory, parentName) } creator, ok := parsers.Parsers[dataFormat] if !ok { return false } // Try to parse the options to detect if any of them is misspelled parser := creator("") //nolint:errcheck // We don't actually use the parser, so no need to check the error. c.toml.UnmarshalTable(table, parser) return true } func (c *Config) addParser(parentcategory, parentname string, table *ast.Table) (*models.RunningParser, error) { conf := &models.ParserConfig{ Parent: parentname, } conf.DataFormat = c.getFieldString(table, "data_format") if conf.DataFormat == "" { conf.DataFormat = setDefaultParser(parentcategory, parentname) } else if conf.DataFormat == "influx" { influxParserType := c.getFieldString(table, "influx_parser_type") if influxParserType == "upstream" { conf.DataFormat = "influx_upstream" } } conf.LogLevel = c.getFieldString(table, "log_level") creator, ok := parsers.Parsers[conf.DataFormat] if !ok { return nil, fmt.Errorf("undefined but requested parser: %s", conf.DataFormat) } parser := creator(parentname) // Handle reset-mode of CSV parsers to stay backward compatible (see issue #12022) if conf.DataFormat == "csv" && parentcategory == "inputs" { if parentname == "exec" { csvParser := parser.(*csv.Parser) csvParser.ResetMode = "always" } } if err := c.toml.UnmarshalTable(table, parser); err != nil { return nil, err } running := models.NewRunningParser(parser, conf) err := running.Init() return running, err } func (c *Config) probeSerializer(table *ast.Table) bool { dataFormat := c.getFieldString(table, "data_format") if dataFormat == "" { dataFormat = "influx" } creator, ok := serializers.Serializers[dataFormat] if !ok { return false } // Try to parse the options to detect if any of them is misspelled serializer := creator() //nolint:errcheck // We don't actually use the parser, so no need to check the error. c.toml.UnmarshalTable(table, serializer) return true } func (c *Config) addSerializer(parentname string, table *ast.Table) (*models.RunningSerializer, error) { conf := &models.SerializerConfig{ Parent: parentname, } conf.DataFormat = c.getFieldString(table, "data_format") if conf.DataFormat == "" { conf.DataFormat = "influx" } conf.LogLevel = c.getFieldString(table, "log_level") creator, ok := serializers.Serializers[conf.DataFormat] if !ok { return nil, fmt.Errorf("undefined but requested serializer: %s", conf.DataFormat) } serializer := creator() if err := c.toml.UnmarshalTable(table, serializer); err != nil { return nil, err } running := models.NewRunningSerializer(serializer, conf) err := running.Init() return running, err } func (c *Config) addProcessor(name, source string, table *ast.Table) error { enabled, err := c.matchesLabelSelection(table) if err != nil { return fmt.Errorf("invalid label in plugin processors.%s: %w", name, err) } if !enabled { return nil } creator, ok := processors.Processors[name] if !ok { // Handle removed, deprecated plugins if di, deprecated := processors.Deprecations[name]; deprecated { printHistoricPluginDeprecationNotice("processors", name, di) return errors.New("plugin deprecated") } return fmt.Errorf("undefined but requested processor: %s", name) } // For processors with parsers we need to compute the set of // options that is not covered by both, the parser and the processor. // We achieve this by keeping a local book of missing entries // that counts the number of misses. In case we have a parser // for the input both need to miss the entry. We count the // missing entries at the end. missCount := make(map[string]int) missCountThreshold := 0 c.setLocalMissingTomlFieldTracker(missCount) defer c.resetMissingTomlFieldTracker() // Set up the processor running before the aggregators processorBeforeConfig, err := c.buildProcessor("processors", name, source, table) if err != nil { return err } processorBefore, count, err := c.setupProcessor(processorBeforeConfig.Name, creator, table) if err != nil { return err } rf := models.NewRunningProcessor(processorBefore, processorBeforeConfig) c.fileProcessors = append(c.fileProcessors, &OrderedPlugin{table.Line, rf}) // Setup another (new) processor instance running after the aggregator processorAfterConfig, err := c.buildProcessor("aggprocessors", name, source, table) if err != nil { return err } processorAfter, _, err := c.setupProcessor(processorAfterConfig.Name, creator, table) if err != nil { return err } rf = models.NewRunningProcessor(processorAfter, processorAfterConfig) c.fileAggProcessors = append(c.fileAggProcessors, &OrderedPlugin{table.Line, rf}) // Check the number of misses against the threshold. We need to double // the count as the processor setup is executed twice. missCountThreshold = 2 * count for key, count := range missCount { if count <= missCountThreshold { continue } if err := c.missingTomlField(nil, key); err != nil { return err } } return nil } func (c *Config) setupProcessor(name string, creator processors.StreamingCreator, table *ast.Table) (telegraf.StreamingProcessor, int, error) { var optionTestCount int streamingProcessor := creator() var processor interface{} if p, ok := streamingProcessor.(processors.HasUnwrap); ok { processor = p.Unwrap() } else { processor = streamingProcessor } // If the (underlying) processor has a SetParser or SetParserFunc function, // it can accept arbitrary data-formats, so build the requested parser and // set it. if t, ok := processor.(telegraf.ParserPlugin); ok { parser, err := c.addParser("processors", name, table) if err != nil { return nil, 0, fmt.Errorf("adding parser failed: %w", err) } t.SetParser(parser) optionTestCount++ } if t, ok := processor.(telegraf.ParserFuncPlugin); ok { if !c.probeParser("processors", name, table) { return nil, 0, errors.New("parser not found") } t.SetParserFunc(func() (telegraf.Parser, error) { return c.addParser("processors", name, table) }) optionTestCount++ } // If the (underlying) processor has a SetSerializer function it can accept // arbitrary data-formats, so build the requested serializer and set it. if t, ok := processor.(telegraf.SerializerPlugin); ok { serializer, err := c.addSerializer(name, table) if err != nil { return nil, 0, fmt.Errorf("adding serializer failed: %w", err) } t.SetSerializer(serializer) optionTestCount++ } if t, ok := processor.(telegraf.SerializerFuncPlugin); ok { if !c.probeSerializer(table) { return nil, 0, errors.New("serializer not found") } t.SetSerializerFunc(func() (telegraf.Serializer, error) { return c.addSerializer(name, table) }) optionTestCount++ } if err := c.toml.UnmarshalTable(table, processor); err != nil { return nil, 0, fmt.Errorf("unmarshalling failed: %w", err) } err := c.printUserDeprecation("processors", name, processor) return streamingProcessor, optionTestCount, err } func (c *Config) addOutput(name, source string, table *ast.Table) error { if len(c.OutputFilters) > 0 && !sliceContains(name, c.OutputFilters) { return nil } enabled, err := c.matchesLabelSelection(table) if err != nil { return fmt.Errorf("invalid label in plugin outputs.%s: %w", name, err) } if !enabled { return nil } // For outputs with serializers we need to compute the set of // options that is not covered by both, the serializer and the input. // We achieve this by keeping a local book of missing entries // that counts the number of misses. In case we have a parser // for the input both need to miss the entry. We count the // missing entries at the end. missThreshold := 0 missCount := make(map[string]int) c.setLocalMissingTomlFieldTracker(missCount) defer c.resetMissingTomlFieldTracker() creator, ok := outputs.Outputs[name] if !ok { // Handle removed, deprecated plugins if di, deprecated := outputs.Deprecations[name]; deprecated { printHistoricPluginDeprecationNotice("outputs", name, di) return errors.New("plugin deprecated") } return fmt.Errorf("undefined but requested output: %s", name) } output := creator() // If the output has a SetSerializer function, then this means it can write // arbitrary types of output, so build the serializer and set it. if t, ok := output.(telegraf.SerializerPlugin); ok { missThreshold = 1 serializer, err := c.addSerializer(name, table) if err != nil { return err } t.SetSerializer(serializer) } if t, ok := output.(telegraf.SerializerFuncPlugin); ok { missThreshold = 1 if !c.probeSerializer(table) { return errors.New("serializer not found") } t.SetSerializerFunc(func() (telegraf.Serializer, error) { return c.addSerializer(name, table) }) } outputConfig, err := c.buildOutput(name, source, table) if err != nil { return err } if err := c.toml.UnmarshalTable(table, output); err != nil { return err } if err := c.printUserDeprecation("outputs", name, output); err != nil { return err } if c, ok := interface{}(output).(interface{ TLSConfig() (*tls.Config, error) }); ok { if _, err := c.TLSConfig(); err != nil { return err } } // Check the number of misses against the threshold for key, count := range missCount { if count <= missThreshold { continue } if err := c.missingTomlField(nil, key); err != nil { return err } } ro := models.NewRunningOutput(output, outputConfig, c.Agent.MetricBatchSize, c.Agent.MetricBufferLimit) c.Outputs = append(c.Outputs, ro) return nil } func (c *Config) addInput(name, source string, table *ast.Table) error { if len(c.InputFilters) > 0 && !sliceContains(name, c.InputFilters) { return nil } enabled, err := c.matchesLabelSelection(table) if err != nil { return fmt.Errorf("invalid label in plugin inputs.%s: %w", name, err) } if !enabled { return nil } // For inputs with parsers we need to compute the set of // options that is not covered by both, the parser and the input. // We achieve this by keeping a local book of missing entries // that counts the number of misses. In case we have a parser // for the input both need to miss the entry. We count the // missing entries at the end. missCount := make(map[string]int) missCountThreshold := 0 c.setLocalMissingTomlFieldTracker(missCount) defer c.resetMissingTomlFieldTracker() creator, ok := inputs.Inputs[name] if !ok { // Handle removed, deprecated plugins if di, deprecated := inputs.Deprecations[name]; deprecated { printHistoricPluginDeprecationNotice("inputs", name, di) return errors.New("plugin deprecated") } return fmt.Errorf("undefined but requested input: %s", name) } input := creator() // If the input has a SetParser or SetParserFunc function, it can accept // arbitrary data-formats, so build the requested parser and set it. if t, ok := input.(telegraf.ParserPlugin); ok { missCountThreshold = 1 parser, err := c.addParser("inputs", name, table) if err != nil { return fmt.Errorf("adding parser failed: %w", err) } t.SetParser(parser) } if t, ok := input.(telegraf.ParserFuncPlugin); ok { missCountThreshold = 1 if !c.probeParser("inputs", name, table) { return errors.New("parser not found") } t.SetParserFunc(func() (telegraf.Parser, error) { return c.addParser("inputs", name, table) }) } pluginConfig, err := c.buildInput(name, source, table) if err != nil { return err } if err := c.toml.UnmarshalTable(table, input); err != nil { return err } if err := c.printUserDeprecation("inputs", name, input); err != nil { return err } if c, ok := interface{}(input).(interface{ TLSConfig() (*tls.Config, error) }); ok { if _, err := c.TLSConfig(); err != nil { return err } } // Check the number of misses against the threshold for key, count := range missCount { if count <= missCountThreshold { continue } if err := c.missingTomlField(nil, key); err != nil { return err } } rp := models.NewRunningInput(input, pluginConfig) rp.SetDefaultTags(c.Tags) c.Inputs = append(c.Inputs, rp) return nil } // buildAggregator parses Aggregator specific items from the ast.Table, // builds the filter and returns a // models.AggregatorConfig to be inserted into models.RunningAggregator func (c *Config) buildAggregator(name, source string, tbl *ast.Table) (*models.AggregatorConfig, error) { conf := &models.AggregatorConfig{ Name: name, Source: source, Delay: time.Millisecond * 100, Period: time.Second * 30, Grace: time.Second * 0, } if period, found := c.getFieldDuration(tbl, "period"); found { conf.Period = period } if delay, found := c.getFieldDuration(tbl, "delay"); found { conf.Delay = delay } if grace, found := c.getFieldDuration(tbl, "grace"); found { conf.Grace = grace } conf.DropOriginal = c.getFieldBool(tbl, "drop_original") conf.MeasurementPrefix = c.getFieldString(tbl, "name_prefix") conf.MeasurementSuffix = c.getFieldString(tbl, "name_suffix") conf.NameOverride = c.getFieldString(tbl, "name_override") conf.Alias = c.getFieldString(tbl, "alias") conf.LogLevel = c.getFieldString(tbl, "log_level") conf.Tags = make(map[string]string) if node, ok := tbl.Fields["tags"]; ok { if subtbl, ok := node.(*ast.Table); ok { if err := c.toml.UnmarshalTable(subtbl, conf.Tags); err != nil { return nil, fmt.Errorf("could not parse tags for input %s", name) } } } if c.hasErrs() { return nil, c.firstErr() } var err error conf.Filter, err = c.buildFilter("aggregators."+name, tbl) if err != nil { return conf, err } // Generate an ID for the plugin conf.ID, err = generatePluginID("aggregators."+name, tbl) return conf, err } // buildProcessor parses Processor specific items from the ast.Table, // builds the filter and returns a // models.ProcessorConfig to be inserted into models.RunningProcessor func (c *Config) buildProcessor(category, name, source string, tbl *ast.Table) (*models.ProcessorConfig, error) { conf := &models.ProcessorConfig{ Name: name, Source: source, } conf.Order = c.getFieldInt64(tbl, "order") conf.Alias = c.getFieldString(tbl, "alias") conf.LogLevel = c.getFieldString(tbl, "log_level") if c.hasErrs() { return nil, c.firstErr() } var err error conf.Filter, err = c.buildFilter(category+"."+name, tbl) if err != nil { return conf, err } // Generate an ID for the plugin conf.ID, err = generatePluginID(category+"."+name, tbl) return conf, err } // buildFilter builds a Filter // (tags, fields, namepass, namedrop, metricpass) to // be inserted into the models.OutputConfig/models.InputConfig // to be used for glob filtering on tags and measurements func (c *Config) buildFilter(plugin string, tbl *ast.Table) (models.Filter, error) { f := models.Filter{} f.NamePass = c.getFieldStringSlice(tbl, "namepass") f.NamePassSeparators = c.getFieldString(tbl, "namepass_separator") f.NameDrop = c.getFieldStringSlice(tbl, "namedrop") f.NameDropSeparators = c.getFieldString(tbl, "namedrop_separator") oldPass := c.getFieldStringSlice(tbl, "pass") if len(oldPass) > 0 { PrintOptionDeprecationNotice(plugin, "pass", telegraf.DeprecationInfo{ Since: "0.10.4", RemovalIn: "1.35.0", Notice: "use 'fieldinclude' instead", }) f.FieldInclude = append(f.FieldInclude, oldPass...) } oldFieldPass := c.getFieldStringSlice(tbl, "fieldpass") if len(oldFieldPass) > 0 { PrintOptionDeprecationNotice(plugin, "fieldpass", telegraf.DeprecationInfo{ Since: "1.29.0", RemovalIn: "1.40.0", Notice: "use 'fieldinclude' instead", }) f.FieldInclude = append(f.FieldInclude, oldFieldPass...) } fieldInclude := c.getFieldStringSlice(tbl, "fieldinclude") if len(fieldInclude) > 0 { f.FieldInclude = append(f.FieldInclude, fieldInclude...) } oldDrop := c.getFieldStringSlice(tbl, "drop") if len(oldDrop) > 0 { PrintOptionDeprecationNotice(plugin, "drop", telegraf.DeprecationInfo{ Since: "0.10.4", RemovalIn: "1.35.0", Notice: "use 'fieldexclude' instead", }) f.FieldExclude = append(f.FieldExclude, oldDrop...) } oldFieldDrop := c.getFieldStringSlice(tbl, "fielddrop") if len(oldFieldDrop) > 0 { PrintOptionDeprecationNotice(plugin, "fielddrop", telegraf.DeprecationInfo{ Since: "1.29.0", RemovalIn: "1.40.0", Notice: "use 'fieldexclude' instead", }) f.FieldExclude = append(f.FieldExclude, oldFieldDrop...) } fieldExclude := c.getFieldStringSlice(tbl, "fieldexclude") if len(fieldExclude) > 0 { f.FieldExclude = append(f.FieldExclude, fieldExclude...) } f.TagPassFilters = c.getFieldTagFilter(tbl, "tagpass") f.TagDropFilters = c.getFieldTagFilter(tbl, "tagdrop") f.TagExclude = c.getFieldStringSlice(tbl, "tagexclude") f.TagInclude = c.getFieldStringSlice(tbl, "taginclude") f.MetricPass = c.getFieldString(tbl, "metricpass") if c.hasErrs() { return f, c.firstErr() } if err := f.Compile(); err != nil { return f, err } return f, nil } // buildInput parses input specific items from the ast.Table, // builds the filter and returns a // models.InputConfig to be inserted into models.RunningInput func (c *Config) buildInput(name, source string, tbl *ast.Table) (*models.InputConfig, error) { cp := &models.InputConfig{ Name: name, Source: source, AlwaysIncludeLocalTags: c.Agent.AlwaysIncludeLocalTags, AlwaysIncludeGlobalTags: c.Agent.AlwaysIncludeGlobalTags, } cp.Interval, _ = c.getFieldDuration(tbl, "interval") cp.Precision, _ = c.getFieldDuration(tbl, "precision") cp.CollectionJitter, _ = c.getFieldDuration(tbl, "collection_jitter") cp.CollectionOffset, _ = c.getFieldDuration(tbl, "collection_offset") cp.StartupErrorBehavior = c.getFieldString(tbl, "startup_error_behavior") cp.TimeSource = c.getFieldString(tbl, "time_source") cp.MeasurementPrefix = c.getFieldString(tbl, "name_prefix") cp.MeasurementSuffix = c.getFieldString(tbl, "name_suffix") cp.NameOverride = c.getFieldString(tbl, "name_override") cp.Alias = c.getFieldString(tbl, "alias") cp.LogLevel = c.getFieldString(tbl, "log_level") cp.Tags = make(map[string]string) if node, ok := tbl.Fields["tags"]; ok { if subtbl, ok := node.(*ast.Table); ok { if err := c.toml.UnmarshalTable(subtbl, cp.Tags); err != nil { return nil, fmt.Errorf("could not parse tags for input %s", name) } } } if c.hasErrs() { return nil, c.firstErr() } var err error cp.Filter, err = c.buildFilter("inputs."+name, tbl) if err != nil { return cp, err } // Generate an ID for the plugin cp.ID, err = generatePluginID("inputs."+name, tbl) return cp, err } // buildOutput parses output specific items from the ast.Table, // builds the filter and returns a // models.OutputConfig to be inserted into models.RunningInput // Note: error exists in the return for future calls that might require error func (c *Config) buildOutput(name, source string, tbl *ast.Table) (*models.OutputConfig, error) { filter, err := c.buildFilter("outputs."+name, tbl) if err != nil { return nil, err } bufferStrategy := c.Agent.BufferStrategy if bufferStrategy == "disk" { bufferStrategy = "disk_write_through" } bufferDiskSync := true if c.Agent.BufferDiskSync != nil { bufferDiskSync = *c.Agent.BufferDiskSync } oc := &models.OutputConfig{ Name: name, Source: source, Filter: filter, BufferStrategy: bufferStrategy, BufferDirectory: c.Agent.BufferDirectory, BufferDiskSync: bufferDiskSync, } // TODO: support FieldPass/FieldDrop on outputs oc.FlushInterval, _ = c.getFieldDuration(tbl, "flush_interval") oc.FlushJitter, _ = c.getFieldDuration(tbl, "flush_jitter") oc.MetricBufferLimit = c.getFieldInt(tbl, "metric_buffer_limit") oc.MetricBatchSize = c.getFieldInt(tbl, "metric_batch_size") oc.Alias = c.getFieldString(tbl, "alias") oc.NameOverride = c.getFieldString(tbl, "name_override") oc.NameSuffix = c.getFieldString(tbl, "name_suffix") oc.NamePrefix = c.getFieldString(tbl, "name_prefix") oc.StartupErrorBehavior = c.getFieldString(tbl, "startup_error_behavior") oc.LogLevel = c.getFieldString(tbl, "log_level") if c.hasErrs() { return nil, c.firstErr() } if oc.BufferStrategy == "disk_write_through" { log.Printf("W! Using disk-write-through buffer strategy for plugin outputs.%s, this is an experimental feature", name) } // Generate an ID for the plugin oc.ID, err = generatePluginID("outputs."+name, tbl) return oc, err } func (c *Config) missingTomlField(_ reflect.Type, key string) error { switch key { // General options to ignore case "alias", "always_include_local_tags", "buffer_strategy", "buffer_directory", "buffer_disk_sync", "collection_jitter", "collection_offset", "data_format", "delay", "drop", "drop_original", "fielddrop", "fieldexclude", "fieldinclude", "fieldpass", "flush_interval", "flush_jitter", "grace", "interval", "log_level", "lvm", // What is this used for? "metric_batch_size", "metric_buffer_limit", "metricpass", "name_override", "name_prefix", "name_suffix", "namedrop", "namedrop_separator", "namepass", "namepass_separator", "order", "pass", "period", "precision", "tagdrop", "tagexclude", "taginclude", "tagpass", "tags", "startup_error_behavior", "labels": // Secret-store options to ignore case "id": // Parser and serializer options to ignore case "data_type", "influx_parser_type": default: c.unusedFieldsMutex.Lock() c.UnusedFields[key] = true c.unusedFieldsMutex.Unlock() } return nil } func (c *Config) setLocalMissingTomlFieldTracker(counter map[string]int) { f := func(t reflect.Type, key string) error { // Check if we are in a root element that might share options among // each other. Those root elements are plugins of all types. // All other elements are subtables of their respective plugin and // should just be hit once anyway. Therefore, we mark them with a // high number to handle them correctly later. pt := reflect.PointerTo(t) root := pt.Implements(reflect.TypeOf((*telegraf.Input)(nil)).Elem()) root = root || pt.Implements(reflect.TypeOf((*telegraf.ServiceInput)(nil)).Elem()) root = root || pt.Implements(reflect.TypeOf((*telegraf.Output)(nil)).Elem()) root = root || pt.Implements(reflect.TypeOf((*telegraf.Aggregator)(nil)).Elem()) root = root || pt.Implements(reflect.TypeOf((*telegraf.Processor)(nil)).Elem()) root = root || pt.Implements(reflect.TypeOf((*telegraf.StreamingProcessor)(nil)).Elem()) root = root || pt.Implements(reflect.TypeOf((*telegraf.Parser)(nil)).Elem()) root = root || pt.Implements(reflect.TypeOf((*telegraf.Serializer)(nil)).Elem()) c, ok := counter[key] if !root { counter[key] = 100 } else if !ok { counter[key] = 1 } else { counter[key] = c + 1 } return nil } c.toml.MissingField = f } func (c *Config) resetMissingTomlFieldTracker() { c.toml.MissingField = c.missingTomlField } func (*Config) getFieldString(tbl *ast.Table, fieldName string) string { if node, ok := tbl.Fields[fieldName]; ok { if kv, ok := node.(*ast.KeyValue); ok { if str, ok := kv.Value.(*ast.String); ok { return str.Value } } } return "" } func (c *Config) getFieldDuration(tbl *ast.Table, fieldName string) (time.Duration, bool) { if node, ok := tbl.Fields[fieldName]; ok { if kv, ok := node.(*ast.KeyValue); ok { if str, ok := kv.Value.(*ast.String); ok { d, err := time.ParseDuration(str.Value) if err != nil { c.addError(tbl, fmt.Errorf("error parsing duration: %w", err)) return 0, false } return d, true } } } return 0, false } func (c *Config) getFieldBool(tbl *ast.Table, fieldName string) bool { if node, ok := tbl.Fields[fieldName]; ok { if kv, ok := node.(*ast.KeyValue); ok { switch t := kv.Value.(type) { case *ast.Boolean: target, err := t.Boolean() if err != nil { c.addError(tbl, fmt.Errorf("unknown boolean value type %q, expecting boolean", kv.Value)) return false } return target case *ast.String: target, err := strconv.ParseBool(t.Value) if err != nil { c.addError(tbl, fmt.Errorf("unknown boolean value type %q, expecting boolean", kv.Value)) return false } return target default: c.addError(tbl, fmt.Errorf("unknown boolean value type %q, expecting boolean", kv.Value.Source())) return false } } } return false } func (c *Config) getFieldInt(tbl *ast.Table, fieldName string) int { if node, ok := tbl.Fields[fieldName]; ok { if kv, ok := node.(*ast.KeyValue); ok { if iAst, ok := kv.Value.(*ast.Integer); ok { i, err := iAst.Int() if err != nil { c.addError(tbl, fmt.Errorf("unexpected int type %q, expecting int", iAst.Value)) return 0 } return int(i) } } } return 0 } func (c *Config) getFieldInt64(tbl *ast.Table, fieldName string) int64 { if node, ok := tbl.Fields[fieldName]; ok { if kv, ok := node.(*ast.KeyValue); ok { if iAst, ok := kv.Value.(*ast.Integer); ok { i, err := iAst.Int() if err != nil { c.addError(tbl, fmt.Errorf("unexpected int type %q, expecting int", iAst.Value)) return 0 } return i } c.addError(tbl, fmt.Errorf("found unexpected format while parsing %q, expecting int", fieldName)) return 0 } } return 0 } func (c *Config) getFieldStringSlice(tbl *ast.Table, fieldName string) []string { var target []string if node, ok := tbl.Fields[fieldName]; ok { if kv, ok := node.(*ast.KeyValue); ok { ary, ok := kv.Value.(*ast.Array) if !ok { c.addError(tbl, fmt.Errorf("found unexpected format while parsing %q, expecting string array/slice format", fieldName)) return target } for _, elem := range ary.Value { if str, ok := elem.(*ast.String); ok { target = append(target, str.Value) } } } } return target } func (c *Config) getFieldTagFilter(tbl *ast.Table, fieldName string) []models.TagFilter { var target []models.TagFilter if node, ok := tbl.Fields[fieldName]; ok { if subTbl, ok := node.(*ast.Table); ok { for name, val := range subTbl.Fields { if kv, ok := val.(*ast.KeyValue); ok { ary, ok := kv.Value.(*ast.Array) if !ok { c.addError(tbl, fmt.Errorf("found unexpected format while parsing %q, expecting string array/slice format on each entry", fieldName)) return nil } tagFilter := models.TagFilter{Name: name} for _, elem := range ary.Value { if str, ok := elem.(*ast.String); ok { tagFilter.Values = append(tagFilter.Values, str.Value) } } target = append(target, tagFilter) } } } } return target } func (*Config) getFieldMap(tbl *ast.Table, fieldName string) map[string]string { target := make(map[string]string) if node, ok := tbl.Fields[fieldName]; ok { if subTbl, ok := node.(*ast.Table); ok { for _, val := range subTbl.Fields { if kv, ok := val.(*ast.KeyValue); ok { if str, ok := kv.Value.(*ast.String); ok { target[kv.Key] = str.Value } } } } } return target } func (c *Config) matchesLabelSelection(tbl *ast.Table) (bool, error) { // Get the label definitions for the plugin and check them labels := c.getFieldMap(tbl, "labels") for k, v := range labels { if err := CheckLabelKeyValuePairs(k, v); err != nil { return false, err } } // Match the selection statement against the labels return pluginLabelSelector.matches(labels), nil } func keys(m map[string]bool) []string { result := make([]string, 0, len(m)) for k := range m { result = append(result, k) } return result } func setDefaultParser(category, name string) string { // Legacy support, exec plugin originally parsed JSON by default. if category == "inputs" && name == "exec" { return "json" } return "influx" } func (c *Config) hasErrs() bool { return len(c.errs) > 0 } func (c *Config) firstErr() error { if len(c.errs) == 0 { return nil } return c.errs[0] } func (c *Config) addError(tbl *ast.Table, err error) { c.errs = append(c.errs, fmt.Errorf("line %d:%d: %w", tbl.Line, tbl.Position, err)) } ================================================ FILE: config/config_test.go ================================================ package config_test import ( "bytes" "fmt" "net/http" "net/http/httptest" "os" "os/exec" "path/filepath" "reflect" "regexp" "runtime" "strings" "sync" "testing" "time" "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/stretchr/testify/require" "github.com/influxdata/telegraf" "github.com/influxdata/telegraf/config" logging "github.com/influxdata/telegraf/logger" "github.com/influxdata/telegraf/metric" "github.com/influxdata/telegraf/models" "github.com/influxdata/telegraf/persister" "github.com/influxdata/telegraf/plugins/common/tls" "github.com/influxdata/telegraf/plugins/inputs" "github.com/influxdata/telegraf/plugins/outputs" "github.com/influxdata/telegraf/plugins/parsers" _ "github.com/influxdata/telegraf/plugins/parsers/all" // Blank import to have all parsers for testing "github.com/influxdata/telegraf/plugins/parsers/json" "github.com/influxdata/telegraf/plugins/parsers/json_v2" "github.com/influxdata/telegraf/plugins/processors" "github.com/influxdata/telegraf/plugins/serializers" _ "github.com/influxdata/telegraf/plugins/serializers/all" // Blank import to have all serializers for testing serializers_prometheus "github.com/influxdata/telegraf/plugins/serializers/prometheus" "github.com/influxdata/telegraf/testutil" ) func TestReadBinaryFile(t *testing.T) { // Create a temporary binary file using the Telegraf tool custom_builder to pass as a config t.Chdir("..") tmpdir := t.TempDir() binaryFile := filepath.Join(tmpdir, "custom_builder") cmd := exec.Command("go", "build", "-o", binaryFile, "./tools/custom_builder") var outb, errb bytes.Buffer cmd.Stdout = &outb cmd.Stderr = &errb require.NoErrorf(t, cmd.Run(), "stdout: %s, stderr: %s", outb.String(), errb.String()) c := config.NewConfig() require.ErrorContains(t, c.LoadConfig(binaryFile), "provided config is not a TOML file") } func TestConfig_LoadSingleInputWithEnvVars(t *testing.T) { c := config.NewConfig() t.Setenv("MY_TEST_SERVER", "192.168.1.1") t.Setenv("TEST_INTERVAL", "10s") confFile := filepath.Join("testdata", "single_plugin_env_vars.toml") require.NoError(t, c.LoadConfig(confFile)) input := inputs.Inputs["memcached"]().(*MockupInputPlugin) input.Servers = []string{"192.168.1.1"} input.Command = `Raw command which may or may not contain # in it # is unique` filter := models.Filter{ NameDrop: []string{"metricname2"}, NamePass: []string{"metricname1", "ip_192.168.1.1_name"}, FieldExclude: []string{"other", "stuff"}, FieldInclude: []string{"some", "strings"}, TagDropFilters: []models.TagFilter{ { Name: "badtag", Values: []string{"othertag"}, }, }, TagPassFilters: []models.TagFilter{ { Name: "goodtag", Values: []string{"mytag", "tagwith#value", "TagWithMultilineSyntax"}, }, }, } require.NoError(t, filter.Compile()) inputConfig := &models.InputConfig{ Name: "memcached", Source: confFile, Filter: filter, Interval: 10 * time.Second, } inputConfig.Tags = make(map[string]string) // Ignore Log, Parser and ID c.Inputs[0].Input.(*MockupInputPlugin).Log = nil c.Inputs[0].Input.(*MockupInputPlugin).parser = nil c.Inputs[0].Config.ID = "" require.Equal(t, input, c.Inputs[0].Input, "Testdata did not produce a correct mockup struct.") require.Equal(t, inputConfig, c.Inputs[0].Config, "Testdata did not produce correct input metadata.") } func TestConfig_LoadSingleInput(t *testing.T) { c := config.NewConfig() confFile := filepath.Join("testdata", "single_plugin.toml") require.NoError(t, c.LoadConfig(confFile)) input := inputs.Inputs["memcached"]().(*MockupInputPlugin) input.Servers = []string{"localhost"} filter := models.Filter{ NameDrop: []string{"metricname2"}, NamePass: []string{"metricname1"}, FieldExclude: []string{"other", "stuff"}, FieldInclude: []string{"some", "strings"}, TagDropFilters: []models.TagFilter{ { Name: "badtag", Values: []string{"othertag"}, }, }, TagPassFilters: []models.TagFilter{ { Name: "goodtag", Values: []string{"mytag"}, }, }, } require.NoError(t, filter.Compile()) inputConfig := &models.InputConfig{ Name: "memcached", Source: confFile, Filter: filter, Interval: 5 * time.Second, } inputConfig.Tags = make(map[string]string) // Ignore Log, Parser and ID c.Inputs[0].Input.(*MockupInputPlugin).Log = nil c.Inputs[0].Input.(*MockupInputPlugin).parser = nil c.Inputs[0].Config.ID = "" require.Equal(t, input, c.Inputs[0].Input, "Testdata did not produce a correct memcached struct.") require.Equal(t, inputConfig, c.Inputs[0].Config, "Testdata did not produce correct memcached metadata.") } func TestConfig_LoadSingleInput_WithSeparators(t *testing.T) { c := config.NewConfig() confFile := filepath.Join("testdata", "single_plugin_with_separators.toml") require.NoError(t, c.LoadConfig(confFile)) input := inputs.Inputs["memcached"]().(*MockupInputPlugin) input.Servers = []string{"localhost"} filter := models.Filter{ NameDrop: []string{"metricname2"}, NameDropSeparators: ".", NamePass: []string{"metricname1"}, NamePassSeparators: ".", FieldExclude: []string{"other", "stuff"}, FieldInclude: []string{"some", "strings"}, TagDropFilters: []models.TagFilter{ { Name: "badtag", Values: []string{"othertag"}, }, }, TagPassFilters: []models.TagFilter{ { Name: "goodtag", Values: []string{"mytag"}, }, }, } require.NoError(t, filter.Compile()) inputConfig := &models.InputConfig{ Name: "memcached", Source: confFile, Filter: filter, Interval: 5 * time.Second, } inputConfig.Tags = make(map[string]string) // Ignore Log, Parser and ID c.Inputs[0].Input.(*MockupInputPlugin).Log = nil c.Inputs[0].Input.(*MockupInputPlugin).parser = nil c.Inputs[0].Config.ID = "" require.Equal(t, input, c.Inputs[0].Input, "Testdata did not produce a correct memcached struct.") require.Equal(t, inputConfig, c.Inputs[0].Config, "Testdata did not produce correct memcached metadata.") } func TestConfig_LoadSingleInput_WithCommentInArray(t *testing.T) { c := config.NewConfig() require.NoError(t, c.LoadConfig("./testdata/single_plugin_with_comment_in_array.toml")) require.Len(t, c.Inputs, 1) input := c.Inputs[0].Input.(*MockupInputPlugin) require.ElementsMatch(t, input.Servers, []string{"localhost"}) } func TestConfig_LoadDirectory(t *testing.T) { c := config.NewConfig() files, err := config.WalkDirectory("./testdata/subconfig") confFile := filepath.Join("testdata", "single_plugin.toml") files = append([]string{confFile}, files...) require.NoError(t, err) require.NoError(t, c.LoadAll(files...)) // Create the expected data expectedPlugins := make([]*MockupInputPlugin, 4) expectedConfigs := make([]*models.InputConfig, 4) expectedPlugins[0] = inputs.Inputs["memcached"]().(*MockupInputPlugin) expectedPlugins[0].Servers = []string{"localhost"} filterMockup := models.Filter{ NameDrop: []string{"metricname2"}, NamePass: []string{"metricname1"}, FieldExclude: []string{"other", "stuff"}, FieldInclude: []string{"some", "strings"}, TagDropFilters: []models.TagFilter{ { Name: "badtag", Values: []string{"othertag"}, }, }, TagPassFilters: []models.TagFilter{ { Name: "goodtag", Values: []string{"mytag"}, }, }, } require.NoError(t, filterMockup.Compile()) expectedConfigs[0] = &models.InputConfig{ Name: "memcached", Source: confFile, Filter: filterMockup, Interval: 5 * time.Second, } expectedConfigs[0].Tags = make(map[string]string) expectedPlugins[1] = inputs.Inputs["exec"]().(*MockupInputPlugin) parser := &json.Parser{ MetricName: "exec", Strict: true, } require.NoError(t, parser.Init()) expectedPlugins[1].SetParser(parser) expectedPlugins[1].Command = "/usr/bin/myothercollector --foo=bar" expectedConfigs[1] = &models.InputConfig{ Name: "exec", Source: filepath.Join("testdata", "subconfig", "exec.conf"), // This is the source of the input MeasurementSuffix: "_myothercollector", } expectedConfigs[1].Tags = make(map[string]string) expectedPlugins[2] = inputs.Inputs["memcached"]().(*MockupInputPlugin) expectedPlugins[2].Servers = []string{"192.168.1.1"} filterMemcached := models.Filter{ NameDrop: []string{"metricname2"}, NamePass: []string{"metricname1"}, FieldExclude: []string{"other", "stuff"}, FieldInclude: []string{"some", "strings"}, TagDropFilters: []models.TagFilter{ { Name: "badtag", Values: []string{"othertag"}, }, }, TagPassFilters: []models.TagFilter{ { Name: "goodtag", Values: []string{"mytag"}, }, }, } require.NoError(t, filterMemcached.Compile()) expectedConfigs[2] = &models.InputConfig{ Name: "memcached", Source: filepath.Join("testdata", "subconfig", "memcached.conf"), // This is the source of the input Filter: filterMemcached, Interval: 5 * time.Second, } expectedConfigs[2].Tags = make(map[string]string) expectedPlugins[3] = inputs.Inputs["procstat"]().(*MockupInputPlugin) expectedPlugins[3].PidFile = "/var/run/grafana-server.pid" expectedConfigs[3] = &models.InputConfig{ Name: "procstat", Source: filepath.Join("testdata", "subconfig", "procstat.conf"), // This is the source of the input } expectedConfigs[3].Tags = make(map[string]string) // Check the generated plugins require.Len(t, c.Inputs, len(expectedPlugins)) require.Len(t, c.Inputs, len(expectedConfigs)) for i, plugin := range c.Inputs { input := plugin.Input.(*MockupInputPlugin) // Check the logger and ignore it for comparison require.NotNil(t, input.Log) input.Log = nil // Check the parsers if any if expectedPlugins[i].parser != nil { runningParser, ok := input.parser.(*models.RunningParser) require.True(t, ok) // We only use the JSON parser here parser, ok := runningParser.Parser.(*json.Parser) require.True(t, ok) // Prepare parser for comparison require.NoError(t, parser.Init()) parser.Log = nil // Compare the parser require.Equalf(t, expectedPlugins[i].parser, parser, "Plugin %d: incorrect parser produced", i) } // Ignore the parsers for further comparisons input.parser = nil expectedPlugins[i].parser = nil // Ignore the ID plugin.Config.ID = "" require.Equalf(t, expectedPlugins[i], plugin.Input, "Plugin %d: incorrect struct produced", i) require.Equalf(t, expectedConfigs[i], plugin.Config, "Plugin %d: incorrect config produced", i) } } func TestConfig_WrongCertPath(t *testing.T) { c := config.NewConfig() require.Error(t, c.LoadConfig("./testdata/wrong_cert_path.toml")) } func TestConfig_DefaultParser(t *testing.T) { c := config.NewConfig() require.NoError(t, c.LoadConfig("./testdata/default_parser.toml")) } func TestConfig_DefaultExecParser(t *testing.T) { c := config.NewConfig() require.NoError(t, c.LoadConfig("./testdata/default_parser_exec.toml")) } func TestConfig_LoadSpecialTypes(t *testing.T) { c := config.NewConfig() require.NoError(t, c.LoadConfig("./testdata/special_types.toml")) require.Len(t, c.Inputs, 1) input, ok := c.Inputs[0].Input.(*MockupInputPlugin) require.True(t, ok) // Tests telegraf config.Duration parsing. require.Equal(t, config.Duration(time.Second), input.WriteTimeout) // Tests telegraf size parsing. require.Equal(t, config.Size(1024*1024), input.MaxBodySize) // Tests toml multiline basic strings on single line. require.Equal(t, "./testdata/special_types.pem", input.TLSCert) // Tests toml multiline basic strings on single line. require.Equal(t, "./testdata/special_types.key", input.TLSKey) // Tests toml multiline basic strings on multiple lines. require.Equal(t, "/path/", strings.TrimRight(input.Paths[0], "\r\n")) } func TestConfig_DeprecatedFilters(t *testing.T) { c := config.NewConfig() require.NoError(t, c.LoadConfig("./testdata/deprecated_field_filter.toml")) require.Len(t, c.Inputs, 1) require.Equal(t, []string{"foo", "bar", "baz"}, c.Inputs[0].Config.Filter.FieldInclude) require.Equal(t, []string{"foo", "bar", "baz"}, c.Inputs[0].Config.Filter.FieldExclude) } func TestConfig_FieldNotDefined(t *testing.T) { tests := []struct { name string filename string expected string }{ { name: "in input plugin without parser", filename: "./testdata/invalid_field.toml", expected: "line 1: configuration specified the fields [\"not_a_field\"], but they were not used; " + "this is either a typo or this config option does not exist in this version", }, { name: "in input plugin with parser", filename: "./testdata/invalid_field_with_parser.toml", expected: "line 1: configuration specified the fields [\"not_a_field\"], but they were not used; " + "this is either a typo or this config option does not exist in this version", }, { name: "in input plugin with parser func", filename: "./testdata/invalid_field_with_parserfunc.toml", expected: "line 1: configuration specified the fields [\"not_a_field\"], but they were not used; " + "this is either a typo or this config option does not exist in this version", }, { name: "in parser of input plugin", filename: "./testdata/invalid_field_in_parser_table.toml", expected: "line 1: configuration specified the fields [\"not_a_field\"], but they were not used; " + "this is either a typo or this config option does not exist in this version", }, { name: "in parser of input plugin with parser-func", filename: "./testdata/invalid_field_in_parserfunc_table.toml", expected: "line 1: configuration specified the fields [\"not_a_field\"], but they were not used; " + "this is either a typo or this config option does not exist in this version", }, { name: "in processor plugin without parser", filename: "./testdata/invalid_field_processor.toml", expected: "line 1: configuration specified the fields [\"not_a_field\"], but they were not used; " + "this is either a typo or this config option does not exist in this version", }, { name: "in processor plugin with parser", filename: "./testdata/invalid_field_processor_with_parser.toml", expected: "line 1: configuration specified the fields [\"not_a_field\"], but they were not used; " + "this is either a typo or this config option does not exist in this version", }, { name: "in processor plugin with parser func", filename: "./testdata/invalid_field_processor_with_parserfunc.toml", expected: "line 1: configuration specified the fields [\"not_a_field\"], but they were not used; " + "this is either a typo or this config option does not exist in this version", }, { name: "in parser of processor plugin", filename: "./testdata/invalid_field_processor_in_parser_table.toml", expected: "line 1: configuration specified the fields [\"not_a_field\"], but they were not used; " + "this is either a typo or this config option does not exist in this version", }, { name: "in parser of processor plugin with parser-func", filename: "./testdata/invalid_field_processor_in_parserfunc_table.toml", expected: "line 1: configuration specified the fields [\"not_a_field\"], but they were not used; " + "this is either a typo or this config option does not exist in this version", }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { c := config.NewConfig() err := c.LoadConfig(tt.filename) require.ErrorContains(t, err, tt.expected) }) } } func TestConfig_WrongFieldType(t *testing.T) { c := config.NewConfig() err := c.LoadConfig("./testdata/wrong_field_type.toml") require.Error(t, err, "invalid field type") require.ErrorContains(t, err, "cannot unmarshal TOML string into int") c = config.NewConfig() err = c.LoadConfig("./testdata/wrong_field_type2.toml") require.Error(t, err, "invalid field type2") require.ErrorContains(t, err, "cannot unmarshal TOML string into []string") } func TestConfig_InlineTables(t *testing.T) { // #4098 t.Setenv("TOKEN", "test") c := config.NewConfig() require.NoError(t, c.LoadConfig("./testdata/inline_table.toml")) require.Len(t, c.Outputs, 2) output, ok := c.Outputs[1].Output.(*MockupOutputPlugin) require.True(t, ok) require.Equal(t, map[string]string{"Authorization": "Token test", "Content-Type": "application/json"}, output.Headers) require.Equal(t, []string{"org_id"}, c.Outputs[0].Config.Filter.TagInclude) } func TestConfig_SliceComment(t *testing.T) { c := config.NewConfig() require.NoError(t, c.LoadConfig("./testdata/slice_comment.toml")) require.Len(t, c.Outputs, 1) output, ok := c.Outputs[0].Output.(*MockupOutputPlugin) require.True(t, ok) require.Equal(t, []string{"test"}, output.Scopes) } func TestConfig_BadOrdering(t *testing.T) { // #3444: when not using inline tables, care has to be taken so subsequent configuration // doesn't become part of the table. This is not a bug, but TOML syntax. c := config.NewConfig() err := c.LoadConfig("./testdata/non_slice_slice.toml") require.Error(t, err, "bad ordering") require.Equal( t, "loading config file ./testdata/non_slice_slice.toml failed: error parsing http array, line 4: cannot unmarshal TOML array into string (need slice)", err.Error(), ) } func TestConfig_AzureMonitorNamespacePrefix(t *testing.T) { // #8256 Cannot use empty string as the namespace prefix c := config.NewConfig() require.NoError(t, c.LoadConfig("./testdata/azure_monitor.toml")) require.Len(t, c.Outputs, 2) expectedPrefix := []string{"Telegraf/", ""} for i, plugin := range c.Outputs { output, ok := plugin.Output.(*MockupOutputPlugin) require.True(t, ok) require.Equal(t, expectedPrefix[i], output.NamespacePrefix) } } func TestGetDefaultConfigPathFromEnvURL(t *testing.T) { ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, _ *http.Request) { w.WriteHeader(http.StatusOK) if _, err := w.Write([]byte("[agent]\ndebug = true")); err != nil { w.WriteHeader(http.StatusInternalServerError) t.Error(err) return } })) defer ts.Close() c := config.NewConfig() t.Setenv("TELEGRAF_CONFIG_PATH", ts.URL) configPath, err := config.GetDefaultConfigPath() require.NoError(t, err) require.Equal(t, []string{ts.URL}, configPath) require.NoError(t, c.LoadConfig(configPath[0])) } func TestConfig_URLLikeFileName(t *testing.T) { c := config.NewConfig() err := c.LoadConfig("http:##www.example.com.conf") require.Error(t, err) if runtime.GOOS == "windows" { // The error file not found error message is different on Windows require.Equal( t, "loading config file http:##www.example.com.conf failed: open http:##www.example.com.conf: The system cannot find the file specified.", err.Error(), ) } else { require.Equal(t, "loading config file http:##www.example.com.conf failed: open http:##www.example.com.conf: no such file or directory", err.Error()) } } func TestConfig_Filtering(t *testing.T) { c := config.NewConfig() require.NoError(t, c.LoadAll("./testdata/filter_metricpass.toml")) require.Len(t, c.Processors, 1) in := []telegraf.Metric{ metric.New( "machine", map[string]string{"state": "on"}, map[string]interface{}{"value": 42.0}, time.Date(2023, time.April, 23, 01, 15, 30, 0, time.UTC), ), metric.New( "machine", map[string]string{"state": "off"}, map[string]interface{}{"value": 23.0}, time.Date(2023, time.April, 23, 23, 59, 01, 0, time.UTC), ), metric.New( "temperature", map[string]string{}, map[string]interface{}{"value": 23.5}, time.Date(2023, time.April, 24, 02, 15, 30, 0, time.UTC), ), } expected := []telegraf.Metric{ metric.New( "machine", map[string]string{ "state": "on", "processed": "yes", }, map[string]interface{}{"value": 42.0}, time.Date(2023, time.April, 23, 01, 15, 30, 0, time.UTC), ), metric.New( "machine", map[string]string{"state": "off"}, map[string]interface{}{"value": 23.0}, time.Date(2023, time.April, 23, 23, 59, 01, 0, time.UTC), ), metric.New( "temperature", map[string]string{ "processed": "yes", }, map[string]interface{}{"value": 23.5}, time.Date(2023, time.April, 24, 02, 15, 30, 0, time.UTC), ), } plugin := c.Processors[0] var acc testutil.Accumulator for _, m := range in { require.NoError(t, plugin.Add(m, &acc)) } actual := acc.GetTelegrafMetrics() testutil.RequireMetricsEqual(t, expected, actual, testutil.SortMetrics()) } func TestConfig_SerializerInterfaceNewFormat(t *testing.T) { formats := []string{ "carbon2", "csv", "graphite", "influx", "json", "msgpack", "nowmetric", "prometheus", "prometheusremotewrite", "splunkmetric", "wavefront", } c := config.NewConfig() require.NoError(t, c.LoadConfig("./testdata/serializers_new.toml")) require.Len(t, c.Outputs, len(formats)) override := map[string]struct { param map[string]interface{} mask []string }{} expected := make([]telegraf.Serializer, 0, len(formats)) for _, format := range formats { logger := logging.New("serializers", format, "test") var serializer telegraf.Serializer if creator, found := serializers.Serializers[format]; found { t.Logf("new-style %q", format) serializer = creator() } if settings, found := override[format]; found { s := reflect.Indirect(reflect.ValueOf(serializer)) for key, value := range settings.param { v := reflect.ValueOf(value) s.FieldByName(key).Set(v) } } models.SetLoggerOnPlugin(serializer, logger) if s, ok := serializer.(telegraf.Initializer); ok { require.NoError(t, s.Init()) } expected = append(expected, serializer) } require.Len(t, expected, len(formats)) actual := make([]interface{}, 0) for _, plugin := range c.Outputs { output, ok := plugin.Output.(*MockupOutputPluginSerializerNew) require.True(t, ok) // Get the parser set with 'SetParser()' if p, ok := output.Serializer.(*models.RunningSerializer); ok { actual = append(actual, p.Serializer) } else { actual = append(actual, output.Serializer) } } require.Len(t, actual, len(formats)) for i, format := range formats { // Determine the underlying type of the serializer stype := reflect.Indirect(reflect.ValueOf(expected[i])).Interface() // Ignore all unexported fields and fields not relevant for functionality options := []cmp.Option{ cmpopts.IgnoreUnexported(stype), cmpopts.IgnoreUnexported(reflect.Indirect(reflect.ValueOf(serializers_prometheus.MetricTypes{})).Interface()), cmpopts.IgnoreTypes(sync.Mutex{}, regexp.Regexp{}), cmpopts.IgnoreInterfaces(struct{ telegraf.Logger }{}), } if settings, found := override[format]; found { options = append(options, cmpopts.IgnoreFields(stype, settings.mask...)) } // Do a manual comparison as require.EqualValues will also work on unexported fields // that cannot be cleared or ignored. diff := cmp.Diff(expected[i], actual[i], options...) require.Emptyf(t, diff, "Difference in SetSerializer() for %q", format) } } func TestConfig_ParserInterface(t *testing.T) { formats := []string{ "collectd", "csv", "dropwizard", "form_urlencoded", "graphite", "grok", "influx", "json", "json_v2", "logfmt", "nagios", "prometheus", "prometheusremotewrite", "value", "wavefront", "xml", "xpath_json", "xpath_msgpack", "xpath_protobuf", } c := config.NewConfig() require.NoError(t, c.LoadConfig("./testdata/parsers_new.toml")) require.Len(t, c.Inputs, len(formats)) override := map[string]struct { param map[string]interface{} mask []string }{ "csv": { param: map[string]interface{}{ "HeaderRowCount": 42, }, mask: []string{"TimeFunc", "ResetMode"}, }, "xpath_protobuf": { param: map[string]interface{}{ "ProtobufMessageDef": "testdata/addressbook.proto", "ProtobufMessageType": "addressbook.AddressBook", }, }, "json_v2": { param: map[string]interface{}{ "Configs": []json_v2.Config{{ Fields: []json_v2.DataSet{{ Path: "", Type: "int", Rename: "", Optional: false, }}, }}, }, }, } expected := make([]telegraf.Parser, 0, len(formats)) for _, format := range formats { logger := logging.New("parsers", format, "parser_test_new") creator, found := parsers.Parsers[format] require.Truef(t, found, "No parser for format %q", format) parser := creator("parser_test_new") if settings, found := override[format]; found { s := reflect.Indirect(reflect.ValueOf(parser)) for key, value := range settings.param { v := reflect.ValueOf(value) s.FieldByName(key).Set(v) } } models.SetLoggerOnPlugin(parser, logger) if p, ok := parser.(telegraf.Initializer); ok { require.NoError(t, p.Init()) } expected = append(expected, parser) } require.Len(t, expected, len(formats)) actual := make([]interface{}, 0) generated := make([]interface{}, 0) for _, plugin := range c.Inputs { input, ok := plugin.Input.(*MockupInputPluginParserNew) require.True(t, ok) // Get the parser set with 'SetParser()' if p, ok := input.Parser.(*models.RunningParser); ok { actual = append(actual, p.Parser) } else { actual = append(actual, input.Parser) } // Get the parser set with 'SetParserFunc()' g, err := input.ParserFunc() require.NoError(t, err) if rp, ok := g.(*models.RunningParser); ok { generated = append(generated, rp.Parser) } else { generated = append(generated, g) } } require.Len(t, actual, len(formats)) for i, format := range formats { // Determine the underlying type of the parser stype := reflect.Indirect(reflect.ValueOf(expected[i])).Interface() // Ignore all unexported fields and fields not relevant for functionality options := []cmp.Option{ cmpopts.IgnoreUnexported(stype), cmpopts.IgnoreTypes(sync.Mutex{}), cmpopts.IgnoreInterfaces(struct{ telegraf.Logger }{}), } if settings, found := override[format]; found { options = append(options, cmpopts.IgnoreFields(stype, settings.mask...)) } // Do a manual comparison as require.EqualValues will also work on unexported fields // that cannot be cleared or ignored. diff := cmp.Diff(expected[i], actual[i], options...) require.Emptyf(t, diff, "Difference in SetParser() for %q", format) diff = cmp.Diff(expected[i], generated[i], options...) require.Emptyf(t, diff, "Difference in SetParserFunc() for %q", format) } } func TestConfig_MultipleProcessorsOrder(t *testing.T) { tests := []struct { name string filename []string expectedOrder []string }{ { name: "Test the order of multiple unique processosr", filename: []string{"multiple_processors.toml"}, expectedOrder: []string{ "processor", "parser_test", "processor_parser", "processor_parserfunc", }, }, { name: "Test using a single 'order' configuration", filename: []string{"multiple_processors_simple_order.toml"}, expectedOrder: []string{ "parser_test", "processor_parser", "processor_parserfunc", "processor", }, }, { name: "Test using multiple 'order' configurations", filename: []string{"multiple_processors_messy_order.toml"}, expectedOrder: []string{ "parser_test", "processor_parserfunc", "processor", "processor_parser", "processor_parser", "processor_parserfunc", }, }, { name: "Test loading multiple configuration files", filename: []string{ "multiple_processors.toml", "multiple_processors_simple_order.toml", }, expectedOrder: []string{ "processor", "parser_test", "processor_parser", "processor_parserfunc", "parser_test", "processor_parser", "processor_parserfunc", "processor", }, }, { name: "Test loading multiple configuration files both with order", filename: []string{ "multiple_processors_simple_order.toml", "multiple_processors_messy_order.toml", }, expectedOrder: []string{ "parser_test", "processor_parser", "processor_parserfunc", "parser_test", "processor_parserfunc", "processor", "processor", "processor_parser", "processor_parser", "processor_parserfunc", }, }, } for _, test := range tests { t.Run(test.name, func(t *testing.T) { c := config.NewConfig() filenames := make([]string, 0, len(test.filename)) for _, fn := range test.filename { filenames = append(filenames, filepath.Join(".", "testdata", "processor_order", fn)) } require.NoError(t, c.LoadAll(filenames...)) require.Len(t, c.Processors, len(test.expectedOrder)) order := make([]string, 0, len(c.Processors)) for _, p := range c.Processors { order = append(order, p.Config.Name) } require.Equal(t, test.expectedOrder, order) }) } } func TestConfig_ProcessorsWithParsers(t *testing.T) { formats := []string{ "collectd", "csv", "dropwizard", "form_urlencoded", "graphite", "grok", "influx", "json", "json_v2", "logfmt", "nagios", "prometheus", "prometheusremotewrite", "value", "wavefront", "xml", "xpath_json", "xpath_msgpack", "xpath_protobuf", } c := config.NewConfig() require.NoError(t, c.LoadAll("./testdata/processors_with_parsers.toml")) require.Len(t, c.Processors, len(formats)) override := map[string]struct { param map[string]interface{} mask []string }{ "csv": { param: map[string]interface{}{ "HeaderRowCount": 42, }, mask: []string{"TimeFunc", "ResetMode"}, }, "xpath_protobuf": { param: map[string]interface{}{ "ProtobufMessageDef": "testdata/addressbook.proto", "ProtobufMessageType": "addressbook.AddressBook", }, }, "json_v2": { param: map[string]interface{}{ "Configs": []json_v2.Config{{ Fields: []json_v2.DataSet{{ Path: "", Type: "int", Rename: "", Optional: false, }}, }}, }, }, } expected := make([]telegraf.Parser, 0, len(formats)) for _, format := range formats { logger := logging.New("parsers", format, "processors_with_parsers") creator, found := parsers.Parsers[format] require.Truef(t, found, "No parser for format %q", format) parser := creator("parser_test") if settings, found := override[format]; found { s := reflect.Indirect(reflect.ValueOf(parser)) for key, value := range settings.param { v := reflect.ValueOf(value) s.FieldByName(key).Set(v) } } models.SetLoggerOnPlugin(parser, logger) if p, ok := parser.(telegraf.Initializer); ok { require.NoError(t, p.Init()) } expected = append(expected, parser) } require.Len(t, expected, len(formats)) actual := make([]interface{}, 0) generated := make([]interface{}, 0) for _, plugin := range c.Processors { var processorIF telegraf.Processor if p, ok := plugin.Processor.(processors.HasUnwrap); ok { processorIF = p.Unwrap() } else { processorIF = plugin.Processor.(telegraf.Processor) } require.NotNil(t, processorIF) processor, ok := processorIF.(*MockupProcessorPluginParser) require.True(t, ok) // Get the parser set with 'SetParser()' if p, ok := processor.Parser.(*models.RunningParser); ok { actual = append(actual, p.Parser) } else { actual = append(actual, processor.Parser) } // Get the parser set with 'SetParserFunc()' if processor.ParserFunc != nil { g, err := processor.ParserFunc() require.NoError(t, err) if rp, ok := g.(*models.RunningParser); ok { generated = append(generated, rp.Parser) } else { generated = append(generated, g) } } else { generated = append(generated, nil) } } require.Len(t, actual, len(formats)) for i, format := range formats { // Determine the underlying type of the parser stype := reflect.Indirect(reflect.ValueOf(expected[i])).Interface() // Ignore all unexported fields and fields not relevant for functionality options := []cmp.Option{ cmpopts.IgnoreUnexported(stype), cmpopts.IgnoreTypes(sync.Mutex{}), cmpopts.IgnoreInterfaces(struct{ telegraf.Logger }{}), } if settings, found := override[format]; found { options = append(options, cmpopts.IgnoreFields(stype, settings.mask...)) } // Do a manual comparison as require.EqualValues will also work on unexported fields // that cannot be cleared or ignored. diff := cmp.Diff(expected[i], actual[i], options...) require.Emptyf(t, diff, "Difference in SetParser() for %q", format) diff = cmp.Diff(expected[i], generated[i], options...) require.Emptyf(t, diff, "Difference in SetParserFunc() for %q", format) } } func TestConfigPluginIDsDifferent(t *testing.T) { c := config.NewConfig() c.Agent.Statefile = "/dev/null" require.NoError(t, c.LoadConfig("./testdata/state_persistence_input_all_different.toml")) require.NotEmpty(t, c.Inputs) // Compare generated IDs for i, pi := range c.Inputs { refid := pi.Config.ID require.NotEmpty(t, refid) // Cross-comparison for j, pj := range c.Inputs { testid := pj.Config.ID if i == j { require.Equal(t, refid, testid) continue } require.NotEqualf(t, refid, testid, "equal for %d, %d", i, j) } } } func TestConfigPluginIDsSame(t *testing.T) { c := config.NewConfig() c.Agent.Statefile = "/dev/null" require.NoError(t, c.LoadConfig("./testdata/state_persistence_input_all_same.toml")) require.NotEmpty(t, c.Inputs) // Compare generated IDs for i, pi := range c.Inputs { refid := pi.Config.ID require.NotEmpty(t, refid) // Cross-comparison for j, pj := range c.Inputs { testid := pj.Config.ID require.Equal(t, refid, testid, "not equal for %d, %d", i, j) } } } func TestPersisterInputStoreLoad(t *testing.T) { // Reserve a temporary state file file, err := os.CreateTemp(t.TempDir(), "telegraf_state-*.json") require.NoError(t, err) filename := file.Name() require.NoError(t, file.Close()) // Load the plugins cstore := config.NewConfig() require.NoError(t, cstore.LoadConfig("testdata/state_persistence_input_store_load.toml")) // Initialize the persister for storing the state persisterStore := persister.Persister{ Filename: filename, } require.NoError(t, persisterStore.Init()) expected := make(map[string]interface{}) for i, plugin := range cstore.Inputs { require.NoError(t, plugin.Init()) // Register p := plugin.Input.(*MockupStatePlugin) require.NoError(t, persisterStore.Register(plugin.ID(), p)) // Change the state p.state.Name += "_" + strings.Repeat("a", i+1) p.state.Version++ p.state.Offset += uint64(i + 1) p.state.Bits = append(p.state.Bits, len(p.state.Bits)) p.state.Modified, err = time.Parse(time.RFC3339, "2022-11-03T16:49:00+02:00") require.NoError(t, err) // Store the state for later comparison expected[plugin.ID()] = p.GetState() } // Write state require.NoError(t, persisterStore.Store()) // Load the plugins cload := config.NewConfig() require.NoError(t, cload.LoadConfig("testdata/state_persistence_input_store_load.toml")) require.Len(t, cload.Inputs, len(expected)) // Initialize the persister for loading the state persisterLoad := persister.Persister{ Filename: filename, } require.NoError(t, persisterLoad.Init()) for _, plugin := range cload.Inputs { require.NoError(t, plugin.Init()) // Register p := plugin.Input.(*MockupStatePlugin) require.NoError(t, persisterLoad.Register(plugin.ID(), p)) // Check that the states are not yet restored require.NotNil(t, expected[plugin.ID()]) require.NotEqual(t, expected[plugin.ID()], p.GetState()) } // Restore states require.NoError(t, persisterLoad.Load()) // Check we got what we saved. for _, plugin := range cload.Inputs { p := plugin.Input.(*MockupStatePlugin) require.Equal(t, expected[plugin.ID()], p.GetState()) } } func TestPersisterProcessorRegistration(t *testing.T) { // Load the plugins c := config.NewConfig() require.NoError(t, c.LoadConfig("testdata/state_persistence_processors.toml")) require.NotEmpty(t, c.Processors) require.NotEmpty(t, c.AggProcessors) // Initialize the persister for test dut := persister.Persister{ Filename: "/tmp/doesn_t_matter.json", } require.NoError(t, dut.Init()) // Register the processors for _, plugin := range c.Processors { unwrapped := plugin.Processor.(processors.HasUnwrap).Unwrap() p := unwrapped.(*MockupProcessorPlugin) require.NoError(t, dut.Register(plugin.ID(), p)) } // Register the after-aggregator processors for _, plugin := range c.AggProcessors { unwrapped := plugin.Processor.(processors.HasUnwrap).Unwrap() p := unwrapped.(*MockupProcessorPlugin) require.NoError(t, dut.Register(plugin.ID(), p)) } } func TestConfigEnvVarsStrict(t *testing.T) { tests := []struct { name string file string envvars map[string]string expected *MockupInputPlugin }{ { name: "valid", file: "envvar_valid.conf", envvars: map[string]string{ "MY_TEST_SERVER": "192.168.1.1", }, expected: &MockupInputPlugin{ Servers: []string{"192.168.1.1"}, Port: 8080, Command: `Raw command which may or may not contain # in it # is unique`, }, }, { name: "valid multiline", file: "envvar_valid_multiline.conf", envvars: map[string]string{ "MY_TEST_SERVER": "192.168.1.1", "COMMAND": ` Raw command potentially with multiple lines in it `, }, expected: &MockupInputPlugin{ Servers: []string{"192.168.1.1"}, Port: 8080, Command: " " + ` Raw command potentially with multiple lines in it ` + "\n ", }, }, { name: "malicious envvar", file: "envvar_malicious.conf", envvars: map[string]string{ "PORT": "8080", "PIDFILE": `a pid" [[inputs.memcached]] command = "evil`, }, expected: &MockupInputPlugin{ Servers: []string{"my.server.com"}, Port: 8080, Command: `Raw command which may or may not contain # in it # is unique`, PidFile: `a pid" [[inputs.memcached]] command = "evil`, }, }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { config.NonStrictEnvVarHandling = false // Export the environment variables for k, v := range tt.envvars { t.Setenv(k, v) } // Load the config c := config.NewConfig() confFile := filepath.Join("testdata", tt.file) require.NoError(t, c.LoadConfig(confFile)) // Validate the loaded data require.Len(t, c.Inputs, 1) plugin, ok := c.Inputs[0].Input.(*MockupInputPlugin) require.Truef(t, ok, "plugin is of wrong type %T", c.Inputs[0].Input) // Ignore Log, Parser and ID plugin.Log = nil plugin.parser = nil require.Equal(t, tt.expected, plugin) }) } } func TestConfigEnvVarsStrictFailNonString(t *testing.T) { config.NonStrictEnvVarHandling = false envvars := map[string]string{ "MY_TEST_SERVER": "192.168.1.1", "PORT": "443", } // Export the environment variables for k, v := range envvars { t.Setenv(k, v) } // Load the config c := config.NewConfig() confFile := filepath.Join("testdata", "envvar_non_string.conf") require.ErrorContains(t, c.LoadConfig(confFile), "invalid TOML syntax") } func TestConfigEnvVarsNonStrict(t *testing.T) { tests := []struct { name string file string envvars map[string]string expected *MockupInputPlugin }{ { name: "valid", file: "envvar_valid.conf", envvars: map[string]string{ "MY_TEST_SERVER": "192.168.1.1", }, expected: &MockupInputPlugin{ Servers: []string{"192.168.1.1"}, Command: `Raw command which may or may not contain # in it # is unique`, Port: 8080, }, }, { name: "non-string", file: "envvar_non_string.conf", envvars: map[string]string{ "MY_TEST_SERVER": "192.168.1.1", "PORT": "443", }, expected: &MockupInputPlugin{ Servers: []string{"192.168.1.1"}, Port: 443, Command: `Raw command which may or may not contain # in it # is unique`, }, }, { name: "valid multiline", file: "envvar_valid_multiline.conf", envvars: map[string]string{ "MY_TEST_SERVER": "192.168.1.1", "COMMAND": ` Raw command potentially with multiple lines in it `, }, expected: &MockupInputPlugin{ Servers: []string{"192.168.1.1"}, Port: 8080, Command: " " + ` Raw command potentially with multiple lines in it ` + "\n ", }, }, { name: "non-string multiline", file: "envvar_non_string_multiline.conf", envvars: map[string]string{ "MY_TEST_SERVER": "192.168.1.1", "PORT": "443", "COMMAND": ` Raw command potentially with multiple lines in it `, }, expected: &MockupInputPlugin{ Servers: []string{"192.168.1.1"}, Port: 443, Command: " " + ` Raw command potentially with multiple lines in it ` + "\n ", }, }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { config.NonStrictEnvVarHandling = true t.Cleanup(func() { config.NonStrictEnvVarHandling = false }) // Export the environment variables for k, v := range tt.envvars { t.Setenv(k, v) } // Load the config c := config.NewConfig() confFile := filepath.Join("testdata", tt.file) require.NoError(t, c.LoadConfig(confFile)) // Validate the loaded data require.Len(t, c.Inputs, 1) plugin, ok := c.Inputs[0].Input.(*MockupInputPlugin) require.Truef(t, ok, "plugin is of wrong type %T", c.Inputs[0].Input) // Ignore Log, Parser and ID plugin.Log = nil plugin.parser = nil require.Equal(t, tt.expected, plugin) }) } } func TestConfigEnvVarsNonStrictMalicious(t *testing.T) { envvars := map[string]string{ "PORT": "8080", "PIDFILE": `a pid" [[inputs.memcached]] command = "evil`, } config.NonStrictEnvVarHandling = true t.Cleanup(func() { config.NonStrictEnvVarHandling = false }) // Export the environment variables for k, v := range envvars { t.Setenv(k, v) } // Load the config c := config.NewConfig() confFile := filepath.Join("testdata", "envvar_malicious.conf") require.NoError(t, c.LoadConfig(confFile)) // We expect too plugins due to malicious environment setting require.Len(t, c.Inputs, 2) } // Mockup INPUT plugin for (new) parser testing to avoid cyclic dependencies type MockupInputPluginParserNew struct { Parser telegraf.Parser ParserFunc telegraf.ParserFunc } func (*MockupInputPluginParserNew) SampleConfig() string { return "Mockup old parser test plugin" } func (*MockupInputPluginParserNew) Gather(telegraf.Accumulator) error { return nil } func (m *MockupInputPluginParserNew) SetParser(parser telegraf.Parser) { m.Parser = parser } func (m *MockupInputPluginParserNew) SetParserFunc(f telegraf.ParserFunc) { m.ParserFunc = f } // Mockup INPUT plugin for testing to avoid cyclic dependencies type MockupInputPlugin struct { Servers []string `toml:"servers"` Methods []string `toml:"methods"` Timeout config.Duration `toml:"timeout"` ReadTimeout config.Duration `toml:"read_timeout"` WriteTimeout config.Duration `toml:"write_timeout"` MaxBodySize config.Size `toml:"max_body_size"` Paths []string `toml:"paths"` Port int `toml:"port"` Password config.Secret `toml:"password"` Command string Files []string PidFile string Log telegraf.Logger `toml:"-"` tls.ServerConfig parser telegraf.Parser } func (*MockupInputPlugin) SampleConfig() string { return "Mockup test input plugin" } func (*MockupInputPlugin) Gather(telegraf.Accumulator) error { return nil } func (m *MockupInputPlugin) SetParser(parser telegraf.Parser) { m.parser = parser } // Mockup INPUT plugin with ParserFunc interface type MockupInputPluginParserFunc struct { parserFunc telegraf.ParserFunc } func (*MockupInputPluginParserFunc) SampleConfig() string { return "Mockup test input plugin" } func (*MockupInputPluginParserFunc) Gather(telegraf.Accumulator) error { return nil } func (m *MockupInputPluginParserFunc) SetParserFunc(pf telegraf.ParserFunc) { m.parserFunc = pf } // Mockup INPUT plugin without ParserFunc interface type MockupInputPluginParserOnly struct { parser telegraf.Parser } func (*MockupInputPluginParserOnly) SampleConfig() string { return "Mockup test input plugin" } func (*MockupInputPluginParserOnly) Gather(telegraf.Accumulator) error { return nil } func (m *MockupInputPluginParserOnly) SetParser(p telegraf.Parser) { m.parser = p } // Mockup PROCESSOR plugin for testing to avoid cyclic dependencies type MockupProcessorPluginParser struct { Parser telegraf.Parser ParserFunc telegraf.ParserFunc } func (*MockupProcessorPluginParser) Start(telegraf.Accumulator) error { return nil } func (*MockupProcessorPluginParser) Stop() { } func (*MockupProcessorPluginParser) SampleConfig() string { return "Mockup test processor plugin with parser" } func (*MockupProcessorPluginParser) Apply(...telegraf.Metric) []telegraf.Metric { return nil } func (*MockupProcessorPluginParser) Add(telegraf.Metric, telegraf.Accumulator) error { return nil } func (m *MockupProcessorPluginParser) SetParser(parser telegraf.Parser) { m.Parser = parser } func (m *MockupProcessorPluginParser) SetParserFunc(f telegraf.ParserFunc) { m.ParserFunc = f } // Mockup PROCESSOR plugin without parser type MockupProcessorPlugin struct { Option string `toml:"option"` state []uint64 } func (*MockupProcessorPlugin) SampleConfig() string { return "Mockup test processor plugin with parser" } func (*MockupProcessorPlugin) Apply(in ...telegraf.Metric) []telegraf.Metric { out := make([]telegraf.Metric, 0, len(in)) for _, m := range in { m.AddTag("processed", "yes") out = append(out, m) } return out } func (m *MockupProcessorPlugin) GetState() interface{} { return m.state } func (m *MockupProcessorPlugin) SetState(state interface{}) error { s, ok := state.([]uint64) if !ok { return fmt.Errorf("invalid state type %T", state) } m.state = s return nil } // Mockup PROCESSOR plugin with parser type MockupProcessorPluginParserOnly struct { Parser telegraf.Parser } func (*MockupProcessorPluginParserOnly) Start(telegraf.Accumulator) error { return nil } func (*MockupProcessorPluginParserOnly) Stop() { } func (*MockupProcessorPluginParserOnly) SampleConfig() string { return "Mockup test processor plugin with parser" } func (*MockupProcessorPluginParserOnly) Apply(...telegraf.Metric) []telegraf.Metric { return nil } func (*MockupProcessorPluginParserOnly) Add(telegraf.Metric, telegraf.Accumulator) error { return nil } func (m *MockupProcessorPluginParserOnly) SetParser(parser telegraf.Parser) { m.Parser = parser } // Mockup PROCESSOR plugin with parser-function type MockupProcessorPluginParserFunc struct { Parser telegraf.ParserFunc } func (*MockupProcessorPluginParserFunc) Start(telegraf.Accumulator) error { return nil } func (*MockupProcessorPluginParserFunc) Stop() { } func (*MockupProcessorPluginParserFunc) SampleConfig() string { return "Mockup test processor plugin with parser" } func (*MockupProcessorPluginParserFunc) Apply(...telegraf.Metric) []telegraf.Metric { return nil } func (*MockupProcessorPluginParserFunc) Add(telegraf.Metric, telegraf.Accumulator) error { return nil } func (m *MockupProcessorPluginParserFunc) SetParserFunc(pf telegraf.ParserFunc) { m.Parser = pf } // Mockup OUTPUT plugin for testing to avoid cyclic dependencies type MockupOutputPlugin struct { URL string `toml:"url"` Headers map[string]string `toml:"headers"` Scopes []string `toml:"scopes"` NamespacePrefix string `toml:"namespace_prefix"` Log telegraf.Logger `toml:"-"` tls.ClientConfig } func (*MockupOutputPlugin) Connect() error { return nil } func (*MockupOutputPlugin) Close() error { return nil } func (*MockupOutputPlugin) SampleConfig() string { return "Mockup test output plugin" } func (*MockupOutputPlugin) Write([]telegraf.Metric) error { return nil } type MockupOutputPluginSerializerNew struct { Serializer telegraf.Serializer } func (m *MockupOutputPluginSerializerNew) SetSerializer(s telegraf.Serializer) { m.Serializer = s } func (*MockupOutputPluginSerializerNew) Connect() error { return nil } func (*MockupOutputPluginSerializerNew) Close() error { return nil } func (*MockupOutputPluginSerializerNew) SampleConfig() string { return "Mockup test output plugin" } func (*MockupOutputPluginSerializerNew) Write(_ []telegraf.Metric) error { return nil } // Mockup INPUT plugin with state for testing to avoid cyclic dependencies type MockupState struct { Name string Version uint64 Offset uint64 Bits []int Modified time.Time } type MockupStatePluginSettings struct { Name string `toml:"name"` Factor float64 `toml:"factor"` Enabled bool `toml:"enabled"` BitField []int `toml:"bits"` } type MockupStatePlugin struct { Servers []string `toml:"servers"` Method string `toml:"method"` Settings map[string]string `toml:"params"` Port int `toml:"port"` Setups []MockupStatePluginSettings `toml:"setup"` state MockupState } func (m *MockupStatePlugin) Init() error { t0, err := time.Parse(time.RFC3339, "2021-04-24T23:42:00+02:00") if err != nil { return err } m.state = MockupState{ Name: "mockup", Modified: t0, } return nil } func (m *MockupStatePlugin) GetState() interface{} { return m.state } func (m *MockupStatePlugin) SetState(state interface{}) error { s, ok := state.(MockupState) if !ok { return fmt.Errorf("invalid state type %T", state) } m.state = s return nil } func (*MockupStatePlugin) SampleConfig() string { return "Mockup test plugin" } func (*MockupStatePlugin) Gather(telegraf.Accumulator) error { return nil } // Register the mockup plugin on loading func init() { // Register the mockup input plugin for the required names inputs.Add("parser_test_new", func() telegraf.Input { return &MockupInputPluginParserNew{} }) inputs.Add("parser", func() telegraf.Input { return &MockupInputPluginParserOnly{} }) inputs.Add("parser_func", func() telegraf.Input { return &MockupInputPluginParserFunc{} }) inputs.Add("exec", func() telegraf.Input { return &MockupInputPlugin{Timeout: config.Duration(time.Second * 5)} }) inputs.Add("file", func() telegraf.Input { return &MockupInputPlugin{} }) inputs.Add("http_listener_v2", func() telegraf.Input { return &MockupInputPlugin{} }) inputs.Add("memcached", func() telegraf.Input { return &MockupInputPlugin{} }) inputs.Add("procstat", func() telegraf.Input { return &MockupInputPlugin{} }) inputs.Add("statetest", func() telegraf.Input { return &MockupStatePlugin{} }) // Register the mockup processor plugin for the required names processors.Add("parser_test", func() telegraf.Processor { return &MockupProcessorPluginParser{} }) processors.Add("processor", func() telegraf.Processor { return &MockupProcessorPlugin{} }) processors.Add("processor_parser", func() telegraf.Processor { return &MockupProcessorPluginParserOnly{} }) processors.Add("processor_parserfunc", func() telegraf.Processor { return &MockupProcessorPluginParserFunc{} }) processors.Add("statetest", func() telegraf.Processor { return &MockupProcessorPlugin{} }) // Register the mockup output plugin for the required names outputs.Add("azure_monitor", func() telegraf.Output { return &MockupOutputPlugin{NamespacePrefix: "Telegraf/"} }) outputs.Add("http", func() telegraf.Output { return &MockupOutputPlugin{} }) outputs.Add("serializer_test_new", func() telegraf.Output { return &MockupOutputPluginSerializerNew{} }) } ================================================ FILE: config/deprecation.go ================================================ package config import ( "errors" "fmt" "log" "reflect" "sort" "strings" "github.com/coreos/go-semver/semver" "github.com/fatih/color" "github.com/influxdata/telegraf" "github.com/influxdata/telegraf/plugins/aggregators" "github.com/influxdata/telegraf/plugins/inputs" "github.com/influxdata/telegraf/plugins/outputs" "github.com/influxdata/telegraf/plugins/processors" ) // DeprecationInfo contains all important information to describe a deprecated entity type DeprecationInfo struct { // Name of the plugin or plugin option Name string // LogLevel is the level of deprecation which currently corresponds to a log-level logLevel telegraf.LogLevel info telegraf.DeprecationInfo } func (di *DeprecationInfo) determineEscalation() error { di.logLevel = telegraf.None if di.info.Since == "" { return nil } since, err := semver.NewVersion(di.info.Since) if err != nil { return fmt.Errorf("cannot parse 'since' version %q: %w", di.info.Since, err) } var removal *semver.Version if di.info.RemovalIn != "" { removal, err = semver.NewVersion(di.info.RemovalIn) if err != nil { return fmt.Errorf("cannot parse 'removal' version %q: %w", di.info.RemovalIn, err) } } else { removal = &semver.Version{Major: since.Major} removal.BumpMajor() di.info.RemovalIn = removal.String() } // Drop potential pre-release tags version := semver.Version{ Major: telegrafVersion.Major, Minor: telegrafVersion.Minor, Patch: telegrafVersion.Patch, } if !version.LessThan(*removal) { di.logLevel = telegraf.Error } else if !version.LessThan(*since) { di.logLevel = telegraf.Warn } return nil } // PluginDeprecationInfo holds all information about a deprecated plugin or it's options type PluginDeprecationInfo struct { DeprecationInfo // Options deprecated for this plugin Options []DeprecationInfo } func (c *Config) incrementPluginDeprecations(category string) { newcounts := []int64{1, 0} if counts, found := c.Deprecations[category]; found { newcounts = []int64{counts[0] + 1, counts[1]} } c.Deprecations[category] = newcounts } func (c *Config) incrementPluginOptionDeprecations(category string) { newcounts := []int64{0, 1} if counts, found := c.Deprecations[category]; found { newcounts = []int64{counts[0], counts[1] + 1} } c.Deprecations[category] = newcounts } func (c *Config) collectDeprecationInfo(category, name string, plugin interface{}, all bool) PluginDeprecationInfo { info := PluginDeprecationInfo{ DeprecationInfo: DeprecationInfo{ Name: category + "." + name, logLevel: telegraf.None, }, } // First check if the whole plugin is deprecated switch category { case "aggregators": if pi, deprecated := aggregators.Deprecations[name]; deprecated { info.DeprecationInfo.info = pi } case "inputs": if pi, deprecated := inputs.Deprecations[name]; deprecated { info.DeprecationInfo.info = pi } case "outputs": if pi, deprecated := outputs.Deprecations[name]; deprecated { info.DeprecationInfo.info = pi } case "processors": if pi, deprecated := processors.Deprecations[name]; deprecated { info.DeprecationInfo.info = pi } } if err := info.determineEscalation(); err != nil { panic(fmt.Errorf("plugin %q: %w", info.Name, err)) } if info.logLevel != telegraf.None { c.incrementPluginDeprecations(category) } // Allow checking for names only. if plugin == nil { return info } // Check for deprecated options walkPluginStruct(reflect.ValueOf(plugin), func(field reflect.StructField, value reflect.Value) { // Try to report only those fields that are set if !all && value.IsZero() { return } tags := strings.SplitN(field.Tag.Get("deprecated"), ";", 3) if len(tags) < 1 || tags[0] == "" { return } optionInfo := DeprecationInfo{Name: field.Name} optionInfo.info.Since = tags[0] if len(tags) > 1 { optionInfo.info.Notice = tags[len(tags)-1] } if len(tags) > 2 { optionInfo.info.RemovalIn = tags[1] } if err := optionInfo.determineEscalation(); err != nil { panic(fmt.Errorf("plugin %q option %q: %w", info.Name, field.Name, err)) } if optionInfo.logLevel != telegraf.None { c.incrementPluginOptionDeprecations(category) } // Get the toml field name option := field.Tag.Get("toml") if option != "" { optionInfo.Name = option } info.Options = append(info.Options, optionInfo) }) return info } func (c *Config) printUserDeprecation(category, name string, plugin interface{}) error { info := c.collectDeprecationInfo(category, name, plugin, false) printPluginDeprecationNotice(info.logLevel, info.Name, info.info) if info.logLevel == telegraf.Error { return errors.New("plugin deprecated") } // Print deprecated options deprecatedOptions := make([]string, 0) for _, option := range info.Options { PrintOptionDeprecationNotice(info.Name, option.Name, option.info) if option.logLevel == telegraf.Error { deprecatedOptions = append(deprecatedOptions, option.Name) } } if len(deprecatedOptions) > 0 { return fmt.Errorf("plugin options %q deprecated", strings.Join(deprecatedOptions, ",")) } return nil } func (c *Config) CollectDeprecationInfos(inFilter, outFilter, aggFilter, procFilter []string) map[string][]PluginDeprecationInfo { infos := make(map[string][]PluginDeprecationInfo) infos["inputs"] = make([]PluginDeprecationInfo, 0) for name, creator := range inputs.Inputs { if len(inFilter) > 0 && !sliceContains(name, inFilter) { continue } plugin := creator() info := c.collectDeprecationInfo("inputs", name, plugin, true) if info.logLevel != telegraf.None || len(info.Options) > 0 { infos["inputs"] = append(infos["inputs"], info) } } infos["outputs"] = make([]PluginDeprecationInfo, 0) for name, creator := range outputs.Outputs { if len(outFilter) > 0 && !sliceContains(name, outFilter) { continue } plugin := creator() info := c.collectDeprecationInfo("outputs", name, plugin, true) if info.logLevel != telegraf.None || len(info.Options) > 0 { infos["outputs"] = append(infos["outputs"], info) } } infos["processors"] = make([]PluginDeprecationInfo, 0) for name, creator := range processors.Processors { if len(procFilter) > 0 && !sliceContains(name, procFilter) { continue } plugin := creator() info := c.collectDeprecationInfo("processors", name, plugin, true) if info.logLevel != telegraf.None || len(info.Options) > 0 { infos["processors"] = append(infos["processors"], info) } } infos["aggregators"] = make([]PluginDeprecationInfo, 0) for name, creator := range aggregators.Aggregators { if len(aggFilter) > 0 && !sliceContains(name, aggFilter) { continue } plugin := creator() info := c.collectDeprecationInfo("aggregators", name, plugin, true) if info.logLevel != telegraf.None || len(info.Options) > 0 { infos["aggregators"] = append(infos["aggregators"], info) } } return infos } func (*Config) PrintDeprecationList(plugins []PluginDeprecationInfo) { sort.Slice(plugins, func(i, j int) bool { return plugins[i].Name < plugins[j].Name }) for _, plugin := range plugins { switch plugin.logLevel { case telegraf.Warn, telegraf.Error: fmt.Printf( " %-40s %-5s since %-5s removal in %-5s %s\n", plugin.Name, plugin.logLevel, plugin.info.Since, plugin.info.RemovalIn, plugin.info.Notice, ) } if len(plugin.Options) < 1 { continue } sort.Slice(plugin.Options, func(i, j int) bool { return plugin.Options[i].Name < plugin.Options[j].Name }) for _, option := range plugin.Options { fmt.Printf( " %-40s %-5s since %-5s removal in %-5s %s\n", plugin.Name+"/"+option.Name, option.logLevel, option.info.Since, option.info.RemovalIn, option.info.Notice, ) } } } func printHistoricPluginDeprecationNotice(category, name string, info telegraf.DeprecationInfo) { prefix := "E! " + color.RedString("DeprecationError") log.Printf( "%s: Plugin %q deprecated since version %s and removed: %s", prefix, category+"."+name, info.Since, info.Notice, ) } // walkPluginStruct iterates over the fields of a structure in depth-first search (to cover nested structures) // and calls the given function for every visited field. func walkPluginStruct(value reflect.Value, fn func(f reflect.StructField, fv reflect.Value)) { v := reflect.Indirect(value) t := v.Type() // Only works on structs if t.Kind() != reflect.Struct { return } // Walk over the struct fields and call the given function. If we encounter more complex embedded // elements (structs, slices/arrays, maps) we need to descend into those elements as they might // contain structures nested in the current structure. for i := 0; i < t.NumField(); i++ { field := t.Field(i) fieldValue := v.Field(i) if field.PkgPath != "" { continue } switch field.Type.Kind() { case reflect.Struct: walkPluginStruct(fieldValue, fn) case reflect.Array, reflect.Slice: for j := 0; j < fieldValue.Len(); j++ { element := fieldValue.Index(j) // The array might contain structs walkPluginStruct(element, fn) fn(field, element) } case reflect.Map: iter := fieldValue.MapRange() for iter.Next() { element := iter.Value() // The map might contain structs walkPluginStruct(element, fn) fn(field, element) } } fn(field, fieldValue) } } func deprecationPrefix(level telegraf.LogLevel) string { switch level { case telegraf.Warn: return "W! " + color.YellowString("DeprecationWarning") case telegraf.Error: return "E! " + color.RedString("DeprecationError") } return "" } func printPluginDeprecationNotice(level telegraf.LogLevel, name string, info telegraf.DeprecationInfo) { switch level { case telegraf.Warn, telegraf.Error: prefix := deprecationPrefix(level) log.Printf( "%s: Plugin %q deprecated since version %s and will be removed in %s: %s", prefix, name, info.Since, info.RemovalIn, info.Notice, ) } } func PrintOptionDeprecationNotice(plugin, option string, info telegraf.DeprecationInfo) { // Determine the log-level di := &DeprecationInfo{ Name: plugin, info: info, } if err := di.determineEscalation(); err != nil { log.Printf("E! Determining log-level for option %s in plugin %s failed: %v", option, plugin, err) return } switch di.logLevel { case telegraf.Warn, telegraf.Error: prefix := deprecationPrefix(di.logLevel) log.Printf( "%s: Option %q of plugin %q deprecated since version %s and will be removed in %s: %s", prefix, option, plugin, di.info.Since, di.info.RemovalIn, di.info.Notice, ) } } func PrintOptionValueDeprecationNotice(plugin, option string, value interface{}, info telegraf.DeprecationInfo) { // Determine the log-level di := &DeprecationInfo{ Name: plugin, info: info, } if err := di.determineEscalation(); err != nil { log.Printf("E! Determining log-level for option %s in plugin %s failed: %v", option, plugin, err) return } switch di.logLevel { case telegraf.Warn, telegraf.Error: prefix := deprecationPrefix(di.logLevel) log.Printf( `%s: Value "%+v" for option %q of plugin %q deprecated since version %s and will be removed in %s: %s`, prefix, value, option, plugin, di.info.Since, di.info.RemovalIn, di.info.Notice, ) } } ================================================ FILE: config/deprecation_test.go ================================================ package config import ( "bufio" "bytes" "log" "strings" "testing" "time" "github.com/coreos/go-semver/semver" "github.com/stretchr/testify/require" "github.com/influxdata/telegraf" ) func TestPluginDeprecation(t *testing.T) { info := telegraf.DeprecationInfo{ Since: "1.23.0", RemovalIn: "2.0.0", Notice: "please check", } var tests = []struct { name string level telegraf.LogLevel expected string }{ { name: "Error level", level: telegraf.Error, expected: `Plugin "test" deprecated since version 1.23.0 and will be removed in 2.0.0: please check`, }, { name: "Warn level", level: telegraf.Warn, expected: `Plugin "test" deprecated since version 1.23.0 and will be removed in 2.0.0: please check`, }, { name: "None", level: telegraf.None, expected: ``, }, } // Switch the logger to log to a buffer var buf bytes.Buffer scanner := bufio.NewScanner(&buf) previous := log.Writer() log.SetOutput(&buf) defer log.SetOutput(previous) msg := make(chan string, 1) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { buf.Reset() printPluginDeprecationNotice(tt.level, "test", info) // Wait for a newline to arrive and timeout for cases where // we don't see a message. go func() { scanner.Scan() msg <- scanner.Text() }() // Reduce the timeout if we do not expect a message timeout := 1 * time.Second if tt.expected == "" { timeout = 100 * time.Microsecond } var actual string select { case actual = <-msg: case <-time.After(timeout): } if tt.expected != "" { expected := deprecationPrefix(tt.level) + ": " + tt.expected require.Equal(t, expected, actual) } else { require.Empty(t, actual) } }) } } func TestPluginOptionDeprecation(t *testing.T) { var tests = []struct { name string since string removal string expected string expectedLevel telegraf.LogLevel }{ { name: "Error level", since: "1.23.0", removal: "1.29.0", expectedLevel: telegraf.Error, expected: `Option "option" of plugin "test" deprecated since version 1.23.0 and will be removed in 1.29.0: please check`, }, { name: "Warn level", since: "1.23.0", removal: "2.0.0", expectedLevel: telegraf.Warn, expected: `Option "option" of plugin "test" deprecated since version 1.23.0 and will be removed in 2.0.0: please check`, }, { name: "No removal info", since: "1.23.0", expectedLevel: telegraf.Warn, expected: `Option "option" of plugin "test" deprecated since version 1.23.0 and will be removed in 2.0.0: please check`, }, { name: "None", expectedLevel: telegraf.None, expected: ``, }, } // Fake telegraf's version version, err := semver.NewVersion("1.30.0") require.NoError(t, err) telegrafVersion = version // Switch the logger to log to a buffer var buf bytes.Buffer scanner := bufio.NewScanner(&buf) previous := log.Writer() log.SetOutput(&buf) defer log.SetOutput(previous) msg := make(chan string, 1) for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { buf.Reset() info := telegraf.DeprecationInfo{ Since: tt.since, RemovalIn: tt.removal, Notice: "please check", } PrintOptionDeprecationNotice("test", "option", info) // Wait for a newline to arrive and timeout for cases where // we don't see a message. go func() { scanner.Scan() msg <- scanner.Text() }() // Reduce the timeout if we do not expect a message timeout := 1 * time.Second if tt.expected == "" { timeout = 100 * time.Microsecond } var actual string select { case actual = <-msg: case <-time.After(timeout): } if tt.expected != "" { expected := deprecationPrefix(tt.expectedLevel) + ": " + tt.expected require.Equal(t, expected, actual) } else { require.Empty(t, actual) } }) } } func TestPluginOptionValueDeprecation(t *testing.T) { var tests = []struct { name string since string removal string value interface{} expected string expectedLevel telegraf.LogLevel }{ { name: "Error level", since: "1.25.0", removal: "1.29.0", value: "foobar", expected: `Value "foobar" for option "option" of plugin "test" deprecated since version 1.25.0 and will be removed in 1.29.0: please check`, expectedLevel: telegraf.Error, }, { name: "Warn level", since: "1.25.0", removal: "2.0.0", value: "foobar", expected: `Value "foobar" for option "option" of plugin "test" deprecated since version 1.25.0 and will be removed in 2.0.0: please check`, expectedLevel: telegraf.Warn, }, { name: "No removal info", since: "1.25.0", value: "foobar", expected: `Value "foobar" for option "option" of plugin "test" deprecated since version 1.25.0 and will be removed in 2.0.0: please check`, expectedLevel: telegraf.Warn, }, { name: "None", expected: ``, expectedLevel: telegraf.None, }, { name: "nil value", since: "1.25.0", removal: "1.29.0", value: nil, expected: `Value "" for option "option" of plugin "test" deprecated since version 1.25.0 and will be removed in 1.29.0: please check`, expectedLevel: telegraf.Error, }, { name: "Boolean value", since: "1.25.0", removal: "1.29.0", value: true, expected: `Value "true" for option "option" of plugin "test" deprecated since version 1.25.0 and will be removed in 1.29.0: please check`, expectedLevel: telegraf.Error, }, { name: "Integer value", since: "1.25.0", removal: "1.29.0", value: 123, expected: `Value "123" for option "option" of plugin "test" deprecated since version 1.25.0 and will be removed in 1.29.0: please check`, expectedLevel: telegraf.Error, }, } // Fake telegraf's version version, err := semver.NewVersion("1.30.0") require.NoError(t, err) telegrafVersion = version // Switch the logger to log to a buffer var buf bytes.Buffer previous := log.Writer() log.SetOutput(&buf) defer log.SetOutput(previous) timeout := 1 * time.Second for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { buf.Reset() info := telegraf.DeprecationInfo{ Since: tt.since, RemovalIn: tt.removal, Notice: "please check", } PrintOptionValueDeprecationNotice("test", "option", tt.value, info) if tt.expected != "" { require.Eventually(t, func() bool { return strings.HasSuffix(buf.String(), "\n") }, timeout, 100*time.Millisecond) // Remove the time for comparison actual := strings.TrimSpace(buf.String()) expected := deprecationPrefix(tt.expectedLevel) + ": " + tt.expected require.Equal(t, expected, actual) } else { time.Sleep(timeout) require.Empty(t, buf.String()) } }) } } ================================================ FILE: config/envvar.go ================================================ package config import ( "bytes" "errors" "fmt" "io" "os" "strings" "github.com/compose-spec/compose-go/template" "github.com/compose-spec/compose-go/utils" "github.com/influxdata/toml" "github.com/influxdata/toml/ast" ) type trimmer struct { input *bytes.Reader output bytes.Buffer } func removeComments(buf []byte) ([]byte, error) { t := &trimmer{ input: bytes.NewReader(buf), output: bytes.Buffer{}, } err := t.process() return t.output.Bytes(), err } func (t *trimmer) process() error { for { // Read the next byte until EOF c, err := t.input.ReadByte() if err != nil { if errors.Is(err, io.EOF) { break } return err } // Switch states if we need to switch c { case '\\': //nolint:errcheck // next byte is known t.input.UnreadByte() err = t.escape() case '\'': //nolint:errcheck // next byte is known t.input.UnreadByte() if t.hasNQuotes(c, 3) { err = t.tripleSingleQuote() } else { err = t.singleQuote() } case '"': //nolint:errcheck // next byte is known t.input.UnreadByte() if t.hasNQuotes(c, 3) { err = t.tripleDoubleQuote() } else { err = t.doubleQuote() } case '#': err = t.comment() default: t.output.WriteByte(c) continue } if err != nil { if errors.Is(err, io.EOF) { break } return err } } return nil } func (t *trimmer) hasNQuotes(ref byte, limit int64) bool { var count int64 // Look ahead check if the next characters are what we expect for count = 0; count < limit; count++ { c, err := t.input.ReadByte() if err != nil || c != ref { break } } // We also need to unread the non-matching character offset := -count if count < limit { offset-- } //nolint:errcheck // Unread the already matched characters t.input.Seek(offset, io.SeekCurrent) return count >= limit } func (t *trimmer) readWriteByte() (byte, error) { c, err := t.input.ReadByte() if err != nil { return 0, err } return c, t.output.WriteByte(c) } func (t *trimmer) escape() error { //nolint:errcheck // Consume the known starting backslash and quote t.readWriteByte() // Read the next character which is the escaped one and exit _, err := t.readWriteByte() return err } func (t *trimmer) singleQuote() error { //nolint:errcheck // Consume the known starting quote t.readWriteByte() // Read bytes until EOF, line end or another single quote for { if c, err := t.readWriteByte(); err != nil || c == '\'' || c == '\n' { return err } } } func (t *trimmer) tripleSingleQuote() error { for i := 0; i < 3; i++ { //nolint:errcheck // Consume the known starting quotes t.readWriteByte() } // Read bytes until EOF or another set of triple single quotes for { c, err := t.readWriteByte() if err != nil { return err } if c == '\'' && t.hasNQuotes('\'', 2) { //nolint:errcheck // Consume the two additional ending quotes t.readWriteByte() //nolint:errcheck // Consume the two additional ending quotes t.readWriteByte() return nil } } } func (t *trimmer) doubleQuote() error { //nolint:errcheck // Consume the known starting quote t.readWriteByte() // Read bytes until EOF, line end or another double quote for { c, err := t.input.ReadByte() if err != nil { return err } switch c { case '\\': //nolint:errcheck // Consume the found escaped character t.input.UnreadByte() if err := t.escape(); err != nil { return err } continue case '"', '\n': // Found terminator return t.output.WriteByte(c) } t.output.WriteByte(c) } } func (t *trimmer) tripleDoubleQuote() error { for i := 0; i < 3; i++ { //nolint:errcheck // Consume the known starting quotes t.readWriteByte() } // Read bytes until EOF or another set of triple double quotes for { c, err := t.input.ReadByte() if err != nil { return err } switch c { case '\\': //nolint:errcheck // Consume the found escape character t.input.UnreadByte() if err := t.escape(); err != nil { return err } continue case '"': t.output.WriteByte(c) if t.hasNQuotes('"', 2) { //nolint:errcheck // Consume the two additional ending quotes t.readWriteByte() //nolint:errcheck // Consume the two additional ending quotes t.readWriteByte() return nil } continue } t.output.WriteByte(c) } } func (t *trimmer) comment() error { // Read bytes until EOF or a line break for { c, err := t.input.ReadByte() if err != nil { return err } if c == '\n' { return t.output.WriteByte(c) } } } func substituteEnvironmentStrict(contents []byte, oldReplacementBehavior bool) (*ast.Table, error) { // Parse the tree tree, err := toml.Parse(contents) if err != nil { return nil, err } // Prepare the environment-variable replacer options := []template.Option{ template.WithReplacementFunction(func(s string, m template.Mapping, cfg *template.Config) (string, error) { result, applied, err := template.DefaultReplacementAppliedFunc(s, m, cfg) if err == nil && !applied { // Keep undeclared environment-variable patterns to reproduce // pre-v1.27 behavior return s, nil } if err != nil && strings.HasPrefix(err.Error(), "Invalid template:") { // Keep invalid template patterns to ignore regexp substitutions // like ${1} return s, nil } return result, err }), template.WithoutLogging, } if oldReplacementBehavior { options = append(options, template.WithPattern(oldVarRe)) } envMap := utils.GetAsEqualsMap(os.Environ()) // Walk the AST and find string items to replace if err := walk(tree, func(n interface{}) error { v, ok := n.(*ast.String) if !ok { return nil } replacement, err := template.SubstituteWithOptions(v.Value, func(k string) (string, bool) { if v, ok := envMap[k]; ok { return v, ok } return "", false }, options...) if err != nil { return err } v.Value = replacement return nil }); err != nil { return nil, err } return tree, nil } func walk(node interface{}, f func(interface{}) error) error { switch n := node.(type) { case *ast.Table: for k, v := range n.Fields { if err := walk(v, f); err != nil { return fmt.Errorf("processing field %q with value %v failed: %w", k, v, err) } } case []*ast.Table: for _, v := range n { if err := walk(v, f); err != nil { return fmt.Errorf("processing table %q failed: %w", v.Name, err) } } case *ast.Array: for i, v := range n.Value { if err := walk(v, f); err != nil { return fmt.Errorf("processing element %d with value %v failed: %w", i+1, v, err) } } case *ast.KeyValue: if err := walk(n.Value, f); err != nil { return fmt.Errorf("processing value %v for key %q failed: %w", n.Value, n.Key, err) } } return f(node) } func substituteEnvironmentNonStrict(contents []byte, oldReplacementBehavior bool) ([]byte, error) { options := []template.Option{ template.WithReplacementFunction(func(s string, m template.Mapping, cfg *template.Config) (string, error) { result, applied, err := template.DefaultReplacementAppliedFunc(s, m, cfg) if err == nil && !applied { // Keep undeclared environment-variable patterns to reproduce // pre-v1.27 behavior return s, nil } if err != nil && strings.HasPrefix(err.Error(), "Invalid template:") { // Keep invalid template patterns to ignore regexp substitutions // like ${1} return s, nil } return result, err }), template.WithoutLogging, } if oldReplacementBehavior { options = append(options, template.WithPattern(oldVarRe)) } envMap := utils.GetAsEqualsMap(os.Environ()) retVal, err := template.SubstituteWithOptions(string(contents), func(k string) (string, bool) { if v, ok := envMap[k]; ok { return v, ok } return "", false }, options...) return []byte(retVal), err } ================================================ FILE: config/internal_test.go ================================================ package config import ( "bytes" "fmt" "net/http" "net/http/httptest" "os" "path/filepath" "testing" "time" "github.com/stretchr/testify/require" ) func TestEnvironmentSubstitution(t *testing.T) { tests := []struct { name string setEnv func(*testing.T) contents string expected string wantErr bool errSubstring string }{ { name: "Legacy with ${} and without {}", setEnv: func(t *testing.T) { t.Setenv("TEST_ENV1", "VALUE1") t.Setenv("TEST_ENV2", "VALUE2") }, contents: "A string with ${TEST_ENV1}, $TEST_ENV2 and $TEST_ENV1 as repeated", expected: "A string with VALUE1, VALUE2 and VALUE1 as repeated", }, { name: "Env not set", contents: "Env variable ${NOT_SET} will be empty", expected: "Env variable ${NOT_SET} will be empty", }, { name: "Env not set, fallback to default", contents: "Env variable ${THIS_IS_ABSENT:-Fallback}", expected: "Env variable Fallback", }, { name: "No fallback", setEnv: func(t *testing.T) { t.Setenv("MY_ENV1", "VALUE1") }, contents: "Env variable ${MY_ENV1:-Fallback}", expected: "Env variable VALUE1", }, { name: "Mix and match", setEnv: func(t *testing.T) { t.Setenv("MY_VAR", "VALUE") t.Setenv("MY_VAR2", "VALUE2") }, contents: "Env var ${MY_VAR} is set, with $MY_VAR syntax and default on this ${MY_VAR1:-Substituted}, no default on this ${MY_VAR2:-NoDefault}", expected: "Env var VALUE is set, with VALUE syntax and default on this Substituted, no default on this VALUE2", }, { name: "empty but set", setEnv: func(t *testing.T) { t.Setenv("EMPTY", "") }, contents: "Contains ${EMPTY} nothing", expected: "Contains nothing", }, { name: "Default has special chars", contents: `Not recommended but supported ${MY_VAR:-Default with special chars Supported#$\"}`, expected: `Not recommended but supported Default with special chars Supported#$\"`, // values are escaped }, { name: "unset error", contents: "Contains ${THIS_IS_NOT_SET?unset-error}", wantErr: true, errSubstring: "unset-error", }, { name: "env empty error", setEnv: func(t *testing.T) { t.Setenv("ENV_EMPTY", "") }, contents: "Contains ${ENV_EMPTY:?empty-error}", wantErr: true, errSubstring: "empty-error", }, { name: "Fallback as env variable", setEnv: func(t *testing.T) { t.Setenv("FALLBACK", "my-fallback") }, contents: "Should output ${NOT_SET:-${FALLBACK}}", expected: "Should output my-fallback", }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if tt.setEnv != nil { tt.setEnv(t) } actual, err := substituteEnvironmentNonStrict([]byte(tt.contents), false) if tt.wantErr { require.ErrorContains(t, err, tt.errSubstring) return } require.EqualValues(t, tt.expected, string(actual)) }) } } func TestEnvironmentSubstitutionOldBehavior(t *testing.T) { tests := []struct { name string contents string expected string }{ { name: "not defined no brackets", contents: `my-da$tabase`, expected: `my-da$tabase`, }, { name: "not defined brackets", contents: `my-da${ta}base`, expected: `my-da${ta}base`, }, { name: "not defined no brackets double dollar", contents: `my-da$$tabase`, expected: `my-da$$tabase`, }, { name: "not defined no brackets backslash", contents: `my-da\$tabase`, expected: `my-da\$tabase`, }, { name: "not defined brackets backslash", contents: `my-da\${ta}base`, expected: `my-da\${ta}base`, }, { name: "no brackets and suffix", contents: `my-da$VARbase`, expected: `my-da$VARbase`, }, { name: "no brackets", contents: `my-da$VAR`, expected: `my-dafoobar`, }, { name: "brackets", contents: `my-da${VAR}base`, expected: `my-dafoobarbase`, }, { name: "no brackets double dollar", contents: `my-da$$VAR`, expected: `my-da$foobar`, }, { name: "brackets double dollar", contents: `my-da$${VAR}`, expected: `my-da$foobar`, }, { name: "no brackets backslash", contents: `my-da\$VAR`, expected: `my-da\foobar`, }, { name: "brackets backslash", contents: `my-da\${VAR}base`, expected: `my-da\foobarbase`, }, { name: "fallback", contents: `my-da${ta:-omg}base`, expected: `my-daomgbase`, }, { name: "fallback env", contents: `my-da${ta:-${FALLBACK}}base`, expected: `my-dadefaultbase`, }, { name: "regex substitution", contents: `${1}`, expected: `${1}`, }, { name: "empty but set", contents: "Contains ${EMPTY} nothing", expected: "Contains nothing", }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { t.Setenv("VAR", "foobar") t.Setenv("FALLBACK", "default") t.Setenv("EMPTY", "") actual, err := substituteEnvironmentNonStrict([]byte(tt.contents), true) require.NoError(t, err) require.EqualValues(t, tt.expected, string(actual)) }) } } func TestEnvironmentSubstitutionNewBehavior(t *testing.T) { tests := []struct { name string contents string expected string }{ { name: "not defined no brackets", contents: `my-da$tabase`, expected: `my-da$tabase`, }, { name: "not defined brackets", contents: `my-da${ta}base`, expected: `my-da${ta}base`, }, { name: "not defined no brackets double dollar", contents: `my-da$$tabase`, expected: `my-da$tabase`, }, { name: "not defined no brackets backslash", contents: `my-da\$tabase`, expected: `my-da\$tabase`, }, { name: "not defined brackets backslash", contents: `my-da\${ta}base`, expected: `my-da\${ta}base`, }, { name: "no brackets and suffix", contents: `my-da$VARbase`, expected: `my-da$VARbase`, }, { name: "no brackets", contents: `my-da$VAR`, expected: `my-dafoobar`, }, { name: "brackets", contents: `my-da${VAR}base`, expected: `my-dafoobarbase`, }, { name: "no brackets double dollar", contents: `my-da$$VAR`, expected: `my-da$VAR`, }, { name: "brackets double dollar", contents: `my-da$${VAR}`, expected: `my-da${VAR}`, }, { name: "no brackets backslash", contents: `my-da\$VAR`, expected: `my-da\foobar`, }, { name: "brackets backslash", contents: `my-da\${VAR}base`, expected: `my-da\foobarbase`, }, { name: "fallback", contents: `my-da${ta:-omg}base`, expected: `my-daomgbase`, }, { name: "fallback env", contents: `my-da${ta:-${FALLBACK}}base`, expected: `my-dadefaultbase`, }, { name: "regex substitution", contents: `${1}`, expected: `${1}`, }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { t.Setenv("VAR", "foobar") t.Setenv("FALLBACK", "default") actual, err := substituteEnvironmentNonStrict([]byte(tt.contents), false) require.NoError(t, err) require.EqualValues(t, tt.expected, string(actual)) }) } } func TestParseConfig(t *testing.T) { tests := []struct { name string setEnv func(*testing.T) contents string expected string errmsg string }{ { name: "empty var name", contents: ` # Environment variables can be used anywhere in this config file, simply surround # them with ${}. For strings the variable must be within quotes (ie, "${STR_VAR}"), # for numbers and booleans they should be plain (ie, ${INT_VAR}, ${BOOL_VAR})Should output ${NOT_SET:-${FALLBACK}} `, expected: "\n\n\n\n", }, { name: "comment in command (issue #13643)", contents: ` [[inputs.exec]] commands = ["echo \"abc#def\""] `, expected: ` [[inputs.exec]] commands = ["echo \"abc#def\""] `, }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if tt.setEnv != nil { tt.setEnv(t) } tbl, err := parseConfig([]byte(tt.contents)) if tt.errmsg != "" { require.ErrorContains(t, err, tt.errmsg) return } require.NoError(t, err) if len(tt.expected) > 0 { require.EqualValues(t, tt.expected, string(tbl.Data)) } }) } } func TestRemoveComments(t *testing.T) { // Read expectation expected, err := os.ReadFile(filepath.Join("testdata", "envvar_comments_expected.toml")) require.NoError(t, err) // Read the file and remove the comments buf, err := os.ReadFile(filepath.Join("testdata", "envvar_comments.toml")) require.NoError(t, err) removed, err := removeComments(buf) require.NoError(t, err) lines := bytes.Split(removed, []byte{'\n'}) for i, line := range lines { lines[i] = bytes.TrimRight(line, " \t") } actual := bytes.Join(lines, []byte{'\n'}) // Do the comparison require.Equal(t, string(expected), string(actual)) } func TestURLRetries3Fails(t *testing.T) { httpLoadConfigRetryInterval = 0 * time.Second responseCounter := 0 ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, _ *http.Request) { w.WriteHeader(http.StatusNotFound) responseCounter++ })) defer ts.Close() expected := fmt.Sprintf("loading config file %s failed: failed to fetch HTTP config: 404 Not Found", ts.URL) c := NewConfig() err := c.LoadConfig(ts.URL) require.Error(t, err) require.Equal(t, expected, err.Error()) require.Equal(t, 4, responseCounter) } func TestURLRetries3FailsThenPasses(t *testing.T) { httpLoadConfigRetryInterval = 0 * time.Second responseCounter := 0 ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, _ *http.Request) { if responseCounter <= 2 { w.WriteHeader(http.StatusNotFound) } else { w.WriteHeader(http.StatusOK) } responseCounter++ })) defer ts.Close() c := NewConfig() require.NoError(t, c.LoadConfig(ts.URL)) require.Equal(t, 4, responseCounter) } ================================================ FILE: config/migration.go ================================================ package config import ( "bufio" "bytes" "errors" "fmt" "io" "log" "sort" "strings" "github.com/influxdata/toml" "github.com/influxdata/toml/ast" "github.com/influxdata/telegraf/migrations" _ "github.com/influxdata/telegraf/migrations/all" // register all migrations ) type section struct { name string begin int content *ast.Table raw *bytes.Buffer } func splitToSections(root *ast.Table) ([]section, error) { var sections []section for name, elements := range root.Fields { switch name { case "inputs", "outputs", "processors", "aggregators": category, ok := elements.(*ast.Table) if !ok { return nil, fmt.Errorf("%q is not a table (%T)", name, category) } for plugin, elements := range category.Fields { tbls, ok := elements.([]*ast.Table) if !ok { return nil, fmt.Errorf("elements of \"%s.%s\" is not a list of tables (%T)", name, plugin, elements) } for _, tbl := range tbls { s := section{ name: name + "." + tbl.Name, begin: tbl.Line, content: tbl, raw: &bytes.Buffer{}, } sections = append(sections, s) } } default: tbl, ok := elements.(*ast.Table) if !ok { return nil, fmt.Errorf("%q is not a table (%T)", name, elements) } s := section{ name: name, begin: tbl.Line, content: tbl, raw: &bytes.Buffer{}, } sections = append(sections, s) } } // Sort the TOML elements by begin (line-number) sort.SliceStable(sections, func(i, j int) bool { return sections[i].begin < sections[j].begin }) return sections, nil } func assignTextToSections(data []byte, sections []section) ([]section, error) { // Now assign the raw text to each section if sections[0].begin > 0 { sections = append([]section{{ name: "header", begin: 0, raw: &bytes.Buffer{}, }}, sections...) } var lineno int scanner := bufio.NewScanner(bytes.NewBuffer(data)) for idx, next := range sections[1:] { var buf bytes.Buffer for lineno < next.begin-1 { if !scanner.Scan() { break } lineno++ line := strings.TrimSpace(scanner.Text()) if strings.HasPrefix(line, "#") { buf.Write(scanner.Bytes()) buf.WriteString("\n") continue } else if buf.Len() > 0 { if _, err := io.Copy(sections[idx].raw, &buf); err != nil { return nil, fmt.Errorf("copying buffer failed: %w", err) } buf.Reset() } sections[idx].raw.Write(scanner.Bytes()) sections[idx].raw.WriteString("\n") } if err := scanner.Err(); err != nil { return nil, fmt.Errorf("splitting by line failed: %w", err) } // If a comment is directly in front of the next section, without // newline, the comment is assigned to the next section. if buf.Len() > 0 { if _, err := io.Copy(sections[idx+1].raw, &buf); err != nil { return nil, fmt.Errorf("copying buffer failed: %w", err) } buf.Reset() } } // Write the remaining to the last section for scanner.Scan() { sections[len(sections)-1].raw.Write(scanner.Bytes()) sections[len(sections)-1].raw.WriteString("\n") } if err := scanner.Err(); err != nil { return nil, fmt.Errorf("splitting by line failed: %w", err) } return sections, nil } func ApplyMigrations(data []byte) ([]byte, uint64, error) { root, err := toml.Parse(data) if err != nil { return nil, 0, fmt.Errorf("parsing failed: %w", err) } // Split the configuration into sections containing the location // in the file. sections, err := splitToSections(root) if err != nil { return nil, 0, fmt.Errorf("splitting to sections failed: %w", err) } if len(sections) == 0 { return nil, 0, errors.New("no TOML configuration found") } // Assign the configuration text to the corresponding segments sections, err = assignTextToSections(data, sections) if err != nil { return nil, 0, fmt.Errorf("assigning text failed: %w", err) } var applied uint64 // Do the actual global section migration(s) for idx, s := range sections { if strings.Contains(s.name, ".") { continue } log.Printf("D! applying global migrations to section %q in line %d...", s.name, s.begin) for _, migrate := range migrations.GlobalMigrations { result, msg, err := migrate(s.name, s.content) if err != nil { if errors.Is(err, migrations.ErrNotApplicable) { continue } return nil, 0, fmt.Errorf("migrating options of %q (line %d) failed: %w", s.name, s.begin, err) } if msg != "" { log.Printf("I! Global section %q in line %d: %s", s.name, s.begin, msg) } s.raw = bytes.NewBuffer(result) applied++ } sections[idx] = s } // Do the actual plugin migration(s) for idx, s := range sections { migrate, found := migrations.PluginMigrations[s.name] if !found { continue } log.Printf("D! migrating plugin %q in line %d...", s.name, s.begin) result, msg, err := migrate(s.content) if err != nil { return nil, 0, fmt.Errorf("migrating %q (line %d) failed: %w", s.name, s.begin, err) } if msg != "" { log.Printf("I! Plugin %q in line %d: %s", s.name, s.begin, msg) } s.raw = bytes.NewBuffer(result) tbl, err := toml.Parse(s.raw.Bytes()) if err != nil { return nil, 0, fmt.Errorf("reparsing migrated %q (line %d) failed: %w", s.name, s.begin, err) } s.content = tbl sections[idx] = s applied++ } // Do general migrations applying to all plugins for idx, s := range sections { parts := strings.Split(s.name, ".") if len(parts) != 2 { continue } log.Printf("D! applying general migrations to plugin %q in line %d...", s.name, s.begin) category, name := parts[0], parts[1] for _, migrate := range migrations.GeneralMigrations { result, msg, err := migrate(category, name, s.content) if err != nil { if errors.Is(err, migrations.ErrNotApplicable) { continue } return nil, 0, fmt.Errorf("migrating options of %q (line %d) failed: %w", s.name, s.begin, err) } if msg != "" { log.Printf("I! Plugin %q in line %d: %s", s.name, s.begin, msg) } s.raw = bytes.NewBuffer(result) tbl, err := toml.Parse(s.raw.Bytes()) if err != nil { return nil, 0, fmt.Errorf("reparsing migrated %q (line %d) failed: %w", s.name, s.begin, err) } catTbl := tbl.Fields[category].(*ast.Table) s.content = catTbl.Fields[name].([]*ast.Table)[0] applied++ } sections[idx] = s } // Do the actual plugin option migration(s) for idx, s := range sections { migrate, found := migrations.PluginOptionMigrations[s.name] if !found { continue } log.Printf("D! migrating options of plugin %q in line %d...", s.name, s.begin) result, msg, err := migrate(s.content) if err != nil { if errors.Is(err, migrations.ErrNotApplicable) { continue } return nil, 0, fmt.Errorf("migrating options of %q (line %d) failed: %w", s.name, s.begin, err) } if msg != "" { log.Printf("I! Plugin %q in line %d: %s", s.name, s.begin, msg) } s.raw = bytes.NewBuffer(result) sections[idx] = s applied++ } // Reconstruct the config file from the sections var buf bytes.Buffer for _, s := range sections { _, err = s.raw.WriteTo(&buf) if err != nil { return nil, applied, fmt.Errorf("joining output failed: %w", err) } } return buf.Bytes(), applied, nil } ================================================ FILE: config/plugin_id.go ================================================ package config import ( "crypto/sha256" "encoding/hex" "fmt" "sort" "github.com/influxdata/toml/ast" ) type keyValuePair struct { Key string Value string } func processTable(parent string, table *ast.Table) ([]keyValuePair, error) { var prefix string var options []keyValuePair if parent != "" { prefix = parent + "." } for k, value := range table.Fields { switch v := value.(type) { case *ast.KeyValue: key := prefix + k options = append(options, keyValuePair{ Key: key, Value: v.Value.Source(), }) case *ast.Table: key := prefix + k children, err := processTable(key, v) if err != nil { return nil, fmt.Errorf("parsing table for %q failed: %w", key, err) } options = append(options, children...) case []*ast.Table: for i, t := range v { key := fmt.Sprintf("%s#%d.%s", prefix, i, k) children, err := processTable(key, t) if err != nil { return nil, fmt.Errorf("parsing table for %q #%d failed: %w", key, i, err) } options = append(options, children...) } default: return nil, fmt.Errorf("unknown node type %T in key %q", value, prefix+k) } } return options, nil } func generatePluginID(prefix string, table *ast.Table) (string, error) { // We need to ensure that identically configured plugins _always_ // result in the same ID no matter which order the options are specified. // This is even more relevant as Golang does _not_ give any guarantee // on the ordering of maps. // So we flatten out the configuration options (also for nested objects) // and then sort the resulting array by the canonical key-name. cfg, err := processTable("", table) if err != nil { return "", fmt.Errorf("processing AST failed: %w", err) } sort.SliceStable(cfg, func(i, j int) bool { return cfg[i].Key < cfg[j].Key }) // Hash the config options to get the ID. We also prefix the ID with // the plugin name to prevent overlap with other plugin types. hash := sha256.New() hash.Write(append([]byte(prefix), 0)) for _, kv := range cfg { hash.Write([]byte(kv.Key + ":" + kv.Value)) hash.Write([]byte{0}) } return hex.EncodeToString(hash.Sum(nil)), nil } ================================================ FILE: config/plugin_printer.go ================================================ package config import ( "bytes" "fmt" "sort" "strings" "github.com/jedib0t/go-pretty/v6/table" ) var headers = []string{"Name", "Source(s)"} type pluginPrinter struct { name string source string } type pluginNames []pluginPrinter func getPluginSourcesTable(pluginNames []pluginPrinter) string { if !PrintPluginConfigSource { return "" } if len(pluginNames) == 0 { return "" } data := make([][]any, 0, len(pluginNames)) rows := make(map[string][]string) for _, plugin := range pluginNames { if _, ok := rows[plugin.name]; !ok { rows[plugin.name] = make([]string, 0) } rows[plugin.name] = append(rows[plugin.name], plugin.source) } for name, sources := range rows { var nameCountStr string if len(sources) > 1 { nameCountStr = fmt.Sprintf("%s (%dx)", name, len(sources)) } else { nameCountStr = name } data = append(data, []any{nameCountStr, sources}) } sort.Slice(data, func(i, j int) bool { return len(data[i][1].([]string)) > len(data[j][1].([]string)) }) return getTableString(headers, data) } func getTableString(headers []string, data [][]any) string { buff := new(bytes.Buffer) t := table.NewWriter() t.SetOutputMirror(buff) t.AppendHeader(convertToRow(headers)) // Append rows for _, row := range data { processedRow := make([]interface{}, len(row)) for i, col := range row { switch v := col.(type) { case []string: // Convert slices to multi-line strings var source map[string]int for _, s := range v { if source == nil { source = make(map[string]int) } source[s]++ } // sort the sources according to the count sources := make([]string, 0, len(source)) for s := range source { sources = append(sources, s) } sort.Slice(sources, func(i, j int) bool { return source[sources[i]] > source[sources[j]] }) for i, s := range sources { if source[s] > 1 { sources[i] = fmt.Sprintf("%s (%dx)", s, source[s]) } } processedRow[i] = strings.Join(sources, "\n") default: processedRow[i] = v } } t.AppendRow(processedRow) } t.Style().Options.SeparateRows = true return t.Render() } // Helper function to convert headers to table.Row func convertToRow(data []string) table.Row { row := make(table.Row, len(data)) for i, val := range data { row[i] = val } return row } ================================================ FILE: config/plugin_selector.go ================================================ package config import ( "fmt" "regexp" "slices" "strings" "github.com/influxdata/telegraf/filter" ) const ( selectorSeparator = ";" ) var ( // keyRegex matches a non empty string with A-Z, a-z, 0-9, -, _, . keyRegex = regexp.MustCompile(`^[A-Za-z0-9._-]+$`) // selectorValueRegex matches a non empty string A-Z, a-z, 0-9, -, _, ., *, ? selectorValueRegex = regexp.MustCompile(`^[A-Za-z0-9._\-*?]+$`) // labelValueRegex matches a non empty string with A-Z, a-z, 0-9, -, _, . labelValueRegex = regexp.MustCompile(`^[A-Za-z0-9._-]+$`) pluginLabelSelector labelSelector ) // CheckSelectionKeyValuePairs checks the key and value of a selector. func CheckSelectionKeyValuePairs(k, v string) error { if !keyRegex.MatchString(k) { return fmt.Errorf("invalid key %q", k) } if !selectorValueRegex.MatchString(v) { return fmt.Errorf("invalid value %q", v) } return nil } // CheckLabelKeyValuePairs checks the key and value of a label. func CheckLabelKeyValuePairs(k, v string) error { if !keyRegex.MatchString(k) { return fmt.Errorf("invalid key %q", k) } if !labelValueRegex.MatchString(v) { return fmt.Errorf("invalid value %q", v) } return nil } // SetPluginLabelSelections initializes the plugin label selector with // the given different selection groups. Within a group selectors are // combined via logical AND. Different selector groups are combined via OR. func SetPluginLabelSelections(selections []string) error { return pluginLabelSelector.setSelections(selections) } type labelSelector struct { groups []map[string]filter.Filter } func (l *labelSelector) setSelections(selections []string) error { // Pre-allocate the groups l.groups = make([]map[string]filter.Filter, 0, len(selections)) // Within each group, the selector key-value pairs are separated by selector(semi-colon). for _, selection := range selections { if err := l.addGroup(strings.Split(selection, selectorSeparator)); err != nil { return err } } return nil } func (l *labelSelector) addGroup(selection []string) error { // Skip empty selection // len(selection) can never be 0 if len(selection) == 1 && selection[0] == "" { return nil } // Parse the key-value pairs and create the corresponding filters group := make(map[string]filter.Filter, len(selection)) for _, s := range selection { k, v, found := strings.Cut(s, "=") if !found { return fmt.Errorf("invalid selector %q: missing equal sign", s) } k = strings.TrimSpace(k) if _, found := group[k]; found { return fmt.Errorf("duplicate selector key %q within one statement", k) } v = strings.TrimSpace(v) if err := CheckSelectionKeyValuePairs(k, v); err != nil { return fmt.Errorf("invalid selector %q: %w", s, err) } f, err := filter.Compile([]string{v}) if err != nil { return fmt.Errorf("compiling filter for selector %q failed: %w", s, err) } group[k] = f } // Add the new group for logical OR combination l.groups = append(l.groups, group) return nil } func (l *labelSelector) matches(labels map[string]string) bool { // Fallback to accepting all plugins without labels or if no select // statement specified via command line if len(labels) == 0 || len(l.groups) == 0 { return true } // Iterate over the filter groups and combine all filters within a group via // logical AND and the different groups via logical OR. return slices.ContainsFunc(l.groups, func(group map[string]filter.Filter) bool { for k, f := range group { if label, found := labels[k]; !found || !f.Match(label) { return false } } return true }) } ================================================ FILE: config/plugin_selector_test.go ================================================ package config import ( "testing" "github.com/stretchr/testify/require" ) func TestSetPluginLabelSelections(t *testing.T) { tests := []struct { name string selections []string expectedGroups []int // denotes the length of each group wantErr bool }{ { name: "single selectors", selections: []string{"env=prod", "region=dc-23"}, expectedGroups: []int{1, 1}, // two groups, each with one selector }, { name: "multiple selectors", selections: []string{"env=prod;region=dc-23", "env=dev;app=backend;policy=web"}, expectedGroups: []int{2, 3}, // two groups, one with two selectors and one with three }, { name: "invalid selector syntax", selections: []string{"env=prod;region=dc-23", "invalid-selector"}, wantErr: true, }, { name: "nil selectors", selections: nil, expectedGroups: []int{0}, }, { name: "empty selector", selections: []string{""}, expectedGroups: []int{0}, }, { name: "multiple empty selectors", selections: []string{"", "app=web;env=prod*", ""}, expectedGroups: []int{2}, // only one valid group with 2 selectors }, { name: "duplicate within group", selections: []string{"env=prod;app=web;env=staging"}, wantErr: true, }, { name: "invalid key", selections: []string{"invalid$key=prod", "region=dc-23"}, wantErr: true, }, { name: "invalid value", selections: []string{"env=prod;app=web;invalid=value&()"}, wantErr: true, }, { name: "empty value", selections: []string{"env=prod;app="}, wantErr: true, }, { name: "contains only _,-,*,?", selections: []string{"env=__-_*?"}, expectedGroups: []int{1}, }, { name: "regex check- character set", selections: []string{"Env123=456prOd;123=*456?", "p0-p1_p2.=_?*Env234_-"}, expectedGroups: []int{2, 1}, }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { var pluginSelector labelSelector err := pluginSelector.setSelections(tt.selections) if tt.wantErr { require.Error(t, err) return } require.NoError(t, err) for i, group := range pluginSelector.groups { require.Equal(t, len(group), tt.expectedGroups[i]) } }) } } func TestKeyRegex(t *testing.T) { tests := []struct { name string input string wantErr bool }{ // Valid {name: "simple", input: "abc"}, {name: "alphanumeric", input: "abc123"}, {name: "with-dash", input: "abc-123"}, {name: "with-dot", input: "abc.123"}, {name: "with-underscore", input: "abc_123"}, {name: "mixed", input: "A_z-9.X"}, {name: "single-char", input: "a"}, {name: "long-key", input: "abc.def-ghi_jkl.mno_123"}, {name: "starts-with-dot", input: ".abc"}, {name: "ends-with-dot", input: "abc."}, {name: "two-dots", input: "a..b"}, // Invalid {name: "empty", input: "", wantErr: true}, {name: "wildcard-star", input: "abc*", wantErr: true}, {name: "wildcard-question", input: "abc?", wantErr: true}, {name: "space", input: "abc def", wantErr: true}, {name: "unicode", input: "ümlaut", wantErr: true}, {name: "symbols", input: "abc$", wantErr: true}, {name: "slash", input: "abc/def", wantErr: true}, {name: "colon", input: "abc:def", wantErr: true}, {name: "comma", input: "abc,def", wantErr: true}, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { err := CheckSelectionKeyValuePairs(tt.input, "value") if tt.wantErr { require.Error(t, err) } }) } } func TestSelectorValueRegex(t *testing.T) { tests := []struct { name string input string wantErr bool }{ // Valid {name: "simple", input: "abc"}, {name: "with-wildcards", input: "a*b?c"}, {name: "only-star", input: "*"}, {name: "only-question", input: "?"}, {name: "mixed-wildcards", input: "*a?b*c*"}, {name: "alphanumeric", input: "abc123"}, {name: "combo", input: "A_z-9.X*?foo"}, {name: "dash-dot-underscore-wildcards", input: "a_b-c.d*?"}, {name: "ends-with-wildcard", input: "abc*"}, {name: "starts-with-wildcard", input: "*abc"}, {name: "wildcard-middle", input: "ab*cd?ef"}, {name: "long-value", input: "abc.def-ghi*jkl?mno_123"}, // Invalid {name: "empty", input: "", wantErr: true}, {name: "space", input: "abc def", wantErr: true}, {name: "unicode", input: "ümlaut", wantErr: true}, {name: "control-char", input: "abc\x00def", wantErr: true}, {name: "symbols", input: "abc$", wantErr: true}, {name: "slash", input: "abc/def", wantErr: true}, {name: "colon", input: "abc:def", wantErr: true}, {name: "comma", input: "abc,def", wantErr: true}, {name: "plus", input: "abc+def", wantErr: true}, {name: "pipe", input: "abc|def", wantErr: true}, {name: "caret", input: "abc^def", wantErr: true}, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { err := CheckSelectionKeyValuePairs("key", tt.input) if tt.wantErr { require.Error(t, err) } else { require.NoError(t, err) } }) } } func TestLabelValueRegex(t *testing.T) { tests := []struct { name string input string wantErr bool }{ // Valid {name: "simple", input: "abc"}, {name: "alphanumeric", input: "abc123"}, {name: "with-dash", input: "abc-123"}, {name: "with-dot", input: "abc.123"}, {name: "with-underscore", input: "abc_123"}, {name: "mixed", input: "A_z-9.X"}, {name: "single-char", input: "a"}, {name: "long", input: "abc.def-ghi_jkl.mno_123"}, {name: "starts-with-dot", input: ".abc"}, {name: "ends-with-dot", input: "abc."}, {name: "two-dots", input: "a..b"}, // Invalid {name: "empty", input: "", wantErr: true}, {name: "wildcard-star", input: "abc*", wantErr: true}, {name: "wildcard-question", input: "abc?", wantErr: true}, {name: "space", input: "abc def", wantErr: true}, {name: "unicode", input: "香港", wantErr: true}, {name: "symbols", input: "abc$", wantErr: true}, {name: "slash", input: "abc/def", wantErr: true}, {name: "comma", input: "abc,def", wantErr: true}, {name: "plus", input: "abc+def", wantErr: true}, {name: "caret", input: "abc^def", wantErr: true}, {name: "pipe", input: "abc|def", wantErr: true}, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { err := CheckLabelKeyValuePairs("key", tt.input) if tt.wantErr { require.Error(t, err) } else { require.NoError(t, err) } }) } } func TestMatches(t *testing.T) { tests := []struct { name string selectors []string labels map[string]string expected bool }{ { name: "[Backward Compatibility] No selectors, should run", selectors: nil, labels: map[string]string{"env": "prod"}, expected: true, }, { name: "[Backward Compatibility] No labels, should run", selectors: []string{"env=prod"}, labels: nil, expected: true, }, { name: "Simple exact match", selectors: []string{"env=prod"}, labels: map[string]string{"env": "prod"}, expected: true, }, { name: "Simple mismatch", selectors: []string{"env=prod"}, labels: map[string]string{"env": "dev"}, expected: false, }, { name: "extra labels ignored", selectors: []string{"env=prod"}, labels: map[string]string{"env": "prod", "region": "us-east"}, expected: true, }, { name: "AND inside selector (all match)", selectors: []string{"env=prod;region=dc-23"}, labels: map[string]string{"env": "prod", "region": "dc-23"}, expected: true, }, { name: "AND inside selector (partial match fail)", selectors: []string{"env=prod;region=dc-23"}, labels: map[string]string{"env": "prod", "region": "dc-24"}, expected: false, }, { name: "Simple Wildcard match", selectors: []string{"region=dc-*"}, labels: map[string]string{"region": "dc-23"}, expected: true, }, { name: "Simple Wildcard no match", selectors: []string{"region=us-*"}, labels: map[string]string{"region": "eu-1"}, expected: false, }, { name: "Simple Wildcard match with ?", selectors: []string{"region=eu-dc-?-north"}, labels: map[string]string{"region": "eu-dc-1-north"}, expected: true, }, { name: "Simple Wildcard mismatch with ?", selectors: []string{"region=eu-dc-?-north"}, labels: map[string]string{"region": "eu-dc-fail-north"}, expected: false, }, { name: "Multiple selectors (OR logic) - First matches", selectors: []string{"app=web;env=prod", "region=eu-*"}, labels: map[string]string{"app": "web", "env": "prod"}, expected: true, }, { name: "Multiple selectors (OR logic) - Second matches", selectors: []string{"app=web;env=prod", "region=eu-*"}, labels: map[string]string{"app": "web", "env": "staging", "region": "eu-west"}, expected: true, }, { name: "Multiple selectors (OR logic) - None matches", selectors: []string{"app=web;env=prod", "region=eu-*", "app=not-web"}, labels: map[string]string{"app": "api", "env": "staging", "region": "us-east"}, expected: false, }, { name: "Multiple labels and multiple selectors (AND logic)", selectors: []string{ "env=prod-*-dc-*;region=eu-*456", // this one should not match "simple=match", // this one should match }, // OR logic labels: map[string]string{ "env": "prod-23-dc-1something", "region": "eu-central-123", "simple": "match", }, expected: true, }, { name: "Multiple labels and single selector(Selective AND)", selectors: []string{"env=prod"}, labels: map[string]string{ "env": "prod", "region": "dc-23", "extra": "value", "extra2": "value2", }, expected: true, }, { name: "complex charset match", selectors: []string{"Env-123=prOd456;Env_456=_123prOd-", "Env-123=?456*;Env_456=_???pr0D*"}, labels: map[string]string{ "Env-123": "X456", "Env_456": "____pr0D123", }, expected: true, }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { pls := labelSelector{} require.NoError(t, pls.setSelections(tt.selectors)) require.Equal(t, tt.expected, pls.matches(tt.labels)) }) } } ================================================ FILE: config/secret.go ================================================ package config import ( "fmt" "log" "regexp" "strings" "sync/atomic" "github.com/influxdata/telegraf" ) // unlinkedSecrets contains the list of secrets that contain // references not yet linked to their corresponding secret-store. // Those secrets must later (after reading the config) be linked // by the config to their respective secret-stores. // Secrets containing constant strings will not be found in this // list. var unlinkedSecrets = make([]*Secret, 0) // secretStorePattern is a regex to validate secret-store IDs var secretStorePattern = regexp.MustCompile(`^\w+$`) // secretPattern is a regex to extract references to secrets store in a secret-store var secretPattern = regexp.MustCompile(`@\{(\w+:\w+)\}`) // secretCandidatePattern is a regex to find secret candidates to warn users on invalid characters in references var secretCandidatePattern = regexp.MustCompile(`@\{.+?:.+?}`) // secretCount is the number of secrets use in Telegraf var secretCount atomic.Int64 // selectedImpl is the configured implementation for secrets var selectedImpl secretImpl = &protectedSecretImpl{} // secretImpl represents an abstraction for different implementations of secrets type secretImpl interface { Container(secret []byte) secretContainer EmptyBuffer() SecretBuffer Wipe(secret []byte) } func EnableSecretProtection() { selectedImpl = &protectedSecretImpl{} } func DisableSecretProtection() { selectedImpl = &unprotectedSecretImpl{} } // secretContainer represents an abstraction of the container holding the // actual secret value type secretContainer interface { Destroy() Equals(ref []byte) (bool, error) Buffer() (SecretBuffer, error) AsBuffer(secret []byte) SecretBuffer Replace(secret []byte) } // SecretBuffer allows to access the content of the secret type SecretBuffer interface { // Size returns the length of the buffer content Size() int // Grow will grow the capacity of the underlying buffer to the given size Grow(capacity int) // Bytes returns the content of the buffer as bytes. // NOTE: The returned bytes shall NOT be accessed after destroying the // buffer using 'Destroy()' as the underlying the memory area might be // wiped and invalid. Bytes() []byte // TemporaryString returns the content of the buffer as a string. // NOTE: The returned String shall NOT be accessed after destroying the // buffer using 'Destroy()' as the underlying the memory area might be // wiped and invalid. TemporaryString() string // String returns a copy of the underlying buffer's content as string. // It is safe to use the returned value after destroying the buffer. String() string // Destroy will wipe the buffer's content and destroy the underlying // buffer. Do not access the buffer after destroying it. Destroy() } // Secret safely stores sensitive data such as a password or token type Secret struct { // container is the implementation for holding the secret. It can be // protected or not depending on the concrete implementation. container secretContainer // resolvers are the functions for resolving a given secret-id (key) resolvers map[string]telegraf.ResolveFunc // unlinked contains all references in the secret that are not yet // linked to the corresponding secret store. unlinked []string // notempty denotes if the secret is completely empty notempty bool } // NewSecret creates a new secret from the given bytes func NewSecret(b []byte) Secret { s := Secret{} s.init(b) return s } // UnmarshalText creates a secret from a toml value following the "string" rule. func (s *Secret) UnmarshalText(b []byte) error { // Unmarshal secret from TOML and put it into protected memory s.init(b) // Keep track of secrets that contain references to secret-stores // for later resolving by the config. if len(s.unlinked) > 0 && s.notempty { unlinkedSecrets = append(unlinkedSecrets, s) } return nil } // Initialize the secret content func (s *Secret) init(secret []byte) { // Keep track of the number of secrets... secretCount.Add(1) // Remember if the secret is completely empty s.notempty = len(secret) != 0 // Find all secret candidates and check if they are really a valid // reference. Otherwise issue a warning to let the user know that there is // a potential issue with their secret instead of silently ignoring it. candidates := secretCandidatePattern.FindAllString(string(secret), -1) s.unlinked = make([]string, 0, len(candidates)) for _, c := range candidates { if secretPattern.MatchString(c) { s.unlinked = append(s.unlinked, c) } else { log.Printf("W! Secret %q contains invalid character(s), only letters, digits and underscores are allowed.", c) } } s.resolvers = nil // Setup the container implementation s.container = selectedImpl.Container(secret) } // Destroy the secret content func (s *Secret) Destroy() { s.resolvers = nil s.unlinked = nil s.notempty = false if s.container != nil { s.container.Destroy() s.container = nil // Keep track of the number of used secrets... secretCount.Add(-1) } } // Empty return if the secret is completely empty func (s *Secret) Empty() bool { return !s.notempty } // EqualTo performs a constant-time comparison of the secret to the given reference func (s *Secret) EqualTo(ref []byte) (bool, error) { if s.container == nil { return false, nil } if len(s.unlinked) > 0 { return false, fmt.Errorf("unlinked parts in secret: %v", strings.Join(s.unlinked, ";")) } return s.container.Equals(ref) } // Get return the string representation of the secret func (s *Secret) Get() (SecretBuffer, error) { if s.container == nil { return selectedImpl.EmptyBuffer(), nil } if len(s.unlinked) > 0 { return nil, fmt.Errorf("unlinked parts in secret: %v", strings.Join(s.unlinked, ";")) } // Decrypt the secret so we can return it buffer, err := s.container.Buffer() if err != nil { return nil, err } // We've got a static secret so simply return the buffer if len(s.resolvers) == 0 { return buffer, nil } defer buffer.Destroy() replaceErrs := make([]string, 0) newsecret := secretPattern.ReplaceAllFunc(buffer.Bytes(), func(match []byte) []byte { resolver, found := s.resolvers[string(match)] if !found { replaceErrs = append(replaceErrs, fmt.Sprintf("no resolver for %q", match)) return match } replacement, _, err := resolver() if err != nil { replaceErrs = append(replaceErrs, fmt.Sprintf("resolving %q failed: %v", match, err)) return match } return replacement }) if len(replaceErrs) > 0 { selectedImpl.Wipe(newsecret) return nil, fmt.Errorf("replacing secrets failed: %s", strings.Join(replaceErrs, ";")) } return s.container.AsBuffer(newsecret), nil } // Set overwrites the secret's value with a new one. Please note, the secret // is not linked again, so only references to secret-stores can be used, e.g. by // adding more clear-text or reordering secrets. func (s *Secret) Set(value []byte) error { // Link the new value can be resolved secret, res, replaceErrs := resolve(value, s.resolvers) if len(replaceErrs) > 0 { return fmt.Errorf("linking new secrets failed: %s", strings.Join(replaceErrs, ";")) } // Set the new secret s.container.Replace(secret) s.resolvers = res s.notempty = len(value) > 0 return nil } // GetUnlinked return the parts of the secret that is not yet linked to a resolver func (s *Secret) GetUnlinked() []string { return s.unlinked } // Link used the given resolver map to link the secret parts to their // secret-store resolvers. func (s *Secret) Link(resolvers map[string]telegraf.ResolveFunc) error { // Decrypt the secret so we can return it if s.container == nil { return nil } buffer, err := s.container.Buffer() if err != nil { return err } defer buffer.Destroy() // Iterate through the parts and try to resolve them. For static parts // we directly replace them, while for dynamic ones we store the resolver. newsecret, res, replaceErrs := resolve(buffer.Bytes(), resolvers) if len(replaceErrs) > 0 { return fmt.Errorf("linking secrets failed: %s", strings.Join(replaceErrs, ";")) } s.resolvers = res // Store the secret if it has changed if buffer.TemporaryString() != string(newsecret) { s.container.Replace(newsecret) } // All linked now s.unlinked = nil return nil } func resolve(secret []byte, resolvers map[string]telegraf.ResolveFunc) ([]byte, map[string]telegraf.ResolveFunc, []string) { // Iterate through the parts and try to resolve them. For static parts // we directly replace them, while for dynamic ones we store the resolver. replaceErrs := make([]string, 0) remaining := make(map[string]telegraf.ResolveFunc) newsecret := secretPattern.ReplaceAllFunc(secret, func(match []byte) []byte { resolver, found := resolvers[string(match)] if !found { replaceErrs = append(replaceErrs, fmt.Sprintf("unlinked part %q", match)) return match } replacement, dynamic, err := resolver() if err != nil { replaceErrs = append(replaceErrs, fmt.Sprintf("resolving %q failed: %v", match, err)) return match } // Replace static parts right away if !dynamic { return replacement } // Keep the resolver for dynamic secrets remaining[string(match)] = resolver return match }) return newsecret, remaining, replaceErrs } func splitLink(s string) (storeID, key string) { // There should _ALWAYS_ be two parts due to the regular expression match parts := strings.SplitN(s[2:len(s)-1], ":", 2) return parts[0], parts[1] } ================================================ FILE: config/secret_protected.go ================================================ package config import ( "fmt" "github.com/awnumar/memguard" ) type protectedSecretImpl struct{} func (*protectedSecretImpl) Container(secret []byte) secretContainer { return &protectedSecretContainer{ enclave: memguard.NewEnclave(secret), } } func (*protectedSecretImpl) EmptyBuffer() SecretBuffer { return &lockedBuffer{} } func (*protectedSecretImpl) Wipe(secret []byte) { memguard.WipeBytes(secret) } type lockedBuffer struct { buf *memguard.LockedBuffer } func (lb *lockedBuffer) Size() int { if lb.buf == nil { return 0 } return lb.buf.Size() } func (lb *lockedBuffer) Grow(capacity int) { size := lb.Size() if capacity <= size { return } buf := memguard.NewBuffer(capacity) if lb.buf != nil { buf.Copy(lb.buf.Bytes()) } lb.buf.Destroy() lb.buf = buf } func (lb *lockedBuffer) Bytes() []byte { if lb.buf == nil { return nil } return lb.buf.Bytes() } func (lb *lockedBuffer) TemporaryString() string { if lb.buf == nil { return "" } return lb.buf.String() } func (lb *lockedBuffer) String() string { if lb.buf == nil { return "" } return string(lb.buf.Bytes()) } func (lb *lockedBuffer) Destroy() { if lb.buf == nil { return } lb.buf.Destroy() lb.buf = nil } type protectedSecretContainer struct { enclave *memguard.Enclave } func (c *protectedSecretContainer) Destroy() { if c.enclave == nil { return } // Wipe the secret from memory lockbuf, err := c.enclave.Open() if err == nil { lockbuf.Destroy() } c.enclave = nil } func (c *protectedSecretContainer) Equals(ref []byte) (bool, error) { if c.enclave == nil { return false, nil } // Get a locked-buffer of the secret to perform the comparison lockbuf, err := c.enclave.Open() if err != nil { return false, fmt.Errorf("opening enclave failed: %w", err) } defer lockbuf.Destroy() return lockbuf.EqualTo(ref), nil } func (c *protectedSecretContainer) Buffer() (SecretBuffer, error) { if c.enclave == nil { return &lockedBuffer{}, nil } // Get a locked-buffer of the secret to perform the comparison lockbuf, err := c.enclave.Open() if err != nil { return nil, fmt.Errorf("opening enclave failed: %w", err) } return &lockedBuffer{lockbuf}, nil } func (*protectedSecretContainer) AsBuffer(secret []byte) SecretBuffer { return &lockedBuffer{memguard.NewBufferFromBytes(secret)} } func (c *protectedSecretContainer) Replace(secret []byte) { c.enclave = memguard.NewEnclave(secret) } ================================================ FILE: config/secret_test.go ================================================ package config import ( "bytes" "errors" "fmt" "log" "testing" "github.com/awnumar/memguard" "github.com/stretchr/testify/require" "github.com/stretchr/testify/suite" "github.com/influxdata/telegraf" "github.com/influxdata/telegraf/plugins/inputs" "github.com/influxdata/telegraf/plugins/secretstores" ) func TestSecretConstantManually(t *testing.T) { mysecret := "a wonderful test" s := NewSecret([]byte(mysecret)) defer s.Destroy() retrieved, err := s.Get() require.NoError(t, err) defer retrieved.Destroy() require.EqualValues(t, mysecret, retrieved.TemporaryString()) } func TestLinking(t *testing.T) { mysecret := "a @{referenced:secret}" resolvers := map[string]telegraf.ResolveFunc{ "@{referenced:secret}": func() ([]byte, bool, error) { return []byte("resolved secret"), false, nil }, } s := NewSecret([]byte(mysecret)) defer s.Destroy() require.NoError(t, s.Link(resolvers)) retrieved, err := s.Get() require.NoError(t, err) defer retrieved.Destroy() require.EqualValues(t, "a resolved secret", retrieved.TemporaryString()) } func TestLinkingResolverError(t *testing.T) { mysecret := "a @{referenced:secret}" resolvers := map[string]telegraf.ResolveFunc{ "@{referenced:secret}": func() ([]byte, bool, error) { return nil, false, errors.New("broken") }, } s := NewSecret([]byte(mysecret)) defer s.Destroy() expected := `linking secrets failed: resolving "@{referenced:secret}" failed: broken` require.EqualError(t, s.Link(resolvers), expected) } func TestGettingUnlinked(t *testing.T) { mysecret := "a @{referenced:secret}" s := NewSecret([]byte(mysecret)) defer s.Destroy() _, err := s.Get() require.ErrorContains(t, err, "unlinked parts in secret") } func TestGettingMissingResolver(t *testing.T) { mysecret := "a @{referenced:secret}" s := NewSecret([]byte(mysecret)) defer s.Destroy() s.unlinked = make([]string, 0) s.resolvers = map[string]telegraf.ResolveFunc{ "@{a:dummy}": func() ([]byte, bool, error) { return nil, false, nil }, } _, err := s.Get() expected := `replacing secrets failed: no resolver for "@{referenced:secret}"` require.EqualError(t, err, expected) } func TestGettingResolverError(t *testing.T) { mysecret := "a @{referenced:secret}" s := NewSecret([]byte(mysecret)) defer s.Destroy() s.unlinked = make([]string, 0) s.resolvers = map[string]telegraf.ResolveFunc{ "@{referenced:secret}": func() ([]byte, bool, error) { return nil, false, errors.New("broken") }, } _, err := s.Get() expected := `replacing secrets failed: resolving "@{referenced:secret}" failed: broken` require.EqualError(t, err, expected) } func TestUninitializedEnclave(t *testing.T) { s := Secret{} defer s.Destroy() require.NoError(t, s.Link(map[string]telegraf.ResolveFunc{})) retrieved, err := s.Get() require.NoError(t, err) defer retrieved.Destroy() require.Empty(t, retrieved.Bytes()) } func TestEnclaveOpenError(t *testing.T) { mysecret := "a @{referenced:secret}" s := NewSecret([]byte(mysecret)) defer s.Destroy() memguard.Purge() err := s.Link(map[string]telegraf.ResolveFunc{}) require.ErrorContains(t, err, "opening enclave failed") s.unlinked = make([]string, 0) _, err = s.Get() require.ErrorContains(t, err, "opening enclave failed") } func TestMissingResolver(t *testing.T) { mysecret := "a @{referenced:secret}" s := NewSecret([]byte(mysecret)) defer s.Destroy() err := s.Link(map[string]telegraf.ResolveFunc{}) require.ErrorContains(t, err, "linking secrets failed: unlinked part") } func TestSecretConstant(t *testing.T) { tests := []struct { name string cfg []byte expected string }{ { name: "simple string", cfg: []byte(` [[inputs.mockup]] secret = "a secret" `), expected: "a secret", }, { name: "mail address", cfg: []byte(` [[inputs.mockup]] secret = "someone@mock.org" `), expected: "someone@mock.org", }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { c := NewConfig() require.NoError(t, c.LoadConfigData(tt.cfg, EmptySourcePath)) require.Len(t, c.Inputs, 1) // Create a mockup secretstore store := &MockupSecretStore{ Secrets: map[string][]byte{"mock": []byte("fail")}, } require.NoError(t, store.Init()) c.SecretStores["mock"] = store require.NoError(t, c.LinkSecrets()) plugin := c.Inputs[0].Input.(*MockupSecretPlugin) secret, err := plugin.Secret.Get() require.NoError(t, err) defer secret.Destroy() require.EqualValues(t, tt.expected, secret.TemporaryString()) }) } } func TestSecretUnquote(t *testing.T) { tests := []struct { name string cfg []byte }{ { name: "single quotes", cfg: []byte(` [[inputs.mockup]] secret = 'a secret' expected = 'a secret' `), }, { name: "double quotes", cfg: []byte(` [[inputs.mockup]] secret = "a secret" expected = "a secret" `), }, { name: "triple single quotes", cfg: []byte(` [[inputs.mockup]] secret = '''a secret''' expected = '''a secret''' `), }, { name: "triple double quotes", cfg: []byte(` [[inputs.mockup]] secret = """a secret""" expected = """a secret""" `), }, { name: "escaped double quotes", cfg: []byte(` [[inputs.mockup]] secret = "\"a secret\"" expected = "\"a secret\"" `), }, { name: "mix double-single quotes (single)", cfg: []byte(` [[inputs.mockup]] secret = "'a secret'" expected = "'a secret'" `), }, { name: "mix single-double quotes (single)", cfg: []byte(` [[inputs.mockup]] secret = '"a secret"' expected = '"a secret"' `), }, { name: "mix double-single quotes (triple-single)", cfg: []byte(` [[inputs.mockup]] secret = """'a secret'""" expected = """'a secret'""" `), }, { name: "mix single-double quotes (triple-single)", cfg: []byte(` [[inputs.mockup]] secret = '''"a secret"''' expected = '''"a secret"''' `), }, { name: "mix double-single quotes (triple)", cfg: []byte(` [[inputs.mockup]] secret = """'''a secret'''""" expected = """'''a secret'''""" `), }, { name: "mix single-double quotes (triple)", cfg: []byte(` [[inputs.mockup]] secret = '''"""a secret"""''' expected = '''"""a secret"""''' `), }, { name: "single quotes with backslashes", cfg: []byte(` [[inputs.mockup]] secret = 'Server=SQLTELEGRAF\\SQL2022;app name=telegraf;log=1;' expected = 'Server=SQLTELEGRAF\\SQL2022;app name=telegraf;log=1;' `), }, { name: "double quotes with backslashes", cfg: []byte(` [[inputs.mockup]] secret = "Server=SQLTELEGRAF\\SQL2022;app name=telegraf;log=1;" expected = "Server=SQLTELEGRAF\\SQL2022;app name=telegraf;log=1;" `), }, { name: "triple single quotes with backslashes", cfg: []byte(` [[inputs.mockup]] secret = '''Server=SQLTELEGRAF\\SQL2022;app name=telegraf;log=1;''' expected = '''Server=SQLTELEGRAF\\SQL2022;app name=telegraf;log=1;''' `), }, { name: "triple double quotes with backslashes", cfg: []byte(` [[inputs.mockup]] secret = """Server=SQLTELEGRAF\\SQL2022;app name=telegraf;log=1;""" expected = """Server=SQLTELEGRAF\\SQL2022;app name=telegraf;log=1;""" `), }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { c := NewConfig() require.NoError(t, c.LoadConfigData(tt.cfg, EmptySourcePath)) require.Len(t, c.Inputs, 1) // Create a mockup secretstore store := &MockupSecretStore{ Secrets: map[string][]byte{}, } require.NoError(t, store.Init()) c.SecretStores["mock"] = store require.NoError(t, c.LinkSecrets()) plugin := c.Inputs[0].Input.(*MockupSecretPlugin) secret, err := plugin.Secret.Get() require.NoError(t, err) defer secret.Destroy() require.EqualValues(t, plugin.Expected, secret.TemporaryString()) }) } } func TestSecretEnvironmentVariable(t *testing.T) { cfg := []byte(` [[inputs.mockup]] secret = "$SOME_ENV_SECRET" `) t.Setenv("SOME_ENV_SECRET", "an env secret") c := NewConfig() err := c.LoadConfigData(cfg, EmptySourcePath) require.NoError(t, err) require.Len(t, c.Inputs, 1) // Create a mockup secretstore store := &MockupSecretStore{ Secrets: map[string][]byte{}, } require.NoError(t, store.Init()) c.SecretStores["mock"] = store require.NoError(t, c.LinkSecrets()) plugin := c.Inputs[0].Input.(*MockupSecretPlugin) secret, err := plugin.Secret.Get() require.NoError(t, err) defer secret.Destroy() require.EqualValues(t, "an env secret", secret.TemporaryString()) } func TestSecretCount(t *testing.T) { secretCount.Store(0) cfg := []byte(` [[inputs.mockup]] [[inputs.mockup]] secret = "a secret" [[inputs.mockup]] secret = "another secret" `) c := NewConfig() require.NoError(t, c.LoadConfigData(cfg, EmptySourcePath)) require.Len(t, c.Inputs, 3) require.Equal(t, int64(2), secretCount.Load()) // Remove all secrets and check for _, ri := range c.Inputs { input := ri.Input.(*MockupSecretPlugin) input.Secret.Destroy() } require.Equal(t, int64(0), secretCount.Load()) } func TestSecretStoreStatic(t *testing.T) { cfg := []byte( ` [[inputs.mockup]] secret = "@{mock:secret1}" [[inputs.mockup]] secret = "@{mock:secret2}" [[inputs.mockup]] secret = "@{mock:a_strange_secret}" [[inputs.mockup]] secret = "@{mock:a_weird_secret}" `) c := NewConfig() err := c.LoadConfigData(cfg, EmptySourcePath) require.NoError(t, err) require.Len(t, c.Inputs, 4) // Create a mockup secretstore store := &MockupSecretStore{ Secrets: map[string][]byte{ "secret1": []byte("Ood Bnar"), "secret2": []byte("Thon"), "a_strange_secret": []byte("Obi-Wan Kenobi"), "a_weird_secret": []byte("Arca Jeth"), }, } require.NoError(t, store.Init()) c.SecretStores["mock"] = store require.NoError(t, c.LinkSecrets()) expected := []string{"Ood Bnar", "Thon", "Obi-Wan Kenobi", "Arca Jeth"} for i, input := range c.Inputs { plugin := input.Input.(*MockupSecretPlugin) secret, err := plugin.Secret.Get() require.NoError(t, err) require.EqualValues(t, expected[i], secret.TemporaryString()) secret.Destroy() } } func TestSecretStoreInvalidKeys(t *testing.T) { cfg := []byte( ` [[inputs.mockup]] secret = "@{mock:}" [[inputs.mockup]] secret = "@{mock:wild?%go}" [[inputs.mockup]] secret = "@{mock:a-strange-secret}" [[inputs.mockup]] secret = "@{mock:a weird secret}" `) c := NewConfig() err := c.LoadConfigData(cfg, EmptySourcePath) require.NoError(t, err) require.Len(t, c.Inputs, 4) // Create a mockup secretstore store := &MockupSecretStore{ Secrets: map[string][]byte{ "": []byte("Ood Bnar"), "wild?%go": []byte("Thon"), "a-strange-secret": []byte("Obi-Wan Kenobi"), "a weird secret": []byte("Arca Jeth"), }, } require.NoError(t, store.Init()) c.SecretStores["mock"] = store require.NoError(t, c.LinkSecrets()) expected := []string{ "@{mock:}", "@{mock:wild?%go}", "@{mock:a-strange-secret}", "@{mock:a weird secret}", } for i, input := range c.Inputs { plugin := input.Input.(*MockupSecretPlugin) secret, err := plugin.Secret.Get() require.NoError(t, err) require.EqualValues(t, expected[i], secret.TemporaryString()) secret.Destroy() } } func TestSecretStoreDeclarationMissingID(t *testing.T) { defer func() { unlinkedSecrets = make([]*Secret, 0) }() cfg := []byte(`[[secretstores.mockup]]`) c := NewConfig() err := c.LoadConfigData(cfg, EmptySourcePath) require.ErrorContains(t, err, `error parsing mockup, "mockup" secret-store without ID`) } func TestSecretStoreDeclarationInvalidID(t *testing.T) { defer func() { unlinkedSecrets = make([]*Secret, 0) }() invalidIDs := []string{"foo.bar", "dummy-123", "test!", "wohoo+"} tmpl := ` [[secretstores.mockup]] id = %q ` for _, id := range invalidIDs { t.Run(id, func(t *testing.T) { cfg := []byte(fmt.Sprintf(tmpl, id)) c := NewConfig() err := c.LoadConfigData(cfg, EmptySourcePath) require.ErrorContains(t, err, `error parsing mockup, invalid secret-store ID`) }) } } func TestSecretStoreDeclarationValidID(t *testing.T) { defer func() { unlinkedSecrets = make([]*Secret, 0) }() validIDs := []string{"foobar", "dummy123", "test_id", "W0Hoo_lala123"} tmpl := ` [[secretstores.mockup]] id = %q ` for _, id := range validIDs { t.Run(id, func(t *testing.T) { cfg := []byte(fmt.Sprintf(tmpl, id)) c := NewConfig() err := c.LoadConfigData(cfg, EmptySourcePath) require.NoError(t, err) }) } } type SecretImplTestSuite struct { suite.Suite protected bool } func (tsuite *SecretImplTestSuite) SetupSuite() { if tsuite.protected { EnableSecretProtection() } else { DisableSecretProtection() } } func (*SecretImplTestSuite) TearDownSuite() { EnableSecretProtection() } func (*SecretImplTestSuite) TearDownTest() { unlinkedSecrets = make([]*Secret, 0) } func (tsuite *SecretImplTestSuite) TestSecretEqualTo() { t := tsuite.T() mysecret := "a wonderful test" s := NewSecret([]byte(mysecret)) defer s.Destroy() equal, err := s.EqualTo([]byte(mysecret)) require.NoError(t, err) require.True(t, equal) equal, err = s.EqualTo([]byte("some random text")) require.NoError(t, err) require.False(t, equal) } func (tsuite *SecretImplTestSuite) TestSecretStoreInvalidReference() { t := tsuite.T() cfg := []byte( ` [[inputs.mockup]] secret = "@{mock:test}" `) c := NewConfig() require.NoError(t, c.LoadConfigData(cfg, EmptySourcePath)) require.Len(t, c.Inputs, 1) // Create a mockup secretstore store := &MockupSecretStore{ Secrets: map[string][]byte{"test": []byte("Arca Jeth")}, } require.NoError(t, store.Init()) c.SecretStores["foo"] = store err := c.LinkSecrets() require.EqualError(t, err, `unknown secret-store for "@{mock:test}"`) for _, input := range c.Inputs { plugin := input.Input.(*MockupSecretPlugin) secret, err := plugin.Secret.Get() require.EqualError(t, err, `unlinked parts in secret: @{mock:test}`) require.Empty(t, secret) } } func (tsuite *SecretImplTestSuite) TestSecretStoreStaticChanging() { t := tsuite.T() cfg := []byte( ` [[inputs.mockup]] secret = "@{mock:secret}" `) c := NewConfig() err := c.LoadConfigData(cfg, EmptySourcePath) require.NoError(t, err) require.Len(t, c.Inputs, 1) // Create a mockup secretstore store := &MockupSecretStore{ Secrets: map[string][]byte{"secret": []byte("Ood Bnar")}, Dynamic: false, } require.NoError(t, store.Init()) c.SecretStores["mock"] = store require.NoError(t, c.LinkSecrets()) sequence := []string{"Ood Bnar", "Thon", "Obi-Wan Kenobi", "Arca Jeth"} plugin := c.Inputs[0].Input.(*MockupSecretPlugin) secret, err := plugin.Secret.Get() require.NoError(t, err) defer secret.Destroy() require.EqualValues(t, "Ood Bnar", secret.TemporaryString()) for _, v := range sequence { store.Secrets["secret"] = []byte(v) secret, err := plugin.Secret.Get() require.NoError(t, err) // The secret should not change as the store is marked non-dyamic! require.EqualValues(t, "Ood Bnar", secret.TemporaryString()) secret.Destroy() } } func (tsuite *SecretImplTestSuite) TestSecretStoreDynamic() { t := tsuite.T() cfg := []byte( ` [[inputs.mockup]] secret = "@{mock:secret}" `) c := NewConfig() err := c.LoadConfigData(cfg, EmptySourcePath) require.NoError(t, err) require.Len(t, c.Inputs, 1) // Create a mockup secretstore store := &MockupSecretStore{ Secrets: map[string][]byte{"secret": []byte("Ood Bnar")}, Dynamic: true, } require.NoError(t, store.Init()) c.SecretStores["mock"] = store require.NoError(t, c.LinkSecrets()) sequence := []string{"Ood Bnar", "Thon", "Obi-Wan Kenobi", "Arca Jeth"} plugin := c.Inputs[0].Input.(*MockupSecretPlugin) for _, v := range sequence { store.Secrets["secret"] = []byte(v) secret, err := plugin.Secret.Get() require.NoError(t, err) // The secret should not change as the store is marked non-dynamic! require.EqualValues(t, v, secret.TemporaryString()) secret.Destroy() } } func (tsuite *SecretImplTestSuite) TestSecretSet() { t := tsuite.T() cfg := []byte(` [[inputs.mockup]] secret = "a secret" `) c := NewConfig() require.NoError(t, c.LoadConfigData(cfg, EmptySourcePath)) require.Len(t, c.Inputs, 1) require.NoError(t, c.LinkSecrets()) plugin := c.Inputs[0].Input.(*MockupSecretPlugin) secret, err := plugin.Secret.Get() require.NoError(t, err) defer secret.Destroy() require.EqualValues(t, "a secret", secret.TemporaryString()) require.NoError(t, plugin.Secret.Set([]byte("another secret"))) newsecret, err := plugin.Secret.Get() require.NoError(t, err) defer newsecret.Destroy() require.EqualValues(t, "another secret", newsecret.TemporaryString()) } func (tsuite *SecretImplTestSuite) TestSecretSetResolve() { t := tsuite.T() cfg := []byte(` [[inputs.mockup]] secret = "@{mock:secret}" `) c := NewConfig() require.NoError(t, c.LoadConfigData(cfg, EmptySourcePath)) require.Len(t, c.Inputs, 1) // Create a mockup secretstore store := &MockupSecretStore{ Secrets: map[string][]byte{"secret": []byte("Ood Bnar")}, Dynamic: true, } require.NoError(t, store.Init()) c.SecretStores["mock"] = store require.NoError(t, c.LinkSecrets()) plugin := c.Inputs[0].Input.(*MockupSecretPlugin) secret, err := plugin.Secret.Get() require.NoError(t, err) defer secret.Destroy() require.EqualValues(t, "Ood Bnar", secret.TemporaryString()) require.NoError(t, plugin.Secret.Set([]byte("@{mock:secret} is cool"))) newsecret, err := plugin.Secret.Get() require.NoError(t, err) defer newsecret.Destroy() require.EqualValues(t, "Ood Bnar is cool", newsecret.TemporaryString()) } func (tsuite *SecretImplTestSuite) TestSecretSetResolveInvalid() { t := tsuite.T() cfg := []byte(` [[inputs.mockup]] secret = "@{mock:secret}" `) c := NewConfig() require.NoError(t, c.LoadConfigData(cfg, EmptySourcePath)) require.Len(t, c.Inputs, 1) // Create a mockup secretstore store := &MockupSecretStore{ Secrets: map[string][]byte{"secret": []byte("Ood Bnar")}, Dynamic: true, } require.NoError(t, store.Init()) c.SecretStores["mock"] = store require.NoError(t, c.LinkSecrets()) plugin := c.Inputs[0].Input.(*MockupSecretPlugin) secret, err := plugin.Secret.Get() require.NoError(t, err) defer secret.Destroy() require.EqualValues(t, "Ood Bnar", secret.TemporaryString()) err = plugin.Secret.Set([]byte("@{mock:another_secret}")) require.ErrorContains(t, err, `linking new secrets failed: unlinked part "@{mock:another_secret}"`) } func (tsuite *SecretImplTestSuite) TestSecretInvalidWarn() { t := tsuite.T() // Intercept the log output var buf bytes.Buffer backup := log.Writer() log.SetOutput(&buf) defer log.SetOutput(backup) cfg := []byte(` [[inputs.mockup]] secret = "server=a user=@{mock:secret-with-invalid-chars} pass=@{mock:secret_pass}" `) c := NewConfig() require.NoError(t, c.LoadConfigData(cfg, EmptySourcePath)) require.Len(t, c.Inputs, 1) require.Contains(t, buf.String(), `W! Secret "@{mock:secret-with-invalid-chars}" contains invalid character(s)`) require.NotContains(t, buf.String(), "@{mock:secret_pass}") } func TestSecretImplUnprotected(t *testing.T) { impl := &unprotectedSecretImpl{} container := impl.Container([]byte("foobar")) require.NotNil(t, container) c, ok := container.(*unprotectedSecretContainer) require.True(t, ok) require.Equal(t, "foobar", string(c.buf.content)) buf, err := container.Buffer() require.NoError(t, err) require.NotNil(t, buf) require.Equal(t, []byte("foobar"), buf.Bytes()) require.Equal(t, "foobar", buf.TemporaryString()) require.Equal(t, "foobar", buf.String()) } func TestSecretImplTestSuiteUnprotected(t *testing.T) { suite.Run(t, &SecretImplTestSuite{protected: false}) } func TestSecretImplTestSuiteProtected(t *testing.T) { suite.Run(t, &SecretImplTestSuite{protected: true}) } // Mockup (input) plugin for testing to avoid cyclic dependencies type MockupSecretPlugin struct { Secret Secret `toml:"secret"` Expected string `toml:"expected"` } func (*MockupSecretPlugin) SampleConfig() string { return "Mockup test secret plugin" } func (*MockupSecretPlugin) Gather(_ telegraf.Accumulator) error { return nil } type MockupSecretStore struct { Secrets map[string][]byte Dynamic bool } func (*MockupSecretStore) Init() error { return nil } func (*MockupSecretStore) SampleConfig() string { return "Mockup test secret plugin" } func (s *MockupSecretStore) Get(key string) ([]byte, error) { v, found := s.Secrets[key] if !found { return nil, errors.New("not found") } return v, nil } func (s *MockupSecretStore) Set(key, value string) error { s.Secrets[key] = []byte(value) return nil } func (s *MockupSecretStore) List() ([]string, error) { keys := make([]string, 0, len(s.Secrets)) for k := range s.Secrets { keys = append(keys, k) } return keys, nil } func (s *MockupSecretStore) GetResolver(key string) (telegraf.ResolveFunc, error) { return func() ([]byte, bool, error) { v, err := s.Get(key) return v, s.Dynamic, err }, nil } // Register the mockup plugin on loading func init() { // Register the mockup input plugin for the required names inputs.Add("mockup", func() telegraf.Input { return &MockupSecretPlugin{} }) secretstores.Add("mockup", func(string) telegraf.SecretStore { return &MockupSecretStore{} }) } ================================================ FILE: config/secret_unprotected.go ================================================ package config import ( "bytes" "unsafe" ) type unprotectedSecretImpl struct{} func (*unprotectedSecretImpl) Container(secret []byte) secretContainer { return &unprotectedSecretContainer{buf: newUnlockedBuffer(secret)} } func (*unprotectedSecretImpl) EmptyBuffer() SecretBuffer { return &unlockedBuffer{} } func (*unprotectedSecretImpl) Wipe(secret []byte) { for i := range secret { secret[i] = 0 } } type unlockedBuffer struct { content []byte } func newUnlockedBuffer(secret []byte) *unlockedBuffer { return &unlockedBuffer{bytes.Clone(secret)} } func (lb *unlockedBuffer) Size() int { return len(lb.content) } func (*unlockedBuffer) Grow(int) { // The underlying byte-buffer will grow dynamically } func (lb *unlockedBuffer) Bytes() []byte { return lb.content } func (lb *unlockedBuffer) TemporaryString() string { //nolint:gosec // G103: Valid use of unsafe call to cast underlying bytes to string return unsafe.String(&lb.content[0], len(lb.content)) } func (lb *unlockedBuffer) String() string { return string(lb.content) } func (lb *unlockedBuffer) Destroy() { selectedImpl.Wipe(lb.content) lb.content = nil } type unprotectedSecretContainer struct { buf *unlockedBuffer } func (c *unprotectedSecretContainer) Destroy() { if c.buf == nil { return } // Wipe the secret from memory c.buf.Destroy() c.buf = nil } func (c *unprotectedSecretContainer) Equals(ref []byte) (bool, error) { if c.buf == nil { return false, nil } return bytes.Equal(c.buf.content, ref), nil } func (c *unprotectedSecretContainer) Buffer() (SecretBuffer, error) { if c.buf == nil { return &unlockedBuffer{}, nil } return newUnlockedBuffer(c.buf.content), nil } func (*unprotectedSecretContainer) AsBuffer(secret []byte) SecretBuffer { return &unlockedBuffer{secret} } func (c *unprotectedSecretContainer) Replace(secret []byte) { c.buf = newUnlockedBuffer(secret) } ================================================ FILE: config/testdata/addressbook.proto ================================================ syntax = "proto3"; package addressbook; message Person { string name = 1; int32 id = 2; // Unique ID number for this person. string email = 3; uint32 age = 4; enum PhoneType { MOBILE = 0; HOME = 1; WORK = 2; } message PhoneNumber { string number = 1; PhoneType type = 2; } repeated PhoneNumber phones = 5; } message AddressBook { repeated Person people = 1; repeated string tags = 2; } ================================================ FILE: config/testdata/azure_monitor.toml ================================================ [[outputs.azure_monitor]] [[outputs.azure_monitor]] namespace_prefix = "" ================================================ FILE: config/testdata/default_parser.toml ================================================ [[inputs.file]] files = ["metrics"] ================================================ FILE: config/testdata/default_parser_exec.toml ================================================ [[inputs.exec]] command = '/usr/bin/echo {"value": 42}' ================================================ FILE: config/testdata/deprecated_field_filter.toml ================================================ [[inputs.file]] pass = ["foo"] fieldpass = ["bar"] fieldinclude = ["baz"] drop = ["foo"] fielddrop = ["bar"] fieldexclude = ["baz"] ================================================ FILE: config/testdata/envvar_comments.toml ================================================ # Telegraf Configuration # # Telegraf is entirely plugin driven. All metrics are gathered from the # declared inputs, and sent to the declared outputs. # # Plugins must be declared in here to be active. # To deactivate a plugin, comment out the name and any variables. # # Use 'telegraf -config telegraf.conf -test' to see what metrics a config # file would generate. # # Environment variables can be used anywhere in this config file, simply surround # them with ${}. For strings the variable must be within quotes (ie, "${STR_VAR}"), # for numbers and booleans they should be plain (ie, ${INT_VAR}, ${BOOL_VAR}) [global_tags] [agent] interval = "10s" round_interval = true metric_batch_size = 1000 metric_buffer_limit = 10000 collection_jitter = "0s" flush_interval = '10s' flush_jitter = "0s" precision = "" hostname = '' omit_hostname = false [[outputs.influxdb]] setting1 = '#'#test setting2 = '''#'''#test setting3 = "#"#test setting4 = """#"""#test wicked1 = "\""#test wicked2 = """\""""#test [[inputs.cpu]] percpu = true #totalcpu = true # collect_cpu_time = false ## report_active = false [[a.plugin]] mylist = [ "value 1", # a good value "value 2", # a better value "value 3", "value 4", 'value5', """tagwith#value""", ] # Should work [[some.stuff]] a = 'not a #comment' b = '''not a #comment''' c = "not a #comment" d = """not a #comment""" e = '''not a #comment containing "quotes"''' f = '''not a #comment containing 'quotes'?''' g = """not a #comment containing "quotes"?""" # Issue #14237 [[inputs.myplugin]] value = '''This isn't a #comment.''' [[processors.starlark]] script = """ # Drop fields if they contain a string. # # Example Input: # measurement,host=hostname a=1,b="somestring" 1597255410000000000 # # Example Output: # measurement,host=hostname a=1 1597255410000000000 def apply(metric): for k, v in metric.fields.items(): if type(v) == "string": metric.fields.pop(k) return metric """ [[processors.starlark]] script = ''' # Drop fields if they contain a string. # # Example Input: # measurement,host=hostname a=1,b="somestring" 1597255410000000000 # # Example Output: # measurement,host=hostname a=1 1597255410000000000 def apply(metric): for k, v in metric.fields.items(): if type(v) == "string": metric.fields.pop(k) return metric ''' ================================================ FILE: config/testdata/envvar_comments_expected.toml ================================================ [global_tags] [agent] interval = "10s" round_interval = true metric_batch_size = 1000 metric_buffer_limit = 10000 collection_jitter = "0s" flush_interval = '10s' flush_jitter = "0s" precision = "" hostname = '' omit_hostname = false [[outputs.influxdb]] setting1 = '#' setting2 = '''#''' setting3 = "#" setting4 = """#""" wicked1 = "\"" wicked2 = """\"""" [[inputs.cpu]] percpu = true [[a.plugin]] mylist = [ "value 1", "value 2", "value 3", "value 4", 'value5', """tagwith#value""", ] [[some.stuff]] a = 'not a #comment' b = '''not a #comment''' c = "not a #comment" d = """not a #comment""" e = '''not a #comment containing "quotes"''' f = '''not a #comment containing 'quotes'?''' g = """not a #comment containing "quotes"?""" [[inputs.myplugin]] value = '''This isn't a #comment.''' [[processors.starlark]] script = """ # Drop fields if they contain a string. # # Example Input: # measurement,host=hostname a=1,b="somestring" 1597255410000000000 # # Example Output: # measurement,host=hostname a=1 1597255410000000000 def apply(metric): for k, v in metric.fields.items(): if type(v) == "string": metric.fields.pop(k) return metric """ [[processors.starlark]] script = ''' # Drop fields if they contain a string. # # Example Input: # measurement,host=hostname a=1,b="somestring" 1597255410000000000 # # Example Output: # measurement,host=hostname a=1 1597255410000000000 def apply(metric): for k, v in metric.fields.items(): if type(v) == "string": metric.fields.pop(k) return metric ''' ================================================ FILE: config/testdata/envvar_malicious.conf ================================================ [[inputs.memcached]] # this comment line will be ignored by the parser servers = ["my.server.com"] port = 8080 ##### this input is provided to test multiline strings command = """ Raw command which may or may not contain # in it # is unique""" # Multiline comment black starting with # pidfile = "${PIDFILE}" ================================================ FILE: config/testdata/envvar_non_string.conf ================================================ [[inputs.memcached]] # this comment line will be ignored by the parser servers = ["$MY_TEST_SERVER"] port = ${PORT} ##### this input is provided to test multiline strings command = """ Raw command which may or may not contain # in it # is unique""" # Multiline comment black starting with # ================================================ FILE: config/testdata/envvar_non_string_multiline.conf ================================================ [[inputs.memcached]] # this comment line will be ignored by the parser servers = ["$MY_TEST_SERVER"] port = ${PORT} ##### this input is provided to test multiline strings command = ''' ${COMMAND} ''' ================================================ FILE: config/testdata/envvar_valid.conf ================================================ [[inputs.memcached]] # this comment line will be ignored by the parser servers = ["$MY_TEST_SERVER"] port = 8080 ##### this input is provided to test multiline strings command = """ Raw command which may or may not contain # in it # is unique""" # Multiline comment black starting with # ================================================ FILE: config/testdata/envvar_valid_multiline.conf ================================================ [[inputs.memcached]] # this comment line will be ignored by the parser servers = ["$MY_TEST_SERVER"] port = 8080 ##### this input is provided to test multiline strings command = ''' ${COMMAND} ''' ================================================ FILE: config/testdata/filter_metricpass.toml ================================================ [[processors.processor]] metricpass = '("state" in tags && tags.state == "on") || time > timestamp("2023-04-24T00:00:00Z")' ================================================ FILE: config/testdata/inline_table.toml ================================================ [[outputs.http]] headers = { Authorization = "Token $TOKEN",Content-Type = "application/json" } taginclude = ["org_id"] [[outputs.http]] headers = { Authorization = "Token $TOKEN",Content-Type = "application/json" } taginclude = ["org_id"] ================================================ FILE: config/testdata/invalid_field.toml ================================================ [[inputs.http_listener_v2]] not_a_field = true ================================================ FILE: config/testdata/invalid_field_in_parser_table.toml ================================================ [[inputs.parser]] data_format = "xpath_json" [[inputs.parser.xpath]] not_a_field = true ================================================ FILE: config/testdata/invalid_field_in_parserfunc_table.toml ================================================ [[inputs.parser_func]] data_format = "xpath_json" [[inputs.parser_func.xpath]] not_a_field = true ================================================ FILE: config/testdata/invalid_field_processor.toml ================================================ [[processors.processor]] not_a_field = true ================================================ FILE: config/testdata/invalid_field_processor_in_parser.toml ================================================ [[processors.processor_parser]] not_a_field = true data_format = "influx" ================================================ FILE: config/testdata/invalid_field_processor_in_parser_table.toml ================================================ [[processors.processor_parser]] data_format = "xpath_json" [[processors.processor_parser.xpath]] not_a_field = true ================================================ FILE: config/testdata/invalid_field_processor_in_parserfunc.toml ================================================ [[processors.processor_parserfunc]] not_a_field = true data_format = "influx" ================================================ FILE: config/testdata/invalid_field_processor_in_parserfunc_table.toml ================================================ [[inputs.parser_func]] data_format = "xpath_json" [[inputs.parser_func.xpath]] not_a_field = true ================================================ FILE: config/testdata/invalid_field_processor_with_parser.toml ================================================ [[processors.processor_parser]] not_a_field = true data_format = "influx" ================================================ FILE: config/testdata/invalid_field_processor_with_parserfunc.toml ================================================ [[processors.processor_parserfunc]] not_a_field = true data_format = "influx" ================================================ FILE: config/testdata/invalid_field_with_parser.toml ================================================ [[inputs.parser]] not_a_field = true data_format = "influx" ================================================ FILE: config/testdata/invalid_field_with_parserfunc.toml ================================================ [[inputs.parser_func]] not_a_field = true data_format = "influx" ================================================ FILE: config/testdata/non_slice_slice.toml ================================================ [[outputs.http]] [outputs.http.headers] Content-Type = "application/json" taginclude = ["org_id"] ================================================ FILE: config/testdata/parsers_new.toml ================================================ [[inputs.parser_test_new]] data_format = "collectd" [[inputs.parser_test_new]] data_format = "csv" csv_header_row_count = 42 [[inputs.parser_test_new]] data_format = "dropwizard" [[inputs.parser_test_new]] data_format = "form_urlencoded" [[inputs.parser_test_new]] data_format = "graphite" [[inputs.parser_test_new]] data_format = "grok" grok_patterns = ["%{COMBINED_LOG_FORMAT}"] [[inputs.parser_test_new]] data_format = "influx" [[inputs.parser_test_new]] data_format = "json" [[inputs.parser_test_new]] data_format = "json_v2" [[inputs.parser_test_new.json_v2]] [[inputs.parser_test_new.json_v2.field]] path = "" rename = "" type = "int" [[inputs.parser_test_new]] data_format = "logfmt" [[inputs.parser_test_new]] data_format = "nagios" [[inputs.parser_test_new]] data_format = "prometheus" [[inputs.parser_test_new]] data_format = "prometheusremotewrite" [[inputs.parser_test_new]] data_format = "value" [[inputs.parser_test_new]] data_format = "wavefront" [[inputs.parser_test_new]] data_format = "xml" [[inputs.parser_test_new]] data_format = "xpath_json" [[inputs.parser_test_new]] data_format = "xpath_msgpack" [[inputs.parser_test_new]] data_format = "xpath_protobuf" xpath_protobuf_file = "testdata/addressbook.proto" xpath_protobuf_type = "addressbook.AddressBook" ================================================ FILE: config/testdata/processor_order/multiple_processors.toml ================================================ [[processors.processor]] [[processors.parser_test]] [[processors.processor_parser]] [[processors.processor_parserfunc]] ================================================ FILE: config/testdata/processor_order/multiple_processors_messy_order.toml ================================================ [[processors.parser_test]] [[processors.processor_parser]] order = 2 [[processors.processor_parserfunc]] [[processors.processor]] order = 1 [[processors.processor_parser]] order = 3 [[processors.processor_parserfunc]] order = 3 ================================================ FILE: config/testdata/processor_order/multiple_processors_simple_order.toml ================================================ [[processors.parser_test]] [[processors.processor_parser]] [[processors.processor_parserfunc]] [[processors.processor]] order = 1 ================================================ FILE: config/testdata/processors_with_parsers.toml ================================================ [[processors.parser_test]] data_format = "collectd" [[processors.parser_test]] data_format = "csv" csv_header_row_count = 42 [[processors.parser_test]] data_format = "dropwizard" [[processors.parser_test]] data_format = "form_urlencoded" [[processors.parser_test]] data_format = "graphite" [[processors.parser_test]] data_format = "grok" grok_patterns = ["%{COMBINED_LOG_FORMAT}"] [[processors.parser_test]] data_format = "influx" [[processors.parser_test]] data_format = "json" [[processors.parser_test]] data_format = "json_v2" [[processors.parser_test.json_v2]] [[processors.parser_test.json_v2.field]] path = "" rename = "" type = "int" [[processors.parser_test]] data_format = "logfmt" [[processors.parser_test]] data_format = "nagios" [[processors.parser_test]] data_format = "prometheus" [[processors.parser_test]] data_format = "prometheusremotewrite" [[processors.parser_test]] data_format = "value" [[processors.parser_test]] data_format = "wavefront" [[processors.parser_test]] data_format = "xml" [[processors.parser_test]] data_format = "xpath_json" [[processors.parser_test]] data_format = "xpath_msgpack" [[processors.parser_test]] data_format = "xpath_protobuf" xpath_protobuf_file = "testdata/addressbook.proto" xpath_protobuf_type = "addressbook.AddressBook" ================================================ FILE: config/testdata/serializers_new.toml ================================================ [[outputs.serializer_test_new]] data_format = "carbon2" [[outputs.serializer_test_new]] data_format = "csv" [[outputs.serializer_test_new]] data_format = "graphite" [[outputs.serializer_test_new]] data_format = "influx" [[outputs.serializer_test_new]] data_format = "json" [[outputs.serializer_test_new]] data_format = "msgpack" [[outputs.serializer_test_new]] data_format = "nowmetric" [[outputs.serializer_test_new]] data_format = "prometheus" [[outputs.serializer_test_new]] data_format = "prometheusremotewrite" [[outputs.serializer_test_new]] data_format = "splunkmetric" [[outputs.serializer_test_new]] data_format = "wavefront" ================================================ FILE: config/testdata/serializers_old.toml ================================================ [[outputs.serializer_test_old]] data_format = "carbon2" [[outputs.serializer_test_old]] data_format = "csv" [[outputs.serializer_test_old]] data_format = "graphite" [[outputs.serializer_test_old]] data_format = "influx" [[outputs.serializer_test_old]] data_format = "json" [[outputs.serializer_test_old]] data_format = "msgpack" [[outputs.serializer_test_old]] data_format = "nowmetric" [[outputs.serializer_test_old]] data_format = "prometheus" [[outputs.serializer_test_old]] data_format = "prometheusremotewrite" [[outputs.serializer_test_old]] data_format = "splunkmetric" [[outputs.serializer_test_old]] data_format = "wavefront" ================================================ FILE: config/testdata/single_plugin.toml ================================================ [[inputs.memcached]] servers = ["localhost"] namepass = ["metricname1"] namedrop = ["metricname2"] fieldinclude = ["some", "strings"] fieldexclude = ["other", "stuff"] interval = "5s" [inputs.memcached.tagpass] goodtag = ["mytag"] [inputs.memcached.tagdrop] badtag = ["othertag"] ================================================ FILE: config/testdata/single_plugin_env_vars.toml ================================================ # Telegraf Configuration # # Telegraf is entirely plugin driven. All metrics are gathered from the # declared inputs, and sent to the declared outputs. # # Plugins must be declared in here to be active. # To deactivate a plugin, comment out the name and any variables. # # Use 'telegraf -config telegraf.conf -test' to see what metrics a config # file would generate. # # Environment variables can be used anywhere in this config file, simply surround # them with ${}. For strings the variable must be within quotes (ie, "${STR_VAR}"), # for numbers and booleans they should be plain (ie, ${INT_VAR}, ${BOOL_VAR}) [[inputs.memcached]] # this comment line will be ignored by the parser servers = ["$MY_TEST_SERVER"] namepass = ["metricname1", "ip_${MY_TEST_SERVER}_name"] # this comment will be ignored as well namedrop = ["metricname2"] fieldinclude = ["some", "strings"] fieldexclude = ["other", "stuff"] interval = "$TEST_INTERVAL" ##### this input is provided to test multiline strings command = """ Raw command which may or may not contain # in it # is unique""" # Multiline comment black starting with # [inputs.memcached.tagpass] goodtag = ["mytag", """tagwith#value""", # comment in between array items # should ignore "quotes" in comments '''TagWithMultilineSyntax''', ## ignore this comment ] # hastag [inputs.memcached.tagdrop] badtag = ["othertag"] ================================================ FILE: config/testdata/single_plugin_with_comment_in_array.toml ================================================ [[inputs.memcached]] servers = [ # A comment in the array "localhost" ] ================================================ FILE: config/testdata/single_plugin_with_separators.toml ================================================ [[inputs.memcached]] servers = ["localhost"] namepass = ["metricname1"] namepass_separator = "." namedrop = ["metricname2"] namedrop_separator = "." fieldinclude = ["some", "strings"] fieldexclude = ["other", "stuff"] interval = "5s" [inputs.memcached.tagpass] goodtag = ["mytag"] [inputs.memcached.tagdrop] badtag = ["othertag"] ================================================ FILE: config/testdata/slice_comment.toml ================================================ [[outputs.http]] scopes = [ # comment "test" # comment ] ================================================ FILE: config/testdata/special_types.key ================================================ -----BEGIN EC PRIVATE KEY----- MHcCAQEEIFYI4Hm+jRW3OC3zvoWDaCig6E7X0Ql9l8elHPU3e5+toAoGCCqGSM49 AwEHoUQDQgAEGOw1XQ84Ai3GTZJ5o5u1yTFgA3VLZTTT0oHol06LRj5Md3oRy0MQ QO5OhsAGGz16SYcPHf77aZmf2Of6ixYaLQ== -----END EC PRIVATE KEY----- ================================================ FILE: config/testdata/special_types.pem ================================================ -----BEGIN CERTIFICATE----- MIIBjTCCATOgAwIBAgIRALJ1hlgDYCh5dWfr6tdrBEYwCgYIKoZIzj0EAwIwFDES MBAGA1UEAxMJbG9jYWxob3N0MB4XDTIyMDExMjA3NTgyMloXDTIyMDExMzA3NTgy MlowFDESMBAGA1UEAxMJbG9jYWxob3N0MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcD QgAEGOw1XQ84Ai3GTZJ5o5u1yTFgA3VLZTTT0oHol06LRj5Md3oRy0MQQO5OhsAG Gz16SYcPHf77aZmf2Of6ixYaLaNmMGQwDgYDVR0PAQH/BAQDAgeAMB0GA1UdJQQW MBQGCCsGAQUFBwMBBggrBgEFBQcDAjAdBgNVHQ4EFgQUuKpGXAb1DaVSffJ/xuF6 FE31CC8wFAYDVR0RBA0wC4IJbG9jYWxob3N0MAoGCCqGSM49BAMCA0gAMEUCIHCb m2phe189gftRke2Mo45lDsEAGaXsjA4lO/IOMo5lAiEA5k2X0bQfFhSfAcZPFtDI iUwvC9SD3+CnzkP35O0jo+c= -----END CERTIFICATE----- ================================================ FILE: config/testdata/special_types.toml ================================================ [[inputs.http_listener_v2]] write_timeout = "1s" max_body_size = "1MiB" paths = [ """ /path/ """ ] tls_cert = """./testdata/special_types.pem""" tls_key = '''./testdata/special_types.key''' ================================================ FILE: config/testdata/state_persistence_input_all_different.toml ================================================ [[inputs.statetest]] [[inputs.statetest]] servers = ["myserver.com", "myserver.org"] [[inputs.statetest]] servers = ["myserver.org", "myserver.com"] [[inputs.statetest]] servers = ["myserver.org", "myserver.com"] port = 0 [[inputs.statetest]] servers = ["myserver.org", "myserver.com"] port = 80 method = "strange" [inputs.statetest.params] a = "foo" b = "bar" [[inputs.statetest]] servers = ["myserver.org", "myserver.com"] port = 80 method = "strange" setup = [ {name="alpha", factor=3.1415, enabled=true, bits=[1,2,3]} ] [inputs.statetest.params] a = "foo" b = "bar" [[inputs.statetest]] servers = ["myserver.org", "myserver.com"] port = 80 method = "strange" setup = [ {name="alpha", factor=3.1415, enabled=true, bits=[1,2,3]}, {name="beta", factor=2.71828, enabled=true, bits=[1,2,3]} ] [inputs.statetest.params] a = "foo" b = "bar" ================================================ FILE: config/testdata/state_persistence_input_all_same.toml ================================================ [[inputs.statetest]] servers = ["myserver.org", "myserver.com"] port = 80 method = "strange" setup = [ {name="alpha", factor=3.1415, enabled=true, bits=[1,2,3]}, {name="beta", factor=2.71828, enabled=true, bits=[1,2,3]} ] [inputs.statetest.params] a = "foo" b = "bar" [[inputs.statetest]] ## What a wonderful world... servers = ["myserver.org", "myserver.com"] port = 80 method = "strange" setup = [ {name="alpha", factor=3.1415, enabled=true, bits=[1,2,3]}, {name="beta", factor=2.71828, enabled=true, bits=[1,2,3]} ] [inputs.statetest.params] a = "foo" b = "bar" [[inputs.statetest]] servers = ["myserver.org", "myserver.com"] method = "strange" setup = [ {name="alpha", factor=3.1415, enabled=true, bits=[1,2,3]}, {name="beta", factor=2.71828, enabled=true, bits=[1,2,3]} ] port = 80 [inputs.statetest.params] a = "foo" b = "bar" [[inputs.statetest]] servers = ["myserver.org", "myserver.com"] port = 80 method = "strange" setup = [ {name="alpha", factor=3.1415, enabled=true, bits=[1,2,3]}, {name="beta", factor=2.71828, enabled=true, bits=[1,2,3]} ] [inputs.statetest.params] b = "bar" a = "foo" [[inputs.statetest]] method = "strange" servers = ["myserver.org", "myserver.com"] port = 80 setup = [ {name="alpha", factor=3.1415, enabled=true, bits=[1,2,3]}, {name="beta", factor=2.71828, enabled=true, bits=[1,2,3]} ] [inputs.statetest.params] a = "foo" b = "bar" ================================================ FILE: config/testdata/state_persistence_input_store_load.toml ================================================ [[inputs.statetest]] servers = ["myserverA.org"] port = 42 method = "strange" [[inputs.statetest]] servers = ["myserverB.org"] port = 23 method = "strange" [[inputs.statetest]] servers = ["myserverC.org"] port = 80 method = "strange" [inputs.statetest.params] a = "foo" b = "bar" ================================================ FILE: config/testdata/state_persistence_processors.toml ================================================ [[processors.statetest]] option = "foo" [[processors.statetest]] option = "bar" [[processors.statetest]] option = "captain obvious" ================================================ FILE: config/testdata/subconfig/exec.conf ================================================ [[inputs.exec]] # the command to run command = "/usr/bin/myothercollector --foo=bar" name_suffix = "_myothercollector" ================================================ FILE: config/testdata/subconfig/memcached.conf ================================================ [[inputs.memcached]] servers = ["192.168.1.1"] namepass = ["metricname1"] namedrop = ["metricname2"] pass = ["some", "strings"] drop = ["other", "stuff"] interval = "5s" [inputs.memcached.tagpass] goodtag = ["mytag"] [inputs.memcached.tagdrop] badtag = ["othertag"] ================================================ FILE: config/testdata/subconfig/procstat.conf ================================================ [[inputs.procstat]] pid_file = "/var/run/grafana-server.pid" ================================================ FILE: config/testdata/telegraf-agent.toml ================================================ # Telegraf configuration # Telegraf is entirely plugin driven. All metrics are gathered from the # declared inputs. # Even if a plugin has no configuration, it must be declared in here # to be active. Declaring a plugin means just specifying the name # as a section with no variables. To deactivate a plugin, comment # out the name and any variables. # Use 'telegraf -config telegraf.toml -test' to see what metrics a config # file would generate. # One rule that plugins conform to is wherever a connection string # can be passed, the values '' and 'localhost' are treated specially. # They indicate to the plugin to use their own builtin configuration to # connect to the local system. # NOTE: The configuration has a few required parameters. They are marked # with 'required'. Be sure to edit those to make this configuration work. # Tags can also be specified via a normal map, but only one form at a time: [global_tags] dc = "us-east-1" # Configuration for telegraf agent [agent] # Default data collection interval for all plugins interval = "10s" # run telegraf in debug mode debug = false # Override default hostname, if empty use os.Hostname() hostname = "" ############################################################################### # OUTPUTS # ############################################################################### # Configuration for influxdb server to send metrics to [[outputs.influxdb]] # The full HTTP endpoint URL for your InfluxDB instance # Multiple urls can be specified for InfluxDB cluster support. Server to # write to will be randomly chosen each interval. urls = ["http://localhost:8086"] # required. # The target database for metrics. This database must already exist database = "telegraf" # required. [[outputs.influxdb]] urls = ["udp://localhost:8089"] database = "udp-telegraf" # Configuration for the Kafka server to send metrics to [[outputs.kafka]] # URLs of kafka brokers brokers = ["localhost:9092"] # Kafka topic for producer messages topic = "telegraf" # Telegraf tag to use as a routing key # ie, if this tag exists, its value will be used as the routing key routing_tag = "host" ############################################################################### # PLUGINS # ############################################################################### # Read Apache status information (mod_status) [[inputs.apache]] # An array of Apache status URI to gather stats. urls = ["http://localhost/server-status?auto"] # Read metrics about cpu usage [[inputs.cpu]] # Whether to report per-cpu stats or not percpu = true # Whether to report total system cpu stats or not totalcpu = true # Comment this line if you want the raw CPU time metrics fieldexclude = ["cpu_time"] # Read metrics about disk usage by mount point [[inputs.diskio]] # no configuration # Read metrics from one or many disque servers [[inputs.disque]] # An array of URI to gather stats about. Specify an ip or hostname # with optional port and password. ie disque://localhost, disque://10.10.3.33:18832, # 10.0.0.1:10000, etc. # # If no servers are specified, then localhost is used as the host. servers = ["localhost"] # Read stats from one or more Elasticsearch servers or clusters [[inputs.elasticsearch]] # specify a list of one or more Elasticsearch servers servers = ["http://localhost:9200"] # set local to false when you want to read the indices stats from all nodes # within the cluster local = true # Read flattened metrics from one or more commands that output JSON to stdout [[inputs.exec]] # the command to run command = "/usr/bin/mycollector --foo=bar" name_suffix = "_mycollector" # Read metrics of haproxy, via socket or csv stats page [[inputs.haproxy]] # An array of address to gather stats about. Specify an ip on hostname # with optional port. ie localhost, 10.10.3.33:1936, etc. # # If no servers are specified, then default to 127.0.0.1:1936 servers = ["http://myhaproxy.com:1936", "http://anotherhaproxy.com:1936"] # Or you can also use local socket(not work yet) # servers = ["socket:/run/haproxy/admin.sock"] # Read flattened metrics from one or more JSON HTTP endpoints [[inputs.http]] # a name for the service being polled name_override = "webserver_stats" # URL of each server in the service's cluster urls = [ "http://localhost:9999/stats/", "http://localhost:9998/stats/", ] # HTTP method to use (case-sensitive) # method = "GET" data_format = "json" # Read metrics about disk IO by device [[inputs.diskio]] # no configuration # read metrics from a Kafka 0.9+ topic [[inputs.kafka_consumer]] ## kafka brokers brokers = ["localhost:9092"] ## topic(s) to consume topics = ["telegraf"] ## the name of the consumer group consumer_group = "telegraf_metrics_consumers" ## Offset (must be either "oldest" or "newest") offset = "oldest" # Read metrics from a LeoFS Server via SNMP [[inputs.leofs]] # An array of URI to gather stats about LeoFS. # Specify an ip or hostname with port. ie 127.0.0.1:4020 # # If no servers are specified, then 127.0.0.1 is used as the host and 4020 as the port. servers = ["127.0.0.1:4021"] # Read metrics about memory usage [[inputs.mem]] # no configuration # Read metrics from one or many memcached servers [[inputs.memcached]] # An array of address to gather stats about. Specify an ip on hostname # with optional port. ie localhost, 10.0.0.1:11211, etc. # # If no servers are specified, then localhost is used as the host. servers = ["localhost"] # Telegraf plugin for gathering metrics from N Mesos masters [[inputs.mesos]] # Timeout, in ms. timeout = 100 # A list of Mesos masters, default value is localhost:5050. masters = ["localhost:5050"] # Metrics groups to be collected, by default, all enabled. master_collections = ["resources","master","system","slaves","frameworks","messages","evqueue","registrar"] # Read metrics from one or many MongoDB servers [[inputs.mongodb]] # An array of URI to gather stats about. Specify an ip or hostname # with optional port add password. ie mongodb://user:auth_key@10.10.3.30:27017, # mongodb://10.10.3.33:18832, 10.0.0.1:10000, etc. # # If no servers are specified, then 127.0.0.1 is used as the host and 27107 as the port. servers = ["127.0.0.1:27017"] # Read metrics from one or many mysql servers [[inputs.mysql]] # specify servers via a url matching: # [username[:password]@][protocol[(address)]]/[?tls=[true|false|skip-verify]] # e.g. # servers = ["root:root@http://10.0.0.18/?tls=false"] # servers = ["root:passwd@tcp(127.0.0.1:3306)/"] # # If no servers are specified, then localhost is used as the host. servers = ["localhost"] # Read metrics about network interface usage [[inputs.net]] # By default, telegraf gathers stats from any up interface (excluding loopback) # Setting interfaces will tell it to gather these explicit interfaces, # regardless of status. # # interfaces = ["eth0", ... ] # Read Nginx's basic status information (ngx_http_stub_status_module) [[inputs.nginx]] # An array of Nginx stub_status URI to gather stats. urls = ["http://localhost/status"] # Ping given url(s) and return statistics [[inputs.ping]] # urls to ping urls = ["www.google.com"] # required # number of pings to send (ping -c ) count = 1 # required # interval, in s, at which to ping. 0 == default (ping -i ) ping_interval = 0.0 # ping timeout, in s. 0 == no timeout (ping -t ) timeout = 0.0 # interface to send ping from (ping -I ) interface = "" # Read metrics from one or many postgresql servers [[inputs.postgresql]] # specify address via a url matching: # postgres://[pqgotest[:password]]@localhost[/dbname]?sslmode=[disable|verify-ca|verify-full] # or a simple string: # host=localhost user=pqgotest password=... sslmode=... dbname=app_production # # All connection parameters are optional. By default, the host is localhost # and the user is the currently running user. For localhost, we default # to sslmode=disable as well. # # Without the dbname parameter, the driver will default to a database # with the same name as the user. This dbname is just for instantiating a # connection with the server and doesn't restrict the databases we are trying # to grab metrics for. # address = "sslmode=disable" # A list of databases to pull metrics about. If not specified, metrics for all # databases are gathered. # databases = ["app_production", "blah_testing"] # [[postgresql.servers]] # address = "influx@remoteserver" # Read metrics from one or many prometheus clients [[inputs.prometheus]] # An array of urls to scrape metrics from. urls = ["http://localhost:9100/metrics"] # Read metrics from one or many RabbitMQ servers via the management API [[inputs.rabbitmq]] # Specify servers via an array of tables # name = "rmq-server-1" # optional tag # url = "http://localhost:15672" # username = "guest" # password = "guest" # A list of nodes to pull metrics about. If not specified, metrics for # all nodes are gathered. # nodes = ["rabbit@node1", "rabbit@node2"] # Read metrics from one or many redis servers [[inputs.redis]] # An array of URI to gather stats about. Specify an ip or hostname # with optional port add password. ie redis://localhost, redis://10.10.3.33:18832, # 10.0.0.1:10000, etc. # # If no servers are specified, then localhost is used as the host. servers = ["localhost"] # Read metrics from one or many RethinkDB servers [[inputs.rethinkdb]] # An array of URI to gather stats about. Specify an ip or hostname # with optional port add password. ie rethinkdb://user:auth_key@10.10.3.30:28105, # rethinkdb://10.10.3.33:18832, 10.0.0.1:10000, etc. # # If no servers are specified, then 127.0.0.1 is used as the host and 28015 as the port. servers = ["127.0.0.1:28015"] # Read metrics about swap memory usage [[inputs.swap]] # no configuration # Read metrics about system load & uptime [[inputs.system]] # no configuration ================================================ FILE: config/testdata/wrong_cert_path.toml ================================================ [[inputs.http_listener_v2]] write_timeout = "1s" max_body_size = "1MiB" tls_cert = "invalid.pem" tls_key = "invalid.key" ================================================ FILE: config/testdata/wrong_field_type.toml ================================================ [[inputs.http_listener_v2]] port = "80" ================================================ FILE: config/testdata/wrong_field_type2.toml ================================================ [[inputs.http_listener_v2]] methods = "POST" ================================================ FILE: config/types.go ================================================ package config import ( "fmt" "regexp" "strconv" "strings" "time" "github.com/alecthomas/units" ) // Regexp for day specifications in durations var durationDayRe = regexp.MustCompile(`(\d+(?:\.\d+)?)d`) // Duration is a time.Duration type Duration time.Duration // Size is an int64 type Size int64 // UnmarshalText parses the duration from the Text config file func (d *Duration) UnmarshalText(b []byte) error { // convert to string durStr := string(b) // Value is a TOML number (e.g. 3, 10, 3.5) // First try parsing as integer seconds sI, err := strconv.ParseInt(durStr, 10, 64) if err == nil { dur := time.Second * time.Duration(sI) *d = Duration(dur) return nil } // Second try parsing as float seconds sF, err := strconv.ParseFloat(durStr, 64) if err == nil { dur := float64(time.Second) * sF *d = Duration(dur) return nil } // Finally, try value is a TOML string (e.g. "3s", 3s) or literal (e.g. '3s') if durStr == "" { *d = Duration(0) return nil } // Handle "day" intervals and replace them with the "hours" equivalent for _, m := range durationDayRe.FindAllStringSubmatch(durStr, -1) { days, err := strconv.ParseFloat(m[1], 64) if err != nil { return fmt.Errorf("converting %q to hours failed: %w", durStr, err) } hours := strconv.FormatFloat(days*24, 'f', -1, 64) + "h" durStr = strings.Replace(durStr, m[0], hours, 1) } dur, err := time.ParseDuration(durStr) if err != nil { return err } *d = Duration(dur) return nil } func (s *Size) UnmarshalText(b []byte) error { if len(b) == 0 { return nil } str := string(b) val, err := strconv.ParseInt(str, 10, 64) if err == nil { *s = Size(val) return nil } val, err = units.ParseStrictBytes(str) if err != nil { return err } *s = Size(val) return nil } ================================================ FILE: config/types_test.go ================================================ package config_test import ( "testing" "time" "github.com/stretchr/testify/require" "github.com/influxdata/telegraf" "github.com/influxdata/telegraf/config" "github.com/influxdata/telegraf/plugins/inputs" "github.com/influxdata/telegraf/plugins/processors/reverse_dns" ) func TestConfigDuration(t *testing.T) { c := config.NewConfig() err := c.LoadConfigData([]byte(` [[processors.reverse_dns]] cache_ttl = "3h" lookup_timeout = "17s" max_parallel_lookups = 13 ordered = true [[processors.reverse_dns.lookup]] field = "source_ip" dest = "source_name" `), config.EmptySourcePath) require.NoError(t, err) require.Len(t, c.Processors, 1) p := c.Processors[0].Processor.(*reverse_dns.ReverseDNS) require.EqualValues(t, 3*time.Hour, p.CacheTTL) require.EqualValues(t, 17*time.Second, p.LookupTimeout) require.Equal(t, 13, p.MaxParallelLookups) require.True(t, p.Ordered) } func TestDuration(t *testing.T) { var d config.Duration d = config.Duration(0) require.NoError(t, d.UnmarshalText([]byte(`1s`))) require.Equal(t, time.Second, time.Duration(d)) d = config.Duration(0) require.NoError(t, d.UnmarshalText([]byte(`10`))) require.Equal(t, 10*time.Second, time.Duration(d)) d = config.Duration(0) require.NoError(t, d.UnmarshalText([]byte(`1.5`))) require.Equal(t, 1500*time.Millisecond, time.Duration(d)) d = config.Duration(0) require.NoError(t, d.UnmarshalText([]byte(``))) require.Equal(t, 0*time.Second, time.Duration(d)) require.Error(t, d.UnmarshalText([]byte(`"1"`))) // string missing unit require.Error(t, d.UnmarshalText([]byte(`'2'`))) // string missing unit require.Error(t, d.UnmarshalText([]byte(`'ns'`))) // string missing time require.Error(t, d.UnmarshalText([]byte(`'us'`))) // string missing time } func TestSize(t *testing.T) { var s config.Size require.NoError(t, s.UnmarshalText([]byte(`1B`))) require.Equal(t, int64(1), int64(s)) s = config.Size(0) require.NoError(t, s.UnmarshalText([]byte(`1`))) require.Equal(t, int64(1), int64(s)) s = config.Size(0) require.NoError(t, s.UnmarshalText([]byte(`1GB`))) require.Equal(t, int64(1000*1000*1000), int64(s)) s = config.Size(0) require.NoError(t, s.UnmarshalText([]byte(`12GiB`))) require.Equal(t, int64(12*1024*1024*1024), int64(s)) } func TestTOMLParsingStringDurations(t *testing.T) { cfg := []byte(` [[inputs.typesmockup]] durations = [ "1s", '''1s''', '1s', "1.5s", "", '', "2h", "42m", "100ms", "100us", "100ns", "1d", "7.5d", "7d8h15m", "3d7d", "15m8h3.5d" ] `) expected := []time.Duration{ 1 * time.Second, 1 * time.Second, 1 * time.Second, 1500 * time.Millisecond, 0, 0, 2 * time.Hour, 42 * time.Minute, 100 * time.Millisecond, 100 * time.Microsecond, 100 * time.Nanosecond, 24 * time.Hour, 7*24*time.Hour + 12*time.Hour, 7*24*time.Hour + 8*time.Hour + 15*time.Minute, 10 * 24 * time.Hour, 3*24*time.Hour + 12*time.Hour + 8*time.Hour + 15*time.Minute, } // Load the data c := config.NewConfig() err := c.LoadConfigData(cfg, config.EmptySourcePath) require.NoError(t, err) require.Len(t, c.Inputs, 1) plugin := c.Inputs[0].Input.(*MockupTypesPlugin) require.Empty(t, plugin.Sizes) require.Len(t, plugin.Durations, len(expected)) for i, actual := range plugin.Durations { require.EqualValuesf(t, expected[i], actual, "case %d failed", i) } } func TestTOMLParsingIntegerDurations(t *testing.T) { cfg := []byte(` [[inputs.typesmockup]] durations = [ 1, 10, 3601 ] `) expected := []time.Duration{ 1 * time.Second, 10 * time.Second, 3601 * time.Second, } // Load the data c := config.NewConfig() err := c.LoadConfigData(cfg, config.EmptySourcePath) require.NoError(t, err) require.Len(t, c.Inputs, 1) plugin := c.Inputs[0].Input.(*MockupTypesPlugin) require.Empty(t, plugin.Sizes) require.Len(t, plugin.Durations, len(expected)) for i, actual := range plugin.Durations { require.EqualValuesf(t, expected[i], actual, "case %d failed", i) } } func TestTOMLParsingFloatDurations(t *testing.T) { cfg := []byte(` [[inputs.typesmockup]] durations = [ 42.0, 1.5 ] `) expected := []time.Duration{ 42 * time.Second, 1500 * time.Millisecond, } // Load the data c := config.NewConfig() err := c.LoadConfigData(cfg, config.EmptySourcePath) require.NoError(t, err) require.Len(t, c.Inputs, 1) plugin := c.Inputs[0].Input.(*MockupTypesPlugin) require.Empty(t, plugin.Sizes) require.Len(t, plugin.Durations, len(expected)) for i, actual := range plugin.Durations { require.EqualValuesf(t, expected[i], actual, "case %d failed", i) } } func TestTOMLParsingStringSizes(t *testing.T) { cfg := []byte(` [[inputs.typesmockup]] sizes = [ "1B", "1", '1', '''15kB''', """15KiB""", "1GB", "12GiB" ] `) expected := []int64{ 1, 1, 1, 15 * 1000, 15 * 1024, 1000 * 1000 * 1000, 12 * 1024 * 1024 * 1024, } // Load the data c := config.NewConfig() err := c.LoadConfigData(cfg, config.EmptySourcePath) require.NoError(t, err) require.Len(t, c.Inputs, 1) plugin := c.Inputs[0].Input.(*MockupTypesPlugin) require.Empty(t, plugin.Durations) require.Len(t, plugin.Sizes, len(expected)) for i, actual := range plugin.Sizes { require.EqualValuesf(t, expected[i], actual, "case %d failed", i) } } func TestTOMLParsingIntegerSizes(t *testing.T) { cfg := []byte(` [[inputs.typesmockup]] sizes = [ 0, 1, 1000, 1024 ] `) expected := []int64{ 0, 1, 1000, 1024, } // Load the data c := config.NewConfig() err := c.LoadConfigData(cfg, config.EmptySourcePath) require.NoError(t, err) require.Len(t, c.Inputs, 1) plugin := c.Inputs[0].Input.(*MockupTypesPlugin) require.Empty(t, plugin.Durations) require.Len(t, plugin.Sizes, len(expected)) for i, actual := range plugin.Sizes { require.EqualValuesf(t, expected[i], actual, "case %d failed", i) } } // Mockup (input) plugin for testing to avoid cyclic dependencies type MockupTypesPlugin struct { Durations []config.Duration `toml:"durations"` Sizes []config.Size `toml:"sizes"` } func (*MockupTypesPlugin) SampleConfig() string { return "Mockup test types plugin" } func (*MockupTypesPlugin) Gather(_ telegraf.Accumulator) error { return nil } // Register the mockup plugin on loading func init() { // Register the mockup input plugin for the required names inputs.Add("typesmockup", func() telegraf.Input { return &MockupTypesPlugin{} }) } ================================================ FILE: docs/AGGREGATORS.md ================================================ # Aggregator Plugins This section is for developers who want to create a new aggregator plugin. ## Aggregator Plugin Guidelines * A aggregator must conform to the [telegraf.Aggregator][] interface. * Aggregators should call `aggregators.Add` in their `init` function to register themselves. See below for a quick example. * To be available within Telegraf itself, plugins must register themselves using a file in `github.com/influxdata/telegraf/plugins/aggregators/all` named according to the plugin name. Make sure you also add build-tags to conditionally build the plugin. * Each plugin requires a file called `sample.conf` containing the sample configuration for the plugin in TOML format. Please consult the [Sample Config][] page for the latest style guidelines. * Each plugin `README.md` file should include the `sample.conf` file in a section describing the configuration by specifying a `toml` section in the form `toml @sample.conf`. The specified file(s) are then injected automatically into the Readme. * The Aggregator plugin will need to keep caches of metrics that have passed through it. This should be done using the builtin `HashID()` function of each metric. * When the `Reset()` function is called, all caches should be cleared. * Follow the recommended [Code Style][]. [telegraf.Aggregator]: https://godoc.org/github.com/influxdata/telegraf#Aggregator [Sample Config]: /docs/developers/SAMPLE_CONFIG.md [Code Style]: /docs/developers/CODE_STYLE.md ### Aggregator Plugin Example ### Registration Registration of the plugin on `plugins/aggregators/all/min.go`: ```go //go:build !custom || aggregators || aggregators.min package all import _ "github.com/influxdata/telegraf/plugins/aggregators/min" // register plugin ``` The _build-tags_ in the first line allow to selectively include/exclude your plugin when customizing Telegraf. ### Plugin Content of your plugin file e.g. `min.go` ```go //go:generate ../../../tools/readme_config_includer/generator package min // min.go import ( _ "embed" "github.com/influxdata/telegraf" "github.com/influxdata/telegraf/plugins/aggregators" ) //go:embed sample.conf var sampleConfig string type Min struct { // caches for metric fields, names, and tags fieldCache map[uint64]map[string]float64 nameCache map[uint64]string tagCache map[uint64]map[string]string } func NewMin() telegraf.Aggregator { m := &Min{} m.Reset() return m } func (*Min) SampleConfig() string { return sampleConfig } func (m *Min) Init() error { return nil } func (m *Min) Add(in telegraf.Metric) { id := in.HashID() if _, ok := m.nameCache[id]; !ok { // hit an uncached metric, create caches for first time: m.nameCache[id] = in.Name() m.tagCache[id] = in.Tags() m.fieldCache[id] = make(map[string]float64) for k, v := range in.Fields() { if fv, ok := convert(v); ok { m.fieldCache[id][k] = fv } } } else { for k, v := range in.Fields() { if fv, ok := convert(v); ok { if _, ok := m.fieldCache[id][k]; !ok { // hit an uncached field of a cached metric m.fieldCache[id][k] = fv continue } if fv < m.fieldCache[id][k] { // set new minimum m.fieldCache[id][k] = fv } } } } } func (m *Min) Push(acc telegraf.Accumulator) { for id, _ := range m.nameCache { fields := map[string]interface{}{} for k, v := range m.fieldCache[id] { fields[k+"_min"] = v } acc.AddFields(m.nameCache[id], fields, m.tagCache[id]) } } func (m *Min) Reset() { m.fieldCache = make(map[uint64]map[string]float64) m.nameCache = make(map[uint64]string) m.tagCache = make(map[uint64]map[string]string) } func convert(in interface{}) (float64, bool) { switch v := in.(type) { case float64: return v, true case int64: return float64(v), true default: return 0, false } } func init() { aggregators.Add("min", func() telegraf.Aggregator { return NewMin() }) } ``` ================================================ FILE: docs/AGGREGATORS_AND_PROCESSORS.md ================================================ # Aggregator & Processor Plugins Telegraf has the concept of aggregator and processor plugins, which sit between inputs and outputs. These plugins allow a user to do additional processing or aggregation to collected metrics. ```text ┌───────────┐ │ │ │ CPU │───┐ │ │ │ └───────────┘ │ │ ┌───────────┐ │ ┌───────────┐ │ │ │ │ │ │ Memory │───┤ ┌──▶│ InfluxDB │ │ │ │ │ │ │ └───────────┘ │ ┌─────────────┐ ┌─────────────┐ │ └───────────┘ │ │ │ │Aggregators │ │ ┌───────────┐ │ │Processors │ │ - mean │ │ ┌───────────┐ │ │ │ │ - transform │ │ - quantiles │ │ │ │ │ MySQL │───┼───▶│ - decorate │────▶│ - min/max │───┼──▶│ File │ │ │ │ │ - filter │ │ - count │ │ │ │ └───────────┘ │ │ │ │ │ │ └───────────┘ │ └─────────────┘ └─────────────┘ │ ┌───────────┐ │ │ ┌───────────┐ │ │ │ │ │ │ │ SNMP │───┤ └──▶│ Kafka │ │ │ │ │ │ └───────────┘ │ └───────────┘ │ ┌───────────┐ │ │ │ │ │ Docker │───┘ │ │ └───────────┘ ``` ## Ordering Processors are run first, then aggregators, then processors a second time. Allowing processors to run again after aggregators gives users the opportunity to run a processor on any aggregated metrics. This behavior can be a bit surprising to new users and may cause weird behavior in metrics. For example, if the user scales data, it could get scaled twice! To disable this behavior set the `skip_processors_after_aggregators` agent configuration setting to true. Another option is to use metric filtering as described below. ## Metric Filtering Use [metric filtering][] to control which metrics are passed through a processor or aggregator. If a metric is filtered out the metric bypasses the plugin and is passed downstream to the next plugin. [metric filtering]: CONFIGURATION.md#measurement-filtering ## Processor Processor plugins process metrics as they pass through and immediately emit results based on the values they process. For example, this could be printing all metrics or adding a tag to all metrics that pass through. See the [processors][] for a full list of processor plugins available. [processors]: https://github.com/influxdata/telegraf/tree/master/plugins/processors ## Aggregator Aggregator plugins, on the other hand, are a bit more complicated. Aggregators are typically for emitting new _aggregate_ metrics, such as a running mean, minimum, maximum, or standard deviation. For this reason, all _aggregator_ plugins are configured with a `period`. The `period` is the size of the window of metrics that each _aggregate_ represents. In other words, the emitted _aggregate_ metric will be the aggregated value of the past `period` seconds. Since many users will only care about their aggregates and not every single metric gathered, there is also a `drop_original` argument, which tells Telegraf to only emit the aggregates and not the original metrics. Since aggregates are created for each measurement, field, and unique tag combination the plugin receives, you can make use of `taginclude` to group aggregates by specific tags only. See the [aggregators][] for a full list of aggregator plugins available. **Note:** Aggregator plugins only aggregate metrics within their periods (i.e. `now() - period`). Data with a timestamp earlier than `now() - period` cannot be included. [aggregators]: https://github.com/influxdata/telegraf/tree/master/plugins/aggregators ================================================ FILE: docs/APPARMOR.md ================================================ # AppArmor When running Telegraf under AppArmor users may see denial messages depending on the Telegraf plugins used and the AppArmor profile applied. Telegraf does not have control over the AppArmor profiles used. If users wish to address denials, then they must understand the collections made by their choice of Telegraf plugins, the denial messages, and the impact of changes to their AppArmor profiles. ## Example Denial For example, users might see denial messages such as: ```s type=AVC msg=audit(1588901740.036:2457789): apparmor="DENIED" operation="ptrace" profile="docker-default" pid=9030 comm="telegraf" requested_mask="read" denied_mask="read" peer="unconfined" ``` In this case, Telegraf will also need the ability to ptrace(read). User's will first need to analyze the denial message for the operation and requested mask. Then consider if the required changes make sense. There may be additional denials even after initial changes. For more details around AppArmor settings and configuration, users can check out the `man 5 apparmor.d` man page on their system or the [AppArmor wiki][wiki]. [wiki]: https://gitlab.com/apparmor/apparmor/-/wikis/home ================================================ FILE: docs/COMMANDS_AND_FLAGS.md ================================================ # Telegraf Commands & Flags The following page describes some of the commands and flags available via the Telegraf command line interface. ## Usage General usage of Telegraf, requires passing in at least one config file with the plugins the user wishes to use: ```bash telegraf --config config.toml ``` ## Help To get the full list of subcommands and flags run: ```bash telegraf help ``` Here are some commonly used flags that users should be aware of: * `--config-directory`: Read all config files from a directory * `--debug`: Enable additional debug logging * `--once`: Run one collection and flush interval then exit * `--test`: Run only inputs, output to stdout, and exit Check out the full help out for more available flags and options. ## Version While telegraf will print out the version when running, if a user is uncertain what version their binary is, run the version subcommand: ```bash telegraf version ``` ## Config The config subcommand allows users to print out a sample configuration to stdout. This subcommand can very quickly print out the default values for all or any of the plugins available in Telegraf. For example to print the example config for all plugins run: ```bash telegraf config > telegraf.conf ``` If a user only wanted certain inputs or outputs, then the filters can be used: ```bash telegraf config --input-filter cpu --output-filter influxdb ``` ================================================ FILE: docs/CONFIGURATION.md ================================================ # Configuration Telegraf's configuration file is written using [TOML][] and is composed of three sections: [global tags][], [agent][] settings, and [plugins][]. ## Generating a Configuration File A default config file can be generated by telegraf: ```sh telegraf config > telegraf.conf ``` To generate a file with specific inputs and outputs, you can use the --input-filter and --output-filter flags: ```sh telegraf config --input-filter cpu:mem:net:swap --output-filter influxdb:kafka ``` [View the full list][flags] of Telegraf commands and flags or by running `telegraf --help`. ### Windows PowerShell v5 Encoding In PowerShell 5, the default encoding is UTF-16LE and not UTF-8. Telegraf expects a valid UTF-8 file. This is not an issue with PowerShell 6 or newer, as well as the Command Prompt or with using the Git Bash shell. As such, users will need to specify the output encoding when generating a full configuration file: ```sh telegraf.exe config | Out-File -Encoding utf8 telegraf.conf ``` This will generate a UTF-8 encoded file with a BOM. However, Telegraf can handle the leading BOM. ## Configuration Loading The location of the configuration file can be set via the `--config` command line flag. When the `--config-directory` command line flag is used files ending with `.conf` in the specified directory will also be included in the Telegraf configuration. On most systems, the default locations are `/etc/telegraf/telegraf.conf` for the main configuration file and `/etc/telegraf/telegraf.d` for the directory of configuration files. ## Environment Variables Environment variables can be used anywhere in the config file, simply surround them with `${}`. Replacement occurs before file parsing. For strings the variable must be within quotes, e.g., `"${STR_VAR}"`, for numbers and booleans they should be unquoted, e.g., `${INT_VAR}`, `${BOOL_VAR}`. Users need to keep in mind that when using double quotes the user needs to escape any backslashes (e.g. `"C:\\Program Files"`) or other special characters. If using an environment variable with a single backslash, then enclose the variable in single quotes which signifies a string literal (e.g. `'C:\Program Files'`). In addition to this, Telegraf also supports Shell parameter expansion for environment variables which allows syntax such as: - `${VARIABLE:-default}` evaluates to default if VARIABLE is unset or empty in the environment. - `${VARIABLE-default}` evaluates to default only if VARIABLE is unset in the environment. Similarly, the following syntax allows you to specify mandatory variables: - `${VARIABLE:?err}` exits with an error message containing err if VARIABLE is unset or empty in the environment. - `${VARIABLE?err}` exits with an error message containing err if VARIABLE is unset in the environment. When using the `.deb` or `.rpm` packages, you can define environment variables in the `/etc/default/telegraf` file. **Example**: `/etc/default/telegraf`: For InfluxDB 1.x: ```shell USER="alice" INFLUX_URL="http://localhost:8086" INFLUX_SKIP_DATABASE_CREATION="true" INFLUX_PASSWORD="monkey123" ``` For InfluxDB OSS 2: ```shell INFLUX_HOST="http://localhost:8086" # used to be 9999 INFLUX_TOKEN="replace_with_your_token" INFLUX_ORG="your_username" INFLUX_BUCKET="replace_with_your_bucket_name" ``` For InfluxDB Cloud 2: ```shell # For AWS West (Oregon) INFLUX_HOST="https://us-west-2-1.aws.cloud2.influxdata.com" # Other Cloud URLs at https://v2.docs.influxdata.com/v2.0/reference/urls/#influxdb-cloud-urls INFLUX_TOKEN=”replace_with_your_token” INFLUX_ORG="yourname@yourcompany.com" INFLUX_BUCKET="replace_with_your_bucket_name" ``` `/etc/telegraf.conf`: ```toml [global_tags] user = "${USER}" [[inputs.mem]] # For InfluxDB 1.x: [[outputs.influxdb]] urls = ["${INFLUX_URL}"] skip_database_creation = ${INFLUX_SKIP_DATABASE_CREATION} password = "${INFLUX_PASSWORD}" # For InfluxDB OSS 2: [[outputs.influxdb_v2]] urls = ["${INFLUX_HOST}"] token = "${INFLUX_TOKEN}" organization = "${INFLUX_ORG}" bucket = "${INFLUX_BUCKET}" # For InfluxDB Cloud 2: [[outputs.influxdb_v2]] urls = ["${INFLUX_HOST}"] token = "${INFLUX_TOKEN}" organization = "${INFLUX_ORG}" bucket = "${INFLUX_BUCKET}" ``` The above files will produce the following effective configuration file to be parsed: ```toml [global_tags] user = "alice" [[inputs.mem]] # For InfluxDB 1.x: [[outputs.influxdb]] urls = "http://localhost:8086" skip_database_creation = true password = "monkey123" # For InfluxDB OSS 2: [[outputs.influxdb_v2]] urls = ["http://127.0.0.1:8086"] # double check the port. could be 9999 if using OSS Beta token = "replace_with_your_token" organization = "your_username" bucket = "replace_with_your_bucket_name" # For InfluxDB Cloud 2: [[outputs.influxdb_v2]] # For AWS West (Oregon) INFLUX_HOST="https://us-west-2-1.aws.cloud2.influxdata.com" # Other Cloud URLs at https://v2.docs.influxdata.com/v2.0/reference/urls/#influxdb-cloud-urls token = "replace_with_your_token" organization = "yourname@yourcompany.com" bucket = "replace_with_your_bucket_name" ``` ## Secret-store secrets Additional or instead of environment variables, you can use secret-stores to fill in credentials or similar. To do so, you need to configure one or more secret-store plugin(s) and then reference the secret in your plugin configurations. A reference to a secret is specified in form `@{:}`, where the `secret store id` is the unique ID you defined for your secret-store and `secret name` is the name of the secret to use. **NOTE:** Both, the `secret store id` as well as the `secret name` can only consist of letters (both upper- and lowercase), numbers and underscores. **Example**: This example illustrates the use of secret-store(s) in plugins ```toml [global_tags] user = "alice" [[secretstores.os]] id = "local_secrets" [[secretstores.jose]] id = "cloud_secrets" path = "/etc/telegraf/secrets" # Optional reference to another secret store to unlock this one. password = "@{local_secrets:cloud_store_passwd}" [[inputs.http]] urls = ["http://server.company.org/metrics"] username = "@{local_secrets:company_server_http_metric_user}" password = "@{local_secrets:company_server_http_metric_pass}" [[outputs.influxdb_v2]] urls = ["https://us-west-2-1.aws.cloud2.influxdata.com"] token = "@{cloud_secrets:influxdb_token}" organization = "yourname@yourcompany.com" bucket = "replace_with_your_bucket_name" ``` ### Notes When using plugins supporting secrets, Telegraf locks the memory pages containing the secrets. Therefore, the locked memory limit has to be set to a suitable value. Telegraf will check the limit and the number of used secrets at startup and will warn if your limit is too low. In this case, please increase the limit via `ulimit -l`. If you are running Telegraf in an jail you might need to allow locked pages in that jail by setting `allow.mlock = 1;` in your config. ## Intervals Intervals are durations of time and can be specified for supporting settings by combining an integer value and time unit as a string value. Valid time units are `ns`, `us` (or `µs`), `ms`, `s`, `m`, `h`. ```toml [agent] interval = "10s" ``` ## Global Tags Global tags can be specified in the `[global_tags]` table in key="value" format. All metrics that are gathered will be tagged with the tags specified. Global tags are overridden by tags set by plugins. ```toml [global_tags] dc = "us-east-1" ``` ## Agent The agent table configures Telegraf and the defaults used across all plugins. - **interval**: Default data collection [interval][] for all inputs. - **round_interval**: Rounds collection interval to [interval][] ie, if interval="10s" then always collect on :00, :10, :20, etc. - **metric_batch_size**: Telegraf will send metrics to outputs in batches of at most metric_batch_size metrics. This controls the size of writes that Telegraf sends to output plugins. - **metric_buffer_limit**: Maximum number of unwritten metrics per output. Increasing this value allows for longer periods of output downtime without dropping metrics at the cost of higher maximum memory usage. Oldest metrics are overwritten in favor of new ones when the buffer fills up. - **collection_jitter**: Collection jitter is used to jitter the collection by a random [interval][]. Each plugin will sleep for a random time within jitter before collecting. This can be used to avoid many plugins querying things like sysfs at the same time, which can have a measurable effect on the system. - **collection_offset**: Collection offset is used to shift the collection by the given [interval][]. This can be be used to avoid many plugins querying constraint devices at the same time by manually scheduling them in time. - **flush_interval**: Default flushing [interval][] for all outputs. Maximum flush_interval will be flush_interval + flush_jitter. - **flush_jitter**: Default flush jitter for all outputs. This jitters the flush [interval][] by a random amount. This is primarily to avoid large write spikes for users running a large number of telegraf instances. ie, a jitter of 5s and interval 10s means flushes will happen every 10-15s. - **precision**: Collected metrics are rounded to the precision specified as an [interval][]. Precision will NOT be used for service inputs. It is up to each individual service input to set the timestamp at the appropriate precision. - **debug**: Log at debug level. - **quiet**: Log only error level messages. - **logformat**: Log format controls the way messages are logged and can be one of "text", "structured" or, on Windows, "eventlog". The output file (if any) is determined by the `logfile` setting. - **structured_log_message_key**: Message key for structured logs, to override the default of "msg". Ignored if `logformat` is not "structured". - **logfile**: Name of the file to be logged to or stderr if unset or empty. This setting is ignored for the "eventlog" format. - **logfile_rotation_interval**: The logfile will be rotated after the time interval specified. When set to 0 no time based rotation is performed. - **logfile_rotation_max_size**: The logfile will be rotated when it becomes larger than the specified size. When set to 0 no size based rotation is performed. - **logfile_rotation_max_archives**: Maximum number of rotated archives to keep, any older logs are deleted. If set to -1, no archives are removed. - **log_with_timezone**: Pick a timezone to use when logging or type 'local' for local time. Example: 'America/Chicago'. [See this page for options/formats.](https://socketloop.com/tutorials/golang-display-list-of-timezones-with-gmt) - **hostname**: Override default hostname, if empty use os.Hostname() - **omit_hostname**: If set to true, do no set the "host" tag in the telegraf agent. - **snmp_translator**: Method of translating SNMP objects. Can be "netsnmp" (deprecated) which translates by calling external programs `snmptranslate` and `snmptable`, or "gosmi" which translates using the built-in gosmi library. - **statefile**: Name of the file to load the states of plugins from and store the states to. If uncommented and not empty, this file will be used to save the state of stateful plugins on termination of Telegraf. If the file exists on start, the state in the file will be restored for the plugins. - **always_include_local_tags**: Ensure tags explicitly defined in a plugin will *always* pass tag-filtering via `taginclude` or `tagexclude`. This removes the need to specify local tags twice. - **always_include_global_tags**: Ensure tags explicitly defined in the `global_tags` section will *always* pass tag-filtering via `taginclude` or `tagexclude`. This removes the need to specify those tags twice. - **skip_processors_after_aggregators**: By default, processors are run a second time after aggregators. Changing this setting to true will skip the second run of processors. - **buffer_strategy**: The type of buffer to use for telegraf output plugins. Supported modes are `memory`, the default and original buffer type, and `disk`, an experimental disk-backed buffer which will serialize all metrics to disk as needed to improve data durability and reduce the chance for data loss. This is only supported at the agent level. - **buffer_directory**: The directory to use when in `disk` buffer mode. Each output plugin will make another subdirectory in this directory with the output plugin's ID. - **buffer_disk_sync**: Controls writes durability when "disk" buffer strategy is used. No sync offers better write performance at the risk of losing metrics buffered in the last `flush_interval` in the event of a power cut. Defaults to 'true'. ## Plugins Telegraf plugins are divided into 4 types: [inputs][], [outputs][], [processors][], and [aggregators][]. Unlike the `global_tags` and `agent` tables, any plugin can be defined multiple times and each instance will run independently. This allows you to have plugins defined with differing configurations as needed within a single Telegraf process. Each plugin has a unique set of configuration options, reference the sample configuration for details. Additionally, several options are available on any plugin depending on its type. ### Input Plugins Input plugins gather and create metrics. They support both polling and event driven operation. Parameters that can be used with any input plugin: - **alias**: Name an instance of a plugin. - **interval**: Overrides the `interval` setting of the [agent][Agent] for the plugin. How often to gather this metric. Normal plugins use a single global interval, but if one particular input should be run less or more often, you can configure that here. - **precision**: Overrides the `precision` setting of the [agent][Agent] for the plugin. Collected metrics are rounded to the precision specified as an [interval][]. When this value is set on a service input, multiple events occurring at the same timestamp may be merged by the output database. - **time_source**: Specifies the source of the timestamp on metrics. Possible values are: - `metric` will not alter the metric (default) - `collection_start` sets the timestamp to when collection started - `collection_end` set the timestamp to when collection finished `time_source` will NOT be used for service inputs. It is up to each individual service input to set the timestamp. - **collection_jitter**: Overrides the `collection_jitter` setting of the [agent][Agent] for the plugin. Collection jitter is used to jitter the collection by a random [interval][]. The value must be non-zero to override the agent setting. - **collection_offset**: Overrides the `collection_offset` setting of the [agent][Agent] for the plugin. Collection offset is used to shift the collection by the given [interval][]. The value must be non-zero to override the agent setting. - **name_override**: Override the base name of the measurement. (Default is the name of the input). - **name_prefix**: Specifies a prefix to attach to the measurement name. - **name_suffix**: Specifies a suffix to attach to the measurement name. - **tags**: A map of tags to apply to a specific input's measurements. - **log_level**: Override the log-level for this plugin. Possible values are `error`, `warn`, `info`, `debug` and `trace`. The [metric filtering][] parameters can be used to limit what metrics are emitted from the input plugin. #### Examples Use the name_suffix parameter to emit measurements with the name `cpu_total`: ```toml [[inputs.cpu]] name_suffix = "_total" percpu = false totalcpu = true ``` Use the name_override parameter to emit measurements with the name `foobar`: ```toml [[inputs.cpu]] name_override = "foobar" percpu = false totalcpu = true ``` Emit measurements with two additional tags: `tag1=foo` and `tag2=bar` > **NOTE**: With TOML, order matters. Parameters belong to the last defined > table header, place `[inputs.cpu.tags]` table at the *end* of the plugin > definition. ```toml [[inputs.cpu]] percpu = false totalcpu = true [inputs.cpu.tags] tag1 = "foo" tag2 = "bar" ``` Alternatively, when using the inline table syntax, the tags do not need to go at the end: ```toml [[inputs.cpu]] tags = {tag1 = "foo", tag2 = "bar"} percpu = false totalcpu = true ``` Utilize `name_override`, `name_prefix`, or `name_suffix` config options to avoid measurement collisions when defining multiple plugins: ```toml [[inputs.cpu]] percpu = false totalcpu = true [[inputs.cpu]] percpu = true totalcpu = false name_override = "percpu_usage" fieldexclude = ["cpu_time*"] ``` ### Output Plugins Output plugins write metrics to a location. Outputs commonly write to databases, network services, and messaging systems. Parameters that can be used with any output plugin: - **alias**: Name an instance of a plugin. - **flush_interval**: The maximum time between flushes. Use this setting to override the agent `flush_interval` on a per plugin basis. - **flush_jitter**: The amount of time to jitter the flush interval. Use this setting to override the agent `flush_jitter` on a per plugin basis. The value must be non-zero to override the agent setting. - **metric_batch_size**: The maximum number of metrics to send at once. Use this setting to override the agent `metric_batch_size` on a per plugin basis. - **metric_buffer_limit**: The maximum number of unsent metrics to buffer. Use this setting to override the agent `metric_buffer_limit` on a per plugin basis. - **name_override**: Override the original name of the measurement. - **name_prefix**: Specifies a prefix to attach to the measurement name. - **name_suffix**: Specifies a suffix to attach to the measurement name. - **log_level**: Override the log-level for this plugin. Possible values are `error`, `warn`, `info` and `debug`. The [metric filtering][] parameters can be used to limit what metrics are emitted from the output plugin. #### Examples Override flush parameters for a single output: ```toml [agent] flush_interval = "10s" flush_jitter = "5s" metric_batch_size = 1000 [[outputs.influxdb]] urls = [ "http://example.org:8086" ] database = "telegraf" [[outputs.file]] files = [ "stdout" ] flush_interval = "1s" flush_jitter = "1s" metric_batch_size = 10 ``` ### Processor Plugins Processor plugins perform processing tasks on metrics and are commonly used to rename or apply transformations to metrics. Processors are applied after the input plugins and before any aggregator plugins. Parameters that can be used with any processor plugin: - **alias**: Name an instance of a plugin. - **order**: The order in which the processor(s) are executed. starting with 1. If this is not specified then processor execution order will be the order in the config. Processors without "order" will take precedence over those with a defined order. - **log_level**: Override the log-level for this plugin. Possible values are `error`, `warn`, `info` and `debug`. The [metric filtering][] parameters can be used to limit what metrics are handled by the processor. Excluded metrics are passed downstream to the next processor. #### Examples If the order processors are applied matters you must set order on all involved processors: ```toml [[processors.rename]] order = 1 [[processors.rename.replace]] tag = "path" dest = "resource" [[processors.strings]] order = 2 [[processors.strings.trim_prefix]] tag = "resource" prefix = "/api/" ``` ### Aggregator Plugins Aggregator plugins produce new metrics after examining metrics over a time period, as the name suggests they are commonly used to produce new aggregates such as mean/max/min metrics. Aggregators operate on metrics after any processors have been applied. Parameters that can be used with any aggregator plugin: - **alias**: Name an instance of a plugin. - **period**: The period on which to flush & clear each aggregator. All metrics that are sent with timestamps outside of this period will be ignored by the aggregator. The default period is set to 30 seconds. - **delay**: The delay before each aggregator is flushed. This is to control how long for aggregators to wait before receiving metrics from input plugins, in the case that aggregators are flushing and inputs are gathering on the same interval. The default delay is set to 100 ms. - **grace**: The duration when the metrics will still be aggregated by the plugin, even though they're outside of the aggregation period. This is needed in a situation when the agent is expected to receive late metrics and it's acceptable to roll them up into next aggregation period. The default grace duration is set to 0 s. - **drop_original**: If true, the original metric will be dropped by the aggregator and will not get sent to the output plugins. - **name_override**: Override the base name of the measurement. (Default is the name of the input). - **name_prefix**: Specifies a prefix to attach to the measurement name. - **name_suffix**: Specifies a suffix to attach to the measurement name. - **tags**: A map of tags to apply to the measurement - behavior varies based on aggregator. - **log_level**: Override the log-level for this plugin. Possible values are `error`, `warn`, `info` and `debug`. The [metric filtering][] parameters can be used to limit what metrics are handled by the aggregator. Excluded metrics are passed downstream to the next aggregator. #### Examples Collect and emit the min/max of the system load1 metric every 30s, dropping the originals. ```toml [[inputs.system]] fieldinclude = ["load1"] # collects system load1 metric. [[aggregators.minmax]] period = "30s" # send & clear the aggregate every 30s. drop_original = true # drop the original metrics. [[outputs.file]] files = ["stdout"] ``` Collect and emit the min/max of the swap metrics every 30s, dropping the originals. The aggregator will not be applied to the system load metrics due to the `namepass` parameter. ```toml [[inputs.swap]] [[inputs.system]] fieldinclude = ["load1"] # collects system load1 metric. [[aggregators.minmax]] period = "30s" # send & clear the aggregate every 30s. drop_original = true # drop the original metrics. namepass = ["swap"] # only "pass" swap metrics through the aggregator. [[outputs.file]] files = ["stdout"] ``` ## Metric Filtering Metric filtering can be configured per plugin on any input, output, processor, and aggregator plugin. Filters fall under two categories: Selectors and Modifiers. ### Selectors Selector filters include or exclude entire metrics. When a metric is excluded from a Input or an Output plugin, the metric is dropped. If a metric is excluded from a Processor or Aggregator plugin, it is skips the plugin and is sent onwards to the next stage of processing. - **namepass**: An array of [glob pattern][] strings. Only metrics whose measurement name matches a pattern in this list are emitted. Additionally, custom list of separators can be specified using `namepass_separator`. These separators are excluded from wildcard glob pattern matching. - **namedrop**: The inverse of `namepass`. If a match is found the metric is discarded. This is tested on metrics after they have passed the `namepass` test. Additionally, custom list of separators can be specified using `namedrop_separator`. These separators are excluded from wildcard glob pattern matching. - **tagpass**: A table mapping tag keys to arrays of [glob pattern][] strings. Only metrics that contain a tag key in the table and a tag value matching one of its patterns is emitted. This can either use the explicit table syntax (e.g. a subsection using a `[...]` header) or inline table syntax (e.g like a JSON table with `{...}`). Please see the below notes on specifying the table. - **tagdrop**: The inverse of `tagpass`. If a match is found the metric is discarded. This is tested on metrics after they have passed the `tagpass` test. > NOTE: Due to the way TOML is parsed, when using the explicit table > syntax (with `[...]`) for `tagpass` and `tagdrop` parameters, they > must be defined at the **end** of the plugin definition, otherwise subsequent > plugin config options will be interpreted as part of the tagpass/tagdrop > tables. > NOTE: When using the inline table syntax (e.g. `{...}`) the table must exist > in the main plugin definition and not in any sub-table (e.g. > `[[inputs.win_perf_counters.object]]`). - **metricpass**: A ["Common Expression Language"][CEL] (CEL) expression with boolean result where `true` will allow the metric to pass, otherwise the metric is discarded. This filter expression is more general compared to e.g. `namepass` and also allows for time-based filtering. Further details, such as available functions and expressions, are provided in the [language definition][CEL lang] as well as in the [extension documentation][CEL ext] or the [CEL language introduction][CEL intro]. Expressions that may be valid and compile, but fail at runtime will result in the expression reporting as `true`. The metrics will pass through as a result. An example is when reading a non-existing field. If this happens, the evaluation is aborted, an error is logged, and the expression is reported as `true`, so the metric passes. > [!NOTE] > As CEL is an *interpreted* language, this type of filtering is much slower > compared to `namepass`/`namedrop` and friends. So consider to use the more > restricted filter options where possible in case of high-throughput scenarios. [CEL]:https://github.com/google/cel-go/tree/master [CEL intro]: https://codelabs.developers.google.com/codelabs/cel-go [CEL lang]: https://github.com/google/cel-spec/blob/master/doc/langdef.md [CEL ext]: https://github.com/google/cel-go/tree/master/ext#readme ### Modifiers Modifier filters remove tags and fields from a metric. If all fields are removed the metric is removed and as result not passed through to the following processors or any output plugin. Tags and fields are modified before a metric is passed to a processor, aggregator, or output plugin. When used with an input plugin the filter applies after the input runs. - **fieldinclude**: An array of [glob pattern][] strings. Only fields whose field key matches a pattern in this list are emitted. - **fieldexclude**: The inverse of `fieldinclude`. Fields with a field key matching one of the patterns will be discarded from the metric. This is tested on metrics after they have passed the `fieldinclude` test. - **taginclude**: An array of [glob pattern][] strings. Only tags with a tag key matching one of the patterns are emitted. In contrast to `tagpass`, which will pass an entire metric based on its tag, `taginclude` removes all non matching tags from the metric. Any tag can be filtered including global tags and the agent `host` tag. - **tagexclude**: The inverse of `taginclude`. Tags with a tag key matching one of the patterns will be discarded from the metric. Any tag can be filtered including global tags and the agent `host` tag. ### Filtering Examples #### Using tagpass and tagdrop ```toml [[inputs.cpu]] percpu = true totalcpu = false fieldexclude = ["cpu_time"] # Don't collect CPU data for cpu6 & cpu7 [inputs.cpu.tagdrop] cpu = [ "cpu6", "cpu7" ] [[inputs.disk]] [inputs.disk.tagpass] # tagpass conditions are OR, not AND. # If the (filesystem is ext4 or xfs) OR (the path is /opt or /home) # then the metric passes fstype = [ "ext4", "xfs" ] # Globs can also be used on the tag values path = [ "/opt", "/home*" ] [[inputs.win_perf_counters]] [[inputs.win_perf_counters.object]] ObjectName = "Network Interface" Instances = ["*"] Counters = [ "Bytes Received/sec", "Bytes Sent/sec" ] Measurement = "win_net" # Do not send metrics where the Windows interface name (instance) begins with # 'isatap' or 'Local' [inputs.win_perf_counters.tagdrop] instance = ["isatap*", "Local*"] ``` #### Using fieldinclude and fieldexclude ```toml # Drop all metrics for guest & steal CPU usage [[inputs.cpu]] percpu = false totalcpu = true fieldexclude = ["usage_guest", "usage_steal"] # Only store inode related metrics for disks [[inputs.disk]] fieldinclude = ["inodes*"] ``` #### Using namepass and namedrop ```toml # Drop all metrics about containers for kubelet [[inputs.prometheus]] urls = ["http://kube-node-1:4194/metrics"] namedrop = ["container_*"] # Only store rest client related metrics for kubelet [[inputs.prometheus]] urls = ["http://kube-node-1:4194/metrics"] namepass = ["rest_client_*"] ``` #### Using namepass and namedrop with separators ```toml # Pass all metrics of type 'A.C.B' and drop all others like 'A.C.D.B' [[inputs.socket_listener]] data_format = "graphite" templates = ["measurement*"] namepass = ["A.*.B"] namepass_separator = "." # Drop all metrics of type 'A.C.B' and pass all others like 'A.C.D.B' [[inputs.socket_listener]] data_format = "graphite" templates = ["measurement*"] namedrop = ["A.*.B"] namedrop_separator = "." ``` #### Using taginclude and tagexclude ```toml # Only include the "cpu" tag in the measurements for the cpu plugin. [[inputs.cpu]] percpu = true totalcpu = true taginclude = ["cpu"] # Exclude the "fstype" tag from the measurements for the disk plugin. [[inputs.disk]] tagexclude = ["fstype"] ``` #### Metrics can be routed to different outputs using the metric name and tags ```toml [[outputs.influxdb]] urls = [ "http://localhost:8086" ] database = "telegraf" # Drop all measurements that start with "aerospike" namedrop = ["aerospike*"] [[outputs.influxdb]] urls = [ "http://localhost:8086" ] database = "telegraf-aerospike-data" # Only accept aerospike data: namepass = ["aerospike*"] [[outputs.influxdb]] urls = [ "http://localhost:8086" ] database = "telegraf-cpu0-data" # Only store measurements where the tag "cpu" matches the value "cpu0" [outputs.influxdb.tagpass] cpu = ["cpu0"] ``` #### Routing metrics to different outputs based on the input Metrics are tagged with `influxdb_database` in the input, which is then used to select the output. The tag is removed in the outputs before writing with `tagexclude`. ```toml [[outputs.influxdb]] urls = ["http://influxdb.example.com"] database = "db_default" [outputs.influxdb.tagdrop] influxdb_database = ["*"] [[outputs.influxdb]] urls = ["http://influxdb.example.com"] database = "db_other" tagexclude = ["influxdb_database"] [outputs.influxdb.tagpass] influxdb_database = ["other"] [[inputs.disk]] [inputs.disk.tags] influxdb_database = "other" ``` ## Plugin selection via labels and selectors You can control which plugin instances are enabled by decorating plugins with labels in their config and passing one or more selectors on the command line. ### Selectors Provide selectors with one or more `--select` flags when starting Telegraf. Each `--select` value is a semicolon-separated list of key=value pairs: ```text =[;=] ``` - Pairs in a single `--select` value are combined with logical AND (all must match). - Multiple `--select` flags are combined with logical OR (a plugin is enabled if it matches any selector set). Selectors support simple glob patterns in values (for example `region=us-*`). Example: ```console telegraf --config config.conf --config-directory directory/ \ --select="app=payments;region=us-*" \ --select="env=prod" \ --watch-config --print-plugin-config-source=true ``` ### Labels Add an optional `labels` table to a plugin, similar to `tags`. Keys and values are plain strings. Example: ```toml [[inputs.cpu]] [inputs.cpu.labels] app = "payments" region = "us-east" env = "prod" ``` Telegraf matches the command-line selectors against a plugin's labels to decide whether that plugin instance should be enabled. For more details on the syntax and matching criteria refer, [labels selectors spec][tsd010]. ## Transport Layer Security (TLS) Reference the detailed [TLS][] documentation. [TOML]: https://github.com/toml-lang/toml#toml [global tags]: #global-tags [interval]: #intervals [agent]: #agent [plugins]: #plugins [inputs]: #input-plugins [outputs]: #output-plugins [processors]: #processor-plugins [aggregators]: #aggregator-plugins [metric filtering]: #metric-filtering [TLS]: /docs/TLS.md [glob pattern]: https://github.com/gobwas/glob#syntax [flags]: /docs/COMMANDS_AND_FLAGS.md [tsd010]: /docs/specs/tsd-010-labels-and-selectors.md ================================================ FILE: docs/CUSTOMIZATION.md ================================================ # Customization You can build customized versions of Telegraf with a specific plugin set using the [custom builder](/tools/custom_builder) tool or [build-tags](https://pkg.go.dev/cmd/go#hdr-Build_constraints). For build tags, the plugins can be selected either category-wise, i.e. `inputs`, `outputs`,`processors`, `aggregators`, `parsers`, `secretstores` and `serializers` or individually, e.g. `inputs.modbus` or `outputs.influxdb`. Usually the build tags correspond to the plugin names used in the Telegraf configuration. To be sure, check the files in the corresponding `plugin//all` directory. Make sure to include all parsers you intend to use. __Note:__ You _always_ need to include the `custom` tag when customizing the build as otherwise _all_ plugins will be selected regardless of other tags. ## Via make When using the project's makefile, the build can be customized via the `BUILDTAGS` environment variable containing a __comma-separated__ list of the selected plugins (or categories) __and__ the `custom` tag. For example ```shell BUILDTAGS="custom,inputs,outputs.influxdb_v2,parsers.json" make ``` will build a customized Telegraf including _all_ `inputs`, the InfluxDB v2 `output` and the `json` parser. ## Via `go build` If you wish to build Telegraf using native go tools, you can use the `go build` command with the `-tags` option. Specify a __comma-separated__ list of the selected plugins (or categories) __and__ the `custom` tag as argument. For example ```shell go build -tags "custom,inputs,outputs.influxdb_v2,parsers.json" ./cmd/telegraf ``` will build a customized Telegraf including _all_ `inputs`, the InfluxDB v2 `output` and the `json` parser. ================================================ FILE: docs/DATA_FORMATS_INPUT.md ================================================ # Input Data Formats Telegraf contains many general purpose plugins that support parsing input data using a configurable parser into [metrics][]. This allows, for example, the `kafka_consumer` input plugin to process messages in any of InfluxDB Line Protocol, JSON format, or Apache Avro format. - [Avro](/plugins/parsers/avro) - [Binary](/plugins/parsers/binary) - [Collectd](/plugins/parsers/collectd) - [CSV](/plugins/parsers/csv) - [Dropwizard](/plugins/parsers/dropwizard) - [Form URL Encoded](/plugins/parsers/form_urlencoded) - [Graphite](/plugins/parsers/graphite) - [Grok](/plugins/parsers/grok) - [InfluxDB Line Protocol](/plugins/parsers/influx) - [JSON](/plugins/parsers/json) - [JSON v2](/plugins/parsers/json_v2) - [Logfmt](/plugins/parsers/logfmt) - [Nagios](/plugins/parsers/nagios) - [OpenMetrics](/plugins/parsers/openmetrics) - [OpenTSDB](/plugins/parsers/opentsdb) - [Parquet](/plugins/parsers/parquet) - [Prometheus](/plugins/parsers/prometheus) - [PrometheusRemoteWrite](/plugins/parsers/prometheusremotewrite) - [Value](/plugins/parsers/value), ie: 45 or "booyah" - [Wavefront](/plugins/parsers/wavefront) - [XPath](/plugins/parsers/xpath) (supports XML, JSON, MessagePack, Protocol Buffers) Any input plugin containing the `data_format` option can use it to select the desired parser: ```toml [[inputs.exec]] ## Commands array commands = ["/tmp/test.sh", "/usr/bin/mycollector --foo=bar"] ## measurement name suffix (for separating different commands) name_suffix = "_mycollector" ## Data format to consume. data_format = "json" ``` [metrics]: /docs/METRICS.md ================================================ FILE: docs/DATA_FORMATS_OUTPUT.md ================================================ # Output Data Formats In addition to output specific data formats, Telegraf supports a set of standard data formats that may be selected from when configuring many output plugins. 1. [InfluxDB Line Protocol](/plugins/serializers/influx) 1. [Binary](/plugins/serializers/binary) 1. [Carbon2](/plugins/serializers/carbon2) 1. [CloudEvents](/plugins/serializers/cloudevents) 1. [CSV](/plugins/serializers/csv) 1. [Graphite](/plugins/serializers/graphite) 1. [JSON](/plugins/serializers/json) 1. [MessagePack](/plugins/serializers/msgpack) 1. [Prometheus](/plugins/serializers/prometheus) 1. [Prometheus Remote Write](/plugins/serializers/prometheusremotewrite) 1. [ServiceNow Metrics](/plugins/serializers/nowmetric) 1. [SplunkMetric](/plugins/serializers/splunkmetric) 1. [Template](/plugins/serializers/template) 1. [Wavefront](/plugins/serializers/wavefront) You will be able to identify the plugins with support by the presence of a `data_format` config option, for example, in the `file` output plugin: ```toml [[outputs.file]] ## Files to write to, "stdout" is a specially handled file. files = ["stdout"] ## Data format to output. data_format = "influx" ``` ================================================ FILE: docs/DOCKER.md ================================================ # Docker Images Telegraf is available as an [Official image][] on DockerHub. Official images are a curated set of Docker Images that also automatically get security updates from Docker, follow a set of best practices, and are available via a shortcut syntax which omits the organization. InfluxData maintains Debian and Alpine based images across the last three minor releases. To pull the latest Telegraf images: ```shell # latest Debian-based image docker pull telegraf # latest Alpine-based image docker pull telegraf:alpine ``` See the [Telegraf DockerHub][] page for complete details on available images, versions, and tags. [official image]: https://docs.docker.com/trusted-content/official-images/ [Telegraf DockerHub]: https://hub.docker.com/_/telegraf ## Nightly Images [Nightly builds][] are available and are generated from the master branch each day at around midnight UTC. The artifacts include both binary packages, RPM & DEB packages, as well as nightly Docker images that are hosted on [quay.io][]. [Nightly builds]: /docs/NIGHTLIES.md [quay.io]: https://quay.io/repository/influxdb/telegraf-nightly?tab=tags&tag=latest ## Dockerfiles The [Dockerfiles][] for these images are available for users to use as well. [Dockerfiles]: https://github.com/influxdata/influxdata-docker ## Lockable Memory Telegraf does require the ability to use lockable memory when running by default. In some deployments for Docker a container may not have enough lockable memory, which results in the following warning: ```text W! Insufficient lockable memory 64kb when 72kb is required. Please increase the limit for Telegraf in your Operating System! ``` or this error: ```text panic: could not acquire lock on 0x7f7a8890f000, limit reached? [Err: cannot allocate memory] ``` Users have two options: 1. Increase the ulimit in the container. The user does this with the `ulimit -l` command. To both see and set the value. For docker, there is a `--ulimit` flag that could be used, like `--ulimit memlock=8192:8192` as well. 2. Add the `--unprotected` flag to the command arguments to not use locked memory and instead store secrets in unprotected memory. This is less secure as secrets could find their way into paged out memory and can be written to disk unencrypted, therefore this is opt-in. For docker look at updating the `CMD` used to include this flag. ================================================ FILE: docs/EXTERNAL_PLUGINS.md ================================================ # External Plugins [External plugins](/EXTERNAL_PLUGINS.md) are external programs that are built outside of Telegraf that can run through an `execd` plugin. These external plugins allow for more flexibility compared to internal Telegraf plugins. - External plugins can be written in any language (internal Telegraf plugins can only be written in Go) - External plugins can access to libraries not written in Go - Utilize licensed software that is not available to the open source community - Can include large dependencies that would otherwise bloat Telegraf - You do not need to wait on the Telegraf team to publish the plugin and start working with it. - Using the [shim](/plugins/common/shim) you can easily convert plugins between internal and external use - Using 3rd-party libraries requiring CGO support ## External Plugin Guidelines The guidelines of writing external plugins would follow those for our general [input](/docs/INPUTS.md), [output](/docs/OUTPUTS.md), [processor](/docs/PROCESSORS.md), and [aggregator](/docs/AGGREGATORS.md) plugins. Please reference the documentation on how to create these plugins written in Go. _For listed [external plugins](/EXTERNAL_PLUGINS.md), the author of the external plugin is also responsible for the maintenance and feature development of external plugins. Expect to have users open plugin issues on its respective GitHub repository._ ### Execd Go Shim For Go plugins, there is a [Execd Go Shim](/plugins/common/shim/) that will make it trivial to extract an internal input, processor, or output plugin from the main Telegraf repo out to a stand-alone repo. This shim allows anyone to build and run it as a separate app using one of the `execd` plugins: - [inputs.execd](/plugins/inputs/execd) - [processors.execd](/plugins/processors/execd) - [outputs.execd](/plugins/outputs/execd) Follow the [Steps to externalize a plugin][] and [Steps to build and run your plugin][] to properly with the Execd Go Shim. [Steps to externalize a plugin]: /plugins/common/shim#steps-to-externalize-a-plugin [Steps to build and run your plugin]: /plugins/common/shim#steps-to-build-and-run-your-plugin ## Step-by-Step guidelines This is a guide to help you set up a plugin to use it with `execd`: 1. Write a Telegraf plugin. Depending on the plugin, follow the guidelines on how to create the plugin itself using InfluxData's best practices: - [Input Plugins](/docs/INPUTS.md) - [Processor Plugins](/docs/PROCESSORS.md) - [Aggregator Plugins](/docs/AGGREGATORS.md) - [Output Plugins](/docs/OUTPUTS.md) 2. Move the project to an external repo, it is recommended to preserve the path structure, but not strictly necessary. For example, if the plugin was at `plugins/inputs/cpu`, it is recommended that it also be under `plugins/inputs/cpu` in the new repo. For a further example of what this might look like, take a look at [ssoroka/rand][] or [danielnelson/telegraf-execd-openvpn][]. 3. Copy [main.go](/plugins/common/shim/example/cmd/main.go) into the project under the `cmd` folder. This will be the entrypoint to the plugin when run as a stand-alone program and it will call the shim code for you to make that happen. It is recommended to have only one plugin per repo, as the shim is not designed to run multiple plugins at the same time. 4. Edit the main.go file to import the plugin. Within Telegraf this would have been done in an all.go file, but here we do not split the two apart, and the change just goes in the top of main.go. If you skip this step, the plugin will do nothing. > `_ "github.com/me/my-plugin-telegraf/plugins/inputs/cpu"` 5. Optionally add a [plugin.conf](./example/cmd/plugin.conf) for configuration specific to the plugin. Note that this config file **must be separate from the rest of the config for Telegraf, and must not be in a shared directory where Telegraf is expecting to load all configs**. If Telegraf reads this config file it will not know which plugin it relates to. Telegraf instead uses an execd config block to look for this plugin. 6. Add usage and development instructions in the homepage of the repository for running the plugin with its respective `execd` plugin. Please refer to [openvpn install][] and [awsalarms install][] for examples. Include the following steps: 1. How to download the release package for the platform or how to clone the binary for the external plugin 1. The commands to build the binary 1. Location to edit the `telegraf.conf` 1. Configuration to run the external plugin with [inputs.execd](/plugins/inputs/execd), [processors.execd](/plugins/processors/execd), or [outputs.execd](/plugins/outputs/execd) 7. Submit the plugin by opening a PR to add the external plugin to the [/EXTERNAL_PLUGINS.md](/EXTERNAL_PLUGINS.md) list. Please include the plugin name, link to the plugin repository and a short description of the plugin. [ssoroka/rand]: https://github.com/ssoroka/rand [danielnelson/telegraf-execd-openvpn]: https://github.com/danielnelson/telegraf-execd-openvpn [openvpn install]: https://github.com/danielnelson/telegraf-execd-openvpn#usage [awsalarms install]: https://github.com/vipinvkmenon/awsalarms#installation ================================================ FILE: docs/FAQ.md ================================================ # Frequently Asked Questions ## When is the next release? When will my PR or fix get released? Telegraf has four minor releases a year in March, June, September, and December. In between each of those minor releases, there are 2-4 bug fix releases that happen every 3 weeks. This [Google Calendar][] is kept up to date for upcoming releases dates. Additionally, users can look at the [GitHub milestones][] for the next minor and bug fix release. PRs that resolves issues are released in the next release. PRs that introduce new features are held for the next minor release. Users can view what [GitHub milestones][] a PR belongs to to determine the release it will go out with. [Google Calendar]: https://calendar.google.com/calendar/embed?src=c_03d981cefd8d6432894cb162da5c6186e393bc0f970ca6c371201aa05d30d763%40group.calendar.google.com [GitHub milestones]: https://github.com/influxdata/telegraf/milestones ## How can I filter or select specific metrics? Telegraf has options to select certain metrics or tags as well as filter out specific tags or fields: - **Selectors** allow a user to include or exclude entire metrics based on the metric name or tag key/pair values. - **Modifiers** allow a user to remove tags and fields based on specific keys, with glob support. For more details and examples, see the [Metric Filtering][metric filtering] section in the docs. ## Could not find a usable config.yml, you may have revoked the CircleCI OAuth app This is an error from CircleCI during test runs. To resolve the error, you need to log back into CircleCI with your username/password if that is how you log in or if you use GitHub log, re-create your oauth/re-login with github. That should regenerate your token and then allow you to push a commit or close and reopen this PR and tests should run. ## What does "Context Deadline exceeded (Client.Timeout while awaiting headers)" mean? This is a generic error received from Go's HTTP client. It is generally the result of a network blip or hiccup as a result of a DNS, proxy, firewall, and/or other network issue. The error should be temporary and Telegraf will recover shortly after without the loss of data. ## How do I set the timestamp format for parsing data? Telegraf's `timestamp_format` config option requires the use [Go's reference time][go ref time] to correctly translate the timestamp. For example, if you have the time: ```s 2023-03-01T00:00:42.586+0800 ``` A user needs the timestamp format: ```s 2006-01-02T15:04:05.000-0700 ``` User's can try this out in the [Go playground][playground]. [go ref time]: https://pkg.go.dev/time#pkg-constants [playground]: https://goplay.tools/snippet/hi9GIOG_gVQ ## Q: How can I monitor the Docker Engine Host from within a container? You will need to setup several volume mounts as well as some environment variables: ```shell docker run --name telegraf \ -v /:/hostfs:ro \ -e HOST_ETC=/hostfs/etc \ -e HOST_PROC=/hostfs/proc \ -e HOST_SYS=/hostfs/sys \ -e HOST_VAR=/hostfs/var \ -e HOST_RUN=/hostfs/run \ -e HOST_MOUNT_PREFIX=/hostfs \ telegraf ``` ## Q: Why do I get a "no such host" error resolving hostnames that other programs can resolve? Go uses a pure Go resolver by default for [name resolution](https://golang.org/pkg/net/#hdr-Name_Resolution). This resolver behaves differently than the C library functions but is more efficient when used with the Go runtime. If you encounter problems or want to use more advanced name resolution methods that are unsupported by the pure Go resolver, you can switch to the cgo resolver. If running manually set: ```shell export GODEBUG=netdns=cgo ``` If running as a service add the environment variable to `/etc/default/telegraf`: ```shell GODEBUG=netdns=cgo ``` ## Q: How can I manage series cardinality? High [series cardinality][], when not properly managed, can cause high load on your database. Telegraf attempts to avoid creating series with high cardinality, but some monitoring workloads such as tracking containers are are inherently high cardinality. These workloads can still be monitored, but care must be taken to manage cardinality growth. You can use the following techniques to avoid cardinality issues: - Use [metric filtering][] options to exclude unneeded measurements and tags. - Write to a database with an appropriate [retention policy][]. - Consider using the [Time Series Index][tsi]. - Monitor your databases using the [show cardinality][] commands. - Consult the [InfluxDB documentation][influx docs] for the most up-to-date techniques. [series cardinality]: https://docs.influxdata.com/influxdb/v1.7/concepts/glossary/#series-cardinality [metric filtering]: https://github.com/influxdata/telegraf/blob/master/docs/CONFIGURATION.md#metric-filtering [retention policy]: https://docs.influxdata.com/influxdb/latest/guides/downsampling_and_retention/ [tsi]: https://docs.influxdata.com/influxdb/latest/concepts/time-series-index/ [show cardinality]: https://docs.influxdata.com/influxdb/latest/query_language/spec/#show-cardinality [influx docs]: https://docs.influxdata.com/influxdb/latest/ ================================================ FILE: docs/INPUTS.md ================================================ # Input Plugins This section is for developers who want to create new collection inputs. Telegraf is entirely plugin driven. This interface allows for operators to pick and chose what is gathered and makes it easy for developers to create new ways of generating metrics. Plugin authorship is kept as simple as possible to promote people to develop and submit new inputs. ## Input Plugin Guidelines - A plugin must conform to the [telegraf.Input][] interface. - Input Plugins should call `inputs.Add` in their `init` function to register themselves. See below for a quick example. - To be available within Telegraf itself, plugins must register themselves using a file in `github.com/influxdata/telegraf/plugins/inputs/all` named according to the plugin name. Make sure you also add build-tags to conditionally build the plugin. - Each plugin requires a file called `sample.conf` containing the sample configuration for the plugin in TOML format. Please consult the [Sample Config][] page for the latest style guidelines. - Each plugin `README.md` file should include the `sample.conf` file in a section describing the configuration by specifying a `toml` section in the form `toml @sample.conf`. The specified file(s) are then injected automatically into the Readme. - Follow the recommended [Code Style][]. [Sample Config]: /docs/developers/SAMPLE_CONFIG.md [Code Style]: /docs/developers/CODE_STYLE.md [telegraf.Input]: https://godoc.org/github.com/influxdata/telegraf#Input ### Typed Metrics In addition to the `AddFields` function, the accumulator also supports functions to add typed metrics: `AddGauge`, `AddCounter`, etc. Metric types are ignored by the InfluxDB output, but can be used for other outputs, such as [prometheus][prom metric types]. [prom metric types]: https://prometheus.io/docs/concepts/metric_types/ ### Data Formats Some input plugins, such as the [exec][] plugin, can accept any supported [input data formats][]. In order to enable this, you must specify a `SetParser(parser parsers.Parser)` function on the plugin object (see the exec plugin for an example), as well as defining `parser` as a field of the object. You can then utilize the parser internally in your plugin, parsing data as you see fit. Telegraf's configuration layer will take care of instantiating and creating the `Parser` object. Add the following to the sample configuration in the README.md: ```toml ## Data format to consume. ## Each data format has its own unique set of configuration options, read ## more about them here: ## https://github.com/influxdata/telegraf/blob/master/docs/DATA_FORMATS_INPUT.md data_format = "influx" ``` [exec]: /plugins/inputs/exec [input data formats]: /docs/DATA_FORMATS_INPUT.md ### Service Input Plugins This section is for developers who want to create new "service" collection inputs. A service plugin differs from a regular plugin in that it operates a background service while Telegraf is running. One example would be the `statsd` plugin, which operates a statsd server. Service Input Plugins are substantially more complicated than a regular plugin, as they will require threads and locks to verify data integrity. Service Input Plugins should be avoided unless there is no way to create their behavior with a regular plugin. To create a Service Input implement the [telegraf.ServiceInput][] interface. [telegraf.ServiceInput]: https://godoc.org/github.com/influxdata/telegraf#ServiceInput ### Metric Tracking Metric Tracking provides a system to be notified when metrics have been successfully written to their outputs or otherwise discarded. This allows inputs to be created that function as reliable queue consumers. Please note that this process applies only to internal plugins. For external plugins, the metrics are acknowledged regardless of the actual output. To get started with metric tracking begin by calling `WithTracking` on the [telegraf.Accumulator][]. Add metrics using the `AddTrackingMetricGroup` function on the returned [telegraf.TrackingAccumulator][] and store the `TrackingID`. The `Delivered()` channel will return a type with information about the final delivery status of the metric group. Check the [amqp_consumer][] for an example implementation. [telegraf.Accumulator]: https://godoc.org/github.com/influxdata/telegraf#Accumulator [telegraf.TrackingAccumulator]: https://godoc.org/github.com/influxdata/telegraf#Accumulator [amqp_consumer]: /plugins/inputs/amqp_consumer ### External Services Plugins that connect or require the use of external services should ensure that those servers are active. When may depend on the type of input plugin: For service input plugins, `Init` should be used to check for configuration issues (e.g. bad option) and for other non-recoverable errors. Then `Start` is used to create connections or other retry-able operations. For normal inputs, `Init` should also be used to check for configuration issues as well as any other dependencies that the plugin will require. For example, any binaries that must exist for the plugin to function. If making a connection, this should also take place in `Init`. Developers may find that they switch to using service input plugins more and more to take advantage of the error on retry behavior features. This allows the user to decide what to do on an error, like ignoring the plugin or retrying constantly. ## Input Plugin Example Let's say you've written a plugin that emits metrics about processes on the current host. ### Register Plugin Registration of the plugin on `plugins/inputs/all/simple.go`: ```go //go:build !custom || inputs || inputs.simple package all import _ "github.com/influxdata/telegraf/plugins/inputs/simple" // register plugin ``` The _build-tags_ in the first line allow to selectively include/exclude your plugin when customizing Telegraf. ### Plugin Content of your plugin file e.g. `simple.go` ```go //go:generate ../../../tools/readme_config_includer/generator package simple import ( _ "embed" "github.com/influxdata/telegraf" "github.com/influxdata/telegraf/plugins/inputs" ) //go:embed sample.conf var sampleConfig string type Simple struct { Ok bool `toml:"ok"` Log telegraf.Logger `toml:"-"` } func (*Simple) SampleConfig() string { return sampleConfig } // Init is for setup, and validating config. func (s *Simple) Init() error { return nil } func (s *Simple) Gather(acc telegraf.Accumulator) error { if s.Ok { acc.AddFields("state", map[string]interface{}{"value": "pretty good"}, nil) } else { acc.AddFields("state", map[string]interface{}{"value": "not great"}, nil) } return nil } func init() { inputs.Add("simple", func() telegraf.Input { return &Simple{} }) } ``` ================================================ FILE: docs/INSTALL_GUIDE.md ================================================ # Installation Telegraf compiles to a single static binary, which makes it easy to install. Both InfluxData and the community provide for a wide range of methods to install Telegraf from. For details on each release, view the [changelog][] for the latest updates and changes by version. [changelog]: /CHANGELOG.md There are many places to obtain Telegraf from: * [Binary downloads](#binary-downloads) * [Homebrew](#homebrew) * [InfluxData Linux package repository](#influxdata-linux-package-repository) * [Official Docker images](#official-docker-images) * [Helm charts](#helm-charts) * [Nightly builds](#nightly-builds) * [Build from source](#build-from-source) * [Custom builder](#custom-builder) ## Binary downloads Binary downloads for a wide range of architectures and operating systems are available from the [InfluxData downloads][] page or from the [GitHub Releases][] page. [InfluxData downloads]: https://www.influxdata.com/downloads [GitHub Releases]: https://github.com/influxdata/telegraf/releases ## Homebrew A [Homebrew Formula][] for Telegraf that updates after each release: ```shell brew update brew install telegraf ``` Note that the Homebrew organization builds Telegraf itself and does not use binaries built by InfluxData. This is important as Homebrew builds with CGO, which means there are some differences between the official binaries and those found with Homebrew. [Homebrew Formula]: https://formulae.brew.sh/formula/telegraf ## InfluxData Linux package repository InfluxData provides a package repo that contains both DEB and RPM packages. ### DEB For DEB-based platforms (e.g. Ubuntu and Debian) run the following to add the repo GPG key and setup a new sources.list entry: ```shell # influxdata-archive.key GPG fingerprint: # Primary key fingerprint: 24C9 75CB A61A 024E E1B6 3178 7C3D 5715 9FC2 F927 # Subkey fingerprint: 9D53 9D90 D332 8DC7 D6C8 D3B9 D8FF 8E1F 7DF8 B07E wget -q https://repos.influxdata.com/influxdata-archive.key gpg --show-keys --with-fingerprint --with-colons ./influxdata-archive.key 2>&1 | grep -q '^fpr:\+24C975CBA61A024EE1B631787C3D57159FC2F927:$' && cat influxdata-archive.key | gpg --dearmor | sudo tee /etc/apt/trusted.gpg.d/influxdata-archive.gpg > /dev/null echo 'deb [signed-by=/etc/apt/trusted.gpg.d/influxdata-archive.gpg] https://repos.influxdata.com/debian stable main' | sudo tee /etc/apt/sources.list.d/influxdata.list sudo apt-get update && sudo apt-get install telegraf ``` ### RPM For RPM-based platforms (e.g. RHEL, CentOS) use the following to create a repo file and install telegraf: ```shell # influxdata-archive.key GPG fingerprint: # Primary key fingerprint: 24C9 75CB A61A 024E E1B6 3178 7C3D 5715 9FC2 F927 # Subkey fingerprint: 9D53 9D90 D332 8DC7 D6C8 D3B9 D8FF 8E1F 7DF8 B07E cat < "testcontainers-go" [2]: "DockerHub" [3]: "DockerHub Official Images" ## Network By default the containers will use the bridge network where other containers cannot talk to each other. If a custom network is required for running tests, for example if containers do need to communicate, then users can set that up with the following code: ```go networkName := "test-network" net, err := testcontainers.GenericNetwork(ctx, testcontainers.GenericNetworkRequest{ NetworkRequest: testcontainers.NetworkRequest{ Name: networkName, Attachable: true, CheckDuplicate: true, }, }) require.NoError(t, err) defer func() { require.NoError(t, net.Remove(ctx), "terminating network failed") }() ``` Then specify the network name in the container startup: ```go zookeeper := testutil.Container{ Image: "wurstmeister/zookeeper", ExposedPorts: []string{"2181:2181"}, Networks: []string{networkName}, WaitingFor: wait.ForLog("binding to port"), Name: "telegraf-test-zookeeper", } ``` ## Contributing When adding integrations tests please do the following: - Add integration to the end of the test name - Use testcontainers when an external service is required - Use the testutil.Container to setup and configure testcontainers - Ensure the testcontainer wait stanza is well-tested ================================================ FILE: docs/LICENSE_OF_DEPENDENCIES.md ================================================ # Licenses of dependencies When distributed in a binary form, Telegraf may contain portions of the following works: - cel.dev/expr [Apache License 2.0](https://github.com/google/cel-spec/blob/master/LICENSE) - cloud.google.com/go [Apache License 2.0](https://github.com/googleapis/google-cloud-go/blob/master/LICENSE) - code.cloudfoundry.org/clock [Apache License 2.0](https://github.com/cloudfoundry/clock/blob/master/LICENSE) - collectd.org [ISC License](https://github.com/collectd/go-collectd/blob/master/LICENSE) - dario.cat/mergo [BSD 3-Clause "New" or "Revised" License](https://github.com/imdario/mergo/blob/master/LICENSE) - filippo.io/edwards25519 [BSD 3-Clause "New" or "Revised" License](https://github.com/FiloSottile/edwards25519/blob/main/LICENSE) - github.com/99designs/keyring [MIT License](https://github.com/99designs/keyring/blob/master/LICENSE) - github.com/Azure/azure-amqp-common-go [MIT License](https://github.com/Azure/azure-amqp-common-go/blob/master/LICENSE) - github.com/Azure/azure-event-hubs-go [MIT License](https://github.com/Azure/azure-event-hubs-go/blob/master/LICENSE) - github.com/Azure/azure-kusto-go [MIT License](https://github.com/Azure/azure-kusto-go/blob/master/LICENSE) - github.com/Azure/azure-pipeline-go [MIT License](https://github.com/Azure/azure-pipeline-go/blob/master/LICENSE) - github.com/Azure/azure-sdk-for-go [MIT License](https://github.com/Azure/azure-sdk-for-go/blob/main/LICENSE.txt) - github.com/Azure/azure-sdk-for-go/sdk/azcore [MIT License](https://github.com/Azure/azure-sdk-for-go/blob/main/sdk/azcore/LICENSE.txt) - github.com/Azure/azure-sdk-for-go/sdk/azidentity [MIT License](https://github.com/Azure/azure-sdk-for-go/blob/main/sdk/azidentity/LICENSE.txt) - github.com/Azure/azure-sdk-for-go/sdk/internal [MIT License](https://github.com/Azure/azure-sdk-for-go/blob/main/sdk/internal/LICENSE.txt) - github.com/Azure/azure-sdk-for-go/sdk/messaging/azeventhubs [MIT License](https://github.com/Azure/azure-sdk-for-go/blob/main/sdk/messaging/azeventhubs/LICENSE.txt) - github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/monitor/armmonitor [MIT License](https://github.com/Azure/azure-sdk-for-go/blob/main/sdk/resourcemanager/monitor/armmonitor/LICENSE.txt) - github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/resources/armresources [MIT License](https://github.com/Azure/azure-sdk-for-go/blob/main/sdk/resourcemanager/resources/armresources/LICENSE.txt) - github.com/Azure/azure-sdk-for-go/sdk/storage/azblob [MIT License](https://github.com/Azure/azure-sdk-for-go/blob/main/sdk/storage/azblob/LICENSE.txt) - github.com/Azure/azure-sdk-for-go/sdk/storage/azqueue [MIT License](https://github.com/Azure/azure-sdk-for-go/blob/main/sdk/storage/azqueue/LICENSE.txt) - github.com/Azure/azure-storage-queue-go [MIT License](https://github.com/Azure/azure-storage-queue-go/blob/master/LICENSE) - github.com/Azure/go-amqp [MIT License](https://github.com/Azure/go-amqp/blob/master/LICENSE) - github.com/Azure/go-ansiterm [MIT License](https://github.com/Azure/go-ansiterm/blob/master/LICENSE) - github.com/Azure/go-autorest [Apache License 2.0](https://github.com/Azure/go-autorest/blob/master/LICENSE) - github.com/Azure/go-ntlmssp [MIT License](https://github.com/Azure/go-ntlmssp/blob/master/LICENSE) - github.com/AzureAD/microsoft-authentication-library-for-go [MIT License](https://github.com/AzureAD/microsoft-authentication-library-for-go/blob/main/LICENSE) - github.com/BurntSushi/toml [MIT License](https://github.com/BurntSushi/toml/blob/master/COPYING) - github.com/ClickHouse/ch-go [Apache License 2.0](https://github.com/ClickHouse/ch-go/blob/main/LICENSE) - github.com/ClickHouse/clickhouse-go [Apache License 2.0](https://github.com/ClickHouse/clickhouse-go/blob/master/LICENSE) - github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp [Apache License 2.0](https://github.com/GoogleCloudPlatform/opentelemetry-operations-go/blob/main/LICENSE) - github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric [Apache License 2.0](https://github.com/GoogleCloudPlatform/opentelemetry-operations-go/blob/main/LICENSE) - github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping [Apache License 2.0](https://github.com/GoogleCloudPlatform/opentelemetry-operations-go/blob/main/LICENSE) - github.com/IBM/nzgo [MIT License](https://github.com/IBM/nzgo/blob/master/LICENSE.md) - github.com/IBM/sarama [MIT License](https://github.com/IBM/sarama/blob/master/LICENSE.md) - github.com/Masterminds/goutils [Apache License 2.0](https://github.com/Masterminds/goutils/blob/master/LICENSE.txt) - github.com/Masterminds/semver [MIT License](https://github.com/Masterminds/semver/blob/master/LICENSE.txt) - github.com/Masterminds/sprig [MIT License](https://github.com/Masterminds/sprig/blob/master/LICENSE.txt) - github.com/Max-Sum/base32768 [MIT License](https://github.com/Max-Sum/base32768/blob/master/LICENSE) - github.com/Mellanox/rdmamap [Apache License 2.0](https://github.com/Mellanox/rdmamap/blob/master/LICENSE) - github.com/Microsoft/go-winio [MIT License](https://github.com/Microsoft/go-winio/blob/master/LICENSE) - github.com/PaesslerAG/gval [BSD 3-Clause "New" or "Revised" License](https://github.com/PaesslerAG/gval/blob/master/LICENSE) - github.com/SAP/go-hdb [Apache License 2.0](https://github.com/SAP/go-hdb/blob/main/LICENSE.md) - github.com/abbot/go-http-auth [Apache License 2.0](https://github.com/abbot/go-http-auth/blob/master/LICENSE) - github.com/aerospike/aerospike-client-go [Apache License 2.0](https://github.com/aerospike/aerospike-client-go/blob/master/LICENSE) - github.com/alecthomas/participle [MIT License](https://github.com/alecthomas/participle/blob/master/COPYING) - github.com/alecthomas/units [MIT License](https://github.com/alecthomas/units/blob/master/COPYING) - github.com/alitto/pond [MIT License](https://github.com/alitto/pond/blob/master/LICENSE) - github.com/aliyun/alibaba-cloud-sdk-go [Apache License 2.0](https://github.com/aliyun/alibaba-cloud-sdk-go/blob/master/LICENSE) - github.com/amir/raidman [The Unlicense](https://github.com/amir/raidman/blob/master/UNLICENSE) - github.com/andybalholm/brotli [MIT License](https://github.com/andybalholm/brotli/blob/master/LICENSE) - github.com/antchfx/jsonquery [MIT License](https://github.com/antchfx/jsonquery/blob/master/LICENSE) - github.com/antchfx/xmlquery [MIT License](https://github.com/antchfx/xmlquery/blob/master/LICENSE) - github.com/antchfx/xpath [MIT License](https://github.com/antchfx/xpath/blob/master/LICENSE) - github.com/antithesishq/antithesis-sdk-go [MIT License](https://github.com/antithesishq/antithesis-sdk-go/blob/main/LICENSE) - github.com/antlr4-go/antlr [BSD 3-Clause "New" or "Revised" License](https://github.com/antlr/antlr4/blob/master/LICENSE.txt) - github.com/apache/arrow-go [Apache License 2.0](https://github.com/apache/arrow-go/blob/main/LICENSE.txt) - github.com/apache/arrow/go [Apache License 2.0](https://github.com/apache/arrow/blob/master/LICENSE.txt) - github.com/apache/inlong/inlong-sdk/dataproxy-sdk-twins/dataproxy-sdk-golang [Apache License 2.0](https://github.com/apache/inlong/blob/master/LICENSE) - github.com/apache/iotdb-client-go [Apache License 2.0](https://github.com/apache/iotdb-client-go/blob/main/LICENSE) - github.com/apache/thrift [Apache License 2.0](https://github.com/apache/thrift/blob/master/LICENSE) - github.com/apapsch/go-jsonmerge [MIT License](https://github.com/apapsch/go-jsonmerge/blob/master/LICENSE) - github.com/aristanetworks/glog [Apache License 2.0](https://github.com/aristanetworks/glog/blob/master/LICENSE) - github.com/aristanetworks/goarista [Apache License 2.0](https://github.com/aristanetworks/goarista/blob/master/COPYING) - github.com/armon/go-metrics [MIT License](https://github.com/armon/go-metrics/blob/master/LICENSE) - github.com/awnumar/memcall [Apache License 2.0](https://github.com/awnumar/memcall/blob/master/LICENSE) - github.com/awnumar/memguard [Apache License 2.0](https://github.com/awnumar/memguard/blob/master/LICENSE) - github.com/aws/aws-msk-iam-sasl-signer-go [Apache License 2.0](https://github.com/aws/aws-msk-iam-sasl-signer-go/blob/main/LICENSE) - github.com/aws/aws-sdk-go-v2 [Apache License 2.0](https://github.com/aws/aws-sdk-go-v2/blob/main/LICENSE.txt) - github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream [Apache License 2.0](https://github.com/aws/aws-sdk-go-v2/blob/main/aws/protocol/eventstream/LICENSE.txt) - github.com/aws/aws-sdk-go-v2/config [Apache License 2.0](https://github.com/aws/aws-sdk-go-v2/blob/main/config/LICENSE.txt) - github.com/aws/aws-sdk-go-v2/credentials [Apache License 2.0](https://github.com/aws/aws-sdk-go-v2/blob/main/credentials/LICENSE.txt) - github.com/aws/aws-sdk-go-v2/feature/ec2/imds [Apache License 2.0](https://github.com/aws/aws-sdk-go-v2/blob/main/feature/ec2/imds/LICENSE.txt) - github.com/aws/aws-sdk-go-v2/feature/s3/manager [Apache License 2.0](https://github.com/aws/aws-sdk-go-v2/blob/main/feature/s3/manager/LICENSE.txt) - github.com/aws/aws-sdk-go-v2/internal/configsources [Apache License 2.0](https://github.com/aws/aws-sdk-go-v2/blob/main/internal/configsources/LICENSE.txt) - github.com/aws/aws-sdk-go-v2/internal/endpoints [Apache License 2.0](https://github.com/aws/aws-sdk-go-v2/blob/main/internal/endpoints/v2/LICENSE.txt) - github.com/aws/aws-sdk-go-v2/internal/ini [Apache License 2.0](https://github.com/aws/aws-sdk-go-v2/blob/main/internal/ini/LICENSE.txt) - github.com/aws/aws-sdk-go-v2/internal/v4a [Apache License 2.0](https://github.com/aws/aws-sdk-go-v2/blob/main/internal/v4a/LICENSE.txt) - github.com/aws/aws-sdk-go-v2/service/cloudwatch [Apache License 2.0](https://github.com/aws/aws-sdk-go-v2/blob/main/service/cloudwatch/LICENSE.txt) - github.com/aws/aws-sdk-go-v2/service/cloudwatchlogs [Apache License 2.0](https://github.com/aws/aws-sdk-go-v2/blob/main/service/cloudwatchlogs/LICENSE.txt) - github.com/aws/aws-sdk-go-v2/service/dynamodb [Apache License 2.0](https://github.com/aws/aws-sdk-go-v2/blob/main/service/dynamodb/LICENSE.txt) - github.com/aws/aws-sdk-go-v2/service/ec2 [Apache License 2.0](https://github.com/aws/aws-sdk-go-v2/blob/main/service/ec2/LICENSE.txt) - github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding [Apache License 2.0](https://github.com/aws/aws-sdk-go-v2/blob/main/service/internal/accept-encoding/LICENSE.txt) - github.com/aws/aws-sdk-go-v2/service/internal/checksum [Apache License 2.0](https://github.com/aws/aws-sdk-go-v2/blob/main/service/internal/checksum/LICENSE.txt) - github.com/aws/aws-sdk-go-v2/service/internal/endpoint-discovery [Apache License 2.0](https://github.com/aws/aws-sdk-go-v2/blob/main/service/internal/endpoint-discovery/LICENSE.txt) - github.com/aws/aws-sdk-go-v2/service/internal/presigned-url [Apache License 2.0](https://github.com/aws/aws-sdk-go-v2/blob/main/service/internal/presigned-url/LICENSE.txt) - github.com/aws/aws-sdk-go-v2/service/internal/s3shared [Apache License 2.0](https://github.com/aws/aws-sdk-go-v2/blob/main/service/internal/s3shared/LICENSE.txt) - github.com/aws/aws-sdk-go-v2/service/kinesis [Apache License 2.0](https://github.com/aws/aws-sdk-go-v2/blob/main/service/kinesis/LICENSE.txt) - github.com/aws/aws-sdk-go-v2/service/s3 [Apache License 2.0](https://github.com/aws/aws-sdk-go-v2/blob/main/service/s3/LICENSE.txt) - github.com/aws/aws-sdk-go-v2/service/signin [Apache License 2.0](https://github.com/aws/aws-sdk-go-v2/blob/main/service/signin/LICENSE.txt) - github.com/aws/aws-sdk-go-v2/service/sso [Apache License 2.0](https://github.com/aws/aws-sdk-go-v2/blob/main/service/ec2/LICENSE.txt) - github.com/aws/aws-sdk-go-v2/service/ssooidc [Apache License 2.0](https://github.com/aws/aws-sdk-go-v2/blob/main/service/ssooidc/LICENSE.txt) - github.com/aws/aws-sdk-go-v2/service/sts [Apache License 2.0](https://github.com/aws/aws-sdk-go-v2/blob/main/service/sts/LICENSE.txt) - github.com/aws/aws-sdk-go-v2/service/timestreamwrite [Apache License 2.0](https://github.com/aws/aws-sdk-go-v2/blob/main/service/timestreamwrite/LICENSE.txt) - github.com/aws/smithy-go [Apache License 2.0](https://github.com/aws/smithy-go/blob/main/LICENSE) - github.com/benbjohnson/clock [MIT License](https://github.com/benbjohnson/clock/blob/master/LICENSE) - github.com/beorn7/perks [MIT License](https://github.com/beorn7/perks/blob/master/LICENSE) - github.com/bluenviron/gomavlib [MIT License](https://github.com/bluenviron/gomavlib/blob/main/LICENSE) - github.com/blues/jsonata-go [MIT License](https://github.com/blues/jsonata-go/blob/main/LICENSE) - github.com/bmatcuk/doublestar [MIT License](https://github.com/bmatcuk/doublestar/blob/master/LICENSE) - github.com/boschrexroth/ctrlx-datalayer-golang [MIT License](https://github.com/boschrexroth/ctrlx-datalayer-golang/blob/main/LICENSE) - github.com/brutella/dnssd [MIT License](https://github.com/brutella/dnssd/blob/master/LICENSE) - github.com/bufbuild/protocompile [Apache License 2.0](https://github.com/bufbuild/protocompile/blob/main/LICENSE) - github.com/bwmarrin/snowflake [BSD 2-Clause "Simplified" License](https://github.com/bwmarrin/snowflake/blob/master/LICENSE) - github.com/caio/go-tdigest [MIT License](https://github.com/caio/go-tdigest/blob/master/LICENSE) - github.com/cenkalti/backoff [MIT License](https://github.com/cenkalti/backoff/blob/master/LICENSE) - github.com/cespare/xxhash [MIT License](https://github.com/cespare/xxhash/blob/master/LICENSE.txt) - github.com/cisco-ie/nx-telemetry-proto [Apache License 2.0](https://github.com/cisco-ie/nx-telemetry-proto/blob/master/LICENSE) - github.com/clarify/clarify-go [Apache License 2.0](https://github.com/clarify/clarify-go/blob/master/LICENSE) - github.com/clipperhouse/uax29 [MIT License](https://github.com/clipperhouse/uax29/blob/master/LICENSE) - github.com/cloudevents/sdk-go [Apache License 2.0](https://github.com/cloudevents/sdk-go/blob/main/LICENSE) - github.com/cncf/xds/go [Apache License 2.0](https://github.com/cncf/xds/blob/main/LICENSE) - github.com/compose-spec/compose-go [Apache License 2.0](https://github.com/compose-spec/compose-go/blob/master/LICENSE) - github.com/containerd/errdefs [Apache License 2.0](https://github.com/containerd/errdefs/blob/main/LICENSE) - github.com/containerd/errdefs/pkg [Apache License 2.0](https://github.com/containerd/errdefs/blob/main/LICENSE) - github.com/containerd/log [Apache License 2.0](https://github.com/containerd/log/blob/main/LICENSE) - github.com/containerd/platforms [Apache License 2.0](https://github.com/containerd/platforms/blob/main/LICENSE) - github.com/coocood/freecache [MIT License](https://github.com/coocood/freecache/blob/master/LICENSE) - github.com/coreos/go-semver [Apache License 2.0](https://github.com/coreos/go-semver/blob/main/LICENSE) - github.com/coreos/go-systemd [Apache License 2.0](https://github.com/coreos/go-systemd/blob/main/LICENSE) - github.com/couchbase/go-couchbase [MIT License](https://github.com/couchbase/go-couchbase/blob/master/LICENSE) - github.com/couchbase/gomemcached [MIT License](https://github.com/couchbase/gomemcached/blob/master/LICENSE) - github.com/couchbase/goutils [Apache License 2.0](https://github.com/couchbase/goutils/blob/master/LICENSE.md) - github.com/cpuguy83/dockercfg [MIT License](https://github.com/cpuguy83/dockercfg/blob/main/LICENSE) - github.com/cpuguy83/go-md2man [MIT License](https://github.com/cpuguy83/go-md2man/blob/master/LICENSE.md) - github.com/creack/goselect [MIT License](https://github.com/creack/goselect/blob/master/LICENSE) - github.com/danieljoos/wincred [MIT License](https://github.com/danieljoos/wincred/blob/master/LICENSE) - github.com/datadope-io/go-zabbix [MIT License](https://github.com/datadope-io/go-zabbix/blob/master/LICENSE) - github.com/davecgh/go-spew [ISC License](https://github.com/davecgh/go-spew/blob/master/LICENSE) - github.com/devigned/tab [MIT License](https://github.com/devigned/tab/blob/master/LICENSE) - github.com/dgryski/go-rendezvous [MIT License](https://github.com/dgryski/go-rendezvous/blob/master/LICENSE) - github.com/digitalocean/go-libvirt [Apache License 2.0](https://github.com/digitalocean/go-libvirt/blob/master/LICENSE.md) - github.com/dimchansky/utfbom [Apache License 2.0](https://github.com/dimchansky/utfbom/blob/master/LICENSE) - github.com/distribution/reference [Apache License 2.0](https://github.com/distribution/reference/blob/main/LICENSE) - github.com/djherbis/times [MIT License](https://github.com/djherbis/times/blob/master/LICENSE) - github.com/docker/docker [Apache License 2.0](https://github.com/docker/docker/blob/master/LICENSE) - github.com/docker/go-connections [Apache License 2.0](https://github.com/docker/go-connections/blob/master/LICENSE) - github.com/docker/go-units [Apache License 2.0](https://github.com/docker/go-units/blob/master/LICENSE) - github.com/dustin/go-humanize [MIT License](https://github.com/dustin/go-humanize/blob/master/LICENSE) - github.com/dvsekhvalnov/jose2go [MIT License](https://github.com/dvsekhvalnov/jose2go/blob/master/LICENSE) - github.com/dynatrace-oss/dynatrace-metric-utils-go [Apache License 2.0](https://github.com/dynatrace-oss/dynatrace-metric-utils-go/blob/master/LICENSE) - github.com/eapache/go-resiliency [MIT License](https://github.com/eapache/go-resiliency/blob/master/LICENSE) - github.com/eapache/queue [MIT License](https://github.com/eapache/queue/blob/master/LICENSE) - github.com/ebitengine/purego [Apache License 2.0](https://github.com/ebitengine/purego/blob/main/LICENSE) - github.com/eclipse/paho.golang [Eclipse Public License - v 2.0](https://github.com/eclipse/paho.golang/blob/master/LICENSE) - github.com/eclipse/paho.mqtt.golang [Eclipse Public License - v 2.0](https://github.com/eclipse/paho.mqtt.golang/blob/master/LICENSE) - github.com/elastic/go-sysinfo [Apache License 2.0](https://github.com/elastic/go-sysinfo/blob/main/LICENSE.txt) - github.com/elastic/go-windows [Apache License 2.0](https://github.com/elastic/go-windows/blob/main/LICENSE.txt) - github.com/emiago/sipgo [BSD 2-Clause "Simplified" License](https://github.com/emiago/sipgo/blob/main/LICENSE) - github.com/emicklei/go-restful [MIT License](https://github.com/emicklei/go-restful/blob/v3/LICENSE) - github.com/envoyproxy/go-control-plane/envoy [Apache License 2.0](https://github.com/envoyproxy/go-control-plane/blob/main/LICENSE) - github.com/envoyproxy/protoc-gen-validate [Apache License 2.0](https://github.com/bufbuild/protoc-gen-validate/blob/main/LICENSE) - github.com/facebook/time [Apache License 2.0](https://github.com/facebook/time/blob/main/LICENSE) - github.com/fatih/color [MIT License](https://github.com/fatih/color/blob/master/LICENSE.md) - github.com/felixge/httpsnoop [MIT License](https://github.com/felixge/httpsnoop/blob/master/LICENSE.txt) - github.com/fxamacker/cbor [MIT License](https://github.com/fxamacker/cbor/blob/master/LICENSE) - github.com/gabriel-vasile/mimetype [MIT License](https://github.com/gabriel-vasile/mimetype/blob/master/LICENSE) - github.com/go-asn1-ber/asn1-ber [MIT License](https://github.com/go-asn1-ber/asn1-ber/blob/v1.3/LICENSE) - github.com/go-chi/chi [MIT License](https://github.com/go-chi/chi/blob/master/LICENSE) - github.com/go-faster/city [MIT License](https://github.com/go-faster/city/blob/main/LICENSE) - github.com/go-faster/errors [BSD 3-Clause "New" or "Revised" License](https://github.com/go-faster/errors/blob/main/LICENSE) - github.com/go-git/go-billy [Apache License 2.0](https://github.com/go-git/go-billy/blob/master/LICENSE) - github.com/go-jose/go-jose [Apache License 2.0](https://github.com/go-jose/go-jose/blob/main/LICENSE) - github.com/go-ldap/ldap [MIT License](https://github.com/go-ldap/ldap/blob/v3.4.1/LICENSE) - github.com/go-logfmt/logfmt [MIT License](https://github.com/go-logfmt/logfmt/blob/master/LICENSE) - github.com/go-logr/logr [Apache License 2.0](https://github.com/go-logr/logr/blob/master/LICENSE) - github.com/go-logr/stdr [Apache License 2.0](https://github.com/go-logr/stdr/blob/master/LICENSE) - github.com/go-ole/go-ole [MIT License](https://github.com/go-ole/go-ole/blob/master/LICENSE) - github.com/go-openapi/jsonpointer [Apache License 2.0](https://github.com/go-openapi/jsonpointer/blob/master/LICENSE) - github.com/go-openapi/jsonreference [Apache License 2.0](https://github.com/go-openapi/jsonreference/blob/master/LICENSE) - github.com/go-openapi/swag [Apache License 2.0](https://github.com/go-openapi/swag/blob/master/LICENSE) - github.com/go-openapi/swag/cmdutils [Apache License 2.0](https://github.com/go-openapi/swag/blob/master/LICENSE) - github.com/go-openapi/swag/conv [Apache License 2.0](https://github.com/go-openapi/swag/blob/master/LICENSE) - github.com/go-openapi/swag/fileutils [Apache License 2.0](https://github.com/go-openapi/swag/blob/master/LICENSE) - github.com/go-openapi/swag/jsonname [Apache License 2.0](https://github.com/go-openapi/swag/blob/master/LICENSE) - github.com/go-openapi/swag/jsonutils [Apache License 2.0](https://github.com/go-openapi/swag/blob/master/LICENSE) - github.com/go-openapi/swag/loading [Apache License 2.0](https://github.com/go-openapi/swag/blob/master/LICENSE) - github.com/go-openapi/swag/mangling [Apache License 2.0](https://github.com/go-openapi/swag/blob/master/LICENSE) - github.com/go-openapi/swag/netutils [Apache License 2.0](https://github.com/go-openapi/swag/blob/master/LICENSE) - github.com/go-openapi/swag/stringutils [Apache License 2.0](https://github.com/go-openapi/swag/blob/master/LICENSE) - github.com/go-openapi/swag/typeutils [Apache License 2.0](https://github.com/go-openapi/swag/blob/master/LICENSE) - github.com/go-openapi/swag/yamlutils [Apache License 2.0](https://github.com/go-openapi/swag/blob/master/LICENSE) - github.com/go-redis/redis [BSD 2-Clause "Simplified" License](https://github.com/go-redis/redis/blob/master/LICENSE) - github.com/go-resty/resty [MIT License](https://github.com/go-resty/resty/blob/v2/LICENSE) - github.com/go-sql-driver/mysql [Mozilla Public License 2.0](https://github.com/go-sql-driver/mysql/blob/master/LICENSE) - github.com/go-stack/stack [MIT License](https://github.com/go-stack/stack/blob/master/LICENSE.md) - github.com/go-stomp/stomp [Apache License 2.0](https://github.com/go-stomp/stomp/blob/master/LICENSE.txt) - github.com/go-viper/mapstructure [MIT License](https://github.com/go-viper/mapstructure/blob/main/LICENSE) - github.com/gobwas/glob [MIT License](https://github.com/gobwas/glob/blob/master/LICENSE) - github.com/gobwas/httphead [MIT License](https://github.com/gobwas/httphead/blob/master/LICENSE) - github.com/gobwas/pool [MIT License](https://github.com/gobwas/pool/blob/master/LICENSE) - github.com/gobwas/ws [MIT License](https://github.com/gobwas/ws/blob/master/LICENSE) - github.com/goccy/go-json [MIT License](https://github.com/goccy/go-json/blob/master/LICENSE) - github.com/godbus/dbus [BSD 2-Clause "Simplified" License](https://github.com/godbus/dbus/blob/master/LICENSE) - github.com/gofrs/uuid [MIT License](https://github.com/gofrs/uuid/blob/master/LICENSE) - github.com/gogo/protobuf [BSD 3-Clause Clear License](https://github.com/gogo/protobuf/blob/master/LICENSE) - github.com/golang-jwt/jwt [MIT License](https://github.com/golang-jwt/jwt/blob/main/LICENSE) - github.com/golang-sql/civil [Apache License 2.0](https://github.com/golang-sql/civil/blob/master/LICENSE) - github.com/golang-sql/sqlexp [BSD 3-Clause "New" or "Revised" License](https://github.com/golang-sql/sqlexp/blob/master/LICENSE) - github.com/golang/geo [Apache License 2.0](https://github.com/golang/geo/blob/master/LICENSE) - github.com/golang/groupcache [Apache License 2.0](https://github.com/golang/groupcache/blob/master/LICENSE) - github.com/golang/protobuf [BSD 3-Clause "New" or "Revised" License](https://github.com/golang/protobuf/blob/master/LICENSE) - github.com/golang/snappy [BSD 3-Clause "New" or "Revised" License](https://github.com/golang/snappy/blob/master/LICENSE) - github.com/google/cel-go [Apache License 2.0](https://github.com/google/cel-go/blob/master/LICENSE) - github.com/google/flatbuffers [Apache License 2.0](https://github.com/google/flatbuffers/blob/master/LICENSE) - github.com/google/gnostic-models [Apache License 2.0](https://github.com/google/gnostic-models/blob/master/LICENSE) - github.com/google/gnxi [Apache License 2.0](https://github.com/google/gnxi/blob/master/LICENSE) - github.com/google/go-cmp [BSD 3-Clause "New" or "Revised" License](https://github.com/google/go-cmp/blob/master/LICENSE) - github.com/google/go-github [BSD 3-Clause "New" or "Revised" License](https://github.com/google/go-github/blob/master/LICENSE) - github.com/google/go-querystring [BSD 3-Clause "New" or "Revised" License](https://github.com/google/go-querystring/blob/master/LICENSE) - github.com/google/go-tpm [Apache License 2.0](https://github.com/google/go-tpm/blob/main/LICENSE) - github.com/google/s2a-go [Apache License 2.0](https://github.com/google/s2a-go/blob/main/LICENSE.md) - github.com/google/uuid [BSD 3-Clause "New" or "Revised" License](https://github.com/google/uuid/blob/master/LICENSE) - github.com/googleapis/enterprise-certificate-proxy [Apache License 2.0](https://github.com/googleapis/enterprise-certificate-proxy/blob/main/LICENSE) - github.com/googleapis/gax-go [BSD 3-Clause "New" or "Revised" License](https://github.com/googleapis/gax-go/blob/master/LICENSE) - github.com/gopacket/gopacket [BSD 3-Clause "New" or "Revised" License](https://github.com/gopacket/gopacket/blob/master/LICENSE) - github.com/gopcua/opcua [MIT License](https://github.com/gopcua/opcua/blob/master/LICENSE) - github.com/gophercloud/gophercloud [Apache License 2.0](https://github.com/gophercloud/gophercloud/blob/master/LICENSE) - github.com/gorcon/rcon [MIT License](https://github.com/gorcon/rcon/blob/master/LICENSE) - github.com/gorilla/mux [BSD 3-Clause "New" or "Revised" License](https://github.com/gorilla/mux/blob/master/LICENSE) - github.com/gorilla/websocket [BSD 2-Clause "Simplified" License](https://github.com/gorilla/websocket/blob/master/LICENSE) - github.com/gosnmp/gosnmp [BSD 2-Clause "Simplified" License](https://github.com/gosnmp/gosnmp/blob/master/LICENSE) - github.com/grafana/regexp [BSD 3-Clause "New" or "Revised" License](https://github.com/grafana/regexp/blob/main/LICENSE) - github.com/grid-x/modbus [BSD 3-Clause "New" or "Revised" License](https://github.com/grid-x/modbus/blob/master/LICENSE) - github.com/grid-x/serial [MIT License](https://github.com/grid-x/serial/blob/master/LICENSE) - github.com/grpc-ecosystem/grpc-gateway [BSD 3-Clause "New" or "Revised" License](https://github.com/grpc-ecosystem/grpc-gateway/blob/main/LICENSE) - github.com/gsterjov/go-libsecret [MIT License](https://github.com/gsterjov/go-libsecret/blob/master/LICENSE) - github.com/gwos/tcg/sdk [MIT License](https://github.com/gwos/tcg/blob/master/LICENSE) - github.com/hailocab/go-hostpool [MIT License](https://github.com/hailocab/go-hostpool/blob/master/LICENSE) - github.com/hashicorp/consul/api [Mozilla Public License 2.0](https://github.com/hashicorp/consul/blob/main/api/LICENSE) - github.com/hashicorp/errwrap [Mozilla Public License 2.0](https://github.com/hashicorp/errwrap/blob/master/LICENSE) - github.com/hashicorp/go-cleanhttp [Mozilla Public License 2.0](https://github.com/hashicorp/go-cleanhttp/blob/master/LICENSE) - github.com/hashicorp/go-hclog [MIT License](https://github.com/hashicorp/go-hclog/blob/main/LICENSE) - github.com/hashicorp/go-immutable-radix [Mozilla Public License 2.0](https://github.com/hashicorp/go-immutable-radix/blob/master/LICENSE) - github.com/hashicorp/go-multierror [Mozilla Public License 2.0](https://github.com/hashicorp/go-multierror/blob/master/LICENSE) - github.com/hashicorp/go-retryablehttp [Mozilla Public License 2.0](https://github.com/hashicorp/go-retryablehttp/blob/main/LICENSE) - github.com/hashicorp/go-rootcerts [Mozilla Public License 2.0](https://github.com/hashicorp/go-rootcerts/blob/master/LICENSE) - github.com/hashicorp/go-secure-stdlib/parseutil [Mozilla Public License 2.0](https://github.com/hashicorp/go-secure-stdlib/blob/main/parseutil/LICENSE) - github.com/hashicorp/go-secure-stdlib/strutil [Mozilla Public License 2.0](https://github.com/hashicorp/go-secure-stdlib/blob/main/strutil/LICENSE) - github.com/hashicorp/go-sockaddr [Mozilla Public License 2.0](https://github.com/hashicorp/go-sockaddr/blob/master/LICENSE) - github.com/hashicorp/go-uuid [Mozilla Public License 2.0](https://github.com/hashicorp/go-uuid/blob/master/LICENSE) - github.com/hashicorp/go-version [Mozilla Public License 2.0](https://github.com/hashicorp/go-version/blob/main/LICENSE) - github.com/hashicorp/golang-lru [Mozilla Public License 2.0](https://github.com/hashicorp/golang-lru/blob/master/LICENSE) - github.com/hashicorp/hcl [Mozilla Public License 2.0](https://github.com/hashicorp/hcl/blob/main/LICENSE) - github.com/hashicorp/packer-plugin-sdk [Mozilla Public License 2.0](https://github.com/hashicorp/packer-plugin-sdk/blob/main/LICENSE) - github.com/hashicorp/serf [Mozilla Public License 2.0](https://github.com/hashicorp/serf/blob/master/LICENSE) - github.com/hashicorp/vault/api [Mozilla Public License 2.0](https://github.com/hashicorp/vault/blob/main/api/LICENSE) - github.com/hashicorp/vault/api/auth/approle [Mozilla Public License 2.0](https://github.com/hashicorp/vault/blob/main/api/auth/approle/LICENSE) - github.com/huandu/xstrings [MIT License](https://github.com/huandu/xstrings/blob/master/LICENSE) - github.com/icholy/digest [MIT License](https://github.com/icholy/digest/blob/master/LICENSE) - github.com/imdario/mergo [BSD 3-Clause "New" or "Revised" License](https://github.com/imdario/mergo/blob/master/LICENSE) - github.com/influxdata/influxdb-observability/common [MIT License](https://github.com/influxdata/influxdb-observability/blob/main/LICENSE) - github.com/influxdata/influxdb-observability/influx2otel [MIT License](https://github.com/influxdata/influxdb-observability/blob/main/LICENSE) - github.com/influxdata/influxdb-observability/otel2influx [MIT License](https://github.com/influxdata/influxdb-observability/blob/main/LICENSE) - github.com/influxdata/line-protocol [MIT License](https://github.com/influxdata/line-protocol/blob/v2/LICENSE) - github.com/influxdata/tail [MIT License](https://github.com/influxdata/tail/blob/master/LICENSE.txt) - github.com/influxdata/toml [MIT License](https://github.com/influxdata/toml/blob/master/LICENSE) - github.com/intel/iaevents [Apache License 2.0](https://github.com/intel/iaevents/blob/main/LICENSE) - github.com/intel/powertelemetry [Apache License 2.0](https://github.com/intel/powertelemetry/blob/main/LICENSE) - github.com/jackc/chunkreader [MIT License](https://github.com/jackc/chunkreader/blob/master/LICENSE) - github.com/jackc/pgconn [MIT License](https://github.com/jackc/pgconn/blob/master/LICENSE) - github.com/jackc/pgio [MIT License](https://github.com/jackc/pgio/blob/master/LICENSE) - github.com/jackc/pgpassfile [MIT License](https://github.com/jackc/pgpassfile/blob/master/LICENSE) - github.com/jackc/pgproto3 [MIT License](https://github.com/jackc/pgproto3/blob/master/LICENSE) - github.com/jackc/pgservicefile [MIT License](https://github.com/jackc/pgservicefile/blob/master/LICENSE) - github.com/jackc/pgtype [MIT License](https://github.com/jackc/pgtype/blob/master/LICENSE) - github.com/jackc/pgx [MIT License](https://github.com/jackc/pgx/blob/master/LICENSE) - github.com/jackc/puddle [MIT License](https://github.com/jackc/puddle/blob/master/LICENSE) - github.com/jaegertracing/jaeger [Apache License 2.0](https://github.com/jaegertracing/jaeger/blob/master/LICENSE) - github.com/jcmturner/aescts [Apache License 2.0](https://github.com/jcmturner/aescts/blob/master/LICENSE) - github.com/jcmturner/dnsutils [Apache License 2.0](https://github.com/jcmturner/dnsutils/blob/master/LICENSE) - github.com/jcmturner/gofork [BSD 3-Clause "New" or "Revised" License](https://github.com/jcmturner/gofork/blob/master/LICENSE) - github.com/jcmturner/goidentity [Apache License 2.0](https://github.com/jcmturner/goidentity/blob/master/LICENSE) - github.com/jcmturner/gokrb5 [Apache License 2.0](https://github.com/jcmturner/gokrb5/blob/master/LICENSE) - github.com/jcmturner/rpc [Apache License 2.0](https://github.com/jcmturner/rpc/blob/master/LICENSE) - github.com/jedib0t/go-pretty [MIT License](https://github.com/jedib0t/go-pretty/blob/main/LICENSE) - github.com/jeremywohl/flatten [MIT License](https://github.com/jeremywohl/flatten/blob/master/LICENSE) - github.com/jmespath/go-jmespath [Apache License 2.0](https://github.com/jmespath/go-jmespath/blob/master/LICENSE) - github.com/jmhodges/clock [MIT License](https://github.com/jmhodges/clock/blob/main/LICENSE) - github.com/joeshaw/multierror [MIT License](https://github.com/joeshaw/multierror/blob/master/LICENSE) - github.com/josharian/intern [MIT License](https://github.com/josharian/intern/blob/master/LICENSE.md) - github.com/josharian/native [MIT License](https://github.com/josharian/native/blob/main/license) - github.com/jpillora/backoff [MIT License](https://github.com/jpillora/backoff/blob/master/LICENSE) - github.com/json-iterator/go [MIT License](https://github.com/json-iterator/go/blob/master/LICENSE) - github.com/jzelinskie/whirlpool [BSD 3-Clause "New" or "Revised" License](https://github.com/jzelinskie/whirlpool/blob/master/LICENSE) - github.com/karrick/godirwalk [BSD 2-Clause "Simplified" License](https://github.com/karrick/godirwalk/blob/master/LICENSE) - github.com/kballard/go-shellquote [MIT License](https://github.com/kballard/go-shellquote/blob/master/LICENSE) - github.com/klauspost/compress [BSD 3-Clause Clear License](https://github.com/klauspost/compress/blob/master/LICENSE) - github.com/klauspost/cpuid [MIT License](https://github.com/klauspost/cpuid/blob/master/LICENSE) - github.com/klauspost/pgzip [MIT License](https://github.com/klauspost/pgzip/blob/master/LICENSE) - github.com/kolo/xmlrpc [MIT License](https://github.com/kolo/xmlrpc/blob/master/LICENSE) - github.com/kr/fs [BSD 3-Clause "New" or "Revised" License](https://github.com/kr/fs/blob/main/LICENSE) - github.com/kylelemons/godebug [Apache License 2.0](https://github.com/kylelemons/godebug/blob/master/LICENSE) - github.com/leodido/go-syslog [MIT License](https://github.com/influxdata/go-syslog/blob/develop/LICENSE) - github.com/leodido/ragel-machinery [MIT License](https://github.com/leodido/ragel-machinery/blob/develop/LICENSE) - github.com/likexian/gokit [Apache License 2.0](https://github.com/likexian/gokit/blob/master/LICENSE) - github.com/likexian/whois [Apache License 2.0](https://github.com/likexian/whois/blob/master/LICENSE) - github.com/likexian/whois-parser [Apache License 2.0](https://github.com/likexian/whois-parser/blob/master/LICENSE) - github.com/linkedin/goavro [Apache License 2.0](https://github.com/linkedin/goavro/blob/master/LICENSE) - github.com/logzio/azure-monitor-metrics-receiver [MIT License](https://github.com/logzio/azure-monitor-metrics-receiver/blob/master/LICENSE) - github.com/magiconair/properties [BSD 2-Clause "Simplified" License](https://github.com/magiconair/properties/blob/main/LICENSE.md) - github.com/mailru/easyjson [MIT License](https://github.com/mailru/easyjson/blob/master/LICENSE) - github.com/mattn/go-colorable [MIT License](https://github.com/mattn/go-colorable/blob/master/LICENSE) - github.com/mattn/go-ieproxy [MIT License](https://github.com/mattn/go-ieproxy/blob/master/LICENSE) - github.com/mattn/go-isatty [MIT License](https://github.com/mattn/go-isatty/blob/master/LICENSE) - github.com/mattn/go-runewidth [MIT License](https://github.com/mattn/go-runewidth/blob/master/LICENSE) - github.com/mdlayher/apcupsd [MIT License](https://github.com/mdlayher/apcupsd/blob/master/LICENSE.md) - github.com/mdlayher/genetlink [MIT License](https://github.com/mdlayher/genetlink/blob/master/LICENSE.md) - github.com/mdlayher/netlink [MIT License](https://github.com/mdlayher/netlink/blob/master/LICENSE.md) - github.com/mdlayher/socket [MIT License](https://github.com/mdlayher/socket/blob/master/LICENSE.md) - github.com/mdlayher/vsock [MIT License](https://github.com/mdlayher/vsock/blob/main/LICENSE.md) - github.com/microsoft/ApplicationInsights-Go [MIT License](https://github.com/microsoft/ApplicationInsights-Go/blob/master/LICENSE) - github.com/microsoft/go-mssqldb [BSD 3-Clause "New" or "Revised" License](https://github.com/microsoft/go-mssqldb/blob/master/LICENSE.txt) - github.com/miekg/dns [BSD 3-Clause Clear License](https://github.com/miekg/dns/blob/master/LICENSE) - github.com/minio/highwayhash [Apache License 2.0](https://github.com/minio/highwayhash/blob/master/LICENSE) - github.com/mitchellh/copystructure [MIT License](https://github.com/mitchellh/copystructure/blob/master/LICENSE) - github.com/mitchellh/go-homedir [MIT License](https://github.com/mitchellh/go-homedir/blob/master/LICENSE) - github.com/mitchellh/mapstructure [MIT License](https://github.com/mitchellh/mapstructure/blob/master/LICENSE) - github.com/mitchellh/reflectwalk [MIT License](https://github.com/mitchellh/reflectwalk/blob/master/LICENSE) - github.com/moby/docker-image-spec [Apache License 2.0](https://github.com/moby/docker-image-spec/blob/main/LICENSE) - github.com/moby/go-archive [Apache License 2.0](https://github.com/moby/go-archive/blob/main/LICENSE) - github.com/moby/ipvs [Apache License 2.0](https://github.com/moby/ipvs/blob/master/LICENSE) - github.com/moby/patternmatcher [Apache License 2.0](https://github.com/moby/patternmatcher/blob/main/LICENSE) - github.com/moby/sys/sequential [Apache License 2.0](https://github.com/moby/sys/blob/main/LICENSE) - github.com/moby/sys/user [Apache License 2.0](https://github.com/moby/sys/blob/main/LICENSE) - github.com/moby/sys/userns [Apache License 2.0](https://github.com/moby/sys/blob/main/LICENSE) - github.com/moby/term [Apache License 2.0](https://github.com/moby/term/blob/master/LICENSE) - github.com/modern-go/concurrent [Apache License 2.0](https://github.com/modern-go/concurrent/blob/master/LICENSE) - github.com/modern-go/reflect2 [Apache License 2.0](https://github.com/modern-go/reflect2/blob/master/LICENSE) - github.com/montanaflynn/stats [MIT License](https://github.com/montanaflynn/stats/blob/master/LICENSE) - github.com/morikuni/aec [MIT License](https://github.com/morikuni/aec/blob/master/LICENSE) - github.com/mtibben/percent [MIT License](https://github.com/mtibben/percent/blob/master/LICENSE) - github.com/multiplay/go-ts3 [BSD 2-Clause "Simplified" License](https://github.com/multiplay/go-ts3/blob/master/LICENSE) - github.com/munnerz/goautoneg [BSD 3-Clause Clear License](https://github.com/munnerz/goautoneg/blob/master/LICENSE) - github.com/mwitkow/go-conntrack [Apache License 2.0](https://github.com/mwitkow/go-conntrack/blob/master/LICENSE) - github.com/naoina/go-stringutil [MIT License](https://github.com/naoina/go-stringutil/blob/master/LICENSE) - github.com/nats-io/jwt [Apache License 2.0](https://github.com/nats-io/jwt/blob/master/LICENSE) - github.com/nats-io/nats-server [Apache License 2.0](https://github.com/nats-io/nats-server/blob/master/LICENSE) - github.com/nats-io/nats.go [Apache License 2.0](https://github.com/nats-io/nats.go/blob/master/LICENSE) - github.com/nats-io/nkeys [Apache License 2.0](https://github.com/nats-io/nkeys/blob/master/LICENSE) - github.com/nats-io/nuid [Apache License 2.0](https://github.com/nats-io/nuid/blob/master/LICENSE) - github.com/ncruces/go-strftime [MIT License](https://github.com/ncruces/go-strftime/blob/main/LICENSE) - github.com/ncw/swift [MIT License](https://github.com/ncw/swift/blob/master/COPYING) - github.com/netsampler/goflow2 [BSD 3-Clause "New" or "Revised" License](https://github.com/netsampler/goflow2/blob/main/LICENSE) - github.com/newrelic/newrelic-telemetry-sdk-go [Apache License 2.0](https://github.com/newrelic/newrelic-telemetry-sdk-go/blob/master/LICENSE.md) - github.com/nsqio/go-nsq [MIT License](https://github.com/nsqio/go-nsq/blob/master/LICENSE) - github.com/nwaples/tacplus [BSD 2-Clause "Simplified" License](https://github.com/nwaples/tacplus/blob/master/LICENSE) - github.com/oapi-codegen/runtime [Apache License 2.0](https://github.com/oapi-codegen/runtime/blob/main/LICENSE) - github.com/olivere/elastic [MIT License](https://github.com/olivere/elastic/blob/release-branch.v7/LICENSE) - github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatautil [Apache License 2.0](https://github.com/open-telemetry/opentelemetry-collector-contrib/blob/main/LICENSE) - github.com/openconfig/gnmi [Apache License 2.0](https://github.com/openconfig/gnmi/blob/master/LICENSE) - github.com/openconfig/goyang [Apache License 2.0](https://github.com/openconfig/goyang/blob/master/LICENSE) - github.com/opencontainers/go-digest [Apache License 2.0](https://github.com/opencontainers/go-digest/blob/master/LICENSE) - github.com/opencontainers/image-spec [Apache License 2.0](https://github.com/opencontainers/image-spec/blob/master/LICENSE) - github.com/opensearch-project/opensearch-go [Apache License 2.0](https://github.com/opensearch-project/opensearch-go/blob/main/LICENSE.txt) - github.com/opentracing/opentracing-go [Apache License 2.0](https://github.com/opentracing/opentracing-go/blob/master/LICENSE) - github.com/oxtoacart/bpool [Apache License 2.0](https://github.com/oxtoacart/bpool/blob/master/LICENSE) - github.com/p4lang/p4runtime [Apache License 2.0](https://github.com/p4lang/p4runtime/blob/main/LICENSE) - github.com/panjf2000/ants [MIT License](https://github.com/panjf2000/ants/blob/dev/LICENSE) - github.com/panjf2000/gnet [Apache License 2.0](https://github.com/panjf2000/gnet/blob/dev/LICENSE) - github.com/paulmach/orb [MIT License](https://github.com/paulmach/orb/blob/master/LICENSE.md) - github.com/pavlo-v-chernykh/keystore-go [MIT License](https://github.com/pavlo-v-chernykh/keystore-go/blob/master/LICENSE) - github.com/pborman/ansi [BSD 3-Clause "New" or "Revised" License](https://github.com/pborman/ansi/blob/master/LICENSE) - github.com/pcolladosoto/goslurm [MIT License](https://github.com/pcolladosoto/goslurm/blob/main/LICENSE) - github.com/peterbourgon/unixtransport [Apache License 2.0](https://github.com/peterbourgon/unixtransport/blob/main/LICENSE) - github.com/philhofer/fwd [MIT License](https://github.com/philhofer/fwd/blob/master/LICENSE.md) - github.com/pierrec/lz4 [BSD 3-Clause "New" or "Revised" License](https://github.com/pierrec/lz4/blob/master/LICENSE) - github.com/pion/dtls [MIT License](https://github.com/pion/dtls/blob/master/LICENSES/MIT.txt) - github.com/pion/logging [MIT License](https://github.com/pion/logging/blob/master/LICENSES/MIT.txt) - github.com/pion/transport [MIT License](https://github.com/pion/transport/blob/master/LICENSES/MIT.txt) - github.com/pkg/browser [BSD 2-Clause "Simplified" License](https://github.com/pkg/browser/blob/master/LICENSE) - github.com/pkg/errors [BSD 2-Clause "Simplified" License](https://github.com/pkg/errors/blob/master/LICENSE) - github.com/pkg/sftp [BSD 2-Clause "Simplified" License](https://github.com/pkg/sftp/blob/master/LICENSE) - github.com/pkg/xattr [BSD 2-Clause "Simplified" License](https://github.com/pkg/xattr/blob/master/LICENSE) - github.com/pmezard/go-difflib [BSD 3-Clause Clear License](https://github.com/pmezard/go-difflib/blob/master/LICENSE) - github.com/prometheus-community/pro-bing [MIT License](https://github.com/prometheus-community/pro-bing/blob/main/LICENSE) - github.com/prometheus/client_golang [Apache License 2.0](https://github.com/prometheus/client_golang/blob/master/LICENSE) - github.com/prometheus/client_model [Apache License 2.0](https://github.com/prometheus/client_model/blob/master/LICENSE) - github.com/prometheus/common [Apache License 2.0](https://github.com/prometheus/common/blob/master/LICENSE) - github.com/prometheus/procfs [Apache License 2.0](https://github.com/prometheus/procfs/blob/master/LICENSE) - github.com/prometheus/prometheus [Apache License 2.0](https://github.com/prometheus/prometheus/blob/master/LICENSE) - github.com/rabbitmq/amqp091-go [BSD 2-Clause "Simplified" License](https://github.com/rabbitmq/amqp091-go/blob/main/LICENSE) - github.com/rclone/rclone [MIT License](https://github.com/rclone/rclone/blob/master/COPYING) - github.com/rcrowley/go-metrics [BSD 2-Clause with views sentence](https://github.com/rcrowley/go-metrics/blob/master/LICENSE) - github.com/redis/go-redis [BSD 2-Clause "Simplified" License](https://github.com/redis/go-redis/blob/master/LICENSE) - github.com/remyoudompheng/bigfft [BSD 3-Clause "New" or "Revised" License](https://github.com/remyoudompheng/bigfft/blob/master/LICENSE) - github.com/rfjakob/eme [MIT License](https://github.com/rfjakob/eme/blob/master/LICENSE) - github.com/riemann/riemann-go-client [MIT License](https://github.com/riemann/riemann-go-client/blob/master/LICENSE) - github.com/robbiet480/go.nut [MIT License](https://github.com/robbiet480/go.nut/blob/master/LICENSE) - github.com/robinson/gos7 [BSD 3-Clause "New" or "Revised" License](https://github.com/robinson/gos7/blob/master/LICENSE) - github.com/russross/blackfriday [BSD 2-Clause "Simplified" License](https://github.com/russross/blackfriday/blob/master/LICENSE.txt) - github.com/ryanuber/go-glob [MIT License](https://github.com/ryanuber/go-glob/blob/master/LICENSE) - github.com/safchain/ethtool [Apache License 2.0](https://github.com/safchain/ethtool/blob/master/LICENSE) - github.com/samber/lo [MIT License](https://github.com/samber/lo/blob/master/LICENSE) - github.com/seancfoley/bintree [Apache License 2.0](https://github.com/seancfoley/bintree/blob/master/LICENSE) - github.com/seancfoley/ipaddress-go [Apache License 2.0](https://github.com/seancfoley/ipaddress-go/blob/master/LICENSE) - github.com/segmentio/asm [MIT License](https://github.com/segmentio/asm/blob/main/LICENSE) - github.com/shirou/gopsutil [BSD 3-Clause Clear License](https://github.com/shirou/gopsutil/blob/master/LICENSE) - github.com/shopspring/decimal [MIT License](https://github.com/shopspring/decimal/blob/master/LICENSE) - github.com/showwin/speedtest-go [MIT License](https://github.com/showwin/speedtest-go/blob/master/LICENSE) - github.com/signalfx/com_signalfx_metrics_protobuf [Apache License 2.0](https://github.com/signalfx/com_signalfx_metrics_protobuf/blob/master/LICENSE) - github.com/signalfx/gohistogram [MIT License](https://github.com/signalfx/gohistogram/blob/master/LICENSE) - github.com/signalfx/golib [Apache License 2.0](https://github.com/signalfx/golib/blob/master/LICENSE) - github.com/signalfx/sapm-proto [Apache License 2.0](https://github.com/signalfx/sapm-proto/blob/master/LICENSE) - github.com/sijms/go-ora [MIT License](https://github.com/sijms/go-ora/blob/master/LICENSE) - github.com/sirupsen/logrus [MIT License](https://github.com/sirupsen/logrus/blob/master/LICENSE) - github.com/sleepinggenius2/gosmi [MIT License](https://github.com/sleepinggenius2/gosmi/blob/master/LICENSE) - github.com/snowflakedb/gosnowflake [Apache License 2.0](https://github.com/snowflakedb/gosnowflake/blob/master/LICENSE) - github.com/spf13/cast [MIT License](https://github.com/spf13/cast/blob/master/LICENSE) - github.com/spf13/pflag [BSD 3-Clause "New" or "Revised" License](https://github.com/spf13/pflag/blob/master/LICENSE) - github.com/spiffe/go-spiffe [Apache License 2.0](https://github.com/spiffe/go-spiffe/blob/main/LICENSE) - github.com/srebhan/cborquery [MIT License](https://github.com/srebhan/cborquery/blob/main/LICENSE) - github.com/srebhan/protobufquery [MIT License](https://github.com/srebhan/protobufquery/blob/master/LICENSE) - github.com/stretchr/objx [MIT License](https://github.com/stretchr/objx/blob/master/LICENSE) - github.com/stretchr/testify [MIT License](https://github.com/stretchr/testify/blob/master/LICENSE) - github.com/tdrn-org/go-hue [MIT License](https://github.com/tdrn-org/go-log/blob/main/LICENSE) - github.com/tdrn-org/go-nsdp [MIT License](https://github.com/tdrn-org/go-nsdp/blob/main/LICENSE) - github.com/tdrn-org/go-tr064 [Apache License 2.0](https://github.com/tdrn-org/go-tr064/blob/main/LICENSE) - github.com/testcontainers/testcontainers-go [MIT License](https://github.com/testcontainers/testcontainers-go/blob/main/LICENSE) - github.com/thomasklein94/packer-plugin-libvirt [Mozilla Public License 2.0](https://github.com/thomasklein94/packer-plugin-libvirt/blob/main/LICENSE) - github.com/tidwall/gjson [MIT License](https://github.com/tidwall/gjson/blob/master/LICENSE) - github.com/tidwall/match [MIT License](https://github.com/tidwall/match/blob/master/LICENSE) - github.com/tidwall/pretty [MIT License](https://github.com/tidwall/pretty/blob/master/LICENSE) - github.com/tidwall/tinylru [MIT License](https://github.com/tidwall/tinylru/blob/master/LICENSE) - github.com/tidwall/wal [MIT License](https://github.com/tidwall/wal/blob/master/LICENSE) - github.com/tinylib/msgp [MIT License](https://github.com/tinylib/msgp/blob/master/LICENSE) - github.com/tklauser/go-sysconf [BSD 3-Clause "New" or "Revised" License](https://github.com/tklauser/go-sysconf/blob/master/LICENSE) - github.com/tklauser/numcpus [Apache License 2.0](https://github.com/tklauser/numcpus/blob/master/LICENSE) - github.com/twmb/murmur3 [BSD 3-Clause "New" or "Revised" License](https://github.com/twmb/murmur3/blob/master/LICENSE) - github.com/uber/jaeger-client-go [Apache License 2.0](https://github.com/jaegertracing/jaeger-client-go/blob/master/LICENSE) - github.com/uber/jaeger-lib [Apache License 2.0](https://github.com/jaegertracing/jaeger-lib/blob/main/LICENSE) - github.com/urfave/cli [MIT License](https://github.com/urfave/cli/blob/main/LICENSE) - github.com/valyala/bytebufferpool [MIT License](https://github.com/valyala/bytebufferpool/blob/master/LICENSE) - github.com/vapourismo/knx-go [MIT License](https://github.com/vapourismo/knx-go/blob/master/LICENSE) - github.com/vertica/vertica-sql-go [Apache License 2.0](https://github.com/vertica/vertica-sql-go/blob/master/LICENSE) - github.com/vishvananda/netlink [Apache License 2.0](https://github.com/vishvananda/netlink/blob/master/LICENSE) - github.com/vishvananda/netns [Apache License 2.0](https://github.com/vishvananda/netns/blob/master/LICENSE) - github.com/vjeantet/grok [Apache License 2.0](https://github.com/vjeantet/grok/blob/master/LICENSE) - github.com/vmware/govmomi [Apache License 2.0](https://github.com/vmware/govmomi/blob/master/LICENSE.txt) - github.com/wavefronthq/wavefront-sdk-go [Apache License 2.0](https://github.com/wavefrontHQ/wavefront-sdk-go/blob/master/LICENSE) - github.com/x448/float16 [MIT License](https://github.com/x448/float16/blob/master/LICENSE) - github.com/xanzy/ssh-agent [Apache License 2.0](https://github.com/xanzy/ssh-agent/blob/main/LICENSE) - github.com/xdg-go/scram [Apache License 2.0](https://github.com/xdg-go/scram/blob/master/LICENSE) - github.com/xdg-go/stringprep [Apache License 2.0](https://github.com/xdg-go/stringprep/blob/master/LICENSE) - github.com/xdg/scram [Apache License 2.0](https://github.com/xdg-go/scram/blob/master/LICENSE) - github.com/xdg/stringprep [Apache License 2.0](https://github.com/xdg-go/stringprep/blob/master/LICENSE) - github.com/xrash/smetrics [MIT License](https://github.com/xrash/smetrics/blob/master/LICENSE) - github.com/youmark/pkcs8 [MIT License](https://github.com/youmark/pkcs8/blob/master/LICENSE) - github.com/yuin/gopher-lua [MIT License](https://github.com/yuin/gopher-lua/blob/master/LICENSE) - github.com/yusufpapurcu/wmi [MIT License](https://github.com/yusufpapurcu/wmi/blob/master/LICENSE) - github.com/zeebo/xxh3 [BSD 2-Clause "Simplified" License](https://github.com/zeebo/xxh3/blob/master/LICENSE) - github.com/zentures/cityhash [MIT License](https://github.com/zentures/cityhash/blob/master/LICENSE) - go.bug.st/serial [BSD 3-Clause License](https://github.com/bugst/go-serial/blob/master/LICENSE) - go.mongodb.org/mongo-driver [Apache License 2.0](https://github.com/mongodb/mongo-go-driver/blob/master/LICENSE) - go.opencensus.io [Apache License 2.0](https://github.com/census-instrumentation/opencensus-go/blob/master/LICENSE) - go.opentelemetry.io/auto/sdk [Apache License 2.0](https://github.com/open-telemetry/opentelemetry-go-instrumentation/blob/main/sdk/LICENSE) - go.opentelemetry.io/collector/consumer/consumererror [Apache License 2.0](https://github.com/open-telemetry/opentelemetry-collector/blob/main/LICENSE) - go.opentelemetry.io/collector/featuregate [Apache License 2.0](https://github.com/open-telemetry/opentelemetry-collector/blob/main/LICENSE) - go.opentelemetry.io/collector/pdata [Apache License 2.0](https://github.com/open-telemetry/opentelemetry-collector/blob/main/LICENSE) - go.opentelemetry.io/collector/pdata/pprofile [Apache License 2.0](https://github.com/open-telemetry/opentelemetry-collector/blob/main/LICENSE) - go.opentelemetry.io/collector/semconv [Apache License 2.0](https://github.com/open-telemetry/opentelemetry-collector/blob/main/LICENSE) - go.opentelemetry.io/contrib/detectors/gcp [Apache License 2.0](https://github.com/open-telemetry/opentelemetry-go-contrib/blob/main/LICENSE) - go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc [Apache License 2.0](https://github.com/open-telemetry/opentelemetry-go-contrib/blob/main/LICENSE) - go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp [Apache License 2.0](https://github.com/open-telemetry/opentelemetry-go-contrib/blob/main/LICENSE) - go.opentelemetry.io/otel [Apache License 2.0](https://github.com/open-telemetry/opentelemetry-go/blob/main/LICENSE) - go.opentelemetry.io/otel/metric [Apache License 2.0](https://github.com/open-telemetry/opentelemetry-go/blob/main/LICENSE) - go.opentelemetry.io/otel/sdk [Apache License 2.0](https://github.com/open-telemetry/opentelemetry-go/blob/main/LICENSE) - go.opentelemetry.io/otel/sdk/metric [Apache License 2.0](https://github.com/open-telemetry/opentelemetry-go/blob/main/LICENSE) - go.opentelemetry.io/otel/trace [Apache License 2.0](https://github.com/open-telemetry/opentelemetry-go/blob/main/LICENSE) - go.opentelemetry.io/proto/otlp [Apache License 2.0](https://github.com/open-telemetry/opentelemetry-proto-go/blob/main/LICENSE) - go.opentelemetry.io/proto/otlp/collector/profiles/v1development [Apache License 2.0](https://github.com/open-telemetry/opentelemetry-proto-go/blob/main/LICENSE) - go.opentelemetry.io/proto/otlp/profiles/v1development [Apache License 2.0](https://github.com/open-telemetry/opentelemetry-proto-go/blob/main/LICENSE) - go.starlark.net [BSD 3-Clause "New" or "Revised" License](https://github.com/google/starlark-go/blob/master/LICENSE) - go.step.sm/crypto [Apache License 2.0](https://github.com/smallstep/crypto/blob/master/LICENSE) - go.uber.org/atomic [MIT License](https://pkg.go.dev/go.uber.org/atomic?tab=licenses) - go.uber.org/multierr [MIT License](https://pkg.go.dev/go.uber.org/multierr?tab=licenses) - go.uber.org/zap [MIT License](https://pkg.go.dev/go.uber.org/zap?tab=licenses) - go.yaml.in/yaml [Apache License 2.0](https://github.com/yaml/go-yaml/blob/main/LICENSE) - golang.org/x/crypto [BSD 3-Clause Clear License](https://github.com/golang/crypto/blob/master/LICENSE) - golang.org/x/exp [BSD 3-Clause Clear License](https://github.com/golang/exp/blob/master/LICENSE) - golang.org/x/net [BSD 3-Clause Clear License](https://github.com/golang/net/blob/master/LICENSE) - golang.org/x/oauth2 [BSD 3-Clause "New" or "Revised" License](https://github.com/golang/oauth2/blob/master/LICENSE) - golang.org/x/sync [BSD 3-Clause "New" or "Revised" License](https://github.com/golang/sync/blob/master/LICENSE) - golang.org/x/sys [BSD 3-Clause Clear License](https://github.com/golang/sys/blob/master/LICENSE) - golang.org/x/term [BSD 3-Clause License](https://pkg.go.dev/golang.org/x/term?tab=licenses) - golang.org/x/text [BSD 3-Clause Clear License](https://github.com/golang/text/blob/master/LICENSE) - golang.org/x/time [BSD 3-Clause Clear License](https://github.com/golang/time/blob/master/LICENSE) - golang.org/x/xerrors [BSD 3-Clause Clear License](https://github.com/golang/xerrors/blob/master/LICENSE) - golang.zx2c4.com/wireguard [MIT License](https://github.com/WireGuard/wgctrl-go/blob/master/LICENSE.md) - golang.zx2c4.com/wireguard/wgctrl [MIT License](https://github.com/WireGuard/wgctrl-go/blob/master/LICENSE.md) - gonum.org/v1/gonum [BSD 3-Clause "New" or "Revised" License](https://github.com/gonum/gonum/blob/master/LICENSE) - google.golang.org/api [BSD 3-Clause "New" or "Revised" License](https://github.com/googleapis/google-api-go-client/blob/master/LICENSE) - google.golang.org/genproto [Apache License 2.0](https://github.com/google/go-genproto/blob/master/LICENSE) - google.golang.org/genproto/googleapis/api [Apache License 2.0](https://pkg.go.dev/google.golang.org/genproto/googleapis/api?tab=licenses) - google.golang.org/genproto/googleapis/rpc [Apache License 2.0](https://pkg.go.dev/google.golang.org/genproto/googleapis/rpc?tab=licenses) - google.golang.org/grpc [Apache License 2.0](https://github.com/grpc/grpc-go/blob/master/LICENSE) - google.golang.org/protobuf [BSD 3-Clause "New" or "Revised" License](https://pkg.go.dev/google.golang.org/protobuf?tab=licenses) - gopkg.in/evanphx/json-patch.v4 [BSD 3-Clause "New" or "Revised" License](https://github.com/evanphx/json-patch/blob/master/LICENSE) - gopkg.in/fatih/pool.v2 [MIT License](https://github.com/fatih/pool/blob/v2.0.0/LICENSE) - gopkg.in/fsnotify.v1 [BSD 3-Clause "New" or "Revised" License](https://github.com/fsnotify/fsnotify/blob/v1.4.7/LICENSE) - gopkg.in/gorethink/gorethink.v3 [Apache License 2.0](https://github.com/rethinkdb/rethinkdb-go/blob/v3.0.5/LICENSE) - gopkg.in/inf.v0 [BSD 3-Clause "New" or "Revised" License](https://github.com/go-inf/inf/blob/v0.9.1/LICENSE) - gopkg.in/ini.v1 [Apache License 2.0](https://github.com/go-ini/ini/blob/master/LICENSE) - gopkg.in/natefinch/lumberjack.v2 [MIT License](https://github.com/natefinch/lumberjack/blob/v2.0/LICENSE) - gopkg.in/olivere/elastic.v5 [MIT License](https://github.com/olivere/elastic/blob/v5.0.76/LICENSE) - gopkg.in/tomb.v1 [BSD 3-Clause Clear License](https://github.com/go-tomb/tomb/blob/v1/LICENSE) - gopkg.in/tomb.v2 [BSD 3-Clause Clear License](https://github.com/go-tomb/tomb/blob/v2/LICENSE) - gopkg.in/yaml.v2 [Apache License 2.0](https://github.com/go-yaml/yaml/blob/v2.2.2/LICENSE) - gopkg.in/yaml.v3 [MIT License](https://github.com/go-yaml/yaml/blob/v3/LICENSE) - howett.net/plist [BSD-2-Clause-Views, BSD-3-Clause](https://github.com/DHowett/go-plist/blob/main/LICENSE) - k8s.io/api [Apache License 2.0](https://github.com/kubernetes/client-go/blob/master/LICENSE) - k8s.io/apimachinery [Apache License 2.0](https://github.com/kubernetes/client-go/blob/master/LICENSE) - k8s.io/client-go [Apache License 2.0](https://github.com/kubernetes/client-go/blob/master/LICENSE) - k8s.io/klog [Apache License 2.0](https://github.com/kubernetes/client-go/blob/master/LICENSE) - k8s.io/kube-openapi [Apache License 2.0](https://github.com/kubernetes/client-go/blob/master/LICENSE) - k8s.io/utils [Apache License 2.0](https://github.com/kubernetes/client-go/blob/master/LICENSE) - layeh.com/radius [Mozilla Public License 2.0](https://github.com/layeh/radius/blob/master/LICENSE) - modernc.org/libc [BSD 3-Clause "New" or "Revised" License](https://gitlab.com/cznic/libc/-/blob/master/LICENSE) - modernc.org/mathutil [BSD 3-Clause "New" or "Revised" License](https://gitlab.com/cznic/mathutil/-/blob/master/LICENSE) - modernc.org/memory [BSD 3-Clause "New" or "Revised" License](https://gitlab.com/cznic/memory/-/blob/master/LICENSE) - modernc.org/sqlite [BSD 3-Clause "New" or "Revised" License](https://gitlab.com/cznic/sqlite/-/blob/master/LICENSE) - sigs.k8s.io/json [Apache License 2.0](https://github.com/kubernetes/client-go/blob/master/LICENSE) - sigs.k8s.io/randfill [Apache License 2.0](https://github.com/kubernetes-sigs/randfill/blob/main/LICENSE) - sigs.k8s.io/structured-merge-diff [Apache License 2.0](https://github.com/kubernetes/client-go/blob/master/LICENSE) - sigs.k8s.io/yaml [Apache License 2.0](https://github.com/kubernetes/client-go/blob/master/LICENSE) - software.sslmate.com/src/go-pkcs12 [BSD 3-Clause "New" or "Revised" License](https://github.com/SSLMate/go-pkcs12/blob/master/LICENSE) ## Telegraf used and modified code from these projects - github.com/DataDog/datadog-agent [Apache License 2.0](https://github.com/DataDog/datadog-agent/blob/main/LICENSE) ================================================ FILE: docs/METRICS.md ================================================ # Metrics Telegraf metrics are the internal representation used to model data during processing. Metrics are closely based on InfluxDB's data model and contain four main components: - **Measurement Name**: Description and namespace for the metric. - **Tags**: Key/Value string pairs and usually used to identify the metric. - **Fields**: Key/Value pairs that are typed and usually contain the metric data. - **Timestamp**: Date and time associated with the fields. This metric type exists only in memory and must be converted to a concrete representation in order to be transmitted or viewed. To achieve this we provide several [output data formats][] sometimes referred to as *serializers*. Our default serializer converts to [InfluxDB Line Protocol][line protocol] which provides a high performance and one-to-one direct mapping from Telegraf metrics. [output data formats]: /docs/DATA_FORMATS_OUTPUT.md [line protocol]: /plugins/serializers/influx ## Tracking Metrics Tracking metrics are metrics that ensure that data is passed from the input and handed to an output before acknowledging the message back to the input. The use case for these types of metrics is to ensure that the message makes it to the destination before removing the metric from the input. For example, if a configuration is reading from MQTT, Kafka, or an AMQP source Telegraf will read the message and wait till the metric is handed to the output before telling the metric source that the message was read. If Telegraf were to stop or the system running Telegraf to crash, this allows the messages that were not completely delivered to an output to get re-read at a later date. Please note that this process applies only to internal plugins. For external plugins, the metrics are acknowledged regardless of the actual output. ### Undelivered Messages When an input uses tracking metrics, an additional setting, `max_undelivered_messages`, is available in that plugin. This setting determines how many metrics should be read in before reading additional messages. In practice, this means that Telegraf may not read new messages from an input at every collection interval. Users need to use caution with this setting. Setting the value too high may mean that Telegraf pushes constant batches to an output, ignoring the flush interval. ================================================ FILE: docs/NIGHTLIES.md ================================================ # Nightly Builds These builds are generated from the master branch at midnight UTC: | DEB | RPM | TAR GZ | ZIP | | --------------- | --------------- | ------------------------------| --- | | [amd64.deb](https://dl.influxdata.com/telegraf/nightlies/telegraf_nightly_amd64.deb) | [aarch64.rpm](https://dl.influxdata.com/telegraf/nightlies/telegraf-nightly.aarch64.rpm) | [darwin_amd64.tar.gz](https://dl.influxdata.com/telegraf/nightlies/telegraf-nightly_darwin_amd64.tar.gz) | [windows_amd64.zip](https://dl.influxdata.com/telegraf/nightlies/telegraf-nightly_windows_amd64.zip) | | [arm64.deb](https://dl.influxdata.com/telegraf/nightlies/telegraf_nightly_arm64.deb) | [armel.rpm](https://dl.influxdata.com/telegraf/nightlies/telegraf-nightly.armel.rpm) | [darwin_arm64.tar.gz](https://dl.influxdata.com/telegraf/nightlies/telegraf-nightly_darwin_arm64.tar.gz) | [windows_arm64.zip](https://dl.influxdata.com/telegraf/nightlies/telegraf-nightly_windows_arm64.zip) | | [armel.deb](https://dl.influxdata.com/telegraf/nightlies/telegraf_nightly_armel.deb) | [armv6hl.rpm](https://dl.influxdata.com/telegraf/nightlies/telegraf-nightly.armv6hl.rpm) | [freebsd_amd64.tar.gz](https://dl.influxdata.com/telegraf/nightlies/telegraf-nightly_freebsd_amd64.tar.gz) | [windows_i386.zip](https://dl.influxdata.com/telegraf/nightlies/telegraf-nightly_windows_i386.zip) | | [armhf.deb](https://dl.influxdata.com/telegraf/nightlies/telegraf_nightly_armhf.deb) | [i386.rpm](https://dl.influxdata.com/telegraf/nightlies/telegraf-nightly.i386.rpm) | [freebsd_armv7.tar.gz](https://dl.influxdata.com/telegraf/nightlies/telegraf-nightly_freebsd_armv7.tar.gz) | | | [i386.deb](https://dl.influxdata.com/telegraf/nightlies/telegraf_nightly_i386.deb) | [loongarch64.rpm](https://dl.influxdata.com/telegraf/nightlies/telegraf-nightly.loongarch64.rpm) | [freebsd_i386.tar.gz](https://dl.influxdata.com/telegraf/nightlies/telegraf-nightly_freebsd_i386.tar.gz) | | | [loong64.deb](https://dl.influxdata.com/telegraf/nightlies/telegraf_nightly_loong64.deb) | [ppc64le.rpm](https://dl.influxdata.com/telegraf/nightlies/telegraf-nightly.ppc64le.rpm) | [linux_amd64.tar.gz](https://dl.influxdata.com/telegraf/nightlies/telegraf-nightly_linux_amd64.tar.gz) | | | [mips.deb](https://dl.influxdata.com/telegraf/nightlies/telegraf_nightly_mips.deb) | [riscv64.rpm](https://dl.influxdata.com/telegraf/nightlies/telegraf-nightly.riscv64.rpm) | [linux_arm64.tar.gz](https://dl.influxdata.com/telegraf/nightlies/telegraf-nightly_linux_arm64.tar.gz) | | | [mipsel.deb](https://dl.influxdata.com/telegraf/nightlies/telegraf_nightly_mipsel.deb) | [s390x.rpm](https://dl.influxdata.com/telegraf/nightlies/telegraf-nightly.s390x.rpm) | [linux_armel.tar.gz](https://dl.influxdata.com/telegraf/nightlies/telegraf-nightly_linux_armel.tar.gz) | | | [ppc64el.deb](https://dl.influxdata.com/telegraf/nightlies/telegraf_nightly_ppc64el.deb) | [x86_64.rpm](https://dl.influxdata.com/telegraf/nightlies/telegraf-nightly.x86_64.rpm) | [linux_armhf.tar.gz](https://dl.influxdata.com/telegraf/nightlies/telegraf-nightly_linux_armhf.tar.gz) | | | [riscv64.deb](https://dl.influxdata.com/telegraf/nightlies/telegraf_nightly_riscv64.deb) | | [linux_i386.tar.gz](https://dl.influxdata.com/telegraf/nightlies/telegraf-nightly_linux_i386.tar.gz) | | | [s390x.deb](https://dl.influxdata.com/telegraf/nightlies/telegraf_nightly_s390x.deb) | | [linux_loong64.tar.gz](https://dl.influxdata.com/telegraf/nightlies/telegraf-nightly_linux_loong64.tar.gz) | | | | | [linux_mips.tar.gz](https://dl.influxdata.com/telegraf/nightlies/telegraf-nightly_linux_mips.tar.gz) | | | | | [linux_mipsel.tar.gz](https://dl.influxdata.com/telegraf/nightlies/telegraf-nightly_linux_mipsel.tar.gz) | | | | | [linux_ppc64le.tar.gz](https://dl.influxdata.com/telegraf/nightlies/telegraf-nightly_linux_ppc64le.tar.gz) | | | | | [linux_riscv64.tar.gz](https://dl.influxdata.com/telegraf/nightlies/telegraf-nightly_linux_riscv64.tar.gz) | | | | | [linux_s390x.tar.gz](https://dl.influxdata.com/telegraf/nightlies/telegraf-nightly_linux_s390x.tar.gz) | | Nightly docker images are available on [quay.io](https://quay.io/repository/influxdb/telegraf-nightly?tab=tags): ```shell # Debian-based image docker pull quay.io/influxdb/telegraf-nightly:latest # Alpine-based image docker pull quay.io/influxdb/telegraf-nightly:alpine ``` ================================================ FILE: docs/OUTPUTS.md ================================================ # Output Plugins This section is for developers who want to create a new output sink. Outputs are created in a similar manner as collection plugins, and their interface has similar constructs. ## Output Plugin Guidelines - An output must conform to the [telegraf.Output][] interface. - Outputs should call `outputs.Add` in their `init` function to register themselves. See below for a quick example. - To be available within Telegraf itself, plugins must register themselves using a file in `github.com/influxdata/telegraf/plugins/outputs/all` named according to the plugin name. Make sure you also add build-tags to conditionally build the plugin. - Each plugin requires a file called `sample.conf` containing the sample configuration for the plugin in TOML format. Please consult the [Sample Config][] page for the latest style guidelines. - Each plugin `README.md` file should include the `sample.conf` file in a section describing the configuration by specifying a `toml` section in the form `toml @sample.conf`. The specified file(s) are then injected automatically into the Readme. - Follow the recommended [Code Style][]. [Sample Config]: /docs/developers/SAMPLE_CONFIG.md [Code Style]: /docs/developers/CODE_STYLE.md [telegraf.Output]: https://godoc.org/github.com/influxdata/telegraf#Output ## Data Formats Some output plugins, such as the [file][] plugin, can write in any supported [output data formats][]. In order to enable this, you must specify a `SetSerializer(serializer serializers.Serializer)` function on the plugin object (see the file plugin for an example), as well as defining `serializer` as a field of the object. You can then utilize the serializer internally in your plugin, serializing data before it's written. Telegraf's configuration layer will take care of instantiating and creating the `Serializer` object. You should also add the following to your `SampleConfig()`: ```toml ## Data format to output. ## Each data format has its own unique set of configuration options, read ## more about them here: ## https://github.com/influxdata/telegraf/blob/master/docs/DATA_FORMATS_OUTPUT.md data_format = "influx" ``` [file]: /plugins/inputs/file [output data formats]: /docs/DATA_FORMATS_OUTPUT.md ## Flushing Metrics to Outputs Metrics are flushed to outputs when any of the following events happen: - `flush_interval + rand(flush_jitter)` has elapsed since start or the last flush interval - At least `metric_batch_size` count of metrics are waiting in the buffer - The telegraf process has received a SIGUSR1 signal Note that if the flush takes longer than the `agent.interval` to write the metrics to the output, user will see a message saying the output: > did not complete within its flush interval This may mean the output is not keeping up with the flow of metrics, and you may want to look into enabling compression, reducing the size of your metrics or investigate other reasons why the writes might be taking longer than expected. ## Output Plugin Example ## Registration Registration of the plugin on `plugins/outputs/all/simpleoutput.go`: ```go //go:build !custom || outputs || outputs.simpleoutput package all import _ "github.com/influxdata/telegraf/plugins/outputs/simpleoutput" // register plugin ``` The _build-tags_ in the first line allow to selectively include/exclude your plugin when customizing Telegraf. ## Plugin Content of your plugin file e.g. `simpleoutput.go` ```go //go:generate ../../../tools/readme_config_includer/generator package simpleoutput // simpleoutput.go import ( _ "embed" "github.com/influxdata/telegraf" "github.com/influxdata/telegraf/plugins/outputs" ) //go:embed sample.conf var sampleConfig string type Simple struct { Ok bool `toml:"ok"` Log telegraf.Logger `toml:"-"` } func (*Simple) SampleConfig() string { return sampleConfig } // Init is for setup, and validating config. func (s *Simple) Init() error { return nil } func (s *Simple) Connect() error { // Make any connection required here return nil } func (s *Simple) Close() error { // Close any connections here. // Write will not be called once Close is called, so there is no need to synchronize. return nil } // Write should write immediately to the output, and not buffer writes // (Telegraf manages the buffer for you). Returning an error will fail this // batch of writes and the entire batch will be retried automatically. func (s *Simple) Write(metrics []telegraf.Metric) error { for _, metric := range metrics { // write `metric` to the output sink here } return nil } func init() { outputs.Add("simpleoutput", func() telegraf.Output { return &Simple{} }) } ``` ================================================ FILE: docs/PARSING_DATA.md ================================================ # Parsing Data Telegraf has the ability to take data in a variety of formats. Telegraf requires configuration from the user in order to correctly parse, store, and send the original data. Telegraf does not take the raw data and maintain it internally. Telegraf uses an internal metric representation consisting of the metric name, tags, fields and a timestamp, very similar to [line protocol][]. This means that data needs to be broken up into a metric name, tags, fields, and a timestamp. While none of these options are required, they are available to the user and might be necessary to ensure the data is represented correctly. [line protocol]: https://docs.influxdata.com/influxdb/cloud/reference/syntax/line-protocol/ ## Parsers The first step is to determine which parser to use. Look at the list of [parsers][] and find one that will work with the user's data. This is generally straightforward as the data-type will only have one parser that is actually applicable to the data. [parsers]: https://github.com/influxdata/telegraf/tree/master/plugins/parsers ### JSON parsers There is an exception when it comes to JSON data. Instead of a single parser, there are three different parsers capable of reading JSON data: * `json`: This parser is great for flat JSON data. If the JSON is more complex and for example, has other objects or nested arrays, then do not use this and look at the other two options. * `json_v2`: The v2 parser was created out of the need to parse JSON objects. It can take on more advanced cases, at the cost of additional configuration. * `xpath_json`: The xpath parser is the most capable of the three options. While the xpath name may imply XML data, it can parse a variety of data types using XPath expressions. ## Tags and fields The next step is to look at the data and determine how the data needs to be split up between tags and fields. Tags are generally strings or values that a user will want to search on. While fields are the raw data values, numeric types, etc. Generally, data is considered to be a field unless otherwise specified as a tag. ## Timestamp To parse a timestamp, at the very least the users needs to specify which field has the timestamp and what the format of the timestamp is. The format can either be a predefined Unix timestamp or parsed using a custom format based on Go reference time. For Unix timestamps Telegraf understands the following settings: | Timestamp | Timestamp Format | | --------------------- | ---------------- | | `1709572232` | `unix` | | `1709572232123` | `unix_ms` | | `1709572232123456` | `unix_us` | | `1709572232123456789` | `unix_ns` | There are some named formats available as well: | Timestamp | Named Format | | ------------------------------------- | ------------- | | `Mon Jan _2 15:04:05 2006` | `ANSIC` | | `Mon Jan _2 15:04:05 MST 2006` | `UnixDate` | | `Mon Jan 02 15:04:05 -0700 2006` | `RubyDate` | | `02 Jan 06 15:04 MST` | `RFC822` | | `02 Jan 06 15:04 -0700` | `RFC822Z` | | `Monday, 02-Jan-06 15:04:05 MST` | `RFC850` | | `Mon, 02 Jan 2006 15:04:05 MST` | `RFC1123` | | `Mon, 02 Jan 2006 15:04:05 -0700` | `RFC1123Z` | | `2006-01-02T15:04:05Z07:00` | `RFC3339` | | `2006-01-02T15:04:05.999999999Z07:00` | `RFC3339Nano` | | `Jan _2 15:04:05` | `Stamp` | | `Jan _2 15:04:05.000` | `StampMilli` | | `Jan _2 15:04:05.000000` | `StampMicro` | | `Jan _2 15:04:05.000000000` | `StampNano` | If the timestamp does not conform to any of the above, then the user can specify a custom timestamp format, in which the user must provide the timestamp in [Go reference time][] notation. Here are a few example timestamps and their Go reference time equivalent: | Timestamp | Go reference time | | ----------------------------- | -------------------------------- | | `2024-03-04T17:10:32` | `2006-01-02T15:04:05` | | `04 Mar 24 10:10 -0700` | `02 Jan 06 15:04 -0700` | | `2024-03-04T10:10:32Z07:00` | `2006-01-02T15:04:05Z07:00` | | `2024-03-04 17:10:32.123+00` | `2006-01-02 15:04:05.999+00` | | `2024-03-04T10:10:32.123456Z` | `2006-01-02T15:04:05.000000Z` | | `2024-03-04T10:10:32.123456Z` | `2006-01-02T15:04:05.999999999Z` | Note for fractional second values, the user can use either a `9` or `0`. Using a `0` forces a certain length, but using `9`s do not. Please note, that timezone abbreviations are ambiguous! For example `MST`, can stand for either Mountain Standard Time (UTC-07) or Malaysia Standard Time (UTC+08). As such, avoid abbreviated timezones if possible. Unix timestamps use UTC, there is no concept of a timezone for a Unix timestamp. Some devices report timestamp as a number, similar to Unix timestamp format, but in local timezone not UTC. The formats below provide support for these cases by means of computing offset between local time and UTC: | Timestamp | Timestamp Format | | --------------------- | ----------------- | | `1709572232` | `timestamp_tz` | | `1709572232123` | `timestamp_tz_ms` | | `1709572232123456` | `timestamp_tz_us` | | `1709572232123456789` | `timestamp_tz_ns` | [Go reference time]: https://pkg.go.dev/time#pkg-constants ## Examples Below are a few basic examples to get users started. ### CSV Given the following data: ```csv node,temp,humidity,alarm,time node1,32.3,23,false,2023-03-06T16:52:23Z node2,22.6,44,false,2023-03-06T16:52:23Z node3,17.9,56,true,2023-03-06T16:52:23Z ``` Here is corresponding parser configuration and result: ```toml [[inputs.file]] files = ["test.csv"] data_format = "csv" csv_header_row_count = 1 csv_column_names = ["node","temp","humidity","alarm","time"] csv_tag_columns = ["node"] csv_timestamp_column = "time" csv_timestamp_format = "2006-01-02T15:04:05Z" ``` ```text file,node=node1 temp=32.3,humidity=23i,alarm=false 1678121543000000000 file,node=node2 temp=22.6,humidity=44i,alarm=false 1678121543000000000 file,node=node3 temp=17.9,humidity=56i,alarm=true 1678121543000000000 ``` ### CSV with Local Timestamp Given the following data: ```csv node,temp,humidity,alarm,time node1,32.3,23,false,1568338208 node2,22.6,44,false,1568338208 ``` Here is corresponding parser configuration and result: ```toml [[inputs.file]] files = ["test.csv"] data_format = "csv" csv_header_row_count = 1 csv_column_names = ["node","temp","humidity","alarm","time"] csv_tag_columns = ["node"] csv_timestamp_column = "time" csv_timestamp_format = "timestamp_tz" csv_timezone = "Pacific/Fiji" ``` ```text file,node=node1 temp=32.3,humidity=23i,alarm=false 1568295008000000000 file,node=node2 temp=22.6,humidity=44i,alarm=false 1568295008000000000 file,node=node3 temp=17.9,humidity=56i,alarm=true 1568295008000000000 ``` Pay attention that the timestamp in CSV is 12 hours later than the metrics timestamp because `Pacific/Fiji` is +12:00 Timezone. ### JSON flat data Given the following data: ```json { "node": "node", "temp": 32.3, "humidity": 23, "alarm": false, "time": "1709572232123456789"} ``` Here is corresponding parser configuration: ```toml [[inputs.file]] files = ["test.json"] precision = "1ns" data_format = "json" tag_keys = ["node"] json_time_key = "time" json_time_format = "unix_ns" ``` ```text file,node=node temp=32.3,humidity=23 1709572232123456789 ``` ### JSON Objects Given the following data: ```json { "metrics": [ { "node": "node1", "temp": 32.3, "humidity": 23, "alarm": "false", "time": "1678121543"}, { "node": "node2", "temp": 22.6, "humidity": 44, "alarm": "false", "time": "1678121543"}, { "node": "node3", "temp": 17.9, "humidity": 56, "alarm": "true", "time": "1678121543"} ] } ``` Here is corresponding parser configuration: ```toml [[inputs.file]] files = ["test.json"] data_format = "json_v2" [[inputs.file.json_v2]] [[inputs.file.json_v2.object]] path = "metrics" timestamp_key = "time" timestamp_format = "unix" [[inputs.file.json_v2.object.tag]] path = "#.node" [[inputs.file.json_v2.object.field]] path = "#.temp" type = "float" [[inputs.file.json_v2.object.field]] path = "#.humidity" type = "int" [[inputs.file.json_v2.object.field]] path = "#.alarm" type = "bool" ``` ```text file,node=node1 temp=32.3,humidity=23i,alarm=false 1678121543000000000 file,node=node2 temp=22.6,humidity=44i,alarm=false 1678121543000000000 file,node=node3 temp=17.9,humidity=56i,alarm=true 1678121543000000000 ``` ### JSON Line Protocol Given the following data: ```json { "fields": {"temp": 32.3, "humidity": 23, "alarm": false}, "name": "measurement", "tags": {"node": "node1"}, "time": "2024-03-04T10:10:32.123456Z" } ``` Here is corresponding parser configuration: ```toml [[inputs.file]] files = ["test.json"] precision = "1us" data_format = "xpath_json" [[inputs.file.xpath]] metric_name = "/name" field_selection = "fields/*" tag_selection = "tags/*" timestamp = "/time" timestamp_format = "2006-01-02T15:04:05.999999999Z" ``` ```text measurement,node=node1 alarm="false",humidity="23",temp="32.3" 1709547032123456000 ``` ================================================ FILE: docs/PROCESSORS.md ================================================ # Processor Plugins This section is for developers who want to create a new processor plugin. ## Processor Plugin Guidelines * A processor must conform to the [telegraf.Processor][] interface. * Processors should call `processors.Add` in their `init` function to register themselves. See below for a quick example. * To be available within Telegraf itself, plugins must register themselves using a file in `github.com/influxdata/telegraf/plugins/processors/all` named according to the plugin name. Make sure you also add build-tags to conditionally build the plugin. * Each plugin requires a file called `sample.conf` containing the sample configuration for the plugin in TOML format. Please consult the [Sample Config][] page for the latest style guidelines. * Each plugin `README.md` file should include the `sample.conf` file in a section describing the configuration by specifying a `toml` section in the form `toml @sample.conf`. The specified file(s) are then injected automatically into the Readme. * Follow the recommended [Code Style][]. [Sample Config]: /docs/developers/SAMPLE_CONFIG.md [Code Style]: /docs/developers/CODE_STYLE.md [telegraf.Processor]: https://godoc.org/github.com/influxdata/telegraf#Processor ## Streaming Processors Streaming processors are a new processor type available to you. They are particularly useful to implement processor types that use background processes or goroutines to process multiple metrics at the same time. Some examples of this are the execd processor, which pipes metrics out to an external process over stdin and reads them back over stdout, and the reverse_dns processor, which does reverse dns lookups on IP addresses in fields. While both of these come with a speed cost, it would be significantly worse if you had to process one metric completely from start to finish before handling the next metric, and thus they benefit significantly from a streaming-pipe approach. Some differences from classic Processors: * Streaming processors must conform to the [telegraf.StreamingProcessor][] interface. * Processors should call `processors.AddStreaming` in their `init` function to register themselves. See below for a quick example. [telegraf.StreamingProcessor]: https://godoc.org/github.com/influxdata/telegraf#StreamingProcessor ## Processor Plugin Example ### Registration Registration of the plugin on `plugins/processors/all/printer.go`: ```go //go:build !custom || processors || processors.printer package all import _ "github.com/influxdata/telegraf/plugins/processors/printer" // register plugin ``` The _build-tags_ in the first line allow to selectively include/exclude your plugin when customizing Telegraf. ### Plugin Content of your plugin file e.g. `printer.go` ```go //go:generate ../../../tools/readme_config_includer/generator package printer import ( _ "embed" "fmt" "github.com/influxdata/telegraf" "github.com/influxdata/telegraf/plugins/processors" ) //go:embed sample.conf var sampleConfig string type Printer struct { Log telegraf.Logger `toml:"-"` } func (*Printer) SampleConfig() string { return sampleConfig } // Init is for setup, and validating config. func (p *Printer) Init() error { return nil } func (p *Printer) Apply(in ...telegraf.Metric) []telegraf.Metric { for _, metric := range in { fmt.Println(metric.String()) } return in } func init() { processors.Add("printer", func() telegraf.Processor { return &Printer{} }) } ``` ## Streaming Processor Example ```go //go:generate ../../../tools/readme_config_includer/generator package printer import ( _ "embed" "fmt" "github.com/influxdata/telegraf" "github.com/influxdata/telegraf/plugins/processors" ) //go:embed sample.conf var sampleConfig string type Printer struct { Log telegraf.Logger `toml:"-"` } func (*Printer) SampleConfig() string { return sampleConfig } // Init is for setup, and validating config. func (p *Printer) Init() error { return nil } // Start is called once when the plugin starts; it is only called once per // plugin instance, and never in parallel. // Start should return once it is ready to receive metrics. // The passed in accumulator is the same as the one passed to Add(), so you // can choose to save it in the plugin, or use the one received from Add(). func (p *Printer) Start(acc telegraf.Accumulator) error { } // Add is called for each metric to be processed. The Add() function does not // need to wait for the metric to be processed before returning, and it may // be acceptable to let background goroutine(s) handle the processing if you // have slow processing you need to do in parallel. // Keep in mind Add() should not spawn unbounded goroutines, so you may need // to use a semaphore or pool of workers (eg: reverse_dns plugin does this). // Metrics you don't want to pass downstream should have metric.Drop() called, // rather than simply omitting the acc.AddMetric() call func (p *Printer) Add(metric telegraf.Metric, acc telegraf.Accumulator) error { // print! fmt.Println(metric.String()) // pass the metric downstream, or metric.Drop() it. // Metric will be dropped if this function returns an error. acc.AddMetric(metric) return nil } // Stop gives you an opportunity to gracefully shut down the processor. // Once Stop() is called, Add() will not be called any more. If you are using // goroutines, you should wait for any in-progress metrics to be processed // before returning from Stop(). // When stop returns, you should no longer be writing metrics to the // accumulator. func (p *Printer) Stop() error { } func init() { processors.AddStreaming("printer", func() telegraf.StreamingProcessor { return &Printer{} }) } ``` ================================================ FILE: docs/PROFILING.md ================================================ # Profiling Telegraf uses the standard package `net/http/pprof`. This package serves via its HTTP server runtime profiling data in the format expected by the pprof visualization tool. ## Enable profiling By default, the profiling is turned off. To enable profiling users need to specify the pprof address config parameter `pprof-addr`. For example: ```shell telegraf --config telegraf.conf --pprof-addr localhost:6060 ``` ## Profiles To view all available profiles, open the URL specified in a browser. For example, open `http://localhost:6060/debug/pprof/` in your browser. To look at the heap profile: ```shell go tool pprof http://localhost:6060/debug/pprof/heap ``` To look at a 30-second CPU profile: ```shell go tool pprof http://localhost:6060/debug/pprof/profile?seconds=30 ``` ## Generate heap image It is very helpful to generate an image to visualize what heap memory is used. It is best to capture an image a few moments after Telegraf starts and then at additional periods (e.g. 1min, 5min, etc.). A user can capture the image with Go via: ```shell go tool pprof -png http://localhost:6060/debug/pprof/heap > heap.png ``` The resulting image can be uploaded to a bug report. ## References For additional information on pprof see the following: * [net/http/pprof][] * [Julia Evans: Profiling Go programs with pprof][] * [Debugging Go Code][] [net/http/pprof]: https://pkg.go.dev/net/http/pprof [julia evans: profiling go programs with pprof]: https://jvns.ca/blog/2017/09/24/profiling-go-with-pprof/ [Debugging Go Code]: https://www.infoq.com/articles/debugging-go-programs-pprof-trace/ ================================================ FILE: docs/QUICK_START.md ================================================ # Quick Start The following demos getting started with Telegraf quickly using Docker to monitor the local system. ## Install This example will use Docker to launch a Telegraf container: ```shell docker pull telegraf ``` Refer to the [Install Guide][] for the full list of ways to install Telegraf. [Install Guide]: /docs/INSTALL_GUIDE.md ## Configure Telegraf requires a configuration to start up. A configuration requires at least one input to collect data from and one output to send data to. The configuration file is a [TOML][] file. [TOML]: /docs/TOML.md ```sh $ cat config.toml [[inputs.cpu]] [[inputs.mem]] [[outputs.file]] ``` The above enables two inputs, CPU and Memory, and one output file. The inputs will collect usage information about the CPU and Memory, while the file output is used to print the metrics to STDOUT. Note that defining plugins to use are a TOML array of tables. This means users can define a plugin multiple times. This is more useful with other plugins that may need to connect to different endpoints. ## Launch With the image downloaded and a config file created, launch the image: ```sh docker run --rm --volume $PWD/config.toml:/etc/telegraf/telegraf.conf telegraf ``` The user will see some initial information print out about which config file was loaded, version information, and what plugins were loaded. After the initial few seconds metrics will start to print out. ## Next steps To go beyond this quick start, users should consider the following: 1. Determine where you want to collect data or metrics from and look at the available [input plugins][] 2. Determine where you want to send metrics to and look at the available [output plugins][] 3. Look at the [install guide][] for the complete list of methods to deploy and install Telegraf 4. If parsing arbitrary data or sending metrics or logs to Telegraf, read through the [parsing data][] guide. [input plugins]: /plugins/inputs [output plugins]: /plugins/outputs [parsing data]: /docs/PARSING_DATA.md ================================================ FILE: docs/README.md ================================================ # Telegraf Documentation * [FAQ][] * [Install Guide][] * [Quick Start][] ## Usage * [Commands and Flags][] * [Configuration][] * [Docker][] * [Windows Service][] * [Releases][] * [Supported Platforms][] ## Plugins * [Aggregators][] * [External Plugins][] * [Inputs][] * [SQL Drivers Input][] * [Parsers: Input Data Formats][] * [Outputs][] * [Secret Stores][] * [Serializers: Output Data Formats][] * [Processors][] ## Developers * [Custom Builds][] * [Integration Tests][] * [License of Dependencies][] * [Nightlies][] * [Profiling][] ## Reference * [Aggregators & Processors][] * [AppArmor][] * [Metrics][] * [Parsing Data][] * [Template Pattern][] * [TOML][] * [TLS][] ## Blog Posts * [Common Expression Language][] * [Config Recommendations and Performance Monitoring][] * [Deploying Telegraf via Docker Compose][] * [Reduce Binary Size][] * [Storing Secrets][] [Aggregators & Processors]: /docs/AGGREGATORS_AND_PROCESSORS.md [Aggregators]: /docs/AGGREGATORS.md [AppArmor]: /docs/APPARMOR.md [Commands and Flags]: /docs/COMMANDS_AND_FLAGS.md [Configuration]: /docs/CONFIGURATION.md [Custom Builds]: /docs/CUSTOMIZATION.md [Parsers: Input Data Formats]: /docs/DATA_FORMATS_INPUT.md [Serializers: Output Data Formats]: /docs/DATA_FORMATS_OUTPUT.md [Docker]: /docs/DOCKER.md [External Plugins]: /docs/EXTERNAL_PLUGINS.md [FAQ]: /docs/FAQ.md [Inputs]: /docs/INPUTS.md [Install Guide]: /docs/INSTALL_GUIDE.md [Integration Tests]: /docs/INTEGRATION_TESTS.md [License of Dependencies]: /docs/LICENSE_OF_DEPENDENCIES.md [Metrics]: /docs/METRICS.md [Nightlies]: /docs/NIGHTLIES.md [Outputs]: /docs/OUTPUTS.md [Parsing Data]: /docs/PARSING_DATA.md [Processors]: /docs/PROCESSORS.md [Profiling]: /docs/PROFILING.md [Quick Start]: /docs/QUICK_START.md [Releases]: /docs/RELEASES.md [Secret Stores]: /docs/SECRETSTORES.md [SQL Drivers Input]: /docs/SQL_DRIVERS_INPUT.md [Supported Platforms]: /docs/SUPPORTED_PLATFORMS.md [Template Pattern]: /docs/TEMPLATE_PATTERN.md [TLS]: /docs/TLS.md [TOML]: /docs/TOML.md [Windows Service]: /docs/WINDOWS_SERVICE.md [Config Recommendations and Performance Monitoring]: https://www.influxdata.com/blog/telegraf-best-practices/ [Deploying Telegraf via Docker Compose]: https://www.influxdata.com/blog/telegraf-deployment-strategies-docker-compose/ [Common Expression Language]: https://www.influxdata.com/blog/using-common-expression-language-metric-filtering-telegraf/ [Storing Secrets]: https://www.influxdata.com/blog/storing-secrets-telegraf/ [Reduce Binary Size]: https://www.influxdata.com/blog/how-reduce-telegraf-binary-size/ ================================================ FILE: docs/RELEASES.md ================================================ # Releases Telegraf has four minor releases a year in March, June, September, and December. In between each of those minor releases, there are 2-4 bug fix releases that happen every 3 weeks. This [Google Calendar][] is kept up to date for upcoming release dates. Additionally, users can look at the [GitHub milestones][] for the next minor and bug fix releases. ## Versioning Telegraf uses semantic versioning. ## Minor vs Patch Release PRs that resolve issues are released in the next release. PRs that introduce new features are held for the next minor release. Users can view what [GitHub milestones][] a PR belongs to when they want to determine the release it will go out with. [Google Calendar]: https://calendar.google.com/calendar/embed?src=c_03d981cefd8d6432894cb162da5c6186e393bc0f970ca6c371201aa05d30d763%40group.calendar.google.com [GitHub milestones]: https://github.com/influxdata/telegraf/milestones ================================================ FILE: docs/SECRETSTORES.md ================================================ # Secret Store Plugins This section is for developers who want to create a new secret store plugin. ## Secret Store Plugin Guidelines * A secret store must conform to the [telegraf.SecretStore][] interface. * Secret-stores should call `secretstores.Add` in their `init` function to register themselves. See below for a quick example. * To be available within Telegraf itself, plugins must register themselves using a file in `github.com/influxdata/telegraf/plugins/secretstores/all` named according to the plugin name. Make sure you also add build-tags to conditionally build the plugin. * Each plugin requires a file called `sample.conf` containing the sample configuration for the plugin in TOML format. Please consult the [Sample Config][] page for the latest style guidelines. * Each plugin `README.md` file should include the `sample.conf` file in a section describing the configuration by specifying a `toml` section in the form `toml @sample.conf`. The specified file(s) are then injected automatically into the Readme. * Follow the recommended [Code Style][]. [telegraf.SecretStore]: https://pkg.go.dev/github.com/influxdata/telegraf?utm_source=godoc#SecretStore [Sample Config]: https://github.com/influxdata/telegraf/blob/master/docs/developers/SAMPLE_CONFIG.md [Code Style]: https://github.com/influxdata/telegraf/blob/master/docs/developers/CODE_STYLE.md ## Secret Store Plugin Example ### Registration Registration of the plugin on `plugins/secretstores/all/printer.go`: ```go //go:build !custom || secretstores || secretstores.printer package all import _ "github.com/influxdata/telegraf/plugins/secretstores/printer" // register plugin ``` The _build-tags_ in the first line allow to selectively include/exclude your plugin when customizing Telegraf. ### Plugin ```go //go:generate ../../../tools/readme_config_includer/generator package main import ( _ "embed" "errors" "github.com/influxdata/telegraf" "github.com/influxdata/telegraf/plugins/secretstores" ) //go:embed sample.conf var sampleConfig string type Printer struct { Log telegraf.Logger `toml:"-"` cache map[string]string } func (p *Printer) SampleConfig() string { return sampleConfig } func (p *Printer) Init() error { return nil } // Get searches for the given key and return the secret func (p *Printer) Get(key string) ([]byte, error) { v, found := p.cache[key] if !found { return nil, errors.New("not found") } return []byte(v), nil } // Set sets the given secret for the given key func (p *Printer) Set(key, value string) error { p.cache[key] = value return nil } // List lists all known secret keys func (p *Printer) List() ([]string, error) { keys := make([]string, 0, len(p.cache)) for k := range p.cache { keys = append(keys, k) } return keys, nil } // GetResolver returns a function to resolve the given key. func (p *Printer) GetResolver(key string) (telegraf.ResolveFunc, error) { resolver := func() ([]byte, bool, error) { s, err := p.Get(key) return s, false, err } return resolver, nil } // Register the secret-store on load. func init() { secretstores.Add("printer", func(string) telegraf.SecretStore { return &Printer{} }) } ``` ================================================ FILE: docs/SQL_DRIVERS_INPUT.md ================================================ # Available SQL drivers for the SQL input plugin This is a list of available drivers for the SQL input plugin. The data-source-name (DSN) is driver specific and might change between versions. Please check the driver documentation for available options and the format. | database | driver | aliases | example DSN | comment | |----------------------|-----------------------------------------------------------------------------------------|-----------------|------------------------------------------------------------------------------------------------------------------|------------------------------------------------------------------------------------------------------------------------------| | ClickHouse | [clickhouse](https://github.com/ClickHouse/clickhouse-go) | | `tcp://host:port[?param1=value&...¶mN=value]"` | see [clickhouse-go docs](https://github.com/ClickHouse/clickhouse-go#dsn) for more information | | CockroachDB | [cockroach](https://github.com/jackc/pgx) | postgres or pgx | see _postgres_ driver | uses PostgresQL driver | | FlightSQL | [flightsql](https://github.com/apache/arrow/tree/main/go/arrow/flight/flightsql/driver) | | `flightsql://[username[:password]@]host:port?timeout=10s[&token=TOKEN][¶m1=value1&...¶mN=valueN]` | see [driver docs](https://github.com/apache/arrow/blob/main/go/arrow/flight/flightsql/driver/README.md) for more information | | IBM Netezza | [nzgo](https://github.com/IBM/nzgo) | | `host=your_nz_host port=5480 user=your_nz_user password=your_nz_password dbname=your_nz_db_name sslmode=disable` | see [driver docs](https://pkg.go.dev/github.com/IBM/nzgo/v12) for more | | MariaDB | [maria](https://github.com/go-sql-driver/mysql) | mysql | see _mysql_ driver | uses MySQL driver | | Microsoft SQL Server | [sqlserver](https://github.com/microsoft/go-mssqldb) | mssql | `sqlserver://username:password@host/instance?param1=value¶m2=value` | uses newer _sqlserver_ driver | | MySQL | [mysql](https://github.com/go-sql-driver/mysql) | | `[username[:password]@][protocol[(address)]]/dbname[?param1=value1&...¶mN=valueN]` | see [driver docs](https://github.com/go-sql-driver/mysql) for more information | | Oracle | [oracle](https://github.com/sijms/go-ora) | oracle | `oracle://username:password@host:port/service?param1=value¶m2=value` | see [driver docs](https://github.com/sijms/go-ora/blob/master/README.md) for more information | | PostgreSQL | [postgres](https://github.com/jackc/pgx) | pgx | `postgresql://[user[:password]@][netloc][:port][,...][/dbname][?param1=value1&...]` | see [postgres docs](https://www.postgresql.org/docs/current/libpq-connect.html#LIBPQ-CONNSTRING) for more information | | SAP HANA | [go-hdb](https://github.com/SAP/go-hdb) | hana | `hdb://user:password@host:port` | see [driver docs](https://github.com/SAP/go-hdb) for more information | | SQLite | [sqlite](https://gitlab.com/cznic/sqlite) | | `filename` | see [driver docs](https://pkg.go.dev/modernc.org/sqlite) for more information | | TiDB | [tidb](https://github.com/go-sql-driver/mysql) | mysql | see _mysql_ driver | uses MySQL driver | | Vertica | [vertica](https://github.com/vertica/vertica-sql-go) | | `vertica://(user):(password)@(host):(port)/(database)[?arg1=value&...&argN=valueN]` | see [driver docs](https://github.com/vertica/vertica-sql-go) for more information | ## Comments ### Driver aliases Some database drivers are supported though another driver (e.g. CockroachDB). For other databases we provide a more obvious name (e.g. postgres) compared to the driver name. For all of those drivers you might use an _alias_ name during configuration. ### Example data-source-name DSN The given examples are just that, so please check the driver documentation for the exact format and available options and parameters. Please note that the format of a DSN might also change between driver version. ### Type conversions Telegraf relies on type conversion of the database driver and/or the golang sql framework. In case you find any problem, please open an issue! ## Help If nothing seems to work, you might find help in the telegraf forum or in the chat. ### The documentation is wrong Please open an issue or even better send a pull-request! ### I found a bug Please open an issue or even better send a pull-request! ### My database is not supported We currently cannot support CGO drivers in telegraf! Please check if a **pure Go** driver for the [golang sql framework][go_sql] exists. If you found such a driver, please let us know by opening an issue or even better by sending a pull-request! [go_sql]: https://golang.org/pkg/database/sql/ ================================================ FILE: docs/SUPPORTED_PLATFORMS.md ================================================ # Supported Platforms This doc helps define the platform support for Telegraf. See the [install guide][] for specific options for installing Telegraf. Bug reports should be submitted only for supported platforms that are under general support, not extended or paid support. In general, Telegraf supports Linux, macOS, Microsoft Windows, and FreeBSD. Telegraf is written in Go, which supports many operating systems. Golang.org has a [table][go-table] of valid OS and architecture combinations and the Go Wiki has more specific [minimum requirements][go-reqs] for Go itself. Telegraf may work and produce builds for other operating systems and users are welcome to build their own binaries for them. Again, bug reports must be made on a supported platform. [install guide]: /docs/INSTALL_GUIDE.md [go-table]: https://golang.org/doc/install/source#environment [go-reqs]: https://github.com/golang/go/wiki/MinimumRequirements#operating-systems ## FreeBSD Telegraf supports releases under FreeBSD security support. See the [FreeBSD security page][] for specific versions. [FreeBSD security page]: https://www.freebsd.org/security/#sup ## Linux Telegraf will support the latest generally supported versions of major linux distributions. This does not include extended supported releases where customers can pay for additional support. Below are some of the major distributions and the intent to support: * [Debian][]: Releases supported by security and release teams * [Fedora][]: Releases currently supported by Fedora team * [Red Hat Enterprise Linux][]: Releases under full support * [Ubuntu][]: Releases, interim and LTS, releases in standard support [Debian]: https://wiki.debian.org/LTS [Fedora]: https://fedoraproject.org/wiki/Releases [Red Hat Enterprise Linux]: https://access.redhat.com/support/policy/updates/errata#Life_Cycle_Dates [Ubuntu]: https://ubuntu.com/about/release-cycle ## macOS Telegraf supports releases supported by Apple. Release history is available from [wikipedia][wp-macos]. [wp-macos]: https://endoflife.date/macos ## Microsoft Windows Telegraf intends to support current versions of [Windows][] and [Windows Server][]. The release must be under mainstream or generally supported and not under any paid or extended security support. [Windows]: https://learn.microsoft.com/en-us/lifecycle/faq/windows [Windows Server]: https://learn.microsoft.com/en-us/windows-server/get-started/windows-server-release-info ================================================ FILE: docs/TEMPLATE_PATTERN.md ================================================ # Template Patterns Template patterns are a mini language that describes how a dot delimited string should be mapped to and from [metrics][]. A template has the form: ```text "host.mytag.mytag.measurement.measurement.field*" ``` Where the following keywords can be set: 1. `measurement`: specifies that this section of the graphite bucket corresponds to the measurement name. This can be specified multiple times. 2. `field`: specifies that this section of the graphite bucket corresponds to the field name. This can be specified multiple times. 3. `measurement*`: specifies that all remaining elements of the graphite bucket correspond to the measurement name. 4. `field*`: specifies that all remaining elements of the graphite bucket correspond to the field name. Any part of the template that is not a keyword is treated as a tag key. This can also be specified multiple times. **NOTE:** `measurement` must be specified in your template. **NOTE:** `field*` cannot be used in conjunction with `measurement*`. ## Examples ### Measurement & Tag Templates The most basic template is to specify a single transformation to apply to all incoming metrics. So the following template: ```toml templates = [ "region.region.measurement*" ] ``` would result in the following Graphite -> Telegraf transformation. ```text us.west.cpu.load 100 => cpu.load,region=us.west value=100 ``` Multiple templates can also be specified, but these should be differentiated using _filters_ (see below for more details) ```toml templates = [ "*.*.* region.region.measurement", # <- all 3-part measurements will match this one. "*.*.*.* region.region.host.measurement", # <- all 4-part measurements will match this one. ] ``` ### Field Templates The field keyword tells Telegraf to give the metric that field name. So the following template: ```toml separator = "_" templates = [ "measurement.measurement.field.field.region" ] ``` would result in the following Graphite -> Telegraf transformation. ```text cpu.usage.idle.percent.eu-east 100 => cpu_usage,region=eu-east idle_percent=100 ``` The field key can also be derived from all remaining elements of the graphite bucket by specifying `field*`: ```toml separator = "_" templates = [ "measurement.measurement.region.field*" ] ``` which would result in the following Graphite -> Telegraf transformation. ```text cpu.usage.eu-east.idle.percentage 100 => cpu_usage,region=eu-east idle_percentage=100 ``` ### Filter Templates Users can also filter the template(s) to use based on the name of the bucket, using glob matching, like so: ```toml templates = [ "cpu.* measurement.measurement.region", "mem.* measurement.measurement.host" ] ``` which would result in the following transformation: ```text cpu.load.eu-east 100 => cpu_load,region=eu-east value=100 mem.cached.localhost 256 => mem_cached,host=localhost value=256 ``` ### Adding Tags Additional tags can be added to a metric that don't exist on the received metric. You can add additional tags by specifying them after the pattern. Tags have the same format as the line protocol. Multiple tags are separated by commas. ```toml templates = [ "measurement.measurement.field.region datacenter=1a" ] ``` would result in the following Graphite -> Telegraf transformation. ```text cpu.usage.idle.eu-east 100 => cpu_usage,region=eu-east,datacenter=1a idle=100 ``` [metrics]: /docs/METRICS.md ================================================ FILE: docs/TLS.md ================================================ # Transport Layer Security There is an ongoing effort to standardize TLS options across plugins. When possible, plugins will provide the standard settings described below. With the exception of the advanced configuration available TLS settings will be documented in the sample configuration. ## Client Configuration For client TLS support we have the following options: ```toml ## Enable/disable TLS ## Set to true/false to enforce TLS being enabled/disabled. If not set, ## enable TLS only if any of the other options are specified. # tls_enable = ## Root certificates for verifying server certificates encoded in PEM format. # tls_ca = "/etc/telegraf/ca.pem" ## The public and private key pairs for the client encoded in PEM format. May ## contain intermediate certificates. # tls_cert = "/etc/telegraf/cert.pem" # tls_key = "/etc/telegraf/key.pem" # passphrase for encrypted private key, if it is in PKCS#8 format. Encrypted PKCS#1 private keys are not supported. # tls_key_pwd = "changeme" ## Skip TLS verification. # insecure_skip_verify = false ## Send the specified TLS server name via SNI. # tls_server_name = "foo.example.com" # ``` ### Server Configuration The server TLS configuration provides support for TLS mutual authentication: ```toml ## Set one or more allowed client CA certificate file names to ## enable mutually authenticated TLS connections. # tls_allowed_cacerts = ["/etc/telegraf/clientca.pem"] ## Set one or more allowed DNS name to enable a whitelist ## to verify incoming client certificates. ## It will go through all available SAN in the certificate, ## if of them matches the request is accepted. # tls_allowed_dns_names = ["client.example.org"] ## Add service certificate and key. # tls_cert = "/etc/telegraf/cert.pem" # tls_key = "/etc/telegraf/key.pem" # passphrase for encrypted private key, if it is in PKCS#8 format. Encrypted PKCS#1 private keys are not supported. # tls_key_pwd = "changeme" ``` #### Advanced Configuration For plugins using the standard server configuration you can also set several advanced settings. These options are not included in the sample configuration for the interest of brevity. ```toml ## Define list of allowed ciphers suites. If not defined the default ciphers ## supported by Go will be used. ## ex: tls_cipher_suites = [ ## "TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305", ## "TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305", ## "TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256", ## "TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256", ## "TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384", ## "TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384", ## "TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256", ## "TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA", ## "TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256", ## "TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA", ## "TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA", ## "TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA", ## "TLS_RSA_WITH_AES_128_GCM_SHA256", ## "TLS_RSA_WITH_AES_256_GCM_SHA384", ## "TLS_RSA_WITH_AES_128_CBC_SHA256", ## "TLS_RSA_WITH_AES_128_CBC_SHA", ## "TLS_RSA_WITH_AES_256_CBC_SHA" ## ] # tls_cipher_suites = [] ## Minimum TLS version that is acceptable. # tls_min_version = "TLS10" ## Maximum SSL/TLS version that is acceptable. # tls_max_version = "TLS13" ``` Cipher suites for use with `tls_cipher_suites`: - `TLS_RSA_WITH_RC4_128_SHA` - `TLS_RSA_WITH_3DES_EDE_CBC_SHA` - `TLS_RSA_WITH_AES_128_CBC_SHA` - `TLS_RSA_WITH_AES_256_CBC_SHA` - `TLS_RSA_WITH_AES_128_CBC_SHA256` - `TLS_RSA_WITH_AES_128_GCM_SHA256` - `TLS_RSA_WITH_AES_256_GCM_SHA384` - `TLS_ECDHE_ECDSA_WITH_RC4_128_SHA` - `TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA` - `TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA` - `TLS_ECDHE_RSA_WITH_RC4_128_SHA` - `TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA` - `TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA` - `TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA` - `TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256` - `TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256` - `TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256` - `TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256` - `TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384` - `TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384` - `TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305` - `TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305` - `TLS_AES_128_GCM_SHA256` - `TLS_AES_256_GCM_SHA384` - `TLS_CHACHA20_POLY1305_SHA256` TLS versions for use with `tls_min_version` or `tls_max_version`: - `TLS10` - `TLS11` - `TLS12` - `TLS13` ================================================ FILE: docs/TOML.md ================================================ # TOML Telegraf uses TOML as the configuration language. The following outlines a few common questions and issues that cause questions or confusion. ## Reference and Validator For all things TOML related, please consult the [TOML Spec][] and consider using a TOML validator. In VSCode the [Even Better TOML][] extension or use the [TOML Lint][] website to validate your TOML config. [TOML Spec]: https://toml.io/en/v1.0.0 [Even Better TOML]: https://marketplace.visualstudio.com/items?itemName=tamasfe.even-better-toml [TOML Lint]: https://www.toml-lint.com/ ## Multiple TOML Files TOML technically does not support multiple files, this is done as a convenience for users. Users should be aware that when Telegraf reads a user's config, if multiple files or directories are read in, each file at a time and all settings are combined as if it were one big file. ## Single Table vs Array of Tables Telegraf uses a single agent table (e.g. `[agent]`) to control high-level agent specific configurations. This section can only be defined once for all config files and should be in the first file read in to take effect. This cannot be defined per-config file. Telegraf also uses array of tables (e.g. `[[inputs.file]]`) to define multiple plugins. These can be specified as many times as a user wishes. ## In-line Table vs Table In some cases, a configuration option for a plugin may define a table of configuration options. Take for example, the ability to add arbitrary tags to an input plugin: ```toml [[inputs.cpu]] percpu = false totalcpu = true [inputs.cpu.tags] tag1 = "foo" tag2 = "bar" ``` User's should understand that these tables *must* be at the end of the plugin definition, because any key-value pair is assumed to be part of that table. The following demonstrates how this can cause confusion: ```toml [[inputs.cpu]] totalcpu = true [inputs.cpu.tags] tag1 = "foo" tag2 = "bar" percpu = false # this is treated as a tag to add, not a config option ``` Note TOML does not care about how a user indents the config or whitespace, so the `percpu` option is considered a tag. A far better approach to avoid this situation is to use inline table syntax: ```toml [[inputs.cpu]] tags = {tag1 = "foo", tag2 = "bar"} percpu = false totalcpu = true ``` This way the tags value can go anywhere in the config and avoids possible confusion. ## Basic String vs String Literal In basic strings, signified by double-quotes, certain characters like the backslash and double quote contained in a basic string need to be escaped for the string to be valid. For example the following invalid TOML, includes a Windows path with unescaped backslashes: ```toml path = "C:\Program Files\" # this is invalid TOML ``` User's can either escape the backslashes or use a literal string, which is signified by single-quotes: ```toml path = "C:\\Program Files\\" path = 'C:\Program Files\' ``` Literal strings return exactly what you type. As there is no escaping in literal strings you cannot have an apostrophe in a literal string. ================================================ FILE: docs/WINDOWS_SERVICE.md ================================================ # Running Telegraf as a Windows Service Telegraf natively supports running as a Windows Service. Outlined below is are the general steps to set it up. 1. Obtain the telegraf windows distribution 2. Create the directory `C:\Program Files\Telegraf` or use a custom directory if desired 3. Place the telegraf.exe and the telegraf.conf config file into the directory, either `C:\Program Files\Telegraf` or the custom directory of your choice. If you install in a different location simply specify the `--config` parameter with the desired location. 4. To install the service into the Windows Service Manager, run the command as administrator. Make sure to wrap parameters containing spaces in double quotes: ```shell > "C:\Program Files\Telegraf\telegraf.exe" service install ``` 5. Edit the configuration file to meet your needs 6. To check that it works, run: ```shell > "C:\Program Files\Telegraf\telegraf.exe" --config "C:\Program Files\Telegraf\telegraf.conf" --test ``` 7. To start collecting data, run: ```shell > net start telegraf ``` or ```shell > "C:\Program Files\Telegraf\telegraf.exe" service start ``` or use the Windows service manager to start the service Please also check the Windows event log or your configured log-file for errors during startup. ## Config Directory You can also specify a `--config-directory` for the service to use: 1. Create a directory for config snippets: `C:\Program Files\Telegraf\telegraf.d` 2. Include the `--config-directory` option when registering the service: ```shell > "C:\Program Files\Telegraf\telegraf.exe" --config C:\"Program Files"\Telegraf\telegraf.conf --config-directory C:\"Program Files"\Telegraf\telegraf.d service install ``` ## Other supported operations Telegraf can manage its own service through the --service flag: | Command | Effect | |----------------------------------|------------------------------------------| | `telegraf.exe service install` | Install telegraf as a service | | `telegraf.exe service uninstall` | Remove the telegraf service | | `telegraf.exe service start` | Start the telegraf service | | `telegraf.exe service stop` | Stop the telegraf service | | `telegraf.exe service status` | Query the status of the telegraf service | ## Install multiple services Running multiple instances of Telegraf is seldom needed, as you can run multiple instances of each plugin and route metric flow using the metric filtering options. However, if you do need to run multiple telegraf instances on a single system, you can install the service with the `--service-name` and `--display-name` flags to give the services unique names: ```shell > "C:\Program Files\Telegraf\telegraf.exe" --service-name telegraf-1 service install --display-name "Telegraf 1" > "C:\Program Files\Telegraf\telegraf.exe" --service-name telegraf-2 service install --display-name "Telegraf 2" ``` ## Auto restart and restart delay By default the service will not automatically restart on failure. Providing the `--auto-restart` flag during installation will always restart the service with a default delay of 5 minutes. To modify this to for example 3 minutes, additionally provide `--restart-delay 3m` flag. The delay can be any valid `time.Duration` string. ## Troubleshooting When Telegraf runs as a Windows service, Telegraf logs all messages concerning the service startup to the Windows event log. All messages and errors occuring during runtime will be logged to the log-target you configured. Check the event log for errors reported by the `telegraf` service (or the service-name you configured) during service startup: `Event Viewer -> Windows Logs -> Application` ### Common error #1067 When installing as service in Windows, always double check to specify full path of the config file, otherwise windows service will fail to start. Use ```shell > "C:\Program Files\Telegraf\telegraf.exe" --config "C:\MyConfigs\telegraf.conf" service install ``` instead of ```shell > "C:\Program Files\Telegraf\telegraf.exe" --config "telegraf.conf" service install ``` ### Service is killed during shutdown When shuting down Windows the Telegraf service tries to cleanly stop when receiving the corresponding notification from the Windows service manager. The exit process involves stopping all inputs, processors and aggregators and finally to flush all remaining metrics to the output(s). In case many metrics are not yet flushed this final step might take some time. However, Windows will kill the service and the corresponding process after a predefined timeout (usually 5 seconds). You can change that timeout in the registry under ````text HKLM\SYSTEM\CurrentControlSet\Control\WaitToKillServiceTimeout ``` **NOTE:** The value is in milliseconds and applies to **all** services! ================================================ FILE: docs/developers/CODE_STYLE.md ================================================ # Code Style Code is required to be formatted using `gofmt`, this covers most code style requirements. It is also highly recommended to use `goimports` to automatically order imports. Please try to keep lines length under 80 characters, the exact number of characters is not strict but it generally helps with readability. ================================================ FILE: docs/developers/DEBUG.md ================================================ # Debug The following describes how to use the [delve][1] debugger with telegraf during development. Delve has many, very well documented [subcommands][2] and options. [1]: https://github.com/go-delve/delve [2]: https://github.com/go-delve/delve/blob/master/Documentation/usage/README.md ## CLI To run telegraf manually, users can run: ```bash go run ./cmd/telegraf --config config.toml ``` To attach delve with a similar config users can run the following. Note the additional `--` to specify flags passed to telegraf. Additional flags need to go after this double dash: ```bash $ dlv debug ./cmd/telegraf -- --config config.toml Type 'help' for list of commands. (dlv) ``` At this point a user could set breakpoints and continue execution. ## Visual Studio Code Visual Studio Code's [go language extension][20] includes the ability to easily make use of [delve for debugging][21]. Check out this [full tutorial][22] from the go extension's wiki. A basic config is all that is required along with additional arguments to tell Telegraf where the config is located: ```json { // Use IntelliSense to learn about possible attributes. // Hover to view descriptions of existing attributes. // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 "version": "0.2.0", "configurations": [ { "name": "Launch Package", "type": "go", "request": "launch", "mode": "auto", "program": "${fileDirname}", "args": ["--config", "/path/to/config"] } ] } ``` [20]: https://code.visualstudio.com/docs/languages/go [21]: https://code.visualstudio.com/docs/languages/go#_debugging [22]: https://github.com/golang/vscode-go/wiki/debugging ## GoLand JetBrains' [GoLand][30] also includes full featured [debugging][31] options. The following is an example debug config to run Telegraf with a config: ```xml ``` [30]: https://www.jetbrains.com/go/ [31]: https://www.jetbrains.com/help/go/debugging-code.html ================================================ FILE: docs/developers/DEPRECATION.md ================================================ # Deprecation Deprecation is the primary tool for making changes in Telegraf. A deprecation indicates that the community should move away from using a feature, and documents that the feature will be removed in the next major update (2.0). Key to deprecation is that the feature remains in Telegraf and the behavior is not changed. We do not have a strict definition of a breaking change. All code changes change behavior, the decision to deprecate or make the change immediately is decided based on the impact. ## Deprecate plugins Add an entry to the plugins deprecation list (e.g. in `plugins/inputs/deprecations.go`). Include the deprecation version and any replacement, e.g. ```golang "logparser": { Since: "1.15.0", Notice: "use 'inputs.tail' with 'grok' data format instead", }, ``` The entry can contain an optional `RemovalIn` field specifying the planned version for removal of the plugin. Also add the deprecation warning to the plugin's README: ```markdown # Logparser Input Plugin ### **Deprecated in 1.10**: Please use the [tail][] plugin along with the `grok` [data format][]. [tail]: /plugins/inputs/tail/README.md [data formats]: /docs/DATA_FORMATS_INPUT.md ``` Telegraf will automatically check if a deprecated plugin is configured and print a warning ```text 2022-01-26T20:08:15Z W! DeprecationWarning: Plugin "inputs.logparser" deprecated since version 1.15.0 and will be removed in 2.0.0: use 'inputs.tail' with 'grok' data format instead ``` ## Deprecate options Mark the option as deprecated in the sample config, include the deprecation version and any replacement. ```toml ## Broker to publish to. ## deprecated in 1.7; use the brokers option # url = "amqp://localhost:5672/influxdb" ``` In the plugins configuration struct, add a `deprecated` tag to the option: ```go type AMQP struct { URL string `toml:"url" deprecated:"1.7.0;use 'brokers' instead"` Precision string `toml:"precision" deprecated:"1.2.0;option is ignored"` } ``` The `deprecated` tag has the format `[;removal version];` where the `removal version` is optional. The specified deprecation info will automatically displayed by Telegraf if the option is used in the config ```text 2022-01-26T20:08:15Z W! DeprecationWarning: Option "url" of plugin "outputs.amqp" deprecated since version 1.7.0 and will be removed in 2.0.0: use 'brokers' instead ``` ### Option value In the case a specific option value is being deprecated, the method `models.PrintOptionValueDeprecationNotice` needs to be called in the plugin's `Init` method. ## Deprecate metrics In the README document the metric as deprecated. If there is a replacement field, tag, or measurement then mention it. ```markdown - system - fields: - uptime_format (string, deprecated in 1.10: use `uptime` field) ``` Add filtering to the sample config, leave it commented out. ```toml [[inputs.system]] ## Uncomment to remove deprecated metrics. # fieldexclude = ["uptime_format"] ``` ================================================ FILE: docs/developers/LOGGING.md ================================================ # Logging ## Plugin Logging You can access the Logger for a plugin by defining a field named `Log`. This `Logger` is configured internally with the plugin name and alias so they do not need to be specified for each log call. ```go type MyPlugin struct { Log telegraf.Logger `toml:"-"` } ``` You can then use this Logger in the plugin. Use the method corresponding to the log level of the message. ```go p.Log.Errorf("Unable to write to file: %v", err) ``` ## Agent Logging In other sections of the code it is required to add the log level and module manually: ```go log.Printf("E! [agent] Error writing to %s: %v", output.LogName(), err) ``` ## When to Log Log a message if an error occurs but the plugin can continue working. For example if the plugin handles several servers and only one of them has a fatal error, it can be logged as an error. Use logging judiciously for debug purposes. Since Telegraf does not currently support setting the log level on a per module basis, it is especially important to not over do it with debug logging. If the plugin is listening on a socket, log a message with the address of the socket: ```go p.log.InfoF("Listening on %s://%s", protocol, l.Addr()) ``` ## When not to Log Don't use logging to emit performance data or other meta data about the plugin, instead use the `internal` plugin and the `selfstats` package. Don't log fatal errors in the plugin that require the plugin to return, instead return them from the function and Telegraf will handle the logging. Don't log for static configuration errors, check for them in a plugin `Init()` function and return an error there. Don't log a warning every time a plugin is called for situations that are normal on some systems. ## Log Level The log level is indicated by a single character at the start of the log message. Adding this prefix is not required when using the Plugin Logger. - `D!` Debug - `I!` Info - `W!` Warning - `E!` Error ## Style Log messages should be capitalized and be a single line. If it includes data received from another system or process, such as the text of an error message, the text should be quoted with `%q`. Use the `%v` format for the Go error type instead of `%s` to ensure a nil error is printed. ================================================ FILE: docs/developers/METRIC_FORMAT_CHANGES.md ================================================ # Metric Format Changes When making changes to an existing input plugin, care must be taken not to change the metric format in ways that will cause trouble for existing users. This document helps developers understand how to make metric format changes safely. ## Changes can cause incompatibilities If the metric format changes, data collected in the new format can be incompatible with data in the old format. Database queries designed around the old format may not work with the new format. This can cause application failures. Some metric format changes don't cause incompatibilities. Also, some unsafe changes are necessary. How do you know what changes are safe and what to do if your change isn't safe? ## Guidelines The main guideline is just to keep compatibility in mind when making changes. Often developers are focused on making a change that fixes their particular problem and they forget that many people use the existing code and will upgrade. When you're coding, keep existing users and applications in mind. ### Renaming, removing, reusing Database queries refer to the metric and its tags and fields by name. Any Telegraf code change that changes those names has the potential to break an existing query. Similarly, removing tags or fields can break queries. Changing the meaning of an existing tag value or field value or reusing an existing one in a new way isn't safe. Although queries that use these tags/field may not break, they will not work as they did before the change. Adding a field doesn't break existing queries. Queries that select all fields and/or tags (like "select * from") will return an extra series but this is often useful. ### Performance and storage Time series databases can store large amounts of data but many of them don't perform well on high cardinality data. If a metric format change includes a new tag that holds high cardinality data, database performance could be reduced enough to cause existing applications not to work as they previously did. Metric format changes that dramatically increase the number of tags or fields of a metric can increase database storage requirements unexpectedly. Both of these types of changes are unsafe. ### Make unsafe changes opt-in If your change has the potential to seriously affect existing users, the change must be opt-in. To do this, add a plugin configuration setting that lets the user select the metric format. Make the setting's default value select the old metric format. When new users add the plugin they can choose the new format and get its benefits. When existing users upgrade, their config files won't have the new setting so the default will ensure that there is no change. When adding a setting, avoid using a boolean and consider instead a string or int for future flexibility. A boolean can only handle two formats but a string can handle many. For example, compare `use_new_format=true` and `features=["enable_foo_fields"]`; the latter is much easier to extend and still very descriptive. If you want to encourage existing users to use the new format you can log a warning once on startup when the old format is selected. The warning should tell users in a gentle way that they can upgrade to a better metric format. If it doesn't make sense to maintain multiple metric formats forever, you can change the default on a major release or even remove the old format completely. See [[Deprecation]] for details. ### Utility Changes should be useful to many or most users. A change that is only useful for a small number of users may not accepted, even if it's off by default. ## Summary table | | delete | rename | add | | ------- | ------ | ------ | --- | | metric | unsafe | unsafe | safe | | tag | unsafe | unsafe | be careful with cardinality | | field | unsafe | unsafe | ok as long as it's useful for existing users and is worth the added space | ## References InfluxDB Documentation: "Schema and data layout" ================================================ FILE: docs/developers/PACKAGING.md ================================================ # Packaging Building the packages for Telegraf is automated using [Make][make]. Just running `make` will build a Telegraf binary for the operating system and architecture you are using (if it is supported). If you need to build a different package then you can run `make package` which will build all the supported packages. You will most likely only want a subset, you can define a subset of packages to be built by overriding the `include_packages` variable like so ```shell make package include_packages="amd64.deb" ``` You can also build all packages for a specific architecture like so ```shell make package include_packages="$(make amd64)" ``` The packaging steps require certain tools to be setup before hand to work. These dependencies are listed in the ci.docker file which you can find in the scripts directory. Therefore it is recommended to use Docker to build the artifacts, see more details below. [make]: https://en.wikipedia.org/wiki/Make_(software) ## Go Version Telegraf will be built using the latest version of Go whenever possible. ### Update CI image Incrementing the version is maintained by the core Telegraf team because it requires access to an internal docker repository that hosts the docker CI images. When a new version is released, the following process is followed: 1. Within the `Makefile`, `.circleci\config.yml`, and `scripts/ci.docker` files update the Go versions to the new version number 2. Run `make ci`, this requires quay.io internal permissions 3. The files `scripts\installgo_linux.sh`, `scripts\installgo_mac.sh`, and `scripts\installgo_windows.sh` need to be updated as well with the new Go version and SHA 4. Create a pull request with these new changes, and verify the CI passes and uses the new docker image See the [previous PRs](https://github.com/influxdata/telegraf/search?q=chore+update+go&type=commits) as examples. ### Access to quay.io A member of the team needs to invite you to the quay.io organization. To push new images, the user needs to do the following: 1. Create a password if the user logged in using Google authentication 2. Download an encrypted username/password from the quay.io user page 3. Run `docker login quay.io` and enter in the encrypted username and password from the previous step ## Package using Docker This packaging method uses the CI images, and is very similar to how the official packages are created on release. This is the recommended method for building the rpm/deb as it is less system dependent. Pull the CI images from quay, the version corresponds to the version of Go that is used to build the binary: ```shell docker pull quay.io/influxdb/telegraf-ci:1.9.7 ``` Start a shell in the container: ```shell docker run -ti quay.io/influxdb/telegraf-ci:1.9.7 /bin/bash ``` From within the container: 1. `go get -d github.com/influxdata/telegraf` 2. `cd /go/src/github.com/influxdata/telegraf` 3. `git checkout release-1.10` * Replace tag `release-1.10` with the version of Telegraf you would like to build 4. `git reset --hard 1.10.2` 5. `make deps` 6. `make package include_packages="amd64.deb"` * Change `include_packages` to change what package you want, run `make help` to see possible values From the host system, copy the build artifacts out of the container: ```shell docker cp romantic_ptolemy:/go/src/github.com/influxdata/telegraf/build/telegraf-1.10.2-1.x86_64.rpm . ``` ================================================ FILE: docs/developers/PROFILING.md ================================================ # Profiling This article describes how to collect performance traces and memory profiles from Telegraf. If you are submitting this for an issue, please include the version.txt generated below. Use the `--pprof-addr` option to enable the profiler, the easiest way to do this may be to add this line to `/etc/default/telegraf`: ```shell TELEGRAF_OPTS="--pprof-addr localhost:6060" ``` Restart Telegraf to activate the profile address. ## Trace Profile Collect a trace during the time where the performance issue is occurring. This example collects a 10 second trace and runs for 10 seconds: ```shell curl 'http://localhost:6060/debug/pprof/trace?seconds=10' > trace.bin telegraf --version > version.txt go env GOOS GOARCH >> version.txt ``` The `trace.bin` and `version.txt` files can be sent in for analysis or, if desired, you can analyze the trace with: ```shell go tool trace trace.bin ``` ## Memory Profile Collect a heap memory profile: ```shell curl 'http://localhost:6060/debug/pprof/heap' > mem.prof telegraf --version > version.txt go env GOOS GOARCH >> version.txt ``` Analyze: ```shell $ go tool pprof mem.prof (pprof) top5 ``` ## CPU Profile Collect a 30s CPU profile: ```shell curl 'http://localhost:6060/debug/pprof/profile' > cpu.prof telegraf --version > version.txt go env GOOS GOARCH >> version.txt ``` Analyze: ```shell go tool pprof cpu.prof (pprof) top5 ``` ================================================ FILE: docs/developers/REVIEWS.md ================================================ # Reviews Pull-requests require two approvals before being merged. Expect several rounds of back and forth on reviews, non-trivial changes are rarely accepted on the first pass. It might take some time until you see a first review so please be patient. All pull requests should follow the style and best practices in the [CONTRIBUTING.md](https://github.com/influxdata/telegraf/blob/master/CONTRIBUTING.md) document. ## Process The review process is roughly structured as follows: 1. Submit a pull request. Please check that you signed the [CLA](https://www.influxdata.com/legal/cla/) (and [Corporate CLA](https://www.influxdata.com/legal/ccla/) if you are contributing code on as an employee of your company). Provide a short description of your submission and reference issues that you potentially close. Make sure the CI tests are all green and there are no linter-issues. 1. Get feedback from a first reviewer and a `ready for final review` tag. Please constructively work with the reviewer to get your code into a mergeable state (see also [below](#reviewing-plugin-code)). 1. Get a final review by one of the InfluxData maintainers. Please fix any issue raised. 1. Wait for the pull-request to be merged. It might take some time until your PR gets merged, depending on the release cycle and the type of your pull-request (bugfix, enhancement of existing code, new plugin, etc). Remember, it might be necessary to rebase your code before merge to resolve conflicts. Please read the review comments carefully, fix the related part of the code and/or respond in case there is anything unclear. Maintainers will add the `waiting for response` tag to PRs to make it clear we are waiting on the submitter for updates. __Once the tag is added, if there is no activity on a pull request or the contributor does not respond, our bot will automatically close the PR after two weeks!__ If you expect a longer period of inactivity or you want to abandon a pull request, please let us know. In case you still want to continue with the PR, feel free to reopen it. ## Reviewing Plugin Code - Avoid variables scoped to the package. Everything should be scoped to the plugin struct, since multiple instances of the same plugin are allowed and package-level variables will cause race conditions. - SampleConfig must match the readme, but not include the plugin name. - structs should include toml tags for fields that are expected to be editable from the config. eg `toml:"command"` (snake_case) - plugins that want to log should declare the Telegraf logger, not use the log package. eg: ```Go Log telegraf.Logger `toml:"-"` ``` (in tests, you can do `myPlugin.Log = testutil.Logger{}`) - Initialization and config checking should be done on the `Init() error` function, not in the Connect, Gather, or Start functions. - `Init() error` should not contain connections to external services. If anything fails in Init, Telegraf will consider it a configuration error and refuse to start. - plugins should avoid synchronization code if they are not starting goroutines. Plugin functions are never called in parallel. - avoid goroutines when you don't need them and removing them would simplify the code - errors should almost always be checked. - avoid boolean fields when a string or enumerated type would be better for future extension. Lots of boolean fields also make the code difficult to maintain. - use config.Duration instead of internal.Duration - compose tls.ClientConfig as opposed to specifying all the TLS fields manually - http.Client should be declared once on `Init() error` and reused, (or better yet, on the package if there's no client-specific configuration). `http.Client` has built-in concurrency protection and reuses connections transparently when possible. - avoid doing network calls in loops where possible, as this has a large performance cost. This isn't always possible to avoid. - when processing batches of records with multiple network requests (some outputs that need to partition writes do this), return an error when you want the whole batch to be retried, log the error when you want the batch to continue without the record - consider using the StreamingProcessor interface instead of the (legacy) Processor interface - avoid network calls in processors when at all possible. If it's necessary, it's possible, but complicated (see processor.reversedns). - avoid dependencies when: - they require cgo - they pull in massive projects instead of small libraries - they could be replaced by a simple http call - they seem unnecessary, superfluous, or gratuitous - consider adding build tags if plugins have OS-specific considerations - use the right logger log levels so that Telegraf is normally quiet eg `plugin.Log.Debugf()` only shows up when running Telegraf with `--debug` - consistent field types: dynamically setting the type of a field should be strongly avoided as it causes problems that are difficult to solve later, made worse by having to worry about backwards compatibility in future changes. For example, if an numeric value comes from a string field and it is not clear if the field can sometimes be a float, the author should pick either a float or an int, and parse that field consistently every time. Better to sometimes truncate a float, or to always store ints as floats, rather than changing the field type, which causes downstream problems with output databases. - backwards compatibility: We work hard not to break existing configurations during new changes. Upgrading Telegraf should be a seamless transition. Possible tools to make this transition smooth are: - enumerable type fields that allow you to customize behavior (avoid boolean feature flags) - version fields that can be used to opt in to newer changed behavior without breaking old (see inputs.mysql for example) - a new version of the plugin if it has changed significantly (e.g. `outputs.influxdb` and `outputs.influxdb_v2`) - Logger and README deprecation warnings - changing the default value of a field can be okay, but will affect users who have not specified the field and should be approached cautiously. - The general rule here is "don't surprise me": users should not be caught off-guard by unexpected or breaking changes. ## Linting Each pull request will have the appropriate linters checking the files for any common mistakes. The github action Super Linter is used: [super-linter](https://github.com/github/super-linter). If it is failing you can click on the action and read the logs to figure out the issue. You can also run the github action locally by following these instructions: [run-linter-locally.md](https://github.com/github/super-linter/blob/main/docs/run-linter-locally.md). You can find more information on each of the linters in the super linter readme. ## Testing Sufficient unit tests must be created. New plugins must always contain some unit tests. Bug fixes and enhancements should include new tests, but they can be allowed if the reviewer thinks it would not be worth the effort. [Table Driven Tests](https://github.com/golang/go/wiki/TableDrivenTests) are encouraged to reduce boiler plate in unit tests. The [stretchr/testify](https://github.com/stretchr/testify) library should be used for assertions within the tests when possible, with preference towards github.com/stretchr/testify/require. Primarily use the require package to avoid cascading errors: ```go assert.Equal(t, lhs, rhs) # avoid require.Equal(t, lhs, rhs) # good ``` ## Configuration The config file is the primary interface and should be carefully scrutinized. Ensure the [[SampleConfig]] and [README](https://github.com/influxdata/telegraf/blob/master/plugins/inputs/EXAMPLE_README.md) match with the current standards. READMEs should: - be spaces, not tabs - be indented consistently, matching other READMEs - have two `#` for comments - have one `#` for defaults, which should always match the default value of the plugin - include all appropriate types as a list for enumerable field types - include a useful example, avoiding "example", "test", etc. - include tips for any common problems - include example output from the plugin, if input/processor/aggregator/parser/serializer ## Metric Schema Telegraf metrics are heavily based on InfluxDB points, but have some extensions to support other outputs and metadata. New metrics must follow the recommended [schema design](https://docs.influxdata.com/influxdb/latest/concepts/schema_and_data_layout/). Each metric should be evaluated for _series cardinality_, proper use of tags vs fields, and should use existing patterns for encoding metrics. Metrics use `snake_case` naming style. ### Enumerations Generally enumeration data should be encoded as a tag. In some cases it may be desirable to also include the data as an integer field: ```shell net_response,result=success result_code=0i ``` ### Histograms Use tags for each range with the `le` tag, and `+Inf` for the values out of range. This format is inspired by the Prometheus project: ```shell cpu,le=0.0 usage_idle_bucket=0i 1486998330000000000 cpu,le=50.0 usage_idle_bucket=2i 1486998330000000000 cpu,le=100.0 usage_idle_bucket=2i 1486998330000000000 cpu,le=+Inf usage_idle_bucket=2i 1486998330000000000 ``` ### Lists Lists are tricky, but the general technique is to encode using a tag, creating one series be item in the list. ### Counters Counters retrieved from other projects often are in one of two styles, monotonically increasing without reset and reset on each interval. No attempt should be made to switch between these two styles but if given the option it is preferred to use the non-resetting variant. This style is more resilient in the face of downtime and does not contain a fixed time element. ### Source tag When metrics are gathered from another host, the metric schema should have a tag named "source" that contains the other host's name. See [this feature request](https://github.com/influxdata/telegraf/issues/4413) for details. The metric schema doesn't need to have a tag for the host running telegraf. Telegraf agent code can add a tag named "host" and by default containing the hostname reported by the kernel. This can be configured through the "hostname" and "omit_hostname" agent settings. ## Go Best Practices In general code should follow best practice describe in [Code Review Comments](https://github.com/golang/go/wiki/CodeReviewComments). ### Networking All network operations should have appropriate timeouts. The ability to cancel the option, preferably using a context, is desirable but not always worth the implementation complexity. ### Channels Channels should be used in judiciously as they often complicate the design and can easily be used improperly. Only use them when they are needed. ================================================ FILE: docs/developers/SAMPLE_CONFIG.md ================================================ # Sample Configuration The sample config file is generated from a results of the `SampleConfig()` functions of the plugin. You can generate a full sample config: ```shell telegraf config ``` You can also generate the config for a particular plugin using the `-usage` option: ```shell telegraf --usage influxdb ``` ## Style In the config file we use 2-space indention. Since the config is [TOML](https://github.com/toml-lang/toml) the indention has no meaning. Documentation is double commented, full sentences, and ends with a period. ```toml ## This text describes what an the exchange_type option does. # exchange_type = "topic" ``` Try to give every parameter a default value whenever possible. If a parameter does not have a default or must frequently be changed then have it uncommented. ```toml ## Brokers are the AMQP brokers to connect to. brokers = ["amqp://localhost:5672"] ``` Options where the default value is usually sufficient are normally commented out. The commented out value is the default. ```toml ## What an exchange type is. # exchange_type = "topic" ``` If you want to show an example of a possible setting filled out that is different from the default, show both: ```toml ## Static routing key. Used when no routing_tag is set or as a fallback ## when the tag specified in routing tag is not found. ## example: routing_key = "telegraf" # routing_key = "" ``` Unless parameters are closely related, add a space between them. Usually parameters is closely related have a single description. ```toml ## If true, queue will be declared as an exclusive queue. # queue_exclusive = false ## If true, queue will be declared as an auto deleted queue. # queue_auto_delete = false ## Authentication credentials for the PLAIN auth_method. # username = "" # password = "" ``` Parameters should usually be describable in a few sentences. If it takes much more than this, try to provide a shorter explanation and provide a more complex description in the Configuration section of the plugins [README](/plugins/inputs/example) Boolean parameters should be used judiciously. You should try to think of something better since they don't scale well, things are often not truly boolean, and frequently end up with implicit dependencies: this option does something if this and this are also set. ================================================ FILE: docs/developers/STATE_PERSISTENCE.md ================================================ # State-persistence for plugins ## Purpose Plugin state-persistence allows a plugin to save its state across restarts of Telegraf. This might be necessary if data-input (or output) is stateful and depends on the result of a previous operation. If you for example query data from a service providing a `next` token, your plugin would need to know the last token received in order to make the next query. However, this token is lost after a restart of Telegraf if not persisted and thus your only chance is to restart the query chain potentially resulting in handling redundant data producing unnecessary traffic. This is where state-persistence comes into play. The state-persistence framework allows your plugin to store a _state_ on shutdown and load that _state_ again on startup of Telegraf. ## State format The _state_ of a plugin can be any structure or datatype that is serializable using Golang's JSON serializer. It can be a key-value map or a more complex structure. E.g. ```go type MyState struct { CurrentToken string LastToken string NextToken string FilterIDs []int64 } ``` would represent a valid state. ## Implementation To enable state-persistence in your plugin you need to implement the `StatefulPlugin` interface defined in `plugin.go`. The interface looks as follows: ```go type StatefulPlugin interface { GetState() interface{} SetState(state interface{}) error } ``` The `GetState()` function should return the current state of the plugin (see [state format](#state-format)). Please note that this function should _always_ succeed and should always be callable directly after `Init()`. So make sure your relevant data-structures are initialized in `Init` to prevent panics. Telegraf will call the `GetState()` function on shutdown and will then compile an overall Telegraf state from the information of all stateful plugins. This state is then persisted to disk if (and only if) the `statefile` option in the `agent` section is set. You do _not_ need take care of any serialization or writing, Telegraf will handle this for you. When starting Telegraf, the overall persisted Telegraf state will be restored, if `statefile` is set. To do so, the `SetState()` function is called with the deserialized state of the plugin. Please note that this function is called directly _after_ the `Init()` function of your plugin. You need to make sure that the given state is what you expect using a type-assertion! Make sure this won't panic but rather return a meaningful error. To assign the state to the correct plugin, Telegraf relies on a plugin ID. See the ["State assignment" section](#state-assignment) for more details on the procedure and ["Plugin Identifier" section](#plugin-identifier) for more details on ID generation. ## State assignment When restoring the state on loading, Telegraf needs to ensure that each plugin _instance_ gets the correct state. To do so, a plugin ID is used. By default this ID is generated automatically for each plugin instance but can be overwritten if necessary (see [Plugin Identifier](#plugin-identifier)). State assignment needs to be able to handle multiple instances of the same plugin type correctly, e.g. if the user has configured multiple instances of your plugin with different `server` settings. Here, the state saved for `foo.example.com` needs to be restored to the plugin instance handling `foo.example.com` on next startup of Telegraf and should _not_ end up at server `bar.example.com`. So the plugin identifier used for the assignment should be consistent over restarts of Telegraf. In case plugin instances are added to the configuration between restarts, no state is restored _for those instances_. Furthermore, all states referencing plugin identifier that are no-longer valid are dropped and will be ignored. This can happen in case plugin instances are removed or changed in ID. ## Plugin Identifier As outlined above, the plugin identifier (plugin ID) is crucial when assigning states to plugin instances. By default, Telegraf will automatically generate an identifier for each plugin configured when starting up. The ID is consistent over restarts of Telegraf and is based on the _entire configuration_ of the plugin. This means for each plugin instance, all settings in the configuration will be concatenated and hashed to derive the ID. The resulting ID will then be used in both save and restore operations making sure the state ends up in a plugin with _exactly_ the same configuration that created the state. However, this also means that the plugin identifier _is changing_ whenever _any_ of the configuration setting is changed! For example if your plugin is defined as ```go type MyPlugin struct { Server string `toml:"server"` Token string `toml:"token"` Timeout config.Duration `toml:"timeout"` offset int } ``` with `offset` being your state, the plugin ID will change if a user changes the `timeout` setting in the configuration file. As a consequence the state cannot be restored. This might be undesirable for your plugin, therefore you can overwrite the ID generation by implementing the `PluginWithID` interface (see `plugin.go`). This interface defines a `ID() string` function returning the identifier o the current plugin _instance_. When implementing this function you should take the following criteria into account: 1. The identifier has to be _unique_ for your plugin _instance_ (not only for the plugin type) to make sure the state is assigned to the correct instance. 1. The identifier has to be _consistent_ across startups/restarts of Telegraf as otherwise the state cannot be restored. Make sure the order of configuration settings doesn't matter. 1. Make sure to _include all settings relevant for state assignment_. In the example above, the plugin's `token` setting might or might not be relevant to identify the plugin instance. 1. Make sure to _leave out all settings irrelevant for state assignment_. In the example above, the plugin's `timeout` setting likely is not relevant for the state and can be left out. Which settings are relevant for the state are plugin specific. For example, if the `offset` is a property of the _server_ the `token` setting is irrelevant. However, if the `offset` is specific for a certain user suddenly the `token` setting is relevant. Alternatively to generating an identifier automatically, the plugin can allow the user to specify that ID directly in a configuration setting. However, please not that this might lead to colliding IDs in larger setups and should thus be avoided. ================================================ FILE: docs/includes/plugin_config.md ================================================ Plugins support additional global and plugin configuration settings for tasks such as modifying metrics, tags, and fields, creating aliases, and configuring plugin ordering. See [CONFIGURATION.md][CONFIGURATION.md] for more details. [CONFIGURATION.md]: ../../../docs/CONFIGURATION.md#plugins ================================================ FILE: docs/includes/secret_usage.md ================================================ Secrets defined by a store are referenced with `@{:}` the Telegraf configuration. Only certain Telegraf plugins and options of support secret stores. To see which plugins and options support secrets, see their respective documentation (e.g. `plugins/outputs/influxdb/README.md`). If the plugin's README has the `Secret-store support` section, it will detail which options support secret store usage. ================================================ FILE: docs/includes/service_input.md ================================================ This plugin is a service input. Normal plugins gather metrics determined by the interval setting. Service plugins start a service to listen and wait for metrics or events to occur. Service plugins have two key differences from normal plugins: 1. The global or plugin specific `interval` setting may not apply 2. The CLI options of `--test`, `--test-wait`, and `--once` may not produce output for this plugin ================================================ FILE: docs/includes/startup_error_behavior.md ================================================ In addition to the plugin-specific and global configuration settings the plugin supports options for specifying the behavior when experiencing startup errors using the `startup_error_behavior` setting. Available values are: - `error`: Telegraf with stop and exit in case of startup errors. This is the default behavior. - `ignore`: Telegraf will ignore startup errors for this plugin and disables it but continues processing for all other plugins. - `retry`: Telegraf will try to startup the plugin in every gather or write cycle in case of startup errors. The plugin is disabled until the startup succeeds. - `probe`: Telegraf will probe the plugin's function (if possible) and disables the plugin in case probing fails. If the plugin does not support probing, Telegraf will behave as if `ignore` was set instead. ================================================ FILE: docs/specs/README.md ================================================ # Telegraf Specification Overview ## Objective Define and layout the Telegraf specification process. ## Overview The general goal of a spec is to detail the work that needs to get accomplished for a new feature. A developer should be able to pick up a spec and have a decent understanding of the objective, the steps required, and most of the general design decisions. The specs can then live in the Telegraf repository to share and involve the community in the process of planning larger changes or new features. The specs also serve as a public historical record for changes. ## Process The general workflow is for a user to put up a PR with a spec outlining the task, have any discussion in the PR, reach consensus, and ultimately commit the finished spec to the repo. While researching a new feature may involve an investment of time, writing the spec should be relatively quick. It should not take hours of time. ## Spec naming Please name the actual file prefixed with `tsd` and the next available number, for example: * tsd-001-agent-write-ahead-log.md * tsd-002-inputs-apache-increase-timeout.md * tsd-003-serializers-parquet.md All lower-case and separated by hyphens. ## What belongs in a spec A spec should involve the creation of a markdown file with at least an objective and overview: * Objective (required) - One sentence headline * Overview (required) - Explain the reasoning for the new feature and any historical information. Answer the why this is needed. Please feel free to make a copy the template.md and start with that. The user is free to add additional sections or parts in order to express and convey a new feature. For example this might include: * Keywords - Help identify what the spec is about * Is/Is-not - Explicitly state what this change includes and does not include * Prior Art - Point at existing or previous PRs, issues, or other works that demonstrate the feature or need for it. * Open Questions - Section with open questions that can get captured in updates to the PR ## Changing existing specs Small changes which are non-substantive, like grammar or formatting are gladly accepted. After a feature is complete it may make sense to come back and update a spec based on the final result. Other changes that make substantive changes are entirely up to the maintainers whether the edits to an existing RFC will be accepted. In general, finished specs should be considered complete and done, however, priorities, details, or other situations may evolve over time and as such introduce the need to make updates. ================================================ FILE: docs/specs/template.md ================================================ # Title ## Objective One sentence explanation of the feature. ## Overview Background and details about the feature. ## Keywords A few items to specify what areas of Telegraf this spec affects (e.g. outputs, inputs, processors, aggregators, agent, packaging, etc.) ## Is/Is-not ## Prior art ## Open questions ================================================ FILE: docs/specs/tsd-001-deprecation.md ================================================ # Plugin and Plugin Option Deprecation ## Objective Specifies the process of deprecating and removing plugins, plugin settings including values of those settings or features. ## Keywords procedure, removal, all plugins ## Overview Over time the number of plugins, plugin options and plugin features grow and some of those plugins or options are either not relevant anymore, have been superseded or subsumed by other plugins or options. To be able to remove those, this specification defines a process to deprecate plugins, plugin options and plugin features including a timeline and minimal time-frames. Additionally, the specification defines a framework to annotate deprecations in the code and inform users about such deprecations. ## User experience In the deprecation phase a warning will be shown at Telegraf startup with the following content ```text Plugin "inputs.logparser" deprecated since version 1.15.0 and will be removed in 1.40.0: use 'inputs.tail' with 'grok' data format instead ``` Similar warnings will be shown when removing plugin options or option values. This provides users with time to replace the deprecated plugin in their configuration file. After the shown release (`v1.40.0` in this case) the warning will be promoted to an error preventing Telegraf from starting. The user now has to adapt the configuration file to start Telegraf. ## Time frames and considerations When deprecating parts of Telegraf, it is important to provide users with enough time to migrate to alternative solutions before actually removing those parts. In general, plugins, plugin options or option values should only be deprecated if a suitable alternative exists! In those cases, the deprecations should predate the removal by at least one and a half years. In current release terms this corresponds to six minor-versions. However, there might be circumstances requiring a prolonged time between deprecation and removal to ensure a smooth transition for users. Versions between deprecation and removal of plugins, plugin options or option values, Telegraf must log a *warning* on startup including information about the version introducing the deprecation, the version of removal and an user-facing hint on suitable replacements. In this phase Telegraf should operate normally even with deprecated plugins, plugin options or option values being set in the configuration files. Starting from the removal version, Telegraf must show an *error* message for deprecated plugins present in the configuration including all information listed above. Removed plugin options and option values should be handled as invalid settings in the configuration files and must lead to an error. In this phase, Telegraf should *stop running* until all deprecated plugins, plugin options and option values are removed from the configuration files. ## Deprecation Process The deprecation process comprises the following the steps below. ### File issue In the filed issue you should outline which plugin, plugin option or feature you want to deprecate and *why*! Determine in which version the plugin should be removed. Try to reach an agreement in the issue before continuing and get a sign off from the maintainers! ### Submit deprecation pull-request Send a pull request adding deprecation information to the code and update the plugin's `README.md` file. Depending on what you want to deprecate this comprises different locations and steps as detailed below. Once the deprecation pull-request is merged and Telegraf is released, we have to wait for the targeted Telegraf version for actually removing the code. #### Deprecating a plugin When deprecating a plugin you need to add an entry to the `deprecation.go` file in the respective plugin category with the following format ```golang "": { Since: "", RemovalIn: "", Notice: "", }, ``` If you for example want to remove the `inputs.logparser` plugin you should add ```golang "logparser": { Since: "1.15.0", RemovalIn: "1.40.0" Notice: "use 'inputs.tail' with 'grok' data format instead", }, ``` to `plugins/inputs/deprecations.go`. By doing this, Telegraf will show a deprecation warning to the user starting from version `1.15.0` including the `Notice` you provided. The plugin can then be remove in version `1.40.0`. Additionally, you should update the plugin's `README.md` adding a paragraph mentioning since when the plugin is deprecated, when it will be removed and a hint to alternatives or replacements. The paragraph should look like this ```text **Deprecated in version v1.15.0 and scheduled for removal in v1.40.0**: Please use the [tail][] plugin with the [`grok` data format][grok parser] instead! ``` #### Deprecating an option To deprecate a plugin option, remove the option from the `sample.conf` file and add the deprecation information to the structure field in the code. If you for for example want to deprecate the `ssl_enabled` option in `inputs.example` you should add ```golang type Example struct { ... SSLEnabled bool `toml:"ssl_enabled" deprecated:"1.3.0;1.40.0;use 'tls_*' options instead"` } ``` to schedule the setting for removal in version `1.40.0`. The last element of the `deprecated` tag is a user-facing notice similar to plugin deprecation. #### Deprecating an option-value Sometimes, certain option values become deprecated or superseded by other options or values. To deprecate those option values, remove them from `sample.conf` and add the deprecation info in the code if the deprecated value is *actually used* via ```golang func (e *Example) Init() error { ... if e.Mode == "old" { models.PrintOptionDeprecationNotice(telegraf.Warn, "inputs.example", "mode", telegraf.DeprecationInfo{ Since: "1.23.1", RemovalIn: "1.40.0", Notice: "use 'v1' instead", }) } ... return nil } ``` This will show a warning if the deprecated `v1` value is used for the `mode` setting in `inputs.example` with a user-facing notice. ### Submit pull-request for removing code Once the plugin, plugin option or option-value is deprecated, we have to wait for the `RemovedIn` release to remove the code. In the examples above, this would be version `1.40.0`. After all scheduled bugfix-releases are done, with `1.40.0` being the next release, you can create a pull-request to actually remove the deprecated code. Please make sure, you remove the plugin, plugin option or option value and the code referencing those. This might also comprise the `all` files of your plugin category, test-cases including those of other plugins, README files or other documentation. For removed plugins, please keep the deprecation info in `deprecations.go` so users can find a reference when switching from a really old version. Make sure you add an `Important Changes` sections to the `CHANGELOG.md` file describing the removal with a reference to your PR. ================================================ FILE: docs/specs/tsd-002-custom-builder.md ================================================ # Telegraf Custom-Builder ## Objective Provide a tool to build a customized, smaller version of Telegraf with only the required plugins included. ## Keywords tool, binary size, customization ## Overview The Telegraf binary continues to grow as new plugins and features are added and dependencies are updated. Users running on resource constrained systems such as embedded-systems or inside containers might suffer from the growth. This document specifies a tool to build a smaller Telegraf binary tailored to the plugins configured and actually used, removing unnecessary and unused plugins. The implementation should be able to cope with configured parsers and serializers including defaults for those plugin categories. Valid Telegraf configuration files, including directories containing such files, are the input to the customization process. The customization tool might not be available for older versions of Telegraf. Furthermore, the degree of customization and thus the effective size reduction might vary across versions. The tool must create a single static Telegraf binary. Distribution packages or containers are *not* targeted. ## Prior art [PR #5809](https://github.com/influxdata/telegraf/pull/5809) and [telegraf-lite-builder](https://github.com/influxdata/telegraf/tree/telegraf-lite-builder/cmd/telegraf-lite-builder): - Uses docker - Uses browser: - Generates a webpage to pick what options you want. User chooses plugins; does not take a config file - Build a binary, then minifies by stripping and compressing that binary - Does some steps that belong in makefile, not builder - Special case for upx - Makes gzip, zip, tar.gz - Uses gopkg.in? - Can also work from the command line [PR #8519](https://github.com/influxdata/telegraf/pull/8519) - User chooses plugins OR provides a config file [powers/telegraf-build](https://github.com/powersj/telegraf-build) - User chooses plugins OR provides a config file - Currently kept in separate repo - Undoes changes to all.go files [rawkode/bring-your-own-telegraf](https://github.com/rawkode/bring-your-own-telegraf) - Uses docker ## Additional information You might be able to further reduce the binary size of Telegraf by removing debugging information. This is done by adding `-w` and `-s` to the linker flags before building `LDFLAGS="-w -s"`. However, please note that this removes information helpful for debugging issues in Telegraf. Additionally, you can use a binary packer such as [UPX](https://upx.github.io/) to reduce the required *disk* space. This compresses the binary and decompresses it again at runtime. However, this does not reduce memory footprint at runtime. ================================================ FILE: docs/specs/tsd-003-state-persistence.md ================================================ # Plugin State-Persistence ## Objective Retain the state of stateful plugins across restarts of Telegraf. ## Keywords framework, plugin, stateful, persistence ## Overview Telegraf contains a number of plugins that hold an internal state while processing. For some of the plugins this state is important for efficient processing like the location when reading a large file or when continuously querying data from a stateful peer requiring for example an offset or the last queried timestamp. For those plugins it is important to persistent their internal state over restarts of Telegraf. It is intended to - allow for opt-in of plugins to store a state per plugin _instance_ - restore the state for each plugin instances at startup - track the plugin instances over restarts to relate the stored state with a corresponding plugin instance - automatically compute plugin instance IDs based on the plugin configuration - provide a way to manually specify instance IDs by the user - _not_ restore states if the plugin configuration changed between runs - make implementation easy for plugin developers - make no assumption on the state _content_ The persistence will use the following steps: - Compute an unique ID for each of the plugin _instances_ - Startup Telegraf plugins calling `Init()`, etc. - Initialize persistence framework with the user specified `statefile` location and load the state if present - Determine all stateful plugin instances by fulfilling the `StatefulPlugin` interface - Restore plugin states (if any) for each plugin ID present in the state-file - Run data-collection etc... - On shutdown, stopping all Telegraf plugins calling `Stop()` or `Close()` depending on the plugin type - Query the state of all registered stateful plugins state - Create an overall state-map with the plugin instance ID as a key and the serialized plugin state as value. - Marshal the overall state-map and store to disk Potential users of this functionality are plugins continuously querying endpoints with information of a previous query (e.g. timestamps, offsets, transaction tokens, etc.) The following plugins are known to have an internal state. This is not a comprehensive list. - `inputs.win_eventlog` ([PR #8281](https://github.com/influxdata/telegraf/pull/8281)) - `inputs.docker_log` ([PR #7749](https://github.com/influxdata/telegraf/pull/7749)) - `inputs.tail` (file offset) - `inputs.cloudwatch` (`windowStart`/`windowEnd` parameters) - `inputs.stackdriver` (`prevEnd` parameter) ### Plugin ID computation The plugin ID is computed based on the configuration options specified for the plugin instance. To generate the ID all settings are extracted as `string` key-value pairs with the option name being the key and the value being the configuration option setting. For nested configuration options, e.g. if the plugins has a sub-table, the options are flattened with a canonical key. The canonical key elements must be concatenated with a dot (`.`) separator. In case the sub-element is a list of tables, the key must include the index of each table prefixed by a hash sign i.e. `#.`. The resulting key-value pairs of configuration options are then sorted by the key in lexical order to make the resulting ID invariant against changes in the order of configuration options. The key and the value of each pair are joined by a colon (`:`) to a single `string`. Finally, a SHA256 sum is computed across all key-value strings separated by a `null` byte. The HEX representation of the resulting SHA256 is used as the plugin instance ID. ### State serialization format The overall Telegraf state maps the plugin IDs (keys) to the serialized state of the corresponding plugin (values). The state data returned by stateful plugins is serialized to JSON. The resulting byte-sequence is used as the value for the overall state. On-disk, the overall state of Telegraf is stored as JSON. To restore the state of a plugin, the overall Telegraf state is first deserialized from the on-disk JSON data and a lookup for the plugin ID is performed in the resulting map. The value, if found, is then deserialized to the plugin's state data-structure and provided to the plugin after calling `Init()`. ## Is / Is-not ### Is - A framework to persist states over restarts of Telegraf - A simple local state store - A way to restore plugin states between restarts without configuration changes - A unified API for plugins to use when requiring persistence of a state ### Is-Not - A remote storage framework - A way to store anything beyond fundamental plugin states - A data-store or database - A way to reassign plugin states if their configuration changes - A tool to interactively adding/removing/modifying states of plugins - A persistence guarantee beyond clean shutdown (i.e. no crash resistance) ## Prior art - [PR #8281](https://github.com/influxdata/telegraf/pull/8281): Stores Windows event-log bookmarks in the registry - [PR #7749](https://github.com/influxdata/telegraf/pull/7749): Stores container ID and log offset to a file at a user-provided path - [PR #7537](https://github.com/influxdata/telegraf/pull/7537): Provides a global state object and periodically queries plugin states to store the state object to a JSON file. This approach does not provide a ID per plugin _instance_ so it seems like there is only a single state for a plugin _type_ - [PR #9476](https://github.com/influxdata/telegraf/pull/9476): Register stateful plugins to persister and automatically assigns an ID to plugin _instances_ based on the configuration. The approach also allows to overwrite the automatic ID e.g. with user specified data. It uses the plugin instance ID to store/restore state to the same plugin instance and queries the plugin state on shutdown and write file (currently JSON). ================================================ FILE: docs/specs/tsd-004-configuration-migration.md ================================================ # Configuration Migration ## Objective Provides a subcommand and framework to migrate configurations containing deprecated settings to a corresponding recent configuration. ## Keywords configuration, deprecation, telegraf command ## Overview With the deprecation framework of [TSD-001](tsd-001-deprecation.md) implemented we see more and more plugins and options being scheduled for removal in the future. Furthermore, deprecations become visible to the user due to the warnings issued for removed plugins, plugin options and plugin option values. To aid the user in mitigating deprecated configuration settings this specifications proposes the implementation of a `migrate` sub-command to the Telegraf `config` command for automatically migrate the user's existing configuration files away from the deprecated settings to an equivalent, recent configuration. Furthermore, the specification describes the layout and functionality of a plugin-based migration framework to implement migrations. ### `migrate` sub-command The `migrate` sub-command of the `config` command should take a set of configuration files and configuration directories and apply available migrations to deprecated plugins, plugin options or plugin option-values in order to generate new configuration files that do not make use of deprecated options. In the process, the migration procedure must ensure that only plugins with applicable migrations are modified. Existing configuration must be kept and not be overwritten without manual confirmation of the user. This should be accomplished by storing modified configuration files with a `.migrated` suffix and leaving it to the user to overwrite the existing configuration with the generated counterparts. If no migration is applied in a configuration file, the command might not generate a new file and leave the original file untouched. During migration, the configuration, plugin behavior, resulting metrics and comments should be kept on a best-effort basis. Telegraf must inform the user about applied migrations and potential changes in the plugin behavior or resulting metrics. If a plugin cannot be automatically migrated but requires manual intervention, Telegraf should inform the user. ### Migration implementations To implement migrations for deprecated plugins, plugin option or plugin option values, Telegraf must provide a plugin-based infrastructure to register and apply implemented migrations based on the plugin-type. Only one migration per plugin-type must be registered. Developers must implement the required interfaces and register the migration to the mentioned framework. The developer must provide the possibility to exclude the migration at build-time according to [TSD-002](tsd-002-custom-builder.md). Existing migrations can be extended but must be cumulative such that any previous configuration migration functionality is kept. Resulting configurations should generate metrics equivalent to the previous setup also making use of metric selection, renaming and filtering mechanisms. In cases this is not possible, there must be a clear information to the user what to expect and which differences might occur. A migration can only be informative, i.e. notify the user that a plugin has to manually be migrated and should point users to additional information. Deprecated plugins and plugin options must be removed from the migrated configuration. ================================================ FILE: docs/specs/tsd-005-output-buffer-strategy.md ================================================ # Telegraf Output Buffer Strategy ## Objective Introduce a new agent-level config option to choose a disk buffer strategy for output plugin metric queues. ## Overview Currently, when a Telegraf output metric queue fills, either due to incoming metrics being too fast or various issues with writing to the output, oldest metrics are overwritten and never written to the output. This specification defines a set of options to make this output queue more durable by persisting pending metrics to disk rather than only an in-memory limited size queue. ## Keywords output plugins, agent configuration, persist to disk ## Agent Configuration The configuration is at the agent-level, with options for: - **Memory**, the current implementation, with no persistence to disk - **Disk-write-through**, all metrics are also written to disk using a Write Ahead Log (WAL) file - **Disk-overflow**, when the memory buffer fills, metrics are flushed to a WAL file to avoid dropping overflow metrics As well as an option to specify a directory to store the WAL files on disk, with a default value. These configurations are global, and no change means memory only mode, retaining current behavior. ## Metric Ordering and Tracking Tracking metrics will be accepted on a successful write to the output destination. Metrics will be written to their appropriate output in the order they are received in the buffer regardless of which buffer strategy is chosen. ## Disk Utilization and File Handling Each output plugin has its own in-memory output buffer, and therefore will each have their own WAL file for buffer persistence. This file may not exist if Telegraf is successfully able to write all of its metrics without filling the in-memory buffer in disk-overflow mode, or not at all in memory mode. Telegraf should use one file per output plugin, and remove entries from the WAL file as they are written to the output. Telegraf will not make any attempt to limit the size on disk taken by these files beyond cleaning up WAL files for metrics that have successfully been flushed to their output destination. It is the user's responsibility to ensure these files do not entirely fill the disk, both during Telegraf uptime and with lingering files from previous instances of the program. If WAL files exist for an output plugin from previous instances of Telegraf, they will be picked up and flushed before any new metrics that are written to the output. This is to ensure that these metrics are not lost, and to ensure that output write order remains consistent. Telegraf must additionally provide a way to manually flush WAL files via some separate plugin or similar. This could be used as a way to ensure that WAL files are properly written in the event that the output plugin changes and the WAL file is unable to be detected by a new instance of Telegraf. This plugin should not be required for use to allow the buffer strategy to work. ## Is/Is-not - Is a way to prevent metrics from being dropped due to a full memory buffer - Is not a way to guarantee data safety in the event of a crash or system failure - Is not a way to manage file system allocation size, file space will be used until the disk is full ## Prior art [Initial issue](https://github.com/influxdata/telegraf/issues/802) [Loose specification issue](https://github.com/influxdata/telegraf/issues/14805) ================================================ FILE: docs/specs/tsd-006-startup-error-behavior.md ================================================ # Startup Error Behavior ## Objective Unified, configurable behavior on retriable startup errors. ## Keywords inputs, outputs, startup, error, retry ## Overview Many Telegraf plugins connect to an external service either on the same machine or via network. On automated startup of Telegraf (e.g. via service) there is no guarantee that those services are fully started yet, especially when they reside on a remote host. More and more plugins implement mechanisms to retry reaching their related service if they failed to do so on startup. This specification intends to unify the naming of configuration-options, the values of those options, and their semantic meaning. It describes the behavior for the different options on handling startup-errors. Startup errors are all errors occurring in calls to `Start()` for inputs and service-inputs or `Connect()` for outputs. The behaviors described below should only be applied in cases where the plugin *explicitly* states that an startup error is *retriable*. This includes for example network errors indicating that the host or service is not yet reachable or external resources, like a machine or file, which are not yet available, but might become available later. To indicate a retriable startup error the plugin should return a predefined error-type. In cases where the error cannot be generally determined be retriable by the plugin, the plugin might add configuration settings to let the user configure that property. For example, where an error code indicates a fatal, non-recoverable error in one case but a non-fatal, recoverable error in another case. ## Configuration Options and Behaviors Telegraf must introduce a unified `startup_error_behavior` configuration option for inputs and output plugins. The option is handled directly by the Telegraf agent and is not passed down to the plugins. The setting must be available on a per-plugin basis and defines how Telegraf behaves on startup errors. For all config option values Telegraf might retry to start the plugin for a limited number of times during the startup phase before actually processing data. This corresponds to the current behavior of Telegraf to retry three times with a fifteen second interval before continuing processing of the plugins. ### `error` behavior The `error` setting for the `startup_error_behavior` option causes Telegraf to fail and exit on startup errors. This must be the default behavior. ### `retry` behavior The `retry` setting for the `startup_error_behavior` option Telegraf must *not* fail on startup errors and should continue running. Telegraf must retry to startup the failed plugin in each gather or write cycle, for inputs or for outputs respectively, for an unlimited number of times. Neither the plugin's `Gather()` nor `Write()` method is called as long as the startup did not succeed. Metrics sent to an output plugin will be buffered until the plugin is actually started. If the metric-buffer limit is reached **metrics might be dropped**! In case a plugin signals a partially successful startup, e.g. a subset of the given endpoints are reachable, Telegraf must try to fully startup the remaining endpoints by calling `Start()` or `Connect()`, respectively, until full startup is reached **and** trigger the plugin's `Gather()` nor `Write()` methods. ### `ignore` behavior When using the `ignore` setting for the `startup_error_behavior` option Telegraf must *not* fail on startup errors and should continue running. On startup error, Telegraf must ignore the plugin as-if it was not configured at all, i.e. the plugin must be completely removed from processing. ### `probe` behavior When using the `probe` setting for the `startup_error_behavior` option Telegraf must *not* fail on startup errors and should continue running. On startup error, Telegraf must ignore the plugin as-if it was not configured at all, i.e. the plugin must be completely removed from processing, similar to the `ignore` behavior. Additionally, Telegraf must probe the plugin (as defined in [TSD-009][tsd_009]) after startup, if it implements the `ProbePlugin` interface. If probing is available *and* returns an error Telegraf must *ignore* the plugin as-if it was not configured at all. [tsd_009]: /docs/specs/tsd-009-probe-on-startup.md ## Plugin Requirements Plugins participating in handling startup errors must implement the `Start()` or `Connect()` method for inputs and outputs respectively. Those methods must be safe to be called multiple times during retries without leaking resources or causing issues in the service used. Furthermore, the `Close()` method of the plugins must be safe to be called for cases where the startup failed without causing panics. The plugins should return a `nil` error during startup to indicate a successful startup or a retriable error (via predefined error type) to enable the defined startup error behaviors. A non-retriable error (via predefined error type) or a generic error will bypass the startup error behaviors and Telegraf must fail and exit in the startup phase. ## Related Issues - [#8586](https://github.com/influxdata/telegraf/issues/8586) `inputs.postgresql` - [#9778](https://github.com/influxdata/telegraf/issues/9778) `outputs.kafka` - [#13278](https://github.com/influxdata/telegraf/issues/13278) `outputs.cratedb` - [#13746](https://github.com/influxdata/telegraf/issues/13746) `inputs.amqp_consumer` - [#14365](https://github.com/influxdata/telegraf/issues/14365) `outputs.postgresql` - [#14603](https://github.com/influxdata/telegraf/issues/14603) `inputs.nvidia-smi` - [#14603](https://github.com/influxdata/telegraf/issues/14603) `inputs.rocm-smi` ================================================ FILE: docs/specs/tsd-007-url-config-behavior.md ================================================ # URL-Based Config Behavior ## Objective Define the retry and reload behavior of remote URLs that are passed as config to Telegraf. In terms of retry, currently Telegraf will attempt to load a remote URL three times and then exit. In terms of reload, Telegraf does not have the capability to reload remote URL based configs. This spec seeks to allow for options for the user to further these capabilities. ## Keywords config, error, retry, reload ## Overview Telegraf allows for loading configurations from local files, directories, and files via a URL. In order to allow situations where a configuration file is not yet available or due to a flaky network, the first proposal is to introduce a new CLI flag: `--url-config-retry-attempts`. This flag would continue to default to three and would specify the number of retries to attempt to get a remote URL during the initial startup of Telegraf. ```sh --config-url-retry-attempts=3 Number of times to attempt to obtain a remote configuration via a URL during startup. Set to -1 for unlimited attempts. ``` These attempts would block Telegraf from starting up completely until success or until we have run out of attempts and exit. Once Telegraf is up and running, users can use the `--watch` flag to enable watching local files for changes and if/when changes are made, then reload Telegraf with the new configuration. For remote URLs, I propose a new CLI flag: `--url-config-check-interval`. This flag would set an internal timer that when it goes off, would check for an update to a remote URL file. ```sh --config-url-watch-interval=0s Time duration to check for updates to URL based configuration files. Disabled by default. ``` At each interval, Telegraf would send an HTTP HEAD request to the configuration URL, here is an example curl HEAD request and output: ```sh $ curl --head http://localhost:8000/config.toml HTTP/1.0 200 OK Server: SimpleHTTP/0.6 Python/3.12.3 Date: Mon, 29 Apr 2024 18:18:56 GMT Content-type: application/octet-stream Content-Length: 1336 Last-Modified: Mon, 29 Apr 2024 11:44:19 GMT ``` The proposal then is to store the last-modified value when we first obtain the file and compare the value at each interval. No need to parse the value, just store the raw string. If there is a difference, trigger a reload. If anything other than 2xx response code is returned from the HEAD request, Telegraf would print a warning message and retry at the next interval. Telegraf will continue to run the existing configuration with no change. If the value of last-modified is empty, while very unlikely, then Telegraf would ignore this configuration file. Telegraf will print a warning message once about the missing field. ## Relevant Issues * Configuration capabilities to retry for loading config via URL #[8854][] * Telegraf reloads URL-based/remote config on a specified interval #[8730][] [8854]: https://github.com/influxdata/telegraf/issues/8854 [8730]: https://github.com/influxdata/telegraf/issues/8730 ================================================ FILE: docs/specs/tsd-008-partial-write-error-handling.md ================================================ # Partial write error handling ## Objective Provide a way to pass information about partial metric write errors from an output to the output model. ## Keywords output plugins, write, error, output model, metric, buffer ## Overview The output model wrapping each output plugin buffers metrics to be able to batch those metrics for more efficient sending. In each flush cycle, the model collects a batch of metrics and hands it over to the output plugin for writing through the `Write` method. Currently, if writing succeeds (i.e. no error is returned), _all metrics of the batch_ are removed from the buffer and are marked as __accepted__ both in terms of statistics as well as in tracking-metric terms. If writing fails (i.e. any error is returned), _all metrics of the batch_ are __kept__ in the buffer for requeueing them in the next write cycle. Issues arise when an output plugin cannot write all metrics of a batch bit only some to its service endpoint, e.g. due to the metrics being serializable or if metrics are selectively rejected by the service on the server side. This might happen when reaching submission limits, violating service constraints e.g. by out-of-order sends, or due to invalid characters in the serialited metric. In those cases, an output currently is only able to accept or reject the _complete batch of metrics_ as there is no mechanism to inform the model (and in turn the buffer) that only _some_ of the metrics in the batch were failing. As a consequence, outputs often _accept_ the batch to avoid a requeueing of the failing metrics for the next flush interval. This distorts statistics of accepted metrics and causes misleading log messages saying all metrics were written sucessfully which is not true. Even worse, for outputs ending-up with partial writes, e.g. only the first half of the metrics can be written to the service, there is no way of telling the model to selectively accept the actually written metrics and in turn those outputs must internally buffer the remaining, unwritten metrics leading to a duplication of buffering logic and adding to code complexity. This specification aims at defining the handling of partially successful writes and introduces the concept of a special _partial write error_ type to reflect partial writes and partial serialization overcoming the aforementioned issues and limitations. To do so, the _partial write error_ error type must contain a list of successfully written metrics, to be marked __accepted__, both in terms of statistics as well as in terms of metric tracking, and must be removed from the buffer. Furthermore, the error must contain a list of metrics that cannot be sent or serialized and cannot be retried. These metrics must be marked as __rejected__, both in terms of statistics as well as in terms of metric tracking, and must be removed from the buffer. The error may contain a list of metrics not-yet written to be __kept__ for the next write cylce. Those metrics must not be marked and must be kept in the buffer. If the error does not contain the list of not-yet written metrics, this list must be inferred using the accept and reject lists mentioned above. To allow the model and the buffer to correctly handle tracking metrics ending up in the buffer and output the tracking information must be preserved during communication between the output plugin, the model and the buffer through the specified error. To do so, all metric lists should be communicated as indices into the batch to be able to handle tracking metrics correctly. For backward compatibility and simplicity output plugins can return a `nil` error to indicate that __all__ metrics of the batch are __accepted__. Similarly, returing an error _not_ being a _partial write error_ indicates that __all__ metrics of the batch should be __kept__ in the buffer for the next write cycle. ## Related Issues - [issue #11942](https://github.com/influxdata/telegraf/issues/11942) for contradicting log messages - [issue #14802](https://github.com/influxdata/telegraf/issues/14802) for rate-limiting multiple batch sends - [issue #15908](https://github.com/influxdata/telegraf/issues/15908) for infinite loop if single metrics cannot be written ================================================ FILE: docs/specs/tsd-009-probe-on-startup.md ================================================ # Probing plugins after startup ## Objective Allow Telegraf to probe plugins during startup to enable enhanced plugin error detection like availability of hardware or services ## Keywords inputs, outputs, startup, probe, error, ignore, behavior ## Overview When plugins are first instantiated, Telegraf will call the plugin's `Start()` method (for inputs) or `Connect()` (for outputs) which will initialize its configuration based off of config options and the running environment. It is sometimes the case that while the initialization step succeeds, the upstream service in which the plugin relies on is not actually running, or is not capable of being communicated with due to incorrect configuration or environmental problems. In situations like this, Telegraf does not detect that the plugin's upstream service is not functioning properly, and thus it will continually call the plugin during each `Gather()` iteration. This often has the effect of polluting journald and system logs with voluminous error messages, which creates issues for system administrators who rely on such logs to identify other unrelated system problems. More background discussion on this option, including other possible avenues, can be viewed in the [related issue][issue_16028]. [issue_16028]: https://github.com/influxdata/telegraf/issues/16028 ## Probing Probing is an action whereby the plugin should ensure that the plugin will be fully functional on a best effort basis. This may comprise communicating with its external service, trying to access required devices, entities or executables etc to ensure that the plugin will not produce errors during e.g. data collection or data output. Probing must *not* produce, process or output any metrics. Plugins that support probing must implement the `ProbePlugin` interface. Such plugins must behave in the following manner: 1. Return an error if the external dependencies (hardware, services, executables, etc.) of the plugin are not available. 2. Return an error if information cannot be gathered (in the case of inputs) or sent (in the case of outputs) due to unrecoverable issues. For example, invalid authentication, missing permissions, or non-existent endpoints. 3. Otherwise, return `nil` indicating the plugin will be fully functional. ## Plugin Requirements Plugins that allow probing must implement the `ProbePlugin` interface. The exact implementation depends on the plugin's functionality and requirements, but generally it should take the same actions as it would during normal operation e.g. calling `Gather()` or `Write()` and check if errors occur. If probing fails, it must be safe to call the plugin's `Close()` method. Input plugins must *not* produce metrics, output plugins must *not* send any metrics to the service. Plugins must *not* influence the later data processing or collection by modifying the internal state of the plugin or the external state of the service or hardware. For example, file-offsets or other service states must be reset to not lose data during the first gather or write cycle. Plugins must return `nil` upon successful probing or an error otherwise. ## Related Issues - [#16028](https://github.com/influxdata/telegraf/issues/16028) - [#15916](https://github.com/influxdata/telegraf/pull/15916) - [#16001](https://github.com/influxdata/telegraf/pull/16001) ================================================ FILE: docs/specs/tsd-010-labels-and-selectors.md ================================================ # Labels and Selectors for Plugin Enablement ## Objective Introduce a label and selector system to enable or disable plugins dynamically in Telegraf. ## Keywords configuration, dynamic plugin selection ## Overview Currently, managing plugin configurations across multiple Telegraf instances is cumbersome. Methods like commenting out plugins or renaming configuration files are not scalable. A label and selector system provides a more flexible and elegant solution. This feature aims to simplify plugin management in Telegraf by introducing a label and selector system inspired by [Kubernetes][k8s_labels]. Selectors are key-value pairs provided at runtime, and labels are defined in plugin configurations to match against these selectors. This approach allows to enable a plugin dynamically at startup-time, making it easier to manage configurations in large-scale deployments where a single configuration is fetched from a centralized configuration-source. [k8s_labels]: https://kubernetes.io/docs/concepts/overview/working-with-objects/labels ## Command line flags The Telegraf executable must accept one or more optional `--select` command-line flags. The passed value must be of the form: ```text =[;=] ``` The `key` part must be non-empty and must not contain any wildcard characters but only contain alpha-numerical values (`[A-Za-z0-9]`), dots (`.`), dashes (`-`) or underscores (`_`). The `value` part must be non-empty and might contain the wildcard characters asterix (`*`) for matching any number of characters or question mark (`?`) for matching a single character. Furthermore, the value may contain alpha-numerical values (`[A-Za-z0-9]`), dots (`.`), dashes (`-`) or underscores (`_`). The `key` and `value` parts of a selector are separated by an equal sign (`=`). Multiple key-value pairs in a single selector are separated by semicolons. For example, users can start the telegraf instance with the following command line: ```console telegraf --config config.conf --config-directory directory/ --select="app=payments;region=us-*" --select="env=prod" --watch-config --print-plugin-config-source=true ``` Specifying the same `key` multiple times within a single `--select` statement causes an error at Telegraf startup. However, the same `key` can be used in _different_ `--select` statements. ## Plugin Labels Telegraf must implement a new optional `labels` configuration setting. This setting must be available in all input, output, aggregator and processor plugins. The `labels` configuration setting must accept a map where each entry is a single key-value pair. The `key` part must be non-empty and must not contain any wildcard characters but only alpha-numerical values (`[A-Za-z0-9]`), dots (`.`), dashes (`-`) or underscores (`_`). The `value` part must be non-empty and must not contain any wildcard characters but only alpha-numerical values (`[A-Za-z0-9]`), dots (`.`), dashes (`-`) or underscores (`_`). ```toml [[inputs.cpu]] [inputs.cpu.labels] app = "payments" region = "us-east" env = "prod" ``` Telegraf must provide the setting without changes to existing or new plugins. > [!NOTE] > Due to limitations in the TOML format, maps must be defined _after_ top-level > plugin-settings e.g. at the end of the plugin configuration! ## Selection matching Telegraf must match command-line selectors against the plugin labels to determine if a plugin should be enabled. The matching behavior is as follows: Multiple `--select` command-line parameters are treated as a logical **OR** condition. If any select statement matches, the plugin will be enabled. Within each `--select` command-line parameter, multiple key-value pairs, separated by a semicolon, are treated as a logical **AND** condition. All conditions within that select statement must match for a plugin to be selected. Selectors support exact matching as well as wildcard matching using `*` (multiple characters) and `?` (single character) in the selector values. The key part does not support wildcards. ### Behavior Matrix | **Telegraf Run State** | **Label Present** | **Behavior** | | ---------------------- | ----------------- | ------------------------------------------------------------------------------------ | | With `--select` | Yes | Plugin is selected if the selector matches the label. Otherwise, it is not selected. | | With `--select` | No | Plugin is selected (backward compatibility). | | Without `--select` | Yes | Plugin is selected (no selector to compare against). | | Without `--select` | No | Plugin is selected (current behavior). | ### Matching Examples | CLI Selectors (`--select`) | Plugin Labels | Matching Behavior | Result | | ---------------------------------------------------- | ----------------------------------------- | ------------------------------------------------------------------------------------------------------------------------ | -------- | | `app=web` | `app="web"` | Selector requires `app=web`; plugin label has `app=web`, so it matches | Selected | | `app=web` | `app="api"` | Selector requires `app=web`, but plugin has `app=api`; no match | Skipped | | `app=web` | `app="web", region="us-east"` | Selector only cares about `app=web`, which is present; extra labels are ignored | Selected | | `app=web,region=us-east` | `app="web", region="us-east"` | Selector requires both `app=web` and `region=us-east`; both are present | Selected | | `app=web,region=us-west` | `app="web", region="us-east"` | Selector requires `region=us-west`, but plugin has `region=us-east`; mismatch | Skipped | | `env=prod*` | `env="production"` | Selector wants `env` starting with `prod`; `production` matches the wildcard | Selected | | `env=prod*` | `env="staging"` | Selector wants `env` starting with `prod`, but `staging` doesn't match | Skipped | | `env=*` | `env="qa"` | Wildcard `*` matches any value of `env`; `qa` satisfies it | Selected | | `app=web,env=prod`, `region=eu-*` | `app="web", env="prod"` | First selector requires `app=web` AND `env=prod`; both are present, second selector is ignored | Selected | | `app=web,env=prod`, `region=eu-*` | `app="web", env="staging", region="us"` | First selector fails due to `env=staging`; second selector fails due to `region=us`; no match | Skipped | | `env=prod`, `env=staging` | `env="prod"` | At least one selector (`env=prod`) matches label exactly | Selected | | `env=prod`, `env=staging` | `env="qa"` | Neither `env=prod` nor `env=staging` match `env=qa` | Skipped | | `app=web,env=prod`, `app=api,env=prod` | `app="api", env="prod"` | Second selector requires `app=api` AND `env=prod`; both are present in plugin labels | Selected | | `app=web,env=test*,region=eu-west`, `app=*,env=test` | `app="web", env="test"` | First selector requires `app=web` AND `env=test*` AND `region=eu-west`, but `region` is missing; second selector matches | Selected | ## Related Issues - [issue #1317](https://github.com/influxdata/telegraf/issues/1317) for allowing to enable/disable plugin instances - [issue #9304](https://github.com/influxdata/telegraf/issues/9304) for partially enabling a config file - [issue #10543](https://github.com/influxdata/telegraf/issues/10543) for allowing to enable/disable plugin instances ================================================ FILE: docs/specs/tsd-011-internal-plugin-statistics.md ================================================ # Internal plugin statistics collection ## Objective Provide a way to report plugin-internal statistics for collection by the [`internal` input plugin][internal]. [internal]: /plugins/inputs/internal/README.md ## Keywords plugins, statistics ## Overview The [`internal` input plugin][internal] allows to collect statistics about active plugins in Telegraf. These statistics are valuable indicators for operating and optimizing Telegraf setups and for detecting issues. Statistics are provided by plugin models and are then gathered by the [`internal` input plugin][internal] to be emitted through the normal plugin pipeline. However, not all important statistics are known on the model level. Some are only known within the plugin instance itself such as the bytes written to an output or certain error types. Emitting those statistics through direct registration of a statistics object will not pick-up tags defined using the global tags settings or aliases which are only known at the model level. To overcome the mentioned limitation this specification defines a framework allowing to inject a _statistics collector_ object into the plugin allowing to register statistics including the `alias` and tags definitions. To provide plugin-internal statistics a plugin should export a `Statistics` member in the plugin structure. This member must be a pointer type `*selfstat.Collector`. It is strongly recommended to define a `"-"` TOML tag in order to avoid collisions with setting the member through user configuration. The Telegraf model code then must inject a `selfstat.Collector` instance into the plugin's `Statistics` member _after_ instantiating the plugin but _before_ calling the plugin's `Init` function. The injected collector instance must add all relevant model-level information such as an optional `alias` setting or `tags` settings. The plugin must use the collector as proxy to register, unregister, reset and access statistics. ## Related Issues - [issue #4889](https://github.com/influxdata/telegraf/issues/4889) for emitting internal statistics for the InfluxDB output plugin - [issue #6965](https://github.com/influxdata/telegraf/issues/6965) for emitting internal statistics of the Kafka output plugin - [issue #17275](https://github.com/influxdata/telegraf/issues/17275) for emitting internal statistics for the InfluxDB v2 output plugin ================================================ FILE: etc/logrotate.d/telegraf ================================================ /var/log/telegraf/telegraf.log { rotate 6 daily missingok dateext copytruncate notifempty compress } ================================================ FILE: filter/filter.go ================================================ package filter import ( "strings" "github.com/gobwas/glob" ) type Filter interface { Match(string) bool } // Compile takes a list of string filters and returns a Filter interface // for matching a given string against the filter list. The filter list // supports glob matching with separators too, ie: // // f, err := Compile([]string{"cpu", "mem", "net*"}) // f.Match("cpu") // true // f.Match("network") // true // f.Match("memory") // false // // separators are only to be used for globbing filters, ie: // // f, err := Compile([]string{"cpu.*.count"}, '.') // f.Match("cpu.count") // false // f.Match("cpu.measurement.count") // true // f.Match("cpu.field.measurement.count") // false // // Compile will return nil if the filter list is empty. func Compile(filters []string, separators ...rune) (Filter, error) { // return if there is nothing to compile if len(filters) == 0 { return nil, nil } // check if we can compile a non-glob filter wildcards := len(separators) != 0 for _, filter := range filters { if strings.ContainsAny(filter, "*?[") { wildcards = true break } } switch { case !wildcards && len(filters) == 1: return &filterSingle{s: filters[0]}, nil case !wildcards && len(filters) != 1: return newFilterNoGlob(filters), nil case wildcards && len(filters) == 1: return glob.Compile(filters[0], separators...) default: return newFilterGlobMultiple(filters, separators...) } } func MustCompile(filters []string, separators ...rune) Filter { f, err := Compile(filters, separators...) if err != nil { panic(err) } return f } type IncludeExcludeFilter struct { include Filter exclude Filter includeDefault bool excludeDefault bool } func NewIncludeExcludeFilter(include, exclude []string) (Filter, error) { return NewIncludeExcludeFilterDefaults(include, exclude, true, false) } func NewIncludeExcludeFilterDefaults(include, exclude []string, includeDefault, excludeDefault bool) (Filter, error) { in, err := Compile(include) if err != nil { return nil, err } ex, err := Compile(exclude) if err != nil { return nil, err } return &IncludeExcludeFilter{in, ex, includeDefault, excludeDefault}, nil } func (f *IncludeExcludeFilter) Match(s string) bool { if f.include != nil { if !f.include.Match(s) { return false } } else if !f.includeDefault { return false } if f.exclude != nil { if f.exclude.Match(s) { return false } } else if f.excludeDefault { return false } return true } ================================================ FILE: filter/filter_test.go ================================================ package filter import ( "testing" "github.com/stretchr/testify/require" ) func TestCompile(t *testing.T) { f, err := Compile(nil) require.NoError(t, err) require.Nil(t, f) f, err = Compile([]string{"cpu"}) require.NoError(t, err) require.True(t, f.Match("cpu")) require.False(t, f.Match("cpu0")) require.False(t, f.Match("mem")) f, err = Compile([]string{"cpu*"}) require.NoError(t, err) require.True(t, f.Match("cpu")) require.True(t, f.Match("cpu0")) require.False(t, f.Match("mem")) f, err = Compile([]string{"cpu", "mem"}) require.NoError(t, err) require.True(t, f.Match("cpu")) require.False(t, f.Match("cpu0")) require.True(t, f.Match("mem")) f, err = Compile([]string{"cpu", "mem", "net*"}) require.NoError(t, err) require.True(t, f.Match("cpu")) require.False(t, f.Match("cpu0")) require.True(t, f.Match("mem")) require.True(t, f.Match("network")) f, err = Compile([]string{"cpu.*.count"}, '.') require.NoError(t, err) require.False(t, f.Match("cpu.count")) require.True(t, f.Match("cpu.measurement.count")) require.False(t, f.Match("cpu.field.measurement.count")) f, err = Compile([]string{"cpu.*.count"}, '.', ',') require.NoError(t, err) require.True(t, f.Match("cpu.measurement.count")) require.False(t, f.Match("cpu.,.count")) // ',' is not considered under * as it is specified as a separator require.False(t, f.Match("cpu.field,measurement.count")) } func TestMultiple(t *testing.T) { tests := []struct { name string pattern []string value string expected bool }{ { name: "issue 9265", pattern: []string{"*process32:*.exe:*.*", "otherWantedMetric*"}, value: "cpu.process32:testcase.exe:caserunner.2222", expected: true, }, { name: "issue 9265", pattern: []string{"*process32:*.exe:*.*", "otherWantedMetric*"}, value: "process32:testcase.exe:caserunner.2222", expected: true, }, { name: "issue 9265", pattern: []string{"*process32:*.exe:*.*", "otherWantedMetric*"}, value: "otherWantedMetric", expected: true, }, { name: "issue 9265", pattern: []string{"*process32:*.exe:*.*", "otherWantedMetric*"}, value: "otherWantedMetric.ABC", expected: true, }, { name: "issue 9265", pattern: []string{"*process32:*.exe:*.*", "otherWantedMetric*"}, value: "unwantedMetric", expected: false, }, } for _, tt := range tests { t.Run(tt.name+"-"+tt.value, func(t *testing.T) { f, err := Compile(tt.pattern) require.NoError(t, err) require.Equal(t, tt.expected, f.Match(tt.value)) }) } } func TestIncludeExclude(t *testing.T) { labels := []string{"best", "com_influxdata", "timeseries", "com_influxdata_telegraf", "ever"} tags := make([]string, 0, len(labels)) filter, err := NewIncludeExcludeFilter(nil, []string{"com_influx*"}) if err != nil { t.Fatalf("Failed to create include/exclude filter - %v", err) } for i := range labels { if filter.Match(labels[i]) { tags = append(tags, labels[i]) } } require.Equal(t, []string{"best", "timeseries", "ever"}, tags) } var benchbool bool func BenchmarkFilterSingleNoGlobFalse(b *testing.B) { f, err := Compile([]string{"cpu"}) require.NoError(b, err) var tmp bool for n := 0; n < b.N; n++ { tmp = f.Match("network") } benchbool = tmp } func BenchmarkFilterSingleNoGlobTrue(b *testing.B) { f, err := Compile([]string{"cpu"}) require.NoError(b, err) var tmp bool for n := 0; n < b.N; n++ { tmp = f.Match("cpu") } benchbool = tmp } func BenchmarkFilter(b *testing.B) { f, err := Compile([]string{"cpu", "mem", "net*"}) require.NoError(b, err) var tmp bool for n := 0; n < b.N; n++ { tmp = f.Match("network") } benchbool = tmp } func BenchmarkFilterNoGlob(b *testing.B) { f, err := Compile([]string{"cpu", "mem", "net"}) require.NoError(b, err) var tmp bool for n := 0; n < b.N; n++ { tmp = f.Match("net") } benchbool = tmp } func BenchmarkFilter2(b *testing.B) { f, err := Compile([]string{"aa", "bb", "c", "ad", "ar", "at", "aq", "aw", "az", "axxx", "ab", "cpu", "mem", "net*"}) require.NoError(b, err) var tmp bool for n := 0; n < b.N; n++ { tmp = f.Match("network") } benchbool = tmp } func BenchmarkFilter2NoGlob(b *testing.B) { f, err := Compile([]string{"aa", "bb", "c", "ad", "ar", "at", "aq", "aw", "az", "axxx", "ab", "cpu", "mem", "net"}) require.NoError(b, err) var tmp bool for n := 0; n < b.N; n++ { tmp = f.Match("net") } benchbool = tmp } ================================================ FILE: filter/implementations.go ================================================ package filter import "github.com/gobwas/glob" type filterSingle struct { s string } func (f *filterSingle) Match(s string) bool { return f.s == s } type filterNoGlob struct { m map[string]struct{} } func newFilterNoGlob(filters []string) Filter { out := filterNoGlob{m: make(map[string]struct{})} for _, filter := range filters { out.m[filter] = struct{}{} } return &out } func (f *filterNoGlob) Match(s string) bool { _, ok := f.m[s] return ok } type filterGlobMultiple struct { set []glob.Glob } func newFilterGlobMultiple(filters []string, separators ...rune) (Filter, error) { f := &filterGlobMultiple{set: make([]glob.Glob, 0, len(filters))} for _, pattern := range filters { g, err := glob.Compile(pattern, separators...) if err != nil { return nil, err } f.set = append(f.set, g) } return f, nil } func (f *filterGlobMultiple) Match(s string) bool { for _, g := range f.set { if g.Match(s) { return true } } return false } ================================================ FILE: go.mod ================================================ module github.com/influxdata/telegraf go 1.25.7 godebug x509negativeserial=1 require ( cloud.google.com/go/auth v0.18.2 cloud.google.com/go/bigquery v1.74.0 cloud.google.com/go/monitoring v1.24.3 cloud.google.com/go/pubsub/v2 v2.4.0 cloud.google.com/go/storage v1.61.3 collectd.org v0.6.0 github.com/99designs/keyring v1.2.2 github.com/Azure/azure-event-hubs-go/v3 v3.6.2 github.com/Azure/azure-kusto-go v0.16.1 github.com/Azure/azure-sdk-for-go/sdk/azcore v1.21.0 github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.13.1 github.com/Azure/azure-sdk-for-go/sdk/messaging/azeventhubs/v2 v2.0.2 github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/monitor/armmonitor v0.11.0 github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/resources/armresources v1.2.0 github.com/Azure/azure-sdk-for-go/sdk/storage/azqueue v1.0.1 github.com/Azure/go-autorest/autorest v0.11.30 github.com/Azure/go-autorest/autorest/adal v0.9.24 github.com/Azure/go-autorest/autorest/azure/auth v0.5.13 github.com/BurntSushi/toml v1.6.0 github.com/ClickHouse/clickhouse-go/v2 v2.43.0 github.com/DATA-DOG/go-sqlmock v1.5.2 github.com/IBM/nzgo/v12 v12.0.11 github.com/IBM/sarama v1.47.0 github.com/Masterminds/semver/v3 v3.4.0 github.com/Masterminds/sprig v2.22.0+incompatible github.com/Masterminds/sprig/v3 v3.3.0 github.com/Mellanox/rdmamap v1.1.0 github.com/PaesslerAG/gval v1.2.4 github.com/SAP/go-hdb v1.16.1 github.com/aerospike/aerospike-client-go/v5 v5.11.0 github.com/alecthomas/units v0.0.0-20240927000941-0f3dac36c52b github.com/alitto/pond v1.9.2 github.com/alitto/pond/v2 v2.7.0 github.com/aliyun/alibaba-cloud-sdk-go v1.63.107 github.com/amir/raidman v0.0.0-20170415203553-1ccc43bfb9c9 github.com/antchfx/jsonquery v1.3.6 github.com/antchfx/xmlquery v1.5.0 github.com/antchfx/xpath v1.3.6 github.com/apache/arrow-go/v18 v18.5.2 github.com/apache/inlong/inlong-sdk/dataproxy-sdk-twins/dataproxy-sdk-golang v1.0.7 github.com/apache/iotdb-client-go v1.3.5 github.com/apache/thrift v0.22.0 github.com/aristanetworks/goarista v0.0.0-20190325233358-a123909ec740 github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5 github.com/awnumar/memguard v0.23.0 github.com/aws/aws-msk-iam-sasl-signer-go v1.0.4 github.com/aws/aws-sdk-go-v2 v1.41.3 github.com/aws/aws-sdk-go-v2/config v1.32.11 github.com/aws/aws-sdk-go-v2/credentials v1.19.11 github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.19 github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.55.1 github.com/aws/aws-sdk-go-v2/service/cloudwatchlogs v1.64.0 github.com/aws/aws-sdk-go-v2/service/dynamodb v1.56.1 github.com/aws/aws-sdk-go-v2/service/ec2 v1.294.0 github.com/aws/aws-sdk-go-v2/service/kinesis v1.43.2 github.com/aws/aws-sdk-go-v2/service/sts v1.41.8 github.com/aws/aws-sdk-go-v2/service/timestreamwrite v1.35.18 github.com/aws/smithy-go v1.24.2 github.com/benbjohnson/clock v1.3.5 github.com/bluenviron/gomavlib/v3 v3.3.0 github.com/blues/jsonata-go v1.5.4 github.com/bmatcuk/doublestar/v3 v3.0.0 github.com/boschrexroth/ctrlx-datalayer-golang v1.3.1 github.com/bufbuild/protocompile v0.14.1 github.com/caio/go-tdigest v3.1.0+incompatible github.com/cisco-ie/nx-telemetry-proto v0.0.0-20230117155933-f64c045c77df github.com/clarify/clarify-go v0.4.1 github.com/cloudevents/sdk-go/v2 v2.16.2 github.com/compose-spec/compose-go v1.20.2 github.com/coocood/freecache v1.2.5 github.com/coreos/go-semver v0.3.1 github.com/coreos/go-systemd/v22 v22.7.0 github.com/couchbase/go-couchbase v0.1.1 github.com/datadope-io/go-zabbix/v2 v2.0.1 github.com/digitalocean/go-libvirt v0.0.0-20250417173424-a6a66ef779d6 github.com/dimchansky/utfbom v1.1.1 github.com/djherbis/times v1.6.0 github.com/docker/docker v28.5.2+incompatible github.com/docker/go-connections v0.6.0 github.com/dustin/go-humanize v1.0.1 github.com/dynatrace-oss/dynatrace-metric-utils-go v0.5.0 github.com/eclipse/paho.golang v0.23.0 github.com/eclipse/paho.mqtt.golang v1.5.1 github.com/emiago/sipgo v1.2.1 github.com/facebook/time v0.0.0-20250903103710-a5911c32cdb9 github.com/fatih/color v1.18.0 github.com/go-ldap/ldap/v3 v3.4.12 github.com/go-logfmt/logfmt v0.6.1 github.com/go-ole/go-ole v1.3.0 github.com/go-redis/redis/v7 v7.4.1 github.com/go-redis/redis/v8 v8.11.5 github.com/go-sql-driver/mysql v1.9.3 github.com/go-stomp/stomp v2.1.4+incompatible github.com/gobwas/glob v0.2.3 github.com/gofrs/uuid/v5 v5.4.0 github.com/gogo/protobuf v1.3.2 github.com/golang-jwt/jwt/v5 v5.3.1 github.com/golang/geo v0.0.0-20190916061304-5b978397cfec github.com/golang/snappy v1.0.0 github.com/google/cel-go v0.27.0 github.com/google/gnxi v0.0.0-20231026134436-d82d9936af15 github.com/google/go-cmp v0.7.0 github.com/google/go-github/v32 v32.1.0 github.com/google/licensecheck v0.3.1 github.com/google/uuid v1.6.0 github.com/gopacket/gopacket v1.5.0 github.com/gopcua/opcua v0.8.0 github.com/gophercloud/gophercloud/v2 v2.11.1 github.com/gorcon/rcon v1.4.0 github.com/gorilla/mux v1.8.1 github.com/gorilla/websocket v1.5.4-0.20250319132907-e064f32e3674 github.com/gosnmp/gosnmp v1.43.2 github.com/grid-x/modbus v0.0.0-20240503115206-582f2ab60a18 github.com/gwos/tcg/sdk v0.0.0-20240830123415-f8a34bba6358 github.com/hashicorp/consul/api v1.33.4 github.com/hashicorp/go-uuid v1.0.3 github.com/hashicorp/golang-lru/v2 v2.0.7 github.com/hashicorp/vault/api v1.22.0 github.com/hashicorp/vault/api/auth/approle v0.11.0 github.com/influxdata/influxdb-observability/common v0.5.12 github.com/influxdata/influxdb-observability/influx2otel v0.5.12 github.com/influxdata/influxdb-observability/otel2influx v0.5.12 github.com/influxdata/line-protocol/v2 v2.2.1 github.com/influxdata/tail v1.0.1-0.20241014115250-3e0015cb677a github.com/influxdata/toml v0.0.0-20251106153700-c381e153d076 github.com/intel/iaevents v1.1.0 github.com/intel/powertelemetry v1.0.2 github.com/jackc/pgconn v1.14.3 github.com/jackc/pgio v1.0.0 github.com/jackc/pgtype v1.14.4 github.com/jackc/pgx/v4 v4.18.3 github.com/jedib0t/go-pretty/v6 v6.7.8 github.com/jeremywohl/flatten/v2 v2.0.0-20211013061545-07e4a09fb8e4 github.com/jmespath/go-jmespath v0.4.0 github.com/karrick/godirwalk v1.16.2 github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51 github.com/klauspost/compress v1.18.4 github.com/klauspost/pgzip v1.2.6 github.com/kolo/xmlrpc v0.0.0-20220921171641-a4b6fa1dd06b github.com/leodido/go-syslog/v4 v4.3.0 github.com/likexian/whois v1.15.7 github.com/likexian/whois-parser v1.24.21 github.com/linkedin/goavro/v2 v2.15.0 github.com/logzio/azure-monitor-metrics-receiver v1.1.0 github.com/lxc/incus/v6 v6.22.0 github.com/mdlayher/apcupsd v0.0.0-20220319200143-473c7b5f3c6a github.com/mdlayher/vsock v1.2.1 github.com/microsoft/ApplicationInsights-Go v0.4.4 github.com/microsoft/go-mssqldb v1.9.8 github.com/miekg/dns v1.1.72 github.com/moby/ipvs v1.1.0 github.com/multiplay/go-ts3 v1.2.0 github.com/nats-io/nats-server/v2 v2.12.5 github.com/nats-io/nats.go v1.49.0 github.com/netsampler/goflow2/v2 v2.2.6 github.com/newrelic/newrelic-telemetry-sdk-go v0.8.1 github.com/nsqio/go-nsq v1.1.0 github.com/nwaples/tacplus v0.0.3 github.com/olivere/elastic v6.2.37+incompatible github.com/openconfig/gnmi v0.14.1 github.com/openconfig/goyang v1.6.3 github.com/opensearch-project/opensearch-go/v2 v2.3.0 github.com/opentracing/opentracing-go v1.2.1-0.20220228012449-10b1cf09e00b github.com/openzipkin-contrib/zipkin-go-opentracing v0.5.0 github.com/openzipkin/zipkin-go v0.4.3 github.com/p4lang/p4runtime v1.5.0 github.com/pavlo-v-chernykh/keystore-go/v4 v4.5.0 github.com/pborman/ansi v1.0.0 github.com/pcolladosoto/goslurm v0.1.0 github.com/peterbourgon/unixtransport v0.0.7 github.com/pion/dtls/v3 v3.1.2 github.com/prometheus-community/pro-bing v0.8.0 github.com/prometheus/client_golang v1.23.2 github.com/prometheus/client_model v0.6.2 github.com/prometheus/common v0.67.5 github.com/prometheus/procfs v0.20.1 github.com/prometheus/prometheus v0.310.0 github.com/rabbitmq/amqp091-go v1.10.0 github.com/rclone/rclone v1.69.3 github.com/redis/go-redis/v9 v9.18.0 github.com/riemann/riemann-go-client v0.5.1-0.20211206220514-f58f10cdce16 github.com/robbiet480/go.nut v0.0.0-20220219091450-bd8f121e1fa1 github.com/robinson/gos7 v0.0.0-20240315073918-1f14519e4846 github.com/safchain/ethtool v0.7.0 github.com/santhosh-tekuri/jsonschema/v5 v5.3.1 github.com/seancfoley/ipaddress-go v1.7.1 github.com/sensu/sensu-go/api/core/v2 v2.16.0 github.com/shirou/gopsutil/v4 v4.26.2 github.com/showwin/speedtest-go v1.7.10 github.com/signalfx/golib/v3 v3.3.54 github.com/sijms/go-ora/v2 v2.9.0 github.com/sirupsen/logrus v1.9.4 github.com/sleepinggenius2/gosmi v0.4.4 github.com/snowflakedb/gosnowflake v1.19.0 github.com/srebhan/cborquery v1.0.4 github.com/srebhan/protobufquery v1.0.4 github.com/stretchr/testify v1.11.1 github.com/tbrandon/mbserver v0.0.0-20170611213546-993e1772cc62 github.com/tdrn-org/go-hue v0.3.0 github.com/tdrn-org/go-nsdp v0.5.0 github.com/tdrn-org/go-tr064 v0.2.3 github.com/testcontainers/testcontainers-go v0.41.0 github.com/testcontainers/testcontainers-go/modules/azure v0.40.0 github.com/testcontainers/testcontainers-go/modules/kafka v0.40.0 github.com/testcontainers/testcontainers-go/modules/vault v0.41.0 github.com/thomasklein94/packer-plugin-libvirt v0.5.0 github.com/tidwall/gjson v1.18.0 github.com/tidwall/wal v1.2.1 github.com/tinylib/msgp v1.6.3 github.com/urfave/cli/v2 v2.27.7 github.com/vapourismo/knx-go v0.0.0-20240915133544-a6ab43471c11 github.com/vertica/vertica-sql-go v1.3.5 github.com/vishvananda/netlink v1.3.1 github.com/vishvananda/netns v0.0.5 github.com/vjeantet/grok v1.0.1 github.com/vmware/govmomi v0.53.0 github.com/wavefronthq/wavefront-sdk-go v0.15.0 github.com/x448/float16 v0.8.4 github.com/xdg/scram v1.0.5 github.com/yuin/goldmark v1.7.16 go.mongodb.org/mongo-driver v1.17.9 go.opentelemetry.io/collector/pdata v1.53.0 go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v0.44.0 go.opentelemetry.io/otel/sdk/metric v1.41.0 go.opentelemetry.io/proto/otlp v1.10.0 go.opentelemetry.io/proto/otlp/collector/profiles/v1development v0.3.0 go.opentelemetry.io/proto/otlp/profiles/v1development v0.3.0 go.starlark.net v0.0.0-20260210143700-b62fd896b91b go.step.sm/crypto v0.76.2 go.yaml.in/yaml/v3 v3.0.4 golang.org/x/crypto v0.49.0 golang.org/x/exp v0.0.0-20260218203240-3dfff04db8fa golang.org/x/mod v0.34.0 golang.org/x/net v0.52.0 golang.org/x/oauth2 v0.36.0 golang.org/x/sync v0.20.0 golang.org/x/sys v0.42.0 golang.org/x/term v0.41.0 golang.org/x/text v0.35.0 golang.zx2c4.com/wireguard/wgctrl v0.0.0-20211230205640-daad0b7ba671 gonum.org/v1/gonum v0.17.0 google.golang.org/api v0.272.0 google.golang.org/genproto/googleapis/api v0.0.0-20260217215200-42d3e9bedb6d google.golang.org/grpc v1.79.3 google.golang.org/protobuf v1.36.11 gopkg.in/gorethink/gorethink.v3 v3.0.5 gopkg.in/olivere/elastic.v5 v5.0.86 gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 k8s.io/api v0.35.2 k8s.io/apimachinery v0.35.2 k8s.io/client-go v0.35.2 layeh.com/radius v0.0.0-20221205141417-e7fbddd11d68 modernc.org/sqlite v1.46.2 software.sslmate.com/src/go-pkcs12 v0.7.0 ) require ( cel.dev/expr v0.25.1 // indirect cloud.google.com/go v0.123.0 // indirect cloud.google.com/go/auth/oauth2adapt v0.2.8 // indirect cloud.google.com/go/compute/metadata v0.9.0 // indirect cloud.google.com/go/iam v1.5.3 // indirect code.cloudfoundry.org/clock v1.2.0 // indirect dario.cat/mergo v1.0.2 // indirect filippo.io/edwards25519 v1.1.1 // indirect github.com/99designs/go-keychain v0.0.0-20191008050251-8e49817e8af4 // indirect github.com/AdaLogics/go-fuzz-headers v0.0.0-20240806141605-e8a1dd7889d6 // indirect github.com/Azure/azure-amqp-common-go/v4 v4.2.0 // indirect github.com/Azure/azure-pipeline-go v0.2.3 // indirect github.com/Azure/azure-sdk-for-go v68.0.0+incompatible // indirect github.com/Azure/azure-sdk-for-go/sdk/internal v1.11.2 // indirect github.com/Azure/azure-sdk-for-go/sdk/storage/azblob v1.6.3 // indirect github.com/Azure/azure-storage-queue-go v0.0.0-20230531184854-c06a8eff66fe // indirect github.com/Azure/go-amqp v1.5.0 // indirect github.com/Azure/go-ansiterm v0.0.0-20250102033503-faa5f7b0171c // indirect github.com/Azure/go-autorest v14.2.0+incompatible // indirect github.com/Azure/go-autorest/autorest/azure/cli v0.4.6 // indirect github.com/Azure/go-autorest/autorest/date v0.3.0 // indirect github.com/Azure/go-autorest/autorest/to v0.4.0 // indirect github.com/Azure/go-autorest/autorest/validation v0.3.1 // indirect github.com/Azure/go-autorest/logger v0.2.1 // indirect github.com/Azure/go-autorest/tracing v0.6.0 // indirect github.com/Azure/go-ntlmssp v0.0.0-20221128193559-754e69321358 // indirect github.com/AzureAD/microsoft-authentication-library-for-go v1.6.0 // indirect github.com/ClickHouse/ch-go v0.71.0 // indirect github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.30.0 // indirect github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.55.0 // indirect github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.55.0 // indirect github.com/Masterminds/goutils v1.1.1 // indirect github.com/Masterminds/semver v1.5.0 // indirect github.com/Max-Sum/base32768 v0.0.0-20230304063302-18e6ce5945fd // indirect github.com/Microsoft/go-winio v0.6.2 // indirect github.com/abbot/go-http-auth v0.4.0 // indirect github.com/alecthomas/participle v0.4.1 // indirect github.com/andybalholm/brotli v1.2.0 // indirect github.com/antithesishq/antithesis-sdk-go v0.6.0-default-no-op // indirect github.com/antlr4-go/antlr/v4 v4.13.1 // indirect github.com/apache/arrow/go/v15 v15.0.2 // indirect github.com/apapsch/go-jsonmerge/v2 v2.0.0 // indirect github.com/apex/log v1.9.0 // indirect github.com/aristanetworks/glog v0.0.0-20191112221043-67e8567f59f3 // indirect github.com/armon/go-metrics v0.4.1 // indirect github.com/awnumar/memcall v0.4.0 // indirect github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.6 // indirect github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.17.43 // indirect github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.19 // indirect github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.19 // indirect github.com/aws/aws-sdk-go-v2/internal/ini v1.8.5 // indirect github.com/aws/aws-sdk-go-v2/internal/v4a v1.3.25 // indirect github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.6 // indirect github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.4.6 // indirect github.com/aws/aws-sdk-go-v2/service/internal/endpoint-discovery v1.11.19 // indirect github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.19 // indirect github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.18.6 // indirect github.com/aws/aws-sdk-go-v2/service/s3 v1.71.0 // indirect github.com/aws/aws-sdk-go-v2/service/signin v1.0.7 // indirect github.com/aws/aws-sdk-go-v2/service/sso v1.30.12 // indirect github.com/aws/aws-sdk-go-v2/service/ssooidc v1.35.16 // indirect github.com/beorn7/perks v1.0.1 // indirect github.com/bitly/go-hostpool v0.1.0 // indirect github.com/blang/semver/v4 v4.0.0 // indirect github.com/bmizerany/assert v0.0.0-20160611221934-b7ed37b82869 // indirect github.com/brutella/dnssd v1.2.14 // indirect github.com/bwmarrin/snowflake v0.3.0 // indirect github.com/caio/go-tdigest/v4 v4.0.1 // indirect github.com/cenkalti/backoff v2.2.1+incompatible // indirect github.com/cenkalti/backoff/v4 v4.3.0 // indirect github.com/cespare/xxhash/v2 v2.3.0 // indirect github.com/clipperhouse/uax29/v2 v2.7.0 // indirect github.com/cncf/xds/go v0.0.0-20251210132809-ee656c7534f5 // indirect github.com/containerd/errdefs v1.0.0 // indirect github.com/containerd/errdefs/pkg v0.3.0 // indirect github.com/containerd/log v0.1.0 // indirect github.com/containerd/platforms v0.2.1 // indirect github.com/couchbase/gomemcached v0.1.3 // indirect github.com/couchbase/goutils v0.1.0 // indirect github.com/cpuguy83/dockercfg v0.3.2 // indirect github.com/cpuguy83/go-md2man/v2 v2.0.7 // indirect github.com/creack/goselect v0.1.3 // indirect github.com/cyphar/filepath-securejoin v0.6.1 // indirect github.com/danieljoos/wincred v1.2.2 // indirect github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect github.com/devigned/tab v0.1.1 // indirect github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f // indirect github.com/distribution/reference v0.6.0 // indirect github.com/docker/go-units v0.5.0 // indirect github.com/dvsekhvalnov/jose2go v1.7.0 // indirect github.com/eapache/go-resiliency v1.7.0 // indirect github.com/eapache/queue v1.1.0 // indirect github.com/ebitengine/purego v0.10.0 // indirect github.com/echlebek/timeproxy v1.0.0 // indirect github.com/elastic/go-sysinfo v1.8.1 // indirect github.com/elastic/go-windows v1.0.0 // indirect github.com/emicklei/go-restful/v3 v3.12.2 // indirect github.com/envoyproxy/go-control-plane/envoy v1.36.0 // indirect github.com/envoyproxy/protoc-gen-validate v1.3.0 // indirect github.com/felixge/httpsnoop v1.0.4 // indirect github.com/fxamacker/cbor/v2 v2.9.0 // indirect github.com/gabriel-vasile/mimetype v1.4.13 // indirect github.com/go-asn1-ber/asn1-ber v1.5.8-0.20250403174932-29230038a667 // indirect github.com/go-chi/chi/v5 v5.2.5 // indirect github.com/go-darwin/apfs v0.0.0-20211011131704-f84b94dbf348 // indirect github.com/go-faster/city v1.0.1 // indirect github.com/go-faster/errors v0.7.1 // indirect github.com/go-git/go-billy/v5 v5.6.0 // indirect github.com/go-jose/go-jose/v4 v4.1.3 // indirect github.com/go-logr/logr v1.4.3 // indirect github.com/go-logr/stdr v1.2.2 // indirect github.com/go-openapi/jsonpointer v0.22.4 // indirect github.com/go-openapi/jsonreference v0.21.4 // indirect github.com/go-openapi/swag v0.25.4 // indirect github.com/go-openapi/swag/cmdutils v0.25.4 // indirect github.com/go-openapi/swag/conv v0.25.4 // indirect github.com/go-openapi/swag/fileutils v0.25.4 // indirect github.com/go-openapi/swag/jsonname v0.25.4 // indirect github.com/go-openapi/swag/jsonutils v0.25.4 // indirect github.com/go-openapi/swag/loading v0.25.4 // indirect github.com/go-openapi/swag/mangling v0.25.4 // indirect github.com/go-openapi/swag/netutils v0.25.4 // indirect github.com/go-openapi/swag/stringutils v0.25.4 // indirect github.com/go-openapi/swag/typeutils v0.25.4 // indirect github.com/go-openapi/swag/yamlutils v0.25.4 // indirect github.com/go-resty/resty/v2 v2.17.1 // indirect github.com/go-stack/stack v1.8.1 // indirect github.com/go-viper/mapstructure/v2 v2.5.0 // indirect github.com/goburrow/modbus v0.1.0 // indirect github.com/goburrow/serial v0.1.1-0.20211022031912-bfb69110f8dd // indirect github.com/gobwas/httphead v0.1.0 // indirect github.com/gobwas/pool v0.2.1 // indirect github.com/gobwas/ws v1.3.2 // indirect github.com/goccy/go-json v0.10.5 // indirect github.com/godbus/dbus v0.0.0-20190726142602-4481cbc300e2 // indirect github.com/godbus/dbus/v5 v5.1.0 // indirect github.com/gofrs/uuid v4.4.0+incompatible // indirect github.com/golang-jwt/jwt/v4 v4.5.2 // indirect github.com/golang-sql/civil v0.0.0-20220223132316-b832511892a9 // indirect github.com/golang-sql/sqlexp v0.1.0 // indirect github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect github.com/golang/protobuf v1.5.4 // indirect github.com/google/flatbuffers v25.12.19+incompatible // indirect github.com/google/gnostic-models v0.7.0 // indirect github.com/google/go-querystring v1.2.0 // indirect github.com/google/go-tpm v0.9.8 // indirect github.com/google/s2a-go v0.1.9 // indirect github.com/googleapis/enterprise-certificate-proxy v0.3.14 // indirect github.com/googleapis/gax-go/v2 v2.18.0 // indirect github.com/gorilla/securecookie v1.1.2 // indirect github.com/grafana/regexp v0.0.0-20250905093917-f7b3be9d1853 // indirect github.com/grid-x/serial v0.0.0-20211107191517-583c7356b3aa // indirect github.com/grpc-ecosystem/grpc-gateway/v2 v2.28.0 // indirect github.com/gsterjov/go-libsecret v0.0.0-20161001094733-a6f4afe4910c // indirect github.com/hailocab/go-hostpool v0.0.0-20160125115350-e80d13ce29ed // indirect github.com/hashicorp/errwrap v1.1.0 // indirect github.com/hashicorp/go-cleanhttp v0.5.2 // indirect github.com/hashicorp/go-hclog v1.6.3 // indirect github.com/hashicorp/go-immutable-radix v1.3.1 // indirect github.com/hashicorp/go-multierror v1.1.1 // indirect github.com/hashicorp/go-retryablehttp v0.7.8 // indirect github.com/hashicorp/go-rootcerts v1.0.2 // indirect github.com/hashicorp/go-secure-stdlib/parseutil v0.2.0 // indirect github.com/hashicorp/go-secure-stdlib/strutil v0.1.2 // indirect github.com/hashicorp/go-sockaddr v1.0.7 // indirect github.com/hashicorp/go-version v1.8.0 // indirect github.com/hashicorp/golang-lru v1.0.2 // indirect github.com/hashicorp/hcl v1.0.1-vault-7 // indirect github.com/hashicorp/packer-plugin-sdk v0.3.2 // indirect github.com/hashicorp/serf v0.10.1 // indirect github.com/huandu/xstrings v1.5.0 // indirect github.com/icholy/digest v1.1.0 // indirect github.com/imdario/mergo v0.3.16 // indirect github.com/jackc/chunkreader/v2 v2.0.1 // indirect github.com/jackc/pgpassfile v1.0.0 // indirect github.com/jackc/pgproto3/v2 v2.3.3 // indirect github.com/jackc/pgservicefile v0.0.0-20221227161230-091c0ba34f0a // indirect github.com/jackc/puddle v1.3.0 // indirect github.com/jaegertracing/jaeger v1.47.0 // indirect github.com/jcmturner/aescts/v2 v2.0.0 // indirect github.com/jcmturner/dnsutils/v2 v2.0.0 // indirect github.com/jcmturner/gofork v1.7.6 // indirect github.com/jcmturner/goidentity/v6 v6.0.1 // indirect github.com/jcmturner/gokrb5/v8 v8.4.4 // indirect github.com/jcmturner/rpc/v2 v2.0.3 // indirect github.com/jmhodges/clock v1.2.0 // indirect github.com/joeshaw/multierror v0.0.0-20140124173710-69b34d4ec901 // indirect github.com/josharian/intern v1.0.0 // indirect github.com/josharian/native v1.1.0 // indirect github.com/jpillora/backoff v1.0.0 // indirect github.com/json-iterator/go v1.1.12 // indirect github.com/jzelinskie/whirlpool v0.0.0-20201016144138-0675e54bb004 // indirect github.com/klauspost/asmfmt v1.3.2 // indirect github.com/klauspost/cpuid/v2 v2.3.0 // indirect github.com/kr/fs v0.1.0 // indirect github.com/kylelemons/godebug v1.1.0 // indirect github.com/leodido/ragel-machinery v0.0.0-20190525184631-5f46317e436b // indirect github.com/likexian/gokit v0.25.16 // indirect github.com/lufia/plan9stats v0.0.0-20260216142805-b3301c5f2a88 // indirect github.com/magiconair/properties v1.8.10 // indirect github.com/mailru/easyjson v0.9.0 // indirect github.com/mattn/go-colorable v0.1.14 // indirect github.com/mattn/go-ieproxy v0.0.11 // indirect github.com/mattn/go-isatty v0.0.20 // indirect github.com/mattn/go-runewidth v0.0.20 // indirect github.com/mdlayher/genetlink v1.2.0 // indirect github.com/mdlayher/netlink v1.7.2 // indirect github.com/mdlayher/socket v0.5.1 // indirect github.com/minio/asm2plan9s v0.0.0-20200509001527-cdd76441f9d8 // indirect github.com/minio/c2goasm v0.0.0-20190812172519-36a3d3bbc4f3 // indirect github.com/minio/highwayhash v1.0.4-0.20251030100505-070ab1a87a76 // indirect github.com/mitchellh/copystructure v1.2.0 // indirect github.com/mitchellh/go-homedir v1.1.0 // indirect github.com/mitchellh/mapstructure v1.5.1-0.20220423185008-bf980b35cac4 // indirect github.com/mitchellh/reflectwalk v1.0.2 // indirect github.com/moby/docker-image-spec v1.3.1 // indirect github.com/moby/go-archive v0.2.0 // indirect github.com/moby/patternmatcher v0.6.0 // indirect github.com/moby/sys/sequential v0.6.0 // indirect github.com/moby/sys/user v0.4.0 // indirect github.com/moby/sys/userns v0.1.0 // indirect github.com/moby/term v0.5.2 // indirect github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee // indirect github.com/montanaflynn/stats v0.7.1 // indirect github.com/morikuni/aec v1.1.0 // indirect github.com/mtibben/percent v0.2.1 // indirect github.com/muhlemmer/gu v0.3.1 // indirect github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f // indirect github.com/naoina/go-stringutil v0.1.0 // indirect github.com/nats-io/jwt/v2 v2.8.0 // indirect github.com/nats-io/nkeys v0.4.15 // indirect github.com/nats-io/nuid v1.0.1 // indirect github.com/ncruces/go-strftime v1.0.0 // indirect github.com/ncw/swift/v2 v2.0.3 // indirect github.com/oapi-codegen/runtime v1.1.1 // indirect github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatautil v0.145.0 // indirect github.com/opencontainers/go-digest v1.0.0 // indirect github.com/opencontainers/image-spec v1.1.1 // indirect github.com/opencontainers/runtime-spec v1.3.0 // indirect github.com/opencontainers/umoci v0.6.1-0.20251213054154-70fc5ee1f4df // indirect github.com/opentracing-contrib/go-observer v0.0.0-20170622124052-a52f23424492 // indirect github.com/oxtoacart/bpool v0.0.0-20190530202638-03653db5a59c // indirect github.com/panjf2000/ants/v2 v2.11.3 // indirect github.com/panjf2000/gnet/v2 v2.9.7 // indirect github.com/paulmach/orb v0.12.0 // indirect github.com/philhofer/fwd v1.2.0 // indirect github.com/pierrec/lz4/v4 v4.1.25 // indirect github.com/pion/logging v0.2.4 // indirect github.com/pion/transport/v2 v2.2.10 // indirect github.com/pion/transport/v4 v4.0.1 // indirect github.com/pkg/browser v0.0.0-20240102092130-5ac0b6a4141c // indirect github.com/pkg/errors v0.9.1 // indirect github.com/pkg/sftp v1.13.10 // indirect github.com/pkg/xattr v0.4.12 // indirect github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10 // indirect github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55 // indirect github.com/rcrowley/go-metrics v0.0.0-20250401214520-65e299d6c5c9 // indirect github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec // indirect github.com/rfjakob/eme v1.1.2 // indirect github.com/robertkrimen/otto v0.0.0-20191219234010-c382bd3c16ff // indirect github.com/robfig/cron/v3 v3.0.1 // indirect github.com/rootless-containers/proto/go-proto v0.0.0-20260207013450-f6ee952d53d9 // indirect github.com/russross/blackfriday/v2 v2.1.0 // indirect github.com/ryanuber/go-glob v1.0.0 // indirect github.com/samber/lo v1.47.0 // indirect github.com/seancfoley/bintree v1.3.1 // indirect github.com/segmentio/asm v1.2.1 // indirect github.com/shopspring/decimal v1.4.0 // indirect github.com/signalfx/com_signalfx_metrics_protobuf v0.0.3 // indirect github.com/signalfx/gohistogram v0.0.0-20160107210732-1ccfd2ff5083 // indirect github.com/signalfx/sapm-proto v0.12.0 // indirect github.com/spf13/cast v1.10.0 // indirect github.com/spf13/pflag v1.0.10 // indirect github.com/spiffe/go-spiffe/v2 v2.6.0 // indirect github.com/stretchr/objx v0.5.2 // indirect github.com/tidwall/match v1.1.1 // indirect github.com/tidwall/pretty v1.2.1 // indirect github.com/tidwall/tinylru v1.2.1 // indirect github.com/tklauser/go-sysconf v0.3.16 // indirect github.com/tklauser/numcpus v0.11.0 // indirect github.com/twmb/murmur3 v1.1.7 // indirect github.com/uber/jaeger-client-go v2.30.0+incompatible // indirect github.com/uber/jaeger-lib v2.4.1+incompatible // indirect github.com/urfave/cli v1.22.17 // indirect github.com/valyala/bytebufferpool v1.0.0 // indirect github.com/vbatts/go-mtree v0.7.0 // indirect github.com/xanzy/ssh-agent v0.3.3 // indirect github.com/xdg-go/pbkdf2 v1.0.0 // indirect github.com/xdg-go/scram v1.2.0 // indirect github.com/xdg-go/stringprep v1.0.4 // indirect github.com/xdg/stringprep v1.0.3 // indirect github.com/xrash/smetrics v0.0.0-20250705151800-55b8f293f342 // indirect github.com/youmark/pkcs8 v0.0.0-20240726163527-a2c0da244d78 // indirect github.com/yuin/gopher-lua v0.0.0-20200816102855-ee81675732da // indirect github.com/yusufpapurcu/wmi v1.2.4 // indirect github.com/zeebo/assert v1.3.1 // indirect github.com/zeebo/xxh3 v1.1.0 // indirect github.com/zentures/cityhash v0.0.0-20131128155616-cdd6a94144ab // indirect github.com/zitadel/logging v0.7.0 // indirect github.com/zitadel/oidc/v3 v3.45.4 // indirect github.com/zitadel/schema v1.3.2 // indirect go.bug.st/serial v1.6.4 // indirect go.etcd.io/etcd/api/v3 v3.5.4 // indirect go.opencensus.io v0.24.0 // indirect go.opentelemetry.io/auto/sdk v1.2.1 // indirect go.opentelemetry.io/collector/consumer/consumererror v0.135.0 // indirect go.opentelemetry.io/collector/featuregate v1.53.0 // indirect go.opentelemetry.io/collector/internal/testutil v0.147.0 // indirect go.opentelemetry.io/collector/pdata/pprofile v0.140.0 // indirect go.opentelemetry.io/collector/semconv v0.128.0 // indirect go.opentelemetry.io/contrib/detectors/gcp v1.39.0 // indirect go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.63.0 // indirect go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.65.0 // indirect go.opentelemetry.io/otel v1.41.0 // indirect go.opentelemetry.io/otel/metric v1.41.0 // indirect go.opentelemetry.io/otel/sdk v1.41.0 // indirect go.opentelemetry.io/otel/trace v1.41.0 // indirect go.uber.org/atomic v1.11.0 // indirect go.uber.org/multierr v1.11.0 // indirect go.uber.org/zap v1.27.1 // indirect go.yaml.in/yaml/v2 v2.4.3 // indirect golang.org/x/telemetry v0.0.0-20260209163413-e7419c687ee4 // indirect golang.org/x/time v0.15.0 // indirect golang.org/x/tools v0.42.0 // indirect golang.org/x/xerrors v0.0.0-20240903120638-7835f813f4da // indirect golang.zx2c4.com/wireguard v0.0.0-20211209221555-9c9e7e272434 // indirect google.golang.org/genproto v0.0.0-20260217215200-42d3e9bedb6d // indirect google.golang.org/genproto/googleapis/rpc v0.0.0-20260311181403-84a4fc48630c // indirect gopkg.in/evanphx/json-patch.v4 v4.13.0 // indirect gopkg.in/fatih/pool.v2 v2.0.0 // indirect gopkg.in/fsnotify.v1 v1.4.7 // indirect gopkg.in/inf.v0 v0.9.1 // indirect gopkg.in/ini.v1 v1.67.1 // indirect gopkg.in/natefinch/lumberjack.v2 v2.2.1 // indirect gopkg.in/sourcemap.v1 v1.0.5 // indirect gopkg.in/tomb.v2 v2.0.0-20161208151619-d5d1b5820637 // indirect gopkg.in/yaml.v2 v2.4.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect honnef.co/go/tools v0.2.2 // indirect howett.net/plist v0.0.0-20181124034731-591f970eefbb // indirect k8s.io/klog/v2 v2.130.1 // indirect k8s.io/kube-openapi v0.0.0-20250910181357-589584f1c912 // indirect k8s.io/utils v0.0.0-20260210185600-b8788abfbbc2 // indirect modernc.org/libc v1.70.0 // indirect modernc.org/mathutil v1.7.1 // indirect modernc.org/memory v1.11.0 // indirect sigs.k8s.io/json v0.0.0-20250730193827-2d320260d730 // indirect sigs.k8s.io/randfill v1.0.0 // indirect sigs.k8s.io/structured-merge-diff/v6 v6.3.0 // indirect sigs.k8s.io/yaml v1.6.0 // indirect ) ================================================ FILE: go.sum ================================================ bou.ke/monkey v1.0.2 h1:kWcnsrCNUatbxncxR/ThdYqbytgOIArtYWqcQLQzKLI= bou.ke/monkey v1.0.2/go.mod h1:OqickVX3tNx6t33n1xvtTtu85YN5s6cKwVug+oHMaIA= cel.dev/expr v0.25.1 h1:1KrZg61W6TWSxuNZ37Xy49ps13NUovb66QLprthtwi4= cel.dev/expr v0.25.1/go.mod h1:hrXvqGP6G6gyx8UAHSHJ5RGk//1Oj5nXQ2NI02Nrsg4= cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU= cloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU= cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= cloud.google.com/go v0.44.3/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= cloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc= cloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0= cloud.google.com/go v0.50.0/go.mod h1:r9sluTvynVuxRIOHXQEHMFffphuXHOMZMycpNR5e6To= cloud.google.com/go v0.52.0/go.mod h1:pXajvRH/6o3+F9jDHZWQ5PbGhn+o8w9qiu/CffaVdO4= cloud.google.com/go v0.53.0/go.mod h1:fp/UouUEsRkN6ryDKNW/Upv/JBKnv6WDthjR6+vze6M= cloud.google.com/go v0.54.0/go.mod h1:1rq2OEkV3YMf6n/9ZvGWI3GWw0VoqH/1x2nd8Is/bPc= cloud.google.com/go v0.56.0/go.mod h1:jr7tqZxxKOVYizybht9+26Z/gUq7tiRzu+ACVAMbKVk= cloud.google.com/go v0.57.0/go.mod h1:oXiQ6Rzq3RAkkY7N6t3TcE6jE+CIBBbA36lwQ1JyzZs= cloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOYc= cloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHObY= cloud.google.com/go v0.72.0/go.mod h1:M+5Vjvlc2wnp6tjzE102Dw08nGShTscUx2nZMufOKPI= cloud.google.com/go v0.74.0/go.mod h1:VV1xSbzvo+9QJOxLDaJfTjx5e+MePCpCWwvftOeQmWk= cloud.google.com/go v0.75.0/go.mod h1:VGuuCn7PG0dwsd5XPVm2Mm3wlh3EL55/79EKB6hlPTY= cloud.google.com/go v0.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.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.90.0/go.mod h1:kRX0mNRHe0e2rC6oNakvwQqzyDmg57xJ+SZU1eT2aDQ= cloud.google.com/go v0.93.3/go.mod h1:8utlLll2EF5XMAV15woO4lSbWQlk8rer9aLOfLh7+YI= cloud.google.com/go v0.94.1/go.mod h1:qAlAugsXlC+JWO+Bke5vCtc9ONxjQT3drlTTnAplMW4= cloud.google.com/go v0.97.0/go.mod h1:GF7l59pYBVlXQIBLx3a761cZ41F9bBH3JUlihCt2Udc= cloud.google.com/go v0.99.0/go.mod h1:w0Xx2nLzqWJPuozYQX+hFfCSI8WioryfRDzkoI/Y2ZA= cloud.google.com/go v0.100.1/go.mod h1:fs4QogzfH5n2pBXBP9vRiU+eCny7lD2vmFZy79Iuw1U= cloud.google.com/go v0.100.2/go.mod h1:4Xra9TjzAeYHrl5+oeLlzbM2k3mjVhZh4UqTZ//w99A= cloud.google.com/go v0.102.0/go.mod h1:oWcCzKlqJ5zgHQt9YsaeTY9KzIvjyy0ArmiBUgpQ+nc= cloud.google.com/go v0.102.1/go.mod h1:XZ77E9qnTEnrgEOvr4xzfdX5TRo7fB4T2F4O6+34hIU= cloud.google.com/go v0.104.0/go.mod h1:OO6xxXdJyvuJPcEPBLN9BJPD+jep5G1+2U5B5gkRYtA= cloud.google.com/go v0.105.0/go.mod h1:PrLgOJNe5nfE9UMxKxgXj4mD3voiP+YQ6gdt6KMFOKM= cloud.google.com/go v0.107.0/go.mod h1:wpc2eNrD7hXUTy8EKS10jkxpZBjASrORK7goS+3YX2I= cloud.google.com/go v0.110.0/go.mod h1:SJnCLqQ0FCFGSZMUNUf84MV3Aia54kn7pi8st7tMzaY= cloud.google.com/go v0.123.0 h1:2NAUJwPR47q+E35uaJeYoNhuNEM9kM8SjgRgdeOJUSE= cloud.google.com/go v0.123.0/go.mod h1:xBoMV08QcqUGuPW65Qfm1o9Y4zKZBpGS+7bImXLTAZU= cloud.google.com/go/accessapproval v1.4.0/go.mod h1:zybIuC3KpDOvotz59lFe5qxRZx6C75OtwbisN56xYB4= cloud.google.com/go/accessapproval v1.5.0/go.mod h1:HFy3tuiGvMdcd/u+Cu5b9NkO1pEICJ46IR82PoUdplw= cloud.google.com/go/accessapproval v1.6.0/go.mod h1:R0EiYnwV5fsRFiKZkPHr6mwyk2wxUJ30nL4j2pcFY2E= cloud.google.com/go/accesscontextmanager v1.3.0/go.mod h1:TgCBehyr5gNMz7ZaH9xubp+CE8dkrszb4oK9CWyvD4o= cloud.google.com/go/accesscontextmanager v1.4.0/go.mod h1:/Kjh7BBu/Gh83sv+K60vN9QE5NJcd80sU33vIe2IFPE= cloud.google.com/go/accesscontextmanager v1.6.0/go.mod h1:8XCvZWfYw3K/ji0iVnp+6pu7huxoQTLmxAbVjbloTtM= cloud.google.com/go/accesscontextmanager v1.7.0/go.mod h1:CEGLewx8dwa33aDAZQujl7Dx+uYhS0eay198wB/VumQ= cloud.google.com/go/aiplatform v1.22.0/go.mod h1:ig5Nct50bZlzV6NvKaTwmplLLddFx0YReh9WfTO5jKw= cloud.google.com/go/aiplatform v1.24.0/go.mod h1:67UUvRBKG6GTayHKV8DBv2RtR1t93YRu5B1P3x99mYY= cloud.google.com/go/aiplatform v1.27.0/go.mod h1:Bvxqtl40l0WImSb04d0hXFU7gDOiq9jQmorivIiWcKg= cloud.google.com/go/aiplatform v1.35.0/go.mod h1:7MFT/vCaOyZT/4IIFfxH4ErVg/4ku6lKv3w0+tFTgXQ= cloud.google.com/go/aiplatform v1.36.1/go.mod h1:WTm12vJRPARNvJ+v6P52RDHCNe4AhvjcIZ/9/RRHy/k= cloud.google.com/go/aiplatform v1.37.0/go.mod h1:IU2Cv29Lv9oCn/9LkFiiuKfwrRTq+QQMbW+hPCxJGZw= cloud.google.com/go/analytics v0.11.0/go.mod h1:DjEWCu41bVbYcKyvlws9Er60YE4a//bK6mnhWvQeFNI= cloud.google.com/go/analytics v0.12.0/go.mod h1:gkfj9h6XRf9+TS4bmuhPEShsh3hH8PAZzm/41OOhQd4= cloud.google.com/go/analytics v0.17.0/go.mod h1:WXFa3WSym4IZ+JiKmavYdJwGG/CvpqiqczmL59bTD9M= cloud.google.com/go/analytics v0.18.0/go.mod h1:ZkeHGQlcIPkw0R/GW+boWHhCOR43xz9RN/jn7WcqfIE= cloud.google.com/go/analytics v0.19.0/go.mod h1:k8liqf5/HCnOUkbawNtrWWc+UAzyDlW89doe8TtoDsE= cloud.google.com/go/apigateway v1.3.0/go.mod h1:89Z8Bhpmxu6AmUxuVRg/ECRGReEdiP3vQtk4Z1J9rJk= cloud.google.com/go/apigateway v1.4.0/go.mod h1:pHVY9MKGaH9PQ3pJ4YLzoj6U5FUDeDFBllIz7WmzJoc= cloud.google.com/go/apigateway v1.5.0/go.mod h1:GpnZR3Q4rR7LVu5951qfXPJCHquZt02jf7xQx7kpqN8= cloud.google.com/go/apigeeconnect v1.3.0/go.mod h1:G/AwXFAKo0gIXkPTVfZDd2qA1TxBXJ3MgMRBQkIi9jc= cloud.google.com/go/apigeeconnect v1.4.0/go.mod h1:kV4NwOKqjvt2JYR0AoIWo2QGfoRtn/pkS3QlHp0Ni04= cloud.google.com/go/apigeeconnect v1.5.0/go.mod h1:KFaCqvBRU6idyhSNyn3vlHXc8VMDJdRmwDF6JyFRqZ8= cloud.google.com/go/apigeeregistry v0.4.0/go.mod h1:EUG4PGcsZvxOXAdyEghIdXwAEi/4MEaoqLMLDMIwKXY= cloud.google.com/go/apigeeregistry v0.5.0/go.mod h1:YR5+s0BVNZfVOUkMa5pAR2xGd0A473vA5M7j247o1wM= cloud.google.com/go/apigeeregistry v0.6.0/go.mod h1:BFNzW7yQVLZ3yj0TKcwzb8n25CFBri51GVGOEUcgQsc= cloud.google.com/go/apikeys v0.4.0/go.mod h1:XATS/yqZbaBK0HOssf+ALHp8jAlNHUgyfprvNcBIszU= cloud.google.com/go/apikeys v0.5.0/go.mod h1:5aQfwY4D+ewMMWScd3hm2en3hCj+BROlyrt3ytS7KLI= cloud.google.com/go/apikeys v0.6.0/go.mod h1:kbpXu5upyiAlGkKrJgQl8A0rKNNJ7dQ377pdroRSSi8= cloud.google.com/go/appengine v1.4.0/go.mod h1:CS2NhuBuDXM9f+qscZ6V86m1MIIqPj3WC/UoEuR1Sno= cloud.google.com/go/appengine v1.5.0/go.mod h1:TfasSozdkFI0zeoxW3PTBLiNqRmzraodCWatWI9Dmak= cloud.google.com/go/appengine v1.6.0/go.mod h1:hg6i0J/BD2cKmDJbaFSYHFyZkgBEfQrDg/X0V5fJn84= cloud.google.com/go/appengine v1.7.0/go.mod h1:eZqpbHFCqRGa2aCdope7eC0SWLV1j0neb/QnMJVWx6A= cloud.google.com/go/appengine v1.7.1/go.mod h1:IHLToyb/3fKutRysUlFO0BPt5j7RiQ45nrzEJmKTo6E= cloud.google.com/go/area120 v0.5.0/go.mod h1:DE/n4mp+iqVyvxHN41Vf1CR602GiHQjFPusMFW6bGR4= cloud.google.com/go/area120 v0.6.0/go.mod h1:39yFJqWVgm0UZqWTOdqkLhjoC7uFfgXRC8g/ZegeAh0= cloud.google.com/go/area120 v0.7.0/go.mod h1:a3+8EUD1SX5RUcCs3MY5YasiO1z6yLiNLRiFrykbynY= cloud.google.com/go/area120 v0.7.1/go.mod h1:j84i4E1RboTWjKtZVWXPqvK5VHQFJRF2c1Nm69pWm9k= cloud.google.com/go/artifactregistry v1.6.0/go.mod h1:IYt0oBPSAGYj/kprzsBjZ/4LnG/zOcHyFHjWPCi6SAQ= cloud.google.com/go/artifactregistry v1.7.0/go.mod h1:mqTOFOnGZx8EtSqK/ZWcsm/4U8B77rbcLP6ruDU2Ixk= cloud.google.com/go/artifactregistry v1.8.0/go.mod h1:w3GQXkJX8hiKN0v+at4b0qotwijQbYUqF2GWkZzAhC0= cloud.google.com/go/artifactregistry v1.9.0/go.mod h1:2K2RqvA2CYvAeARHRkLDhMDJ3OXy26h3XW+3/Jh2uYc= cloud.google.com/go/artifactregistry v1.11.1/go.mod h1:lLYghw+Itq9SONbCa1YWBoWs1nOucMH0pwXN1rOBZFI= cloud.google.com/go/artifactregistry v1.11.2/go.mod h1:nLZns771ZGAwVLzTX/7Al6R9ehma4WUEhZGWV6CeQNQ= cloud.google.com/go/artifactregistry v1.12.0/go.mod h1:o6P3MIvtzTOnmvGagO9v/rOjjA0HmhJ+/6KAXrmYDCI= cloud.google.com/go/artifactregistry v1.13.0/go.mod h1:uy/LNfoOIivepGhooAUpL1i30Hgee3Cu0l4VTWHUC08= cloud.google.com/go/asset v1.5.0/go.mod h1:5mfs8UvcM5wHhqtSv8J1CtxxaQq3AdBxxQi2jGW/K4o= cloud.google.com/go/asset v1.7.0/go.mod h1:YbENsRK4+xTiL+Ofoj5Ckf+O17kJtgp3Y3nn4uzZz5s= cloud.google.com/go/asset v1.8.0/go.mod h1:mUNGKhiqIdbr8X7KNayoYvyc4HbbFO9URsjbytpUaW0= cloud.google.com/go/asset v1.9.0/go.mod h1:83MOE6jEJBMqFKadM9NLRcs80Gdw76qGuHn8m3h8oHQ= cloud.google.com/go/asset v1.10.0/go.mod h1:pLz7uokL80qKhzKr4xXGvBQXnzHn5evJAEAtZiIb0wY= cloud.google.com/go/asset v1.11.1/go.mod h1:fSwLhbRvC9p9CXQHJ3BgFeQNM4c9x10lqlrdEUYXlJo= cloud.google.com/go/asset v1.12.0/go.mod h1:h9/sFOa4eDIyKmH6QMpm4eUK3pDojWnUhTgJlk762Hg= cloud.google.com/go/asset v1.13.0/go.mod h1:WQAMyYek/b7NBpYq/K4KJWcRqzoalEsxz/t/dTk4THw= cloud.google.com/go/assuredworkloads v1.5.0/go.mod h1:n8HOZ6pff6re5KYfBXcFvSViQjDwxFkAkmUFffJRbbY= cloud.google.com/go/assuredworkloads v1.6.0/go.mod h1:yo2YOk37Yc89Rsd5QMVECvjaMKymF9OP+QXWlKXUkXw= cloud.google.com/go/assuredworkloads v1.7.0/go.mod h1:z/736/oNmtGAyU47reJgGN+KVoYoxeLBoj4XkKYscNI= cloud.google.com/go/assuredworkloads v1.8.0/go.mod h1:AsX2cqyNCOvEQC8RMPnoc0yEarXQk6WEKkxYfL6kGIo= cloud.google.com/go/assuredworkloads v1.9.0/go.mod h1:kFuI1P78bplYtT77Tb1hi0FMxM0vVpRC7VVoJC3ZoT0= cloud.google.com/go/assuredworkloads v1.10.0/go.mod h1:kwdUQuXcedVdsIaKgKTp9t0UJkE5+PAVNhdQm4ZVq2E= cloud.google.com/go/auth v0.18.2 h1:+Nbt5Ev0xEqxlNjd6c+yYUeosQ5TtEUaNcN/3FozlaM= cloud.google.com/go/auth v0.18.2/go.mod h1:xD+oY7gcahcu7G2SG2DsBerfFxgPAJz17zz2joOFF3M= cloud.google.com/go/auth/oauth2adapt v0.2.8 h1:keo8NaayQZ6wimpNSmW5OPc283g65QNIiLpZnkHRbnc= cloud.google.com/go/auth/oauth2adapt v0.2.8/go.mod h1:XQ9y31RkqZCcwJWNSx2Xvric3RrU88hAYYbjDWYDL+c= cloud.google.com/go/automl v1.5.0/go.mod h1:34EjfoFGMZ5sgJ9EoLsRtdPSNZLcfflJR39VbVNS2M0= cloud.google.com/go/automl v1.6.0/go.mod h1:ugf8a6Fx+zP0D59WLhqgTDsQI9w07o64uf/Is3Nh5p8= cloud.google.com/go/automl v1.7.0/go.mod h1:RL9MYCCsJEOmt0Wf3z9uzG0a7adTT1fe+aObgSpkCt8= cloud.google.com/go/automl v1.8.0/go.mod h1:xWx7G/aPEe/NP+qzYXktoBSDfjO+vnKMGgsApGJJquM= cloud.google.com/go/automl v1.12.0/go.mod h1:tWDcHDp86aMIuHmyvjuKeeHEGq76lD7ZqfGLN6B0NuU= cloud.google.com/go/baremetalsolution v0.3.0/go.mod h1:XOrocE+pvK1xFfleEnShBlNAXf+j5blPPxrhjKgnIFc= cloud.google.com/go/baremetalsolution v0.4.0/go.mod h1:BymplhAadOO/eBa7KewQ0Ppg4A4Wplbn+PsFKRLo0uI= cloud.google.com/go/baremetalsolution v0.5.0/go.mod h1:dXGxEkmR9BMwxhzBhV0AioD0ULBmuLZI8CdwalUxuss= cloud.google.com/go/batch v0.3.0/go.mod h1:TR18ZoAekj1GuirsUsR1ZTKN3FC/4UDnScjT8NXImFE= cloud.google.com/go/batch v0.4.0/go.mod h1:WZkHnP43R/QCGQsZ+0JyG4i79ranE2u8xvjq/9+STPE= cloud.google.com/go/batch v0.7.0/go.mod h1:vLZN95s6teRUqRQ4s3RLDsH8PvboqBK+rn1oevL159g= cloud.google.com/go/beyondcorp v0.2.0/go.mod h1:TB7Bd+EEtcw9PCPQhCJtJGjk/7TC6ckmnSFS+xwTfm4= cloud.google.com/go/beyondcorp v0.3.0/go.mod h1:E5U5lcrcXMsCuoDNyGrpyTm/hn7ne941Jz2vmksAxW8= cloud.google.com/go/beyondcorp v0.4.0/go.mod h1:3ApA0mbhHx6YImmuubf5pyW8srKnCEPON32/5hj+RmM= cloud.google.com/go/beyondcorp v0.5.0/go.mod h1:uFqj9X+dSfrheVp7ssLTaRHd2EHqSL4QZmH4e8WXGGU= cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE= cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc= cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg= cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc= cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ= cloud.google.com/go/bigquery v1.42.0/go.mod h1:8dRTJxhtG+vwBKzE5OseQn/hiydoQN3EedCaOdYmxRA= cloud.google.com/go/bigquery v1.43.0/go.mod h1:ZMQcXHsl+xmU1z36G2jNGZmKp9zNY5BUua5wDgmNCfw= cloud.google.com/go/bigquery v1.44.0/go.mod h1:0Y33VqXTEsbamHJvJHdFmtqHvMIY28aK1+dFsvaChGc= cloud.google.com/go/bigquery v1.47.0/go.mod h1:sA9XOgy0A8vQK9+MWhEQTY6Tix87M/ZurWFIxmF9I/E= cloud.google.com/go/bigquery v1.48.0/go.mod h1:QAwSz+ipNgfL5jxiaK7weyOhzdoAy1zFm0Nf1fysJac= cloud.google.com/go/bigquery v1.49.0/go.mod h1:Sv8hMmTFFYBlt/ftw2uN6dFdQPzBlREY9yBh7Oy7/4Q= cloud.google.com/go/bigquery v1.50.0/go.mod h1:YrleYEh2pSEbgTBZYMJ5SuSr0ML3ypjRB1zgf7pvQLU= cloud.google.com/go/bigquery v1.74.0 h1:Q6bAMv+eyvufOpIrfrYxhM46qq1D3ZQTdgUDQqKS+n8= cloud.google.com/go/bigquery v1.74.0/go.mod h1:iViO7Cx3A/cRKcHNRsHB3yqGAMInFBswrE9Pxazsc90= cloud.google.com/go/billing v1.4.0/go.mod h1:g9IdKBEFlItS8bTtlrZdVLWSSdSyFUZKXNS02zKMOZY= cloud.google.com/go/billing v1.5.0/go.mod h1:mztb1tBc3QekhjSgmpf/CV4LzWXLzCArwpLmP2Gm88s= cloud.google.com/go/billing v1.6.0/go.mod h1:WoXzguj+BeHXPbKfNWkqVtDdzORazmCjraY+vrxcyvI= cloud.google.com/go/billing v1.7.0/go.mod h1:q457N3Hbj9lYwwRbnlD7vUpyjq6u5U1RAOArInEiD5Y= cloud.google.com/go/billing v1.12.0/go.mod h1:yKrZio/eu+okO/2McZEbch17O5CB5NpZhhXG6Z766ss= cloud.google.com/go/billing v1.13.0/go.mod h1:7kB2W9Xf98hP9Sr12KfECgfGclsH3CQR0R08tnRlRbc= cloud.google.com/go/binaryauthorization v1.1.0/go.mod h1:xwnoWu3Y84jbuHa0zd526MJYmtnVXn0syOjaJgy4+dM= cloud.google.com/go/binaryauthorization v1.2.0/go.mod h1:86WKkJHtRcv5ViNABtYMhhNWRrD1Vpi//uKEy7aYEfI= cloud.google.com/go/binaryauthorization v1.3.0/go.mod h1:lRZbKgjDIIQvzYQS1p99A7/U1JqvqeZg0wiI5tp6tg0= cloud.google.com/go/binaryauthorization v1.4.0/go.mod h1:tsSPQrBd77VLplV70GUhBf/Zm3FsKmgSqgm4UmiDItk= cloud.google.com/go/binaryauthorization v1.5.0/go.mod h1:OSe4OU1nN/VswXKRBmciKpo9LulY41gch5c68htf3/Q= cloud.google.com/go/certificatemanager v1.3.0/go.mod h1:n6twGDvcUBFu9uBgt4eYvvf3sQ6My8jADcOVwHmzadg= cloud.google.com/go/certificatemanager v1.4.0/go.mod h1:vowpercVFyqs8ABSmrdV+GiFf2H/ch3KyudYQEMM590= cloud.google.com/go/certificatemanager v1.6.0/go.mod h1:3Hh64rCKjRAX8dXgRAyOcY5vQ/fE1sh8o+Mdd6KPgY8= cloud.google.com/go/channel v1.8.0/go.mod h1:W5SwCXDJsq/rg3tn3oG0LOxpAo6IMxNa09ngphpSlnk= cloud.google.com/go/channel v1.9.0/go.mod h1:jcu05W0my9Vx4mt3/rEHpfxc9eKi9XwsdDL8yBMbKUk= cloud.google.com/go/channel v1.11.0/go.mod h1:IdtI0uWGqhEeatSB62VOoJ8FSUhJ9/+iGkJVqp74CGE= cloud.google.com/go/channel v1.12.0/go.mod h1:VkxCGKASi4Cq7TbXxlaBezonAYpp1GCnKMY6tnMQnLU= cloud.google.com/go/cloudbuild v1.3.0/go.mod h1:WequR4ULxlqvMsjDEEEFnOG5ZSRSgWOywXYDb1vPE6U= cloud.google.com/go/cloudbuild v1.4.0/go.mod h1:5Qwa40LHiOXmz3386FrjrYM93rM/hdRr7b53sySrTqA= cloud.google.com/go/cloudbuild v1.6.0/go.mod h1:UIbc/w9QCbH12xX+ezUsgblrWv+Cv4Tw83GiSMHOn9M= cloud.google.com/go/cloudbuild v1.7.0/go.mod h1:zb5tWh2XI6lR9zQmsm1VRA+7OCuve5d8S+zJUul8KTg= cloud.google.com/go/cloudbuild v1.9.0/go.mod h1:qK1d7s4QlO0VwfYn5YuClDGg2hfmLZEb4wQGAbIgL1s= cloud.google.com/go/clouddms v1.3.0/go.mod h1:oK6XsCDdW4Ib3jCCBugx+gVjevp2TMXFtgxvPSee3OM= cloud.google.com/go/clouddms v1.4.0/go.mod h1:Eh7sUGCC+aKry14O1NRljhjyrr0NFC0G2cjwX0cByRk= cloud.google.com/go/clouddms v1.5.0/go.mod h1:QSxQnhikCLUw13iAbffF2CZxAER3xDGNHjsTAkQJcQA= cloud.google.com/go/cloudtasks v1.5.0/go.mod h1:fD92REy1x5woxkKEkLdvavGnPJGEn8Uic9nWuLzqCpY= cloud.google.com/go/cloudtasks v1.6.0/go.mod h1:C6Io+sxuke9/KNRkbQpihnW93SWDU3uXt92nu85HkYI= cloud.google.com/go/cloudtasks v1.7.0/go.mod h1:ImsfdYWwlWNJbdgPIIGJWC+gemEGTBK/SunNQQNCAb4= cloud.google.com/go/cloudtasks v1.8.0/go.mod h1:gQXUIwCSOI4yPVK7DgTVFiiP0ZW/eQkydWzwVMdHxrI= cloud.google.com/go/cloudtasks v1.9.0/go.mod h1:w+EyLsVkLWHcOaqNEyvcKAsWp9p29dL6uL9Nst1cI7Y= cloud.google.com/go/cloudtasks v1.10.0/go.mod h1:NDSoTLkZ3+vExFEWu2UJV1arUyzVDAiZtdWcsUyNwBs= cloud.google.com/go/compute v0.1.0/go.mod h1:GAesmwr110a34z04OlxYkATPBEfVhkymfTBXtfbBFow= cloud.google.com/go/compute v1.3.0/go.mod h1:cCZiE1NHEtai4wiufUhW8I8S1JKkAnhnQJWM7YD99wM= cloud.google.com/go/compute v1.5.0/go.mod h1:9SMHyhJlzhlkJqrPAc839t2BZFTSk6Jdj6mkzQJeu0M= cloud.google.com/go/compute v1.6.0/go.mod h1:T29tfhtVbq1wvAPo0E3+7vhgmkOYeXjhFvz/FMzPu0s= cloud.google.com/go/compute v1.6.1/go.mod h1:g85FgpzFvNULZ+S8AYq87axRKuf2Kh7deLqV/jJ3thU= cloud.google.com/go/compute v1.7.0/go.mod h1:435lt8av5oL9P3fv1OEzSbSUe+ybHXGMPQHHZWZxy9U= cloud.google.com/go/compute v1.10.0/go.mod h1:ER5CLbMxl90o2jtNbGSbtfOpQKR0t15FOtRsugnLrlU= cloud.google.com/go/compute v1.12.0/go.mod h1:e8yNOBcBONZU1vJKCvCoDw/4JQsA0dpM4x/6PIIOocU= cloud.google.com/go/compute v1.12.1/go.mod h1:e8yNOBcBONZU1vJKCvCoDw/4JQsA0dpM4x/6PIIOocU= cloud.google.com/go/compute v1.13.0/go.mod h1:5aPTS0cUNMIc1CE546K+Th6weJUNQErARyZtRXDJ8GE= cloud.google.com/go/compute v1.14.0/go.mod h1:YfLtxrj9sU4Yxv+sXzZkyPjEyPBZfXHUvjxega5vAdo= cloud.google.com/go/compute v1.15.1/go.mod h1:bjjoF/NtFUrkD/urWfdHaKuOPDR5nWIs63rR+SXhcpA= cloud.google.com/go/compute v1.18.0/go.mod h1:1X7yHxec2Ga+Ss6jPyjxRxpu2uu7PLgsOVXvgU0yacs= cloud.google.com/go/compute v1.19.0/go.mod h1:rikpw2y+UMidAe9tISo04EHNOIf42RLYF/q8Bs93scU= cloud.google.com/go/compute v1.19.1/go.mod h1:6ylj3a05WF8leseCdIf77NK0g1ey+nj5IKd5/kvShxE= cloud.google.com/go/compute/metadata v0.1.0/go.mod h1:Z1VN+bulIf6bt4P/C37K4DyZYZEXYonfTBHHFPO/4UU= cloud.google.com/go/compute/metadata v0.2.0/go.mod h1:zFmK7XCadkQkj6TtorcaGlCW1hT1fIilQDwofLpJ20k= cloud.google.com/go/compute/metadata v0.2.1/go.mod h1:jgHgmJd2RKBGzXqF5LR2EZMGxBkeanZ9wwa75XHJgOM= cloud.google.com/go/compute/metadata v0.2.3/go.mod h1:VAV5nSsACxMJvgaAuX6Pk2AawlZn8kiOGuCv6gTkwuA= cloud.google.com/go/compute/metadata v0.9.0 h1:pDUj4QMoPejqq20dK0Pg2N4yG9zIkYGdBtwLoEkH9Zs= cloud.google.com/go/compute/metadata v0.9.0/go.mod h1:E0bWwX5wTnLPedCKqk3pJmVgCBSM6qQI1yTBdEb3C10= cloud.google.com/go/contactcenterinsights v1.3.0/go.mod h1:Eu2oemoePuEFc/xKFPjbTuPSj0fYJcPls9TFlPNnHHY= cloud.google.com/go/contactcenterinsights v1.4.0/go.mod h1:L2YzkGbPsv+vMQMCADxJoT9YiTTnSEd6fEvCeHTYVck= cloud.google.com/go/contactcenterinsights v1.6.0/go.mod h1:IIDlT6CLcDoyv79kDv8iWxMSTZhLxSCofVV5W6YFM/w= cloud.google.com/go/container v1.6.0/go.mod h1:Xazp7GjJSeUYo688S+6J5V+n/t+G5sKBTFkKNudGRxg= cloud.google.com/go/container v1.7.0/go.mod h1:Dp5AHtmothHGX3DwwIHPgq45Y8KmNsgN3amoYfxVkLo= cloud.google.com/go/container v1.13.1/go.mod h1:6wgbMPeQRw9rSnKBCAJXnds3Pzj03C4JHamr8asWKy4= cloud.google.com/go/container v1.14.0/go.mod h1:3AoJMPhHfLDxLvrlVWaK57IXzaPnLaZq63WX59aQBfM= cloud.google.com/go/container v1.15.0/go.mod h1:ft+9S0WGjAyjDggg5S06DXj+fHJICWg8L7isCQe9pQA= cloud.google.com/go/containeranalysis v0.5.1/go.mod h1:1D92jd8gRR/c0fGMlymRgxWD3Qw9C1ff6/T7mLgVL8I= cloud.google.com/go/containeranalysis v0.6.0/go.mod h1:HEJoiEIu+lEXM+k7+qLCci0h33lX3ZqoYFdmPcoO7s4= cloud.google.com/go/containeranalysis v0.7.0/go.mod h1:9aUL+/vZ55P2CXfuZjS4UjQ9AgXoSw8Ts6lemfmxBxI= cloud.google.com/go/containeranalysis v0.9.0/go.mod h1:orbOANbwk5Ejoom+s+DUCTTJ7IBdBQJDcSylAx/on9s= cloud.google.com/go/datacatalog v1.3.0/go.mod h1:g9svFY6tuR+j+hrTw3J2dNcmI0dzmSiyOzm8kpLq0a0= cloud.google.com/go/datacatalog v1.5.0/go.mod h1:M7GPLNQeLfWqeIm3iuiruhPzkt65+Bx8dAKvScX8jvs= cloud.google.com/go/datacatalog v1.6.0/go.mod h1:+aEyF8JKg+uXcIdAmmaMUmZ3q1b/lKLtXCmXdnc0lbc= cloud.google.com/go/datacatalog v1.7.0/go.mod h1:9mEl4AuDYWw81UGc41HonIHH7/sn52H0/tc8f8ZbZIE= cloud.google.com/go/datacatalog v1.8.0/go.mod h1:KYuoVOv9BM8EYz/4eMFxrr4DUKhGIOXxZoKYF5wdISM= cloud.google.com/go/datacatalog v1.8.1/go.mod h1:RJ58z4rMp3gvETA465Vg+ag8BGgBdnRPEMMSTr5Uv+M= cloud.google.com/go/datacatalog v1.12.0/go.mod h1:CWae8rFkfp6LzLumKOnmVh4+Zle4A3NXLzVJ1d1mRm0= cloud.google.com/go/datacatalog v1.13.0/go.mod h1:E4Rj9a5ZtAxcQJlEBTLgMTphfP11/lNaAshpoBgemX8= cloud.google.com/go/datacatalog v1.26.1 h1:bCRKA8uSQN8wGW3Tw0gwko4E9a64GRmbW1nCblhgC2k= cloud.google.com/go/datacatalog v1.26.1/go.mod h1:2Qcq8vsHNxMDgjgadRFmFG47Y+uuIVsyEGUrlrKEdrg= cloud.google.com/go/dataflow v0.6.0/go.mod h1:9QwV89cGoxjjSR9/r7eFDqqjtvbKxAK2BaYU6PVk9UM= cloud.google.com/go/dataflow v0.7.0/go.mod h1:PX526vb4ijFMesO1o202EaUmouZKBpjHsTlCtB4parQ= cloud.google.com/go/dataflow v0.8.0/go.mod h1:Rcf5YgTKPtQyYz8bLYhFoIV/vP39eL7fWNcSOyFfLJE= cloud.google.com/go/dataform v0.3.0/go.mod h1:cj8uNliRlHpa6L3yVhDOBrUXH+BPAO1+KFMQQNSThKo= cloud.google.com/go/dataform v0.4.0/go.mod h1:fwV6Y4Ty2yIFL89huYlEkwUPtS7YZinZbzzj5S9FzCE= cloud.google.com/go/dataform v0.5.0/go.mod h1:GFUYRe8IBa2hcomWplodVmUx/iTL0FrsauObOM3Ipr0= cloud.google.com/go/dataform v0.6.0/go.mod h1:QPflImQy33e29VuapFdf19oPbE4aYTJxr31OAPV+ulA= cloud.google.com/go/dataform v0.7.0/go.mod h1:7NulqnVozfHvWUBpMDfKMUESr+85aJsC/2O0o3jWPDE= cloud.google.com/go/datafusion v1.4.0/go.mod h1:1Zb6VN+W6ALo85cXnM1IKiPw+yQMKMhB9TsTSRDo/38= cloud.google.com/go/datafusion v1.5.0/go.mod h1:Kz+l1FGHB0J+4XF2fud96WMmRiq/wj8N9u007vyXZ2w= cloud.google.com/go/datafusion v1.6.0/go.mod h1:WBsMF8F1RhSXvVM8rCV3AeyWVxcC2xY6vith3iw3S+8= cloud.google.com/go/datalabeling v0.5.0/go.mod h1:TGcJ0G2NzcsXSE/97yWjIZO0bXj0KbVlINXMG9ud42I= cloud.google.com/go/datalabeling v0.6.0/go.mod h1:WqdISuk/+WIGeMkpw/1q7bK/tFEZxsrFJOJdY2bXvTQ= cloud.google.com/go/datalabeling v0.7.0/go.mod h1:WPQb1y08RJbmpM3ww0CSUAGweL0SxByuW2E+FU+wXcM= cloud.google.com/go/dataplex v1.3.0/go.mod h1:hQuRtDg+fCiFgC8j0zV222HvzFQdRd+SVX8gdmFcZzA= cloud.google.com/go/dataplex v1.4.0/go.mod h1:X51GfLXEMVJ6UN47ESVqvlsRplbLhcsAt0kZCCKsU0A= cloud.google.com/go/dataplex v1.5.2/go.mod h1:cVMgQHsmfRoI5KFYq4JtIBEUbYwc3c7tXmIDhRmNNVQ= cloud.google.com/go/dataplex v1.6.0/go.mod h1:bMsomC/aEJOSpHXdFKFGQ1b0TDPIeL28nJObeO1ppRs= cloud.google.com/go/dataproc v1.7.0/go.mod h1:CKAlMjII9H90RXaMpSxQ8EU6dQx6iAYNPcYPOkSbi8s= cloud.google.com/go/dataproc v1.8.0/go.mod h1:5OW+zNAH0pMpw14JVrPONsxMQYMBqJuzORhIBfBn9uI= cloud.google.com/go/dataproc v1.12.0/go.mod h1:zrF3aX0uV3ikkMz6z4uBbIKyhRITnxvr4i3IjKsKrw4= cloud.google.com/go/dataqna v0.5.0/go.mod h1:90Hyk596ft3zUQ8NkFfvICSIfHFh1Bc7C4cK3vbhkeo= cloud.google.com/go/dataqna v0.6.0/go.mod h1:1lqNpM7rqNLVgWBJyk5NF6Uen2PHym0jtVJonplVsDA= cloud.google.com/go/dataqna v0.7.0/go.mod h1:Lx9OcIIeqCrw1a6KdO3/5KMP1wAmTc0slZWwP12Qq3c= 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/datastore v1.10.0/go.mod h1:PC5UzAmDEkAmkfaknstTYbNpgE49HAgW2J1gcgUfmdM= cloud.google.com/go/datastore v1.11.0/go.mod h1:TvGxBIHCS50u8jzG+AW/ppf87v1of8nwzFNgEZU1D3c= cloud.google.com/go/datastream v1.2.0/go.mod h1:i/uTP8/fZwgATHS/XFu0TcNUhuA0twZxxQ3EyCUQMwo= cloud.google.com/go/datastream v1.3.0/go.mod h1:cqlOX8xlyYF/uxhiKn6Hbv6WjwPPuI9W2M9SAXwaLLQ= cloud.google.com/go/datastream v1.4.0/go.mod h1:h9dpzScPhDTs5noEMQVWP8Wx8AFBRyS0s8KWPx/9r0g= cloud.google.com/go/datastream v1.5.0/go.mod h1:6TZMMNPwjUqZHBKPQ1wwXpb0d5VDVPl2/XoS5yi88q4= cloud.google.com/go/datastream v1.6.0/go.mod h1:6LQSuswqLa7S4rPAOZFVjHIG3wJIjZcZrw8JDEDJuIs= cloud.google.com/go/datastream v1.7.0/go.mod h1:uxVRMm2elUSPuh65IbZpzJNMbuzkcvu5CjMqVIUHrww= cloud.google.com/go/deploy v1.4.0/go.mod h1:5Xghikd4VrmMLNaF6FiRFDlHb59VM59YoDQnOUdsH/c= cloud.google.com/go/deploy v1.5.0/go.mod h1:ffgdD0B89tToyW/U/D2eL0jN2+IEV/3EMuXHA0l4r+s= cloud.google.com/go/deploy v1.6.0/go.mod h1:f9PTHehG/DjCom3QH0cntOVRm93uGBDt2vKzAPwpXQI= cloud.google.com/go/deploy v1.8.0/go.mod h1:z3myEJnA/2wnB4sgjqdMfgxCA0EqC3RBTNcVPs93mtQ= cloud.google.com/go/dialogflow v1.15.0/go.mod h1:HbHDWs33WOGJgn6rfzBW1Kv807BE3O1+xGbn59zZWI4= cloud.google.com/go/dialogflow v1.16.1/go.mod h1:po6LlzGfK+smoSmTBnbkIZY2w8ffjz/RcGSS+sh1el0= cloud.google.com/go/dialogflow v1.17.0/go.mod h1:YNP09C/kXA1aZdBgC/VtXX74G/TKn7XVCcVumTflA+8= cloud.google.com/go/dialogflow v1.18.0/go.mod h1:trO7Zu5YdyEuR+BhSNOqJezyFQ3aUzz0njv7sMx/iek= cloud.google.com/go/dialogflow v1.19.0/go.mod h1:JVmlG1TwykZDtxtTXujec4tQ+D8SBFMoosgy+6Gn0s0= cloud.google.com/go/dialogflow v1.29.0/go.mod h1:b+2bzMe+k1s9V+F2jbJwpHPzrnIyHihAdRFMtn2WXuM= cloud.google.com/go/dialogflow v1.31.0/go.mod h1:cuoUccuL1Z+HADhyIA7dci3N5zUssgpBJmCzI6fNRB4= cloud.google.com/go/dialogflow v1.32.0/go.mod h1:jG9TRJl8CKrDhMEcvfcfFkkpp8ZhgPz3sBGmAUYJ2qE= cloud.google.com/go/dlp v1.6.0/go.mod h1:9eyB2xIhpU0sVwUixfBubDoRwP+GjeUoxxeueZmqvmM= cloud.google.com/go/dlp v1.7.0/go.mod h1:68ak9vCiMBjbasxeVD17hVPxDEck+ExiHavX8kiHG+Q= cloud.google.com/go/dlp v1.9.0/go.mod h1:qdgmqgTyReTz5/YNSSuueR8pl7hO0o9bQ39ZhtgkWp4= cloud.google.com/go/documentai v1.7.0/go.mod h1:lJvftZB5NRiFSX4moiye1SMxHx0Bc3x1+p9e/RfXYiU= cloud.google.com/go/documentai v1.8.0/go.mod h1:xGHNEB7CtsnySCNrCFdCyyMz44RhFEEX2Q7UD0c5IhU= cloud.google.com/go/documentai v1.9.0/go.mod h1:FS5485S8R00U10GhgBC0aNGrJxBP8ZVpEeJ7PQDZd6k= cloud.google.com/go/documentai v1.10.0/go.mod h1:vod47hKQIPeCfN2QS/jULIvQTugbmdc0ZvxxfQY1bg4= cloud.google.com/go/documentai v1.16.0/go.mod h1:o0o0DLTEZ+YnJZ+J4wNfTxmDVyrkzFvttBXXtYRMHkM= cloud.google.com/go/documentai v1.18.0/go.mod h1:F6CK6iUH8J81FehpskRmhLq/3VlwQvb7TvwOceQ2tbs= cloud.google.com/go/domains v0.6.0/go.mod h1:T9Rz3GasrpYk6mEGHh4rymIhjlnIuB4ofT1wTxDeT4Y= cloud.google.com/go/domains v0.7.0/go.mod h1:PtZeqS1xjnXuRPKE/88Iru/LdfoRyEHYA9nFQf4UKpg= cloud.google.com/go/domains v0.8.0/go.mod h1:M9i3MMDzGFXsydri9/vW+EWz9sWb4I6WyHqdlAk0idE= cloud.google.com/go/edgecontainer v0.1.0/go.mod h1:WgkZ9tp10bFxqO8BLPqv2LlfmQF1X8lZqwW4r1BTajk= cloud.google.com/go/edgecontainer v0.2.0/go.mod h1:RTmLijy+lGpQ7BXuTDa4C4ssxyXT34NIuHIgKuP4s5w= cloud.google.com/go/edgecontainer v0.3.0/go.mod h1:FLDpP4nykgwwIfcLt6zInhprzw0lEi2P1fjO6Ie0qbc= cloud.google.com/go/edgecontainer v1.0.0/go.mod h1:cttArqZpBB2q58W/upSG++ooo6EsblxDIolxa3jSjbY= cloud.google.com/go/errorreporting v0.3.0/go.mod h1:xsP2yaAp+OAW4OIm60An2bbLpqIhKXdWR/tawvl7QzU= cloud.google.com/go/essentialcontacts v1.3.0/go.mod h1:r+OnHa5jfj90qIfZDO/VztSFqbQan7HV75p8sA+mdGI= cloud.google.com/go/essentialcontacts v1.4.0/go.mod h1:8tRldvHYsmnBCHdFpvU+GL75oWiBKl80BiqlFh9tp+8= cloud.google.com/go/essentialcontacts v1.5.0/go.mod h1:ay29Z4zODTuwliK7SnX8E86aUF2CTzdNtvv42niCX0M= cloud.google.com/go/eventarc v1.7.0/go.mod h1:6ctpF3zTnaQCxUjHUdcfgcA1A2T309+omHZth7gDfmc= cloud.google.com/go/eventarc v1.8.0/go.mod h1:imbzxkyAU4ubfsaKYdQg04WS1NvncblHEup4kvF+4gw= cloud.google.com/go/eventarc v1.10.0/go.mod h1:u3R35tmZ9HvswGRBnF48IlYgYeBcPUCjkr4BTdem2Kw= cloud.google.com/go/eventarc v1.11.0/go.mod h1:PyUjsUKPWoRBCHeOxZd/lbOOjahV41icXyUY5kSTvVY= cloud.google.com/go/filestore v1.3.0/go.mod h1:+qbvHGvXU1HaKX2nD0WEPo92TP/8AQuCVEBXNY9z0+w= cloud.google.com/go/filestore v1.4.0/go.mod h1:PaG5oDfo9r224f8OYXURtAsY+Fbyq/bLYoINEK8XQAI= cloud.google.com/go/filestore v1.5.0/go.mod h1:FqBXDWBp4YLHqRnVGveOkHDf8svj9r5+mUDLupOWEDs= cloud.google.com/go/filestore v1.6.0/go.mod h1:di5unNuss/qfZTw2U9nhFqo8/ZDSc466dre85Kydllg= cloud.google.com/go/firestore v1.1.0/go.mod h1:ulACoGHTpvq5r8rxGJ4ddJZBZqakUQqClKRT5SZwBmk= cloud.google.com/go/firestore v1.9.0/go.mod h1:HMkjKHNTtRyZNiMzu7YAsLr9K3X2udY2AMwDaMEQiiE= cloud.google.com/go/functions v1.6.0/go.mod h1:3H1UA3qiIPRWD7PeZKLvHZ9SaQhR26XIJcC0A5GbvAk= cloud.google.com/go/functions v1.7.0/go.mod h1:+d+QBcWM+RsrgZfV9xo6KfA1GlzJfxcfZcRPEhDDfzg= cloud.google.com/go/functions v1.8.0/go.mod h1:RTZ4/HsQjIqIYP9a9YPbU+QFoQsAlYgrwOXJWHn1POY= cloud.google.com/go/functions v1.9.0/go.mod h1:Y+Dz8yGguzO3PpIjhLTbnqV1CWmgQ5UwtlpzoyquQ08= cloud.google.com/go/functions v1.10.0/go.mod h1:0D3hEOe3DbEvCXtYOZHQZmD+SzYsi1YbI7dGvHfldXw= cloud.google.com/go/functions v1.12.0/go.mod h1:AXWGrF3e2C/5ehvwYo/GH6O5s09tOPksiKhz+hH8WkA= cloud.google.com/go/functions v1.13.0/go.mod h1:EU4O007sQm6Ef/PwRsI8N2umygGqPBS/IZQKBQBcJ3c= cloud.google.com/go/gaming v1.5.0/go.mod h1:ol7rGcxP/qHTRQE/RO4bxkXq+Fix0j6D4LFPzYTIrDM= cloud.google.com/go/gaming v1.6.0/go.mod h1:YMU1GEvA39Qt3zWGyAVA9bpYz/yAhTvaQ1t2sK4KPUA= cloud.google.com/go/gaming v1.7.0/go.mod h1:LrB8U7MHdGgFG851iHAfqUdLcKBdQ55hzXy9xBJz0+w= cloud.google.com/go/gaming v1.8.0/go.mod h1:xAqjS8b7jAVW0KFYeRUxngo9My3f33kFmua++Pi+ggM= cloud.google.com/go/gaming v1.9.0/go.mod h1:Fc7kEmCObylSWLO334NcO+O9QMDyz+TKC4v1D7X+Bc0= cloud.google.com/go/gkebackup v0.2.0/go.mod h1:XKvv/4LfG829/B8B7xRkk8zRrOEbKtEam6yNfuQNH60= cloud.google.com/go/gkebackup v0.3.0/go.mod h1:n/E671i1aOQvUxT541aTkCwExO/bTer2HDlj4TsBRAo= cloud.google.com/go/gkebackup v0.4.0/go.mod h1:byAyBGUwYGEEww7xsbnUTBHIYcOPy/PgUWUtOeRm9Vg= cloud.google.com/go/gkeconnect v0.5.0/go.mod h1:c5lsNAg5EwAy7fkqX/+goqFsU1Da/jQFqArp+wGNr/o= cloud.google.com/go/gkeconnect v0.6.0/go.mod h1:Mln67KyU/sHJEBY8kFZ0xTeyPtzbq9StAVvEULYK16A= cloud.google.com/go/gkeconnect v0.7.0/go.mod h1:SNfmVqPkaEi3bF/B3CNZOAYPYdg7sU+obZ+QTky2Myw= cloud.google.com/go/gkehub v0.9.0/go.mod h1:WYHN6WG8w9bXU0hqNxt8rm5uxnk8IH+lPY9J2TV7BK0= cloud.google.com/go/gkehub v0.10.0/go.mod h1:UIPwxI0DsrpsVoWpLB0stwKCP+WFVG9+y977wO+hBH0= cloud.google.com/go/gkehub v0.11.0/go.mod h1:JOWHlmN+GHyIbuWQPl47/C2RFhnFKH38jH9Ascu3n0E= cloud.google.com/go/gkehub v0.12.0/go.mod h1:djiIwwzTTBrF5NaXCGv3mf7klpEMcST17VBTVVDcuaw= cloud.google.com/go/gkemulticloud v0.3.0/go.mod h1:7orzy7O0S+5kq95e4Hpn7RysVA7dPs8W/GgfUtsPbrA= cloud.google.com/go/gkemulticloud v0.4.0/go.mod h1:E9gxVBnseLWCk24ch+P9+B2CoDFJZTyIgLKSalC7tuI= cloud.google.com/go/gkemulticloud v0.5.0/go.mod h1:W0JDkiyi3Tqh0TJr//y19wyb1yf8llHVto2Htf2Ja3Y= cloud.google.com/go/grafeas v0.2.0/go.mod h1:KhxgtF2hb0P191HlY5besjYm6MqTSTj3LSI+M+ByZHc= cloud.google.com/go/gsuiteaddons v1.3.0/go.mod h1:EUNK/J1lZEZO8yPtykKxLXI6JSVN2rg9bN8SXOa0bgM= cloud.google.com/go/gsuiteaddons v1.4.0/go.mod h1:rZK5I8hht7u7HxFQcFei0+AtfS9uSushomRlg+3ua1o= cloud.google.com/go/gsuiteaddons v1.5.0/go.mod h1:TFCClYLd64Eaa12sFVmUyG62tk4mdIsI7pAnSXRkcFo= cloud.google.com/go/iam v0.1.0/go.mod h1:vcUNEa0pEm0qRVpmWepWaFMIAI8/hjB9mO8rNCJtF6c= cloud.google.com/go/iam v0.3.0/go.mod h1:XzJPvDayI+9zsASAFO68Hk07u3z+f+JrT2xXNdp4bnY= cloud.google.com/go/iam v0.5.0/go.mod h1:wPU9Vt0P4UmCux7mqtRu6jcpPAb74cP1fh50J3QpkUc= cloud.google.com/go/iam v0.6.0/go.mod h1:+1AH33ueBne5MzYccyMHtEKqLE4/kJOibtffMHDMFMc= cloud.google.com/go/iam v0.7.0/go.mod h1:H5Br8wRaDGNc8XP3keLc4unfUUZeyH3Sfl9XpQEYOeg= cloud.google.com/go/iam v0.8.0/go.mod h1:lga0/y3iH6CX7sYqypWJ33hf7kkfXJag67naqGESjkE= cloud.google.com/go/iam v0.11.0/go.mod h1:9PiLDanza5D+oWFZiH1uG+RnRCfEGKoyl6yo4cgWZGY= cloud.google.com/go/iam v0.12.0/go.mod h1:knyHGviacl11zrtZUoDuYpDgLjvr28sLQaG0YB2GYAY= cloud.google.com/go/iam v0.13.0/go.mod h1:ljOg+rcNfzZ5d6f1nAUJ8ZIxOaZUVoS14bKCtaLZ/D0= cloud.google.com/go/iam v1.5.3 h1:+vMINPiDF2ognBJ97ABAYYwRgsaqxPbQDlMnbHMjolc= cloud.google.com/go/iam v1.5.3/go.mod h1:MR3v9oLkZCTlaqljW6Eb2d3HGDGK5/bDv93jhfISFvU= cloud.google.com/go/iap v1.4.0/go.mod h1:RGFwRJdihTINIe4wZ2iCP0zF/qu18ZwyKxrhMhygBEc= cloud.google.com/go/iap v1.5.0/go.mod h1:UH/CGgKd4KyohZL5Pt0jSKE4m3FR51qg6FKQ/z/Ix9A= cloud.google.com/go/iap v1.6.0/go.mod h1:NSuvI9C/j7UdjGjIde7t7HBz+QTwBcapPE07+sSRcLk= cloud.google.com/go/iap v1.7.0/go.mod h1:beqQx56T9O1G1yNPph+spKpNibDlYIiIixiqsQXxLIo= cloud.google.com/go/iap v1.7.1/go.mod h1:WapEwPc7ZxGt2jFGB/C/bm+hP0Y6NXzOYGjpPnmMS74= cloud.google.com/go/ids v1.1.0/go.mod h1:WIuwCaYVOzHIj2OhN9HAwvW+DBdmUAdcWlFxRl+KubM= cloud.google.com/go/ids v1.2.0/go.mod h1:5WXvp4n25S0rA/mQWAg1YEEBBq6/s+7ml1RDCW1IrcY= cloud.google.com/go/ids v1.3.0/go.mod h1:JBdTYwANikFKaDP6LtW5JAi4gubs57SVNQjemdt6xV4= cloud.google.com/go/iot v1.3.0/go.mod h1:r7RGh2B61+B8oz0AGE+J72AhA0G7tdXItODWsaA2oLs= cloud.google.com/go/iot v1.4.0/go.mod h1:dIDxPOn0UvNDUMD8Ger7FIaTuvMkj+aGk94RPP0iV+g= cloud.google.com/go/iot v1.5.0/go.mod h1:mpz5259PDl3XJthEmh9+ap0affn/MqNSP4My77Qql9o= cloud.google.com/go/iot v1.6.0/go.mod h1:IqdAsmE2cTYYNO1Fvjfzo9po179rAtJeVGUvkLN3rLE= cloud.google.com/go/kms v1.4.0/go.mod h1:fajBHndQ+6ubNw6Ss2sSd+SWvjL26RNo/dr7uxsnnOA= cloud.google.com/go/kms v1.5.0/go.mod h1:QJS2YY0eJGBg3mnDfuaCyLauWwBJiHRboYxJ++1xJNg= cloud.google.com/go/kms v1.6.0/go.mod h1:Jjy850yySiasBUDi6KFUwUv2n1+o7QZFyuUJg6OgjA0= cloud.google.com/go/kms v1.8.0/go.mod h1:4xFEhYFqvW+4VMELtZyxomGSYtSQKzM178ylFW4jMAg= cloud.google.com/go/kms v1.9.0/go.mod h1:qb1tPTgfF9RQP8e1wq4cLFErVuTJv7UsSC915J8dh3w= cloud.google.com/go/kms v1.10.0/go.mod h1:ng3KTUtQQU9bPX3+QGLsflZIHlkbn8amFAMY63m8d24= cloud.google.com/go/kms v1.10.1/go.mod h1:rIWk/TryCkR59GMC3YtHtXeLzd634lBbKenvyySAyYI= cloud.google.com/go/language v1.4.0/go.mod h1:F9dRpNFQmJbkaop6g0JhSBXCNlO90e1KWx5iDdxbWic= cloud.google.com/go/language v1.6.0/go.mod h1:6dJ8t3B+lUYfStgls25GusK04NLh3eDLQnWM3mdEbhI= cloud.google.com/go/language v1.7.0/go.mod h1:DJ6dYN/W+SQOjF8e1hLQXMF21AkH2w9wiPzPCJa2MIE= cloud.google.com/go/language v1.8.0/go.mod h1:qYPVHf7SPoNNiCL2Dr0FfEFNil1qi3pQEyygwpgVKB8= cloud.google.com/go/language v1.9.0/go.mod h1:Ns15WooPM5Ad/5no/0n81yUetis74g3zrbeJBE+ptUY= cloud.google.com/go/lifesciences v0.5.0/go.mod h1:3oIKy8ycWGPUyZDR/8RNnTOYevhaMLqh5vLUXs9zvT8= cloud.google.com/go/lifesciences v0.6.0/go.mod h1:ddj6tSX/7BOnhxCSd3ZcETvtNr8NZ6t/iPhY2Tyfu08= cloud.google.com/go/lifesciences v0.8.0/go.mod h1:lFxiEOMqII6XggGbOnKiyZ7IBwoIqA84ClvoezaA/bo= cloud.google.com/go/logging v1.6.1/go.mod h1:5ZO0mHHbvm8gEmeEUHrmDlTDSu5imF6MUP9OfilNXBw= cloud.google.com/go/logging v1.7.0/go.mod h1:3xjP2CjkM3ZkO73aj4ASA5wRPGGCRrPIAeNqVNkzY8M= cloud.google.com/go/logging v1.13.2 h1:qqlHCBvieJT9Cdq4QqYx1KPadCQ2noD4FK02eNqHAjA= cloud.google.com/go/logging v1.13.2/go.mod h1:zaybliM3yun1J8mU2dVQ1/qDzjbOqEijZCn6hSBtKak= cloud.google.com/go/longrunning v0.1.1/go.mod h1:UUFxuDWkv22EuY93jjmDMFT5GPQKeFVJBIF6QlTqdsE= cloud.google.com/go/longrunning v0.3.0/go.mod h1:qth9Y41RRSUE69rDcOn6DdK3HfQfsUI0YSmW3iIlLJc= cloud.google.com/go/longrunning v0.4.1/go.mod h1:4iWDqhBZ70CvZ6BfETbvam3T8FMvLK+eFj0E6AaRQTo= cloud.google.com/go/longrunning v0.8.0 h1:LiKK77J3bx5gDLi4SMViHixjD2ohlkwBi+mKA7EhfW8= cloud.google.com/go/longrunning v0.8.0/go.mod h1:UmErU2Onzi+fKDg2gR7dusz11Pe26aknR4kHmJJqIfk= cloud.google.com/go/managedidentities v1.3.0/go.mod h1:UzlW3cBOiPrzucO5qWkNkh0w33KFtBJU281hacNvsdE= cloud.google.com/go/managedidentities v1.4.0/go.mod h1:NWSBYbEMgqmbZsLIyKvxrYbtqOsxY1ZrGM+9RgDqInM= cloud.google.com/go/managedidentities v1.5.0/go.mod h1:+dWcZ0JlUmpuxpIDfyP5pP5y0bLdRwOS4Lp7gMni/LA= cloud.google.com/go/maps v0.1.0/go.mod h1:BQM97WGyfw9FWEmQMpZ5T6cpovXXSd1cGmFma94eubI= cloud.google.com/go/maps v0.6.0/go.mod h1:o6DAMMfb+aINHz/p/jbcY+mYeXBoZoxTfdSQ8VAJaCw= cloud.google.com/go/maps v0.7.0/go.mod h1:3GnvVl3cqeSvgMcpRlQidXsPYuDGQ8naBis7MVzpXsY= cloud.google.com/go/mediatranslation v0.5.0/go.mod h1:jGPUhGTybqsPQn91pNXw0xVHfuJ3leR1wj37oU3y1f4= cloud.google.com/go/mediatranslation v0.6.0/go.mod h1:hHdBCTYNigsBxshbznuIMFNe5QXEowAuNmmC7h8pu5w= cloud.google.com/go/mediatranslation v0.7.0/go.mod h1:LCnB/gZr90ONOIQLgSXagp8XUW1ODs2UmUMvcgMfI2I= cloud.google.com/go/memcache v1.4.0/go.mod h1:rTOfiGZtJX1AaFUrOgsMHX5kAzaTQ8azHiuDoTPzNsE= cloud.google.com/go/memcache v1.5.0/go.mod h1:dk3fCK7dVo0cUU2c36jKb4VqKPS22BTkf81Xq617aWM= cloud.google.com/go/memcache v1.6.0/go.mod h1:XS5xB0eQZdHtTuTF9Hf8eJkKtR3pVRCcvJwtm68T3rA= cloud.google.com/go/memcache v1.7.0/go.mod h1:ywMKfjWhNtkQTxrWxCkCFkoPjLHPW6A7WOTVI8xy3LY= cloud.google.com/go/memcache v1.9.0/go.mod h1:8oEyzXCu+zo9RzlEaEjHl4KkgjlNDaXbCQeQWlzNFJM= cloud.google.com/go/metastore v1.5.0/go.mod h1:2ZNrDcQwghfdtCwJ33nM0+GrBGlVuh8rakL3vdPY3XY= cloud.google.com/go/metastore v1.6.0/go.mod h1:6cyQTls8CWXzk45G55x57DVQ9gWg7RiH65+YgPsNh9s= cloud.google.com/go/metastore v1.7.0/go.mod h1:s45D0B4IlsINu87/AsWiEVYbLaIMeUSoxlKKDqBGFS8= cloud.google.com/go/metastore v1.8.0/go.mod h1:zHiMc4ZUpBiM7twCIFQmJ9JMEkDSyZS9U12uf7wHqSI= cloud.google.com/go/metastore v1.10.0/go.mod h1:fPEnH3g4JJAk+gMRnrAnoqyv2lpUCqJPWOodSaf45Eo= cloud.google.com/go/monitoring v1.7.0/go.mod h1:HpYse6kkGo//7p6sT0wsIC6IBDET0RhIsnmlA53dvEk= cloud.google.com/go/monitoring v1.8.0/go.mod h1:E7PtoMJ1kQXWxPjB6mv2fhC5/15jInuulFdYYtlcvT4= cloud.google.com/go/monitoring v1.12.0/go.mod h1:yx8Jj2fZNEkL/GYZyTLS4ZtZEZN8WtDEiEqG4kLK50w= cloud.google.com/go/monitoring v1.13.0/go.mod h1:k2yMBAB1H9JT/QETjNkgdCGD9bPF712XiLTVr+cBrpw= cloud.google.com/go/monitoring v1.24.3 h1:dde+gMNc0UhPZD1Azu6at2e79bfdztVDS5lvhOdsgaE= cloud.google.com/go/monitoring v1.24.3/go.mod h1:nYP6W0tm3N9H/bOw8am7t62YTzZY+zUeQ+Bi6+2eonI= cloud.google.com/go/networkconnectivity v1.4.0/go.mod h1:nOl7YL8odKyAOtzNX73/M5/mGZgqqMeryi6UPZTk/rA= cloud.google.com/go/networkconnectivity v1.5.0/go.mod h1:3GzqJx7uhtlM3kln0+x5wyFvuVH1pIBJjhCpjzSt75o= cloud.google.com/go/networkconnectivity v1.6.0/go.mod h1:OJOoEXW+0LAxHh89nXd64uGG+FbQoeH8DtxCHVOMlaM= cloud.google.com/go/networkconnectivity v1.7.0/go.mod h1:RMuSbkdbPwNMQjB5HBWD5MpTBnNm39iAVpC3TmsExt8= cloud.google.com/go/networkconnectivity v1.10.0/go.mod h1:UP4O4sWXJG13AqrTdQCD9TnLGEbtNRqjuaaA7bNjF5E= cloud.google.com/go/networkconnectivity v1.11.0/go.mod h1:iWmDD4QF16VCDLXUqvyspJjIEtBR/4zq5hwnY2X3scM= cloud.google.com/go/networkmanagement v1.4.0/go.mod h1:Q9mdLLRn60AsOrPc8rs8iNV6OHXaGcDdsIQe1ohekq8= cloud.google.com/go/networkmanagement v1.5.0/go.mod h1:ZnOeZ/evzUdUsnvRt792H0uYEnHQEMaz+REhhzJRcf4= cloud.google.com/go/networkmanagement v1.6.0/go.mod h1:5pKPqyXjB/sgtvB5xqOemumoQNB7y95Q7S+4rjSOPYY= cloud.google.com/go/networksecurity v0.5.0/go.mod h1:xS6fOCoqpVC5zx15Z/MqkfDwH4+m/61A3ODiDV1xmiQ= cloud.google.com/go/networksecurity v0.6.0/go.mod h1:Q5fjhTr9WMI5mbpRYEbiexTzROf7ZbDzvzCrNl14nyU= cloud.google.com/go/networksecurity v0.7.0/go.mod h1:mAnzoxx/8TBSyXEeESMy9OOYwo1v+gZ5eMRnsT5bC8k= cloud.google.com/go/networksecurity v0.8.0/go.mod h1:B78DkqsxFG5zRSVuwYFRZ9Xz8IcQ5iECsNrPn74hKHU= cloud.google.com/go/notebooks v1.2.0/go.mod h1:9+wtppMfVPUeJ8fIWPOq1UnATHISkGXGqTkxeieQ6UY= cloud.google.com/go/notebooks v1.3.0/go.mod h1:bFR5lj07DtCPC7YAAJ//vHskFBxA5JzYlH68kXVdk34= cloud.google.com/go/notebooks v1.4.0/go.mod h1:4QPMngcwmgb6uw7Po99B2xv5ufVoIQ7nOGDyL4P8AgA= cloud.google.com/go/notebooks v1.5.0/go.mod h1:q8mwhnP9aR8Hpfnrc5iN5IBhrXUy8S2vuYs+kBJ/gu0= cloud.google.com/go/notebooks v1.7.0/go.mod h1:PVlaDGfJgj1fl1S3dUwhFMXFgfYGhYQt2164xOMONmE= cloud.google.com/go/notebooks v1.8.0/go.mod h1:Lq6dYKOYOWUCTvw5t2q1gp1lAp0zxAxRycayS0iJcqQ= cloud.google.com/go/optimization v1.1.0/go.mod h1:5po+wfvX5AQlPznyVEZjGJTMr4+CAkJf2XSTQOOl9l4= cloud.google.com/go/optimization v1.2.0/go.mod h1:Lr7SOHdRDENsh+WXVmQhQTrzdu9ybg0NecjHidBq6xs= cloud.google.com/go/optimization v1.3.1/go.mod h1:IvUSefKiwd1a5p0RgHDbWCIbDFgKuEdB+fPPuP0IDLI= cloud.google.com/go/orchestration v1.3.0/go.mod h1:Sj5tq/JpWiB//X/q3Ngwdl5K7B7Y0KZ7bfv0wL6fqVA= cloud.google.com/go/orchestration v1.4.0/go.mod h1:6W5NLFWs2TlniBphAViZEVhrXRSMgUGDfW7vrWKvsBk= cloud.google.com/go/orchestration v1.6.0/go.mod h1:M62Bevp7pkxStDfFfTuCOaXgaaqRAga1yKyoMtEoWPQ= cloud.google.com/go/orgpolicy v1.4.0/go.mod h1:xrSLIV4RePWmP9P3tBl8S93lTmlAxjm06NSm2UTmKvE= cloud.google.com/go/orgpolicy v1.5.0/go.mod h1:hZEc5q3wzwXJaKrsx5+Ewg0u1LxJ51nNFlext7Tanwc= cloud.google.com/go/orgpolicy v1.10.0/go.mod h1:w1fo8b7rRqlXlIJbVhOMPrwVljyuW5mqssvBtU18ONc= cloud.google.com/go/osconfig v1.7.0/go.mod h1:oVHeCeZELfJP7XLxcBGTMBvRO+1nQ5tFG9VQTmYS2Fs= cloud.google.com/go/osconfig v1.8.0/go.mod h1:EQqZLu5w5XA7eKizepumcvWx+m8mJUhEwiPqWiZeEdg= cloud.google.com/go/osconfig v1.9.0/go.mod h1:Yx+IeIZJ3bdWmzbQU4fxNl8xsZ4amB+dygAwFPlvnNo= cloud.google.com/go/osconfig v1.10.0/go.mod h1:uMhCzqC5I8zfD9zDEAfvgVhDS8oIjySWh+l4WK6GnWw= cloud.google.com/go/osconfig v1.11.0/go.mod h1:aDICxrur2ogRd9zY5ytBLV89KEgT2MKB2L/n6x1ooPw= cloud.google.com/go/oslogin v1.4.0/go.mod h1:YdgMXWRaElXz/lDk1Na6Fh5orF7gvmJ0FGLIs9LId4E= cloud.google.com/go/oslogin v1.5.0/go.mod h1:D260Qj11W2qx/HVF29zBg+0fd6YCSjSqLUkY/qEenQU= cloud.google.com/go/oslogin v1.6.0/go.mod h1:zOJ1O3+dTU8WPlGEkFSh7qeHPPSoxrcMbbK1Nm2iX70= cloud.google.com/go/oslogin v1.7.0/go.mod h1:e04SN0xO1UNJ1M5GP0vzVBFicIe4O53FOfcixIqTyXo= cloud.google.com/go/oslogin v1.9.0/go.mod h1:HNavntnH8nzrn8JCTT5fj18FuJLFJc4NaZJtBnQtKFs= cloud.google.com/go/phishingprotection v0.5.0/go.mod h1:Y3HZknsK9bc9dMi+oE8Bim0lczMU6hrX0UpADuMefr0= cloud.google.com/go/phishingprotection v0.6.0/go.mod h1:9Y3LBLgy0kDTcYET8ZH3bq/7qni15yVUoAxiFxnlSUA= cloud.google.com/go/phishingprotection v0.7.0/go.mod h1:8qJI4QKHoda/sb/7/YmMQ2omRLSLYSu9bU0EKCNI+Lk= cloud.google.com/go/policytroubleshooter v1.3.0/go.mod h1:qy0+VwANja+kKrjlQuOzmlvscn4RNsAc0e15GGqfMxg= cloud.google.com/go/policytroubleshooter v1.4.0/go.mod h1:DZT4BcRw3QoO8ota9xw/LKtPa8lKeCByYeKTIf/vxdE= cloud.google.com/go/policytroubleshooter v1.5.0/go.mod h1:Rz1WfV+1oIpPdN2VvvuboLVRsB1Hclg3CKQ53j9l8vw= cloud.google.com/go/policytroubleshooter v1.6.0/go.mod h1:zYqaPTsmfvpjm5ULxAyD/lINQxJ0DDsnWOP/GZ7xzBc= cloud.google.com/go/privatecatalog v0.5.0/go.mod h1:XgosMUvvPyxDjAVNDYxJ7wBW8//hLDDYmnsNcMGq1K0= cloud.google.com/go/privatecatalog v0.6.0/go.mod h1:i/fbkZR0hLN29eEWiiwue8Pb+GforiEIBnV9yrRUOKI= cloud.google.com/go/privatecatalog v0.7.0/go.mod h1:2s5ssIFO69F5csTXcwBP7NPFTZvps26xGzvQ2PQaBYg= cloud.google.com/go/privatecatalog v0.8.0/go.mod h1:nQ6pfaegeDAq/Q5lrfCQzQLhubPiZhSaNhIgfJlnIXs= 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.26.0/go.mod h1:QgBH3U/jdJy/ftjPhTkyXNj543Tin1pRYcdcPRnFIRI= cloud.google.com/go/pubsub v1.27.1/go.mod h1:hQN39ymbV9geqBnfQq6Xf63yNhUAhv9CZhzp5O6qsW0= cloud.google.com/go/pubsub v1.28.0/go.mod h1:vuXFpwaVoIPQMGXqRyUQigu/AX1S3IWugR9xznmcXX8= cloud.google.com/go/pubsub v1.30.0/go.mod h1:qWi1OPS0B+b5L+Sg6Gmc9zD1Y+HaM0MdUr7LsupY1P4= cloud.google.com/go/pubsub/v2 v2.4.0 h1:oMKNiBQpXImRWnHYla9uSU66ZzByZwBSCJOEs/pTKVg= cloud.google.com/go/pubsub/v2 v2.4.0/go.mod h1:2lS/XQKq5qtOMs6kHBK+WX1ytUC36kLl2ig3zqsGUx8= cloud.google.com/go/pubsublite v1.5.0/go.mod h1:xapqNQ1CuLfGi23Yda/9l4bBCKz/wC3KIJ5gKcxveZg= cloud.google.com/go/pubsublite v1.6.0/go.mod h1:1eFCS0U11xlOuMFV/0iBqw3zP12kddMeCbj/F3FSj9k= cloud.google.com/go/pubsublite v1.7.0/go.mod h1:8hVMwRXfDfvGm3fahVbtDbiLePT3gpoiJYJY+vxWxVM= cloud.google.com/go/recaptchaenterprise v1.3.1/go.mod h1:OdD+q+y4XGeAlxRaMn1Y7/GveP6zmq76byL6tjPE7d4= cloud.google.com/go/recaptchaenterprise/v2 v2.1.0/go.mod h1:w9yVqajwroDNTfGuhmOjPDN//rZGySaf6PtFVcSCa7o= cloud.google.com/go/recaptchaenterprise/v2 v2.2.0/go.mod h1:/Zu5jisWGeERrd5HnlS3EUGb/D335f9k51B/FVil0jk= cloud.google.com/go/recaptchaenterprise/v2 v2.3.0/go.mod h1:O9LwGCjrhGHBQET5CA7dd5NwwNQUErSgEDit1DLNTdo= cloud.google.com/go/recaptchaenterprise/v2 v2.4.0/go.mod h1:Am3LHfOuBstrLrNCBrlI5sbwx9LBg3te2N6hGvHn2mE= cloud.google.com/go/recaptchaenterprise/v2 v2.5.0/go.mod h1:O8LzcHXN3rz0j+LBC91jrwI3R+1ZSZEWrfL7XHgNo9U= cloud.google.com/go/recaptchaenterprise/v2 v2.6.0/go.mod h1:RPauz9jeLtB3JVzg6nCbe12qNoaa8pXc4d/YukAmcnA= cloud.google.com/go/recaptchaenterprise/v2 v2.7.0/go.mod h1:19wVj/fs5RtYtynAPJdDTb69oW0vNHYDBTbB4NvMD9c= cloud.google.com/go/recommendationengine v0.5.0/go.mod h1:E5756pJcVFeVgaQv3WNpImkFP8a+RptV6dDLGPILjvg= cloud.google.com/go/recommendationengine v0.6.0/go.mod h1:08mq2umu9oIqc7tDy8sx+MNJdLG0fUi3vaSVbztHgJ4= cloud.google.com/go/recommendationengine v0.7.0/go.mod h1:1reUcE3GIu6MeBz/h5xZJqNLuuVjNg1lmWMPyjatzac= cloud.google.com/go/recommender v1.5.0/go.mod h1:jdoeiBIVrJe9gQjwd759ecLJbxCDED4A6p+mqoqDvTg= cloud.google.com/go/recommender v1.6.0/go.mod h1:+yETpm25mcoiECKh9DEScGzIRyDKpZ0cEhWGo+8bo+c= cloud.google.com/go/recommender v1.7.0/go.mod h1:XLHs/W+T8olwlGOgfQenXBTbIseGclClff6lhFVe9Bs= cloud.google.com/go/recommender v1.8.0/go.mod h1:PkjXrTT05BFKwxaUxQmtIlrtj0kph108r02ZZQ5FE70= cloud.google.com/go/recommender v1.9.0/go.mod h1:PnSsnZY7q+VL1uax2JWkt/UegHssxjUVVCrX52CuEmQ= cloud.google.com/go/redis v1.7.0/go.mod h1:V3x5Jq1jzUcg+UNsRvdmsfuFnit1cfe3Z/PGyq/lm4Y= cloud.google.com/go/redis v1.8.0/go.mod h1:Fm2szCDavWzBk2cDKxrkmWBqoCiL1+Ctwq7EyqBCA/A= cloud.google.com/go/redis v1.9.0/go.mod h1:HMYQuajvb2D0LvMgZmLDZW8V5aOC/WxstZHiy4g8OiA= cloud.google.com/go/redis v1.10.0/go.mod h1:ThJf3mMBQtW18JzGgh41/Wld6vnDDc/F/F35UolRZPM= cloud.google.com/go/redis v1.11.0/go.mod h1:/X6eicana+BWcUda5PpwZC48o37SiFVTFSs0fWAJ7uQ= cloud.google.com/go/resourcemanager v1.3.0/go.mod h1:bAtrTjZQFJkiWTPDb1WBjzvc6/kifjj4QBYuKCCoqKA= cloud.google.com/go/resourcemanager v1.4.0/go.mod h1:MwxuzkumyTX7/a3n37gmsT3py7LIXwrShilPh3P1tR0= cloud.google.com/go/resourcemanager v1.5.0/go.mod h1:eQoXNAiAvCf5PXxWxXjhKQoTMaUSNrEfg+6qdf/wots= cloud.google.com/go/resourcemanager v1.6.0/go.mod h1:YcpXGRs8fDzcUl1Xw8uOVmI8JEadvhRIkoXXUNVYcVo= cloud.google.com/go/resourcemanager v1.7.0/go.mod h1:HlD3m6+bwhzj9XCouqmeiGuni95NTrExfhoSrkC/3EI= cloud.google.com/go/resourcesettings v1.3.0/go.mod h1:lzew8VfESA5DQ8gdlHwMrqZs1S9V87v3oCnKCWoOuQU= cloud.google.com/go/resourcesettings v1.4.0/go.mod h1:ldiH9IJpcrlC3VSuCGvjR5of/ezRrOxFtpJoJo5SmXg= cloud.google.com/go/resourcesettings v1.5.0/go.mod h1:+xJF7QSG6undsQDfsCJyqWXyBwUoJLhetkRMDRnIoXA= cloud.google.com/go/retail v1.8.0/go.mod h1:QblKS8waDmNUhghY2TI9O3JLlFk8jybHeV4BF19FrE4= cloud.google.com/go/retail v1.9.0/go.mod h1:g6jb6mKuCS1QKnH/dpu7isX253absFl6iE92nHwlBUY= cloud.google.com/go/retail v1.10.0/go.mod h1:2gDk9HsL4HMS4oZwz6daui2/jmKvqShXKQuB2RZ+cCc= cloud.google.com/go/retail v1.11.0/go.mod h1:MBLk1NaWPmh6iVFSz9MeKG/Psyd7TAgm6y/9L2B4x9Y= cloud.google.com/go/retail v1.12.0/go.mod h1:UMkelN/0Z8XvKymXFbD4EhFJlYKRx1FGhQkVPU5kF14= cloud.google.com/go/run v0.2.0/go.mod h1:CNtKsTA1sDcnqqIFR3Pb5Tq0usWxJJvsWOCPldRU3Do= cloud.google.com/go/run v0.3.0/go.mod h1:TuyY1+taHxTjrD0ZFk2iAR+xyOXEA0ztb7U3UNA0zBo= cloud.google.com/go/run v0.8.0/go.mod h1:VniEnuBwqjigv0A7ONfQUaEItaiCRVujlMqerPPiktM= cloud.google.com/go/run v0.9.0/go.mod h1:Wwu+/vvg8Y+JUApMwEDfVfhetv30hCG4ZwDR/IXl2Qg= cloud.google.com/go/scheduler v1.4.0/go.mod h1:drcJBmxF3aqZJRhmkHQ9b3uSSpQoltBPGPxGAWROx6s= cloud.google.com/go/scheduler v1.5.0/go.mod h1:ri073ym49NW3AfT6DZi21vLZrG07GXr5p3H1KxN5QlI= cloud.google.com/go/scheduler v1.6.0/go.mod h1:SgeKVM7MIwPn3BqtcBntpLyrIJftQISRrYB5ZtT+KOk= cloud.google.com/go/scheduler v1.7.0/go.mod h1:jyCiBqWW956uBjjPMMuX09n3x37mtyPJegEWKxRsn44= cloud.google.com/go/scheduler v1.8.0/go.mod h1:TCET+Y5Gp1YgHT8py4nlg2Sew8nUHMqcpousDgXJVQc= cloud.google.com/go/scheduler v1.9.0/go.mod h1:yexg5t+KSmqu+njTIh3b7oYPheFtBWGcbVUYF1GGMIc= cloud.google.com/go/secretmanager v1.6.0/go.mod h1:awVa/OXF6IiyaU1wQ34inzQNc4ISIDIrId8qE5QGgKA= cloud.google.com/go/secretmanager v1.8.0/go.mod h1:hnVgi/bN5MYHd3Gt0SPuTPPp5ENina1/LxM+2W9U9J4= cloud.google.com/go/secretmanager v1.9.0/go.mod h1:b71qH2l1yHmWQHt9LC80akm86mX8AL6X1MA01dW8ht4= cloud.google.com/go/secretmanager v1.10.0/go.mod h1:MfnrdvKMPNra9aZtQFvBcvRU54hbPD8/HayQdlUgJpU= cloud.google.com/go/security v1.5.0/go.mod h1:lgxGdyOKKjHL4YG3/YwIL2zLqMFCKs0UbQwgyZmfJl4= cloud.google.com/go/security v1.7.0/go.mod h1:mZklORHl6Bg7CNnnjLH//0UlAlaXqiG7Lb9PsPXLfD0= cloud.google.com/go/security v1.8.0/go.mod h1:hAQOwgmaHhztFhiQ41CjDODdWP0+AE1B3sX4OFlq+GU= cloud.google.com/go/security v1.9.0/go.mod h1:6Ta1bO8LXI89nZnmnsZGp9lVoVWXqsVbIq/t9dzI+2Q= cloud.google.com/go/security v1.10.0/go.mod h1:QtOMZByJVlibUT2h9afNDWRZ1G96gVywH8T5GUSb9IA= cloud.google.com/go/security v1.12.0/go.mod h1:rV6EhrpbNHrrxqlvW0BWAIawFWq3X90SduMJdFwtLB8= cloud.google.com/go/security v1.13.0/go.mod h1:Q1Nvxl1PAgmeW0y3HTt54JYIvUdtcpYKVfIB8AOMZ+0= cloud.google.com/go/securitycenter v1.13.0/go.mod h1:cv5qNAqjY84FCN6Y9z28WlkKXyWsgLO832YiWwkCWcU= cloud.google.com/go/securitycenter v1.14.0/go.mod h1:gZLAhtyKv85n52XYWt6RmeBdydyxfPeTrpToDPw4Auc= cloud.google.com/go/securitycenter v1.15.0/go.mod h1:PeKJ0t8MoFmmXLXWm41JidyzI3PJjd8sXWaVqg43WWk= cloud.google.com/go/securitycenter v1.16.0/go.mod h1:Q9GMaLQFUD+5ZTabrbujNWLtSLZIZF7SAR0wWECrjdk= cloud.google.com/go/securitycenter v1.18.1/go.mod h1:0/25gAzCM/9OL9vVx4ChPeM/+DlfGQJDwBy/UC8AKK0= cloud.google.com/go/securitycenter v1.19.0/go.mod h1:LVLmSg8ZkkyaNy4u7HCIshAngSQ8EcIRREP3xBnyfag= cloud.google.com/go/servicecontrol v1.4.0/go.mod h1:o0hUSJ1TXJAmi/7fLJAedOovnujSEvjKCAFNXPQ1RaU= cloud.google.com/go/servicecontrol v1.5.0/go.mod h1:qM0CnXHhyqKVuiZnGKrIurvVImCs8gmqWsDoqe9sU1s= cloud.google.com/go/servicecontrol v1.10.0/go.mod h1:pQvyvSRh7YzUF2efw7H87V92mxU8FnFDawMClGCNuAA= cloud.google.com/go/servicecontrol v1.11.0/go.mod h1:kFmTzYzTUIuZs0ycVqRHNaNhgR+UMUpw9n02l/pY+mc= cloud.google.com/go/servicecontrol v1.11.1/go.mod h1:aSnNNlwEFBY+PWGQ2DoM0JJ/QUXqV5/ZD9DOLB7SnUk= cloud.google.com/go/servicedirectory v1.4.0/go.mod h1:gH1MUaZCgtP7qQiI+F+A+OpeKF/HQWgtAddhTbhL2bs= cloud.google.com/go/servicedirectory v1.5.0/go.mod h1:QMKFL0NUySbpZJ1UZs3oFAmdvVxhhxB6eJ/Vlp73dfg= cloud.google.com/go/servicedirectory v1.6.0/go.mod h1:pUlbnWsLH9c13yGkxCmfumWEPjsRs1RlmJ4pqiNjVL4= cloud.google.com/go/servicedirectory v1.7.0/go.mod h1:5p/U5oyvgYGYejufvxhgwjL8UVXjkuw7q5XcG10wx1U= cloud.google.com/go/servicedirectory v1.8.0/go.mod h1:srXodfhY1GFIPvltunswqXpVxFPpZjf8nkKQT7XcXaY= cloud.google.com/go/servicedirectory v1.9.0/go.mod h1:29je5JjiygNYlmsGz8k6o+OZ8vd4f//bQLtvzkPPT/s= cloud.google.com/go/servicemanagement v1.4.0/go.mod h1:d8t8MDbezI7Z2R1O/wu8oTggo3BI2GKYbdG4y/SJTco= cloud.google.com/go/servicemanagement v1.5.0/go.mod h1:XGaCRe57kfqu4+lRxaFEAuqmjzF0r+gWHjWqKqBvKFo= cloud.google.com/go/servicemanagement v1.6.0/go.mod h1:aWns7EeeCOtGEX4OvZUWCCJONRZeFKiptqKf1D0l/Jc= cloud.google.com/go/servicemanagement v1.8.0/go.mod h1:MSS2TDlIEQD/fzsSGfCdJItQveu9NXnUniTrq/L8LK4= cloud.google.com/go/serviceusage v1.3.0/go.mod h1:Hya1cozXM4SeSKTAgGXgj97GlqUvF5JaoXacR1JTP/E= cloud.google.com/go/serviceusage v1.4.0/go.mod h1:SB4yxXSaYVuUBYUml6qklyONXNLt83U0Rb+CXyhjEeU= cloud.google.com/go/serviceusage v1.5.0/go.mod h1:w8U1JvqUqwJNPEOTQjrMHkw3IaIFLoLsPLvsE3xueec= cloud.google.com/go/serviceusage v1.6.0/go.mod h1:R5wwQcbOWsyuOfbP9tGdAnCAc6B9DRwPG1xtWMDeuPA= cloud.google.com/go/shell v1.3.0/go.mod h1:VZ9HmRjZBsjLGXusm7K5Q5lzzByZmJHf1d0IWHEN5X4= cloud.google.com/go/shell v1.4.0/go.mod h1:HDxPzZf3GkDdhExzD/gs8Grqk+dmYcEjGShZgYa9URw= cloud.google.com/go/shell v1.6.0/go.mod h1:oHO8QACS90luWgxP3N9iZVuEiSF84zNyLytb+qE2f9A= cloud.google.com/go/spanner v1.41.0/go.mod h1:MLYDBJR/dY4Wt7ZaMIQ7rXOTLjYrmxLE/5ve9vFfWos= cloud.google.com/go/spanner v1.44.0/go.mod h1:G8XIgYdOK+Fbcpbs7p2fiprDw4CaZX63whnSMLVBxjk= cloud.google.com/go/spanner v1.45.0/go.mod h1:FIws5LowYz8YAE1J8fOS7DJup8ff7xJeetWEo5REA2M= cloud.google.com/go/speech v1.6.0/go.mod h1:79tcr4FHCimOp56lwC01xnt/WPJZc4v3gzyT7FoBkCM= cloud.google.com/go/speech v1.7.0/go.mod h1:KptqL+BAQIhMsj1kOP2la5DSEEerPDuOP/2mmkhHhZQ= cloud.google.com/go/speech v1.8.0/go.mod h1:9bYIl1/tjsAnMgKGHKmBZzXKEkGgtU+MpdDPTE9f7y0= cloud.google.com/go/speech v1.9.0/go.mod h1:xQ0jTcmnRFFM2RfX/U+rk6FQNUF6DQlydUSyoooSpco= cloud.google.com/go/speech v1.14.1/go.mod h1:gEosVRPJ9waG7zqqnsHpYTOoAS4KouMRLDFMekpJ0J0= cloud.google.com/go/speech v1.15.0/go.mod h1:y6oH7GhqCaZANH7+Oe0BhgIogsNInLlz542tg3VqeYI= cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw= cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos= cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk= cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs= cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0= cloud.google.com/go/storage v1.14.0/go.mod h1:GrKmX003DSIwi9o29oFT7YDnHYwZoctc3fOKtUw0Xmo= cloud.google.com/go/storage v1.22.1/go.mod h1:S8N1cAStu7BOeFfE8KAQzmyyLkK8p/vmRq6kuBTW58Y= cloud.google.com/go/storage v1.23.0/go.mod h1:vOEEDNFnciUMhBeT6hsJIn3ieU5cFRmzeLgDvXzfIXc= cloud.google.com/go/storage v1.27.0/go.mod h1:x9DOL8TK/ygDUMieqwfhdpQryTeEkhGKMi80i/iqR2s= cloud.google.com/go/storage v1.28.1/go.mod h1:Qnisd4CqDdo6BGs2AD5LLnEsmSQ80wQ5ogcBBKhU86Y= cloud.google.com/go/storage v1.29.0/go.mod h1:4puEjyTKnku6gfKoTfNOU/W+a9JyuVNxjpS5GBrB8h4= cloud.google.com/go/storage v1.61.3 h1:VS//ZfBuPGDvakfD9xyPW1RGF1Vy3BWUoVZXgW1KMOg= cloud.google.com/go/storage v1.61.3/go.mod h1:JtqK8BBB7TWv0HVGHubtUdzYYrakOQIsMLffZ2Z/HWk= cloud.google.com/go/storagetransfer v1.5.0/go.mod h1:dxNzUopWy7RQevYFHewchb29POFv3/AaBgnhqzqiK0w= cloud.google.com/go/storagetransfer v1.6.0/go.mod h1:y77xm4CQV/ZhFZH75PLEXY0ROiS7Gh6pSKrM8dJyg6I= cloud.google.com/go/storagetransfer v1.7.0/go.mod h1:8Giuj1QNb1kfLAiWM1bN6dHzfdlDAVC9rv9abHot2W4= cloud.google.com/go/storagetransfer v1.8.0/go.mod h1:JpegsHHU1eXg7lMHkvf+KE5XDJ7EQu0GwNJbbVGanEw= cloud.google.com/go/talent v1.1.0/go.mod h1:Vl4pt9jiHKvOgF9KoZo6Kob9oV4lwd/ZD5Cto54zDRw= cloud.google.com/go/talent v1.2.0/go.mod h1:MoNF9bhFQbiJ6eFD3uSsg0uBALw4n4gaCaEjBw9zo8g= cloud.google.com/go/talent v1.3.0/go.mod h1:CmcxwJ/PKfRgd1pBjQgU6W3YBwiewmUzQYH5HHmSCmM= cloud.google.com/go/talent v1.4.0/go.mod h1:ezFtAgVuRf8jRsvyE6EwmbTK5LKciD4KVnHuDEFmOOA= cloud.google.com/go/talent v1.5.0/go.mod h1:G+ODMj9bsasAEJkQSzO2uHQWXHHXUomArjWQQYkqK6c= cloud.google.com/go/texttospeech v1.4.0/go.mod h1:FX8HQHA6sEpJ7rCMSfXuzBcysDAuWusNNNvN9FELDd8= cloud.google.com/go/texttospeech v1.5.0/go.mod h1:oKPLhR4n4ZdQqWKURdwxMy0uiTS1xU161C8W57Wkea4= cloud.google.com/go/texttospeech v1.6.0/go.mod h1:YmwmFT8pj1aBblQOI3TfKmwibnsfvhIBzPXcW4EBovc= cloud.google.com/go/tpu v1.3.0/go.mod h1:aJIManG0o20tfDQlRIej44FcwGGl/cD0oiRyMKG19IQ= cloud.google.com/go/tpu v1.4.0/go.mod h1:mjZaX8p0VBgllCzF6wcU2ovUXN9TONFLd7iz227X2Xg= cloud.google.com/go/tpu v1.5.0/go.mod h1:8zVo1rYDFuW2l4yZVY0R0fb/v44xLh3llq7RuV61fPM= cloud.google.com/go/trace v1.3.0/go.mod h1:FFUE83d9Ca57C+K8rDl/Ih8LwOzWIV1krKgxg6N0G28= cloud.google.com/go/trace v1.4.0/go.mod h1:UG0v8UBqzusp+z63o7FK74SdFE+AXpCLdFb1rshXG+Y= cloud.google.com/go/trace v1.8.0/go.mod h1:zH7vcsbAhklH8hWFig58HvxcxyQbaIqMarMg9hn5ECA= cloud.google.com/go/trace v1.9.0/go.mod h1:lOQqpE5IaWY0Ixg7/r2SjixMuc6lfTFeO4QGM4dQWOk= cloud.google.com/go/trace v1.11.7 h1:kDNDX8JkaAG3R2nq1lIdkb7FCSi1rCmsEtKVsty7p+U= cloud.google.com/go/trace v1.11.7/go.mod h1:TNn9d5V3fQVf6s4SCveVMIBS2LJUqo73GACmq/Tky0s= cloud.google.com/go/translate v1.3.0/go.mod h1:gzMUwRjvOqj5i69y/LYLd8RrNQk+hOmIXTi9+nb3Djs= cloud.google.com/go/translate v1.4.0/go.mod h1:06Dn/ppvLD6WvA5Rhdp029IX2Mi3Mn7fpMRLPvXT5Wg= cloud.google.com/go/translate v1.5.0/go.mod h1:29YDSYveqqpA1CQFD7NQuP49xymq17RXNaUDdc0mNu0= cloud.google.com/go/translate v1.6.0/go.mod h1:lMGRudH1pu7I3n3PETiOB2507gf3HnfLV8qlkHZEyos= cloud.google.com/go/translate v1.7.0/go.mod h1:lMGRudH1pu7I3n3PETiOB2507gf3HnfLV8qlkHZEyos= cloud.google.com/go/video v1.8.0/go.mod h1:sTzKFc0bUSByE8Yoh8X0mn8bMymItVGPfTuUBUyRgxk= cloud.google.com/go/video v1.9.0/go.mod h1:0RhNKFRF5v92f8dQt0yhaHrEuH95m068JYOvLZYnJSw= cloud.google.com/go/video v1.12.0/go.mod h1:MLQew95eTuaNDEGriQdcYn0dTwf9oWiA4uYebxM5kdg= cloud.google.com/go/video v1.13.0/go.mod h1:ulzkYlYgCp15N2AokzKjy7MQ9ejuynOJdf1tR5lGthk= cloud.google.com/go/video v1.14.0/go.mod h1:SkgaXwT+lIIAKqWAJfktHT/RbgjSuY6DobxEp0C5yTQ= cloud.google.com/go/video v1.15.0/go.mod h1:SkgaXwT+lIIAKqWAJfktHT/RbgjSuY6DobxEp0C5yTQ= cloud.google.com/go/videointelligence v1.6.0/go.mod h1:w0DIDlVRKtwPCn/C4iwZIJdvC69yInhW0cfi+p546uU= cloud.google.com/go/videointelligence v1.7.0/go.mod h1:k8pI/1wAhjznARtVT9U1llUaFNPh7muw8QyOUpavru4= cloud.google.com/go/videointelligence v1.8.0/go.mod h1:dIcCn4gVDdS7yte/w+koiXn5dWVplOZkE+xwG9FgK+M= cloud.google.com/go/videointelligence v1.9.0/go.mod h1:29lVRMPDYHikk3v8EdPSaL8Ku+eMzDljjuvRs105XoU= cloud.google.com/go/videointelligence v1.10.0/go.mod h1:LHZngX1liVtUhZvi2uNS0VQuOzNi2TkY1OakiuoUOjU= cloud.google.com/go/vision v1.2.0/go.mod h1:SmNwgObm5DpFBme2xpyOyasvBc1aPdjvMk2bBk0tKD0= cloud.google.com/go/vision/v2 v2.2.0/go.mod h1:uCdV4PpN1S0jyCyq8sIM42v2Y6zOLkZs+4R9LrGYwFo= cloud.google.com/go/vision/v2 v2.3.0/go.mod h1:UO61abBx9QRMFkNBbf1D8B1LXdS2cGiiCRx0vSpZoUo= cloud.google.com/go/vision/v2 v2.4.0/go.mod h1:VtI579ll9RpVTrdKdkMzckdnwMyX2JILb+MhPqRbPsY= cloud.google.com/go/vision/v2 v2.5.0/go.mod h1:MmaezXOOE+IWa+cS7OhRRLK2cNv1ZL98zhqFFZaaH2E= cloud.google.com/go/vision/v2 v2.6.0/go.mod h1:158Hes0MvOS9Z/bDMSFpjwsUrZ5fPrdwuyyvKSGAGMY= cloud.google.com/go/vision/v2 v2.7.0/go.mod h1:H89VysHy21avemp6xcf9b9JvZHVehWbET0uT/bcuY/0= cloud.google.com/go/vmmigration v1.2.0/go.mod h1:IRf0o7myyWFSmVR1ItrBSFLFD/rJkfDCUTO4vLlJvsE= cloud.google.com/go/vmmigration v1.3.0/go.mod h1:oGJ6ZgGPQOFdjHuocGcLqX4lc98YQ7Ygq8YQwHh9A7g= cloud.google.com/go/vmmigration v1.5.0/go.mod h1:E4YQ8q7/4W9gobHjQg4JJSgXXSgY21nA5r8swQV+Xxc= cloud.google.com/go/vmmigration v1.6.0/go.mod h1:bopQ/g4z+8qXzichC7GW1w2MjbErL54rk3/C843CjfY= cloud.google.com/go/vmwareengine v0.1.0/go.mod h1:RsdNEf/8UDvKllXhMz5J40XxDrNJNN4sagiox+OI208= cloud.google.com/go/vmwareengine v0.2.2/go.mod h1:sKdctNJxb3KLZkE/6Oui94iw/xs9PRNC2wnNLXsHvH8= cloud.google.com/go/vmwareengine v0.3.0/go.mod h1:wvoyMvNWdIzxMYSpH/R7y2h5h3WFkx6d+1TIsP39WGY= cloud.google.com/go/vpcaccess v1.4.0/go.mod h1:aQHVbTWDYUR1EbTApSVvMq1EnT57ppDmQzZ3imqIk4w= cloud.google.com/go/vpcaccess v1.5.0/go.mod h1:drmg4HLk9NkZpGfCmZ3Tz0Bwnm2+DKqViEpeEpOq0m8= cloud.google.com/go/vpcaccess v1.6.0/go.mod h1:wX2ILaNhe7TlVa4vC5xce1bCnqE3AeH27RV31lnmZes= cloud.google.com/go/webrisk v1.4.0/go.mod h1:Hn8X6Zr+ziE2aNd8SliSDWpEnSS1u4R9+xXZmFiHmGE= cloud.google.com/go/webrisk v1.5.0/go.mod h1:iPG6fr52Tv7sGk0H6qUFzmL3HHZev1htXuWDEEsqMTg= cloud.google.com/go/webrisk v1.6.0/go.mod h1:65sW9V9rOosnc9ZY7A7jsy1zoHS5W9IAXv6dGqhMQMc= cloud.google.com/go/webrisk v1.7.0/go.mod h1:mVMHgEYH0r337nmt1JyLthzMr6YxwN1aAIEc2fTcq7A= cloud.google.com/go/webrisk v1.8.0/go.mod h1:oJPDuamzHXgUc+b8SiHRcVInZQuybnvEW72PqTc7sSg= cloud.google.com/go/websecurityscanner v1.3.0/go.mod h1:uImdKm2wyeXQevQJXeh8Uun/Ym1VqworNDlBXQevGMo= cloud.google.com/go/websecurityscanner v1.4.0/go.mod h1:ebit/Fp0a+FWu5j4JOmJEV8S8CzdTkAS77oDsiSqYWQ= cloud.google.com/go/websecurityscanner v1.5.0/go.mod h1:Y6xdCPy81yi0SQnDY1xdNTNpfY1oAgXUlcfN3B3eSng= cloud.google.com/go/workflows v1.6.0/go.mod h1:6t9F5h/unJz41YqfBmqSASJSXccBLtD1Vwf+KmJENM0= cloud.google.com/go/workflows v1.7.0/go.mod h1:JhSrZuVZWuiDfKEFxU0/F1PQjmpnpcoISEXH2bcHC3M= cloud.google.com/go/workflows v1.8.0/go.mod h1:ysGhmEajwZxGn1OhGOGKsTXc5PyxOc0vfKf5Af+to4M= cloud.google.com/go/workflows v1.9.0/go.mod h1:ZGkj1aFIOd9c8Gerkjjq7OW7I5+l6cSvT3ujaO/WwSA= cloud.google.com/go/workflows v1.10.0/go.mod h1:fZ8LmRmZQWacon9UCX1r/g/DfAXx5VcPALq2CxzdePw= code.cloudfoundry.org/clock v0.0.0-20180518195852-02e53af36e6c/go.mod h1:QD9Lzhd/ux6eNQVUDVRJX/RKTigpewimNYBi7ivZKY8= code.cloudfoundry.org/clock v1.2.0 h1:1swXS7yPmQmhAdkTb1nJ2c0geOdf4LvibUleNCo2HjA= code.cloudfoundry.org/clock v1.2.0/go.mod h1:foDbmVp5RIuIGlota90ot4FkJtx5m4+oKoWiVuu2FDg= collectd.org v0.6.0 h1:wDTcB13Zork7m9bEHmU2sVL4z+hxBmm8EyeMjjxtW7s= collectd.org v0.6.0/go.mod h1:fXcRZb1qBKshIHJa2T8qBS7Xew/I43iMutefnTdGeYo= dario.cat/mergo v1.0.2 h1:85+piFYR1tMbRrLcDwR18y4UKJ3aH1Tbzi24VRW1TK8= dario.cat/mergo v1.0.2/go.mod h1:E/hbnu0NxMFBjpMIE34DRGLWqDy0g5FuKDhCb31ngxA= dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= filippo.io/edwards25519 v1.1.1 h1:YpjwWWlNmGIDyXOn8zLzqiD+9TyIlPhGFG96P39uBpw= filippo.io/edwards25519 v1.1.1/go.mod h1:BxyFTGdWcka3PhytdK4V28tE5sGfRvvvRV7EaN4VDT4= gioui.org v0.0.0-20210308172011-57750fc8a0a6/go.mod h1:RSH6KIUZ0p2xy5zHDxgAM4zumjgTw83q2ge/PI+yyw8= git.sr.ht/~sbinet/gg v0.3.1/go.mod h1:KGYtlADtqsqANL9ueOFkWymvzUvLMQllU5Ixo+8v3pc= github.com/99designs/go-keychain v0.0.0-20191008050251-8e49817e8af4 h1:/vQbFIOMbk2FiG/kXiLl8BRyzTWDw7gX/Hz7Dd5eDMs= github.com/99designs/go-keychain v0.0.0-20191008050251-8e49817e8af4/go.mod h1:hN7oaIRCjzsZ2dE+yG5k+rsdt3qcwykqK6HVGcKwsw4= github.com/99designs/keyring v1.2.2 h1:pZd3neh/EmUzWONb35LxQfvuY7kiSXAq3HQd97+XBn0= github.com/99designs/keyring v1.2.2/go.mod h1:wes/FrByc8j7lFOAGLGSNEg8f/PaI3cgTBqhFkHUrPk= github.com/AdaLogics/go-fuzz-headers v0.0.0-20240806141605-e8a1dd7889d6 h1:He8afgbRMd7mFxO99hRNu+6tazq8nFF9lIwo9JFroBk= github.com/AdaLogics/go-fuzz-headers v0.0.0-20240806141605-e8a1dd7889d6/go.mod h1:8o94RPi1/7XTJvwPpRSzSUedZrtlirdB3r9Z20bi2f8= github.com/Azure/azure-amqp-common-go/v4 v4.2.0 h1:q/jLx1KJ8xeI8XGfkOWMN9XrXzAfVTkyvCxPvHCjd2I= github.com/Azure/azure-amqp-common-go/v4 v4.2.0/go.mod h1:GD3m/WPPma+621UaU6KNjKEo5Hl09z86viKwQjTpV0Q= github.com/Azure/azure-event-hubs-go/v3 v3.6.2 h1:7rNj1/iqS/i3mUKokA2n2eMYO72TB7lO7OmpbKoakKY= github.com/Azure/azure-event-hubs-go/v3 v3.6.2/go.mod h1:n+ocYr9j2JCLYqUqz9eI+lx/TEAtL/g6rZzyTFSuIpc= github.com/Azure/azure-kusto-go v0.16.1 h1:vCBWcQghmC1qIErUUgVNWHxGhZVStu1U/hki6iBA14k= github.com/Azure/azure-kusto-go v0.16.1/go.mod h1:9F2zvXH8B6eWzgI1S4k1ZXAIufnBZ1bv1cW1kB1n3D0= github.com/Azure/azure-pipeline-go v0.1.8/go.mod h1:XA1kFWRVhSK+KNFiOhfv83Fv8L9achrP7OxIzeTn1Yg= 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 v68.0.0+incompatible h1:fcYLmCpyNYRnvJbPerq7U0hS+6+I79yEDJBqVNcqUzU= github.com/Azure/azure-sdk-for-go v68.0.0+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= github.com/Azure/azure-sdk-for-go/sdk/azcore v1.21.0 h1:fou+2+WFTib47nS+nz/ozhEBnvU96bKHy6LjRsY4E28= github.com/Azure/azure-sdk-for-go/sdk/azcore v1.21.0/go.mod h1:t76Ruy8AHvUAC8GfMWJMa0ElSbuIcO03NLpynfbgsPA= github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.13.1 h1:Hk5QBxZQC1jb2Fwj6mpzme37xbCDdNTxU7O9eb5+LB4= github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.13.1/go.mod h1:IYus9qsFobWIc2YVwe/WPjcnyCkPKtnHAqUYeebc8z0= github.com/Azure/azure-sdk-for-go/sdk/azidentity/cache v0.3.2 h1:yz1bePFlP5Vws5+8ez6T3HWXPmwOK7Yvq8QxDBD3SKY= github.com/Azure/azure-sdk-for-go/sdk/azidentity/cache v0.3.2/go.mod h1:Pa9ZNPuoNu/GztvBSKk9J1cDJW6vk/n0zLtV4mgd8N8= github.com/Azure/azure-sdk-for-go/sdk/data/aztables v1.3.0 h1:NnE8y/opvxowwNcSNHubQUiSSEhfk3dmooLGAOmPuKs= github.com/Azure/azure-sdk-for-go/sdk/data/aztables v1.3.0/go.mod h1:GhHzPHiiHxZloo6WvKu9X7krmSAKTyGoIwoKMbrKTTA= github.com/Azure/azure-sdk-for-go/sdk/internal v1.11.2 h1:9iefClla7iYpfYWdzPCRDozdmndjTm8DXdpCzPajMgA= github.com/Azure/azure-sdk-for-go/sdk/internal v1.11.2/go.mod h1:XtLgD3ZD34DAaVIIAyG3objl5DynM3CQ/vMcbBNJZGI= github.com/Azure/azure-sdk-for-go/sdk/messaging/azeventhubs v1.3.0 h1:skbmKp8umb8jMxl4A4CwvYyfCblujU00XUB/ytUjEac= github.com/Azure/azure-sdk-for-go/sdk/messaging/azeventhubs v1.3.0/go.mod h1:nynTZqX7jGM6FQy6Y+7uFT7Y+LhaAeO3q3d48VZzH5E= github.com/Azure/azure-sdk-for-go/sdk/messaging/azeventhubs/v2 v2.0.2 h1:EBiOwZYJUMsjLGJ9x0oNY6ADf+5915P/jhhVcn42KXc= github.com/Azure/azure-sdk-for-go/sdk/messaging/azeventhubs/v2 v2.0.2/go.mod h1:NjuxmUsBJ0Ya9Xxjhjo06bj3/QB4C8z838I5S88UtQQ= github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/eventhub/armeventhub v1.3.0 h1:4hGvxD72TluuFIXVr8f4XkKZfqAa7Pj61t0jmQ7+kes= github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/eventhub/armeventhub v1.3.0/go.mod h1:TSH7DcFItwAufy0Lz+Ft2cyopExCpxbOxI5SkH4dRNo= github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/internal/v2 v2.0.0 h1:PTFGRSlMKCQelWwxUyYVEUqseBJVemLyqWJjvMyt0do= github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/internal/v2 v2.0.0/go.mod h1:LRr2FzBTQlONPPa5HREE5+RjSCTXl7BwOvYOaWTqCaI= github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/managementgroups/armmanagementgroups v1.0.0 h1:pPvTJ1dY0sA35JOeFq6TsY2xj6Z85Yo23Pj4wCCvu4o= github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/managementgroups/armmanagementgroups v1.0.0/go.mod h1:mLfWfj8v3jfWKsL9G4eoBoXVcsqcIUTapmdKy7uGOp0= github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/monitor/armmonitor v0.11.0 h1:Ds0KRF8ggpEGg4Vo42oX1cIt/IfOhHWJBikksZbVxeg= github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/monitor/armmonitor v0.11.0/go.mod h1:jj6P8ybImR+5topJ+eH6fgcemSFBmU6/6bFF8KkwuDI= github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/resources/armresources v1.2.0 h1:Dd+RhdJn0OTtVGaeDLZpcumkIVCtA/3/Fo42+eoYvVM= github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/resources/armresources v1.2.0/go.mod h1:5kakwfW5CjC9KK+Q4wjXAg+ShuIm2mBMua0ZFj2C8PE= github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/storage/armstorage v1.8.1 h1:/Zt+cDPnpC3OVDm/JKLOs7M2DKmLRIIp3XIx9pHHiig= github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/storage/armstorage v1.8.1/go.mod h1:Ng3urmn6dYe8gnbCMoHHVl5APYz2txho3koEkV2o2HA= github.com/Azure/azure-sdk-for-go/sdk/security/keyvault/azkeys v1.4.0 h1:E4MgwLBGeVB5f2MdcIVD3ELVAWpr+WD6MUe1i+tM/PA= github.com/Azure/azure-sdk-for-go/sdk/security/keyvault/azkeys v1.4.0/go.mod h1:Y2b/1clN4zsAoUd/pgNAQHjLDnTis/6ROkUfyob6psM= github.com/Azure/azure-sdk-for-go/sdk/security/keyvault/internal v1.2.0 h1:nCYfgcSyHZXJI8J0IWE5MsCGlb2xp9fJiXyxWgmOFg4= github.com/Azure/azure-sdk-for-go/sdk/security/keyvault/internal v1.2.0/go.mod h1:ucUjca2JtSZboY8IoUqyQyuuXvwbMBVwFOm0vdQPNhA= github.com/Azure/azure-sdk-for-go/sdk/storage/azblob v1.6.3 h1:ZJJNFaQ86GVKQ9ehwqyAFE6pIfyicpuJ8IkVaPBc6/4= github.com/Azure/azure-sdk-for-go/sdk/storage/azblob v1.6.3/go.mod h1:URuDvhmATVKqHBH9/0nOiNKk0+YcwfQ3WkK5PqHKxc8= github.com/Azure/azure-sdk-for-go/sdk/storage/azfile v1.4.0 h1:mJVYrRyo7/ISs3MLMHphqssqbS1vLJ3uiwo1+fY8OUQ= github.com/Azure/azure-sdk-for-go/sdk/storage/azfile v1.4.0/go.mod h1:QXy84HaR0FHLPWaGQDBrZZbdCPTshwGl3gQ64uR/Zrc= github.com/Azure/azure-sdk-for-go/sdk/storage/azqueue v1.0.1 h1:qvrrnQ2mIjwY7IVlQuNB0ma43Nr74+9ZTZJ60KlmlV4= github.com/Azure/azure-sdk-for-go/sdk/storage/azqueue v1.0.1/go.mod h1:FkF/Az07vR3S4sBdjCuisznWfFWOD8u6Ibm/g/oyDAk= github.com/Azure/azure-storage-queue-go v0.0.0-20230531184854-c06a8eff66fe h1:HGuouUM1533rBXmMtR7qh5pYNSSjUZG90b/MgJAnb/A= github.com/Azure/azure-storage-queue-go v0.0.0-20230531184854-c06a8eff66fe/go.mod h1:K6am8mT+5iFXgingS9LUc7TmbsW6XBw3nxaRyaMyWc8= github.com/Azure/go-amqp v1.5.0 h1:GRiQK1VhrNFbyx5VlmI6BsA1FCp27W5rb9kxOZScnTo= github.com/Azure/go-amqp v1.5.0/go.mod h1:vZAogwdrkbyK3Mla8m/CxSc/aKdnTZ4IbPxl51Y5WZE= github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1/go.mod h1:xomTg63KZ2rFqZQzSB4Vz2SUXa1BpHTVz9L5PTmPC4E= github.com/Azure/go-ansiterm v0.0.0-20250102033503-faa5f7b0171c h1:udKWzYgxTojEKWjV8V+WSxDXJ4NFATAsZjh8iIbsQIg= github.com/Azure/go-ansiterm v0.0.0-20250102033503-faa5f7b0171c/go.mod h1:xomTg63KZ2rFqZQzSB4Vz2SUXa1BpHTVz9L5PTmPC4E= github.com/Azure/go-autorest v14.2.0+incompatible h1:V5VMDjClD3GiElqLWO7mz2MxNAK/vTfRHdAubSIPRgs= github.com/Azure/go-autorest v14.2.0+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24= github.com/Azure/go-autorest/autorest v0.11.28/go.mod h1:MrkzG3Y3AH668QyF9KRk5neJnGgmhQ6krbhR8Q5eMvA= github.com/Azure/go-autorest/autorest v0.11.30 h1:iaZ1RGz/ALZtN5eq4Nr1SOFSlf2E4pDI3Tcsl+dZPVE= github.com/Azure/go-autorest/autorest v0.11.30/go.mod h1:t1kpPIOpIVX7annvothKvb0stsrXa37i7b+xpmBW8Fs= github.com/Azure/go-autorest/autorest/adal v0.9.18/go.mod h1:XVVeme+LZwABT8K5Lc3hA4nAe8LDBVle26gTrguhhPQ= github.com/Azure/go-autorest/autorest/adal v0.9.22/go.mod h1:XuAbAEUv2Tta//+voMI038TrJBqjKam0me7qR+L8Cmk= github.com/Azure/go-autorest/autorest/adal v0.9.24 h1:BHZfgGsGwdkHDyZdtQRQk1WeUdW0m2WPAwuHZwUi5i4= github.com/Azure/go-autorest/autorest/adal v0.9.24/go.mod h1:7T1+g0PYFmACYW5LlG2fcoPiPlFHjClyRGL7dRlP5c8= github.com/Azure/go-autorest/autorest/azure/auth v0.5.13 h1:Ov8avRZi2vmrE2JcXw+tu5K/yB41r7xK9GZDiBF7NdM= github.com/Azure/go-autorest/autorest/azure/auth v0.5.13/go.mod h1:5BAVfWLWXihP47vYrPuBKKf4cS0bXI+KM9Qx6ETDJYo= github.com/Azure/go-autorest/autorest/azure/cli v0.4.6 h1:w77/uPk80ZET2F+AfQExZyEWtn+0Rk/uw17m9fv5Ajc= github.com/Azure/go-autorest/autorest/azure/cli v0.4.6/go.mod h1:piCfgPho7BiIDdEQ1+g4VmKyD5y+p/XtSNqE6Hc4QD0= github.com/Azure/go-autorest/autorest/date v0.3.0 h1:7gUk1U5M/CQbp9WoqinNzJar+8KY+LPI6wiWrP/myHw= github.com/Azure/go-autorest/autorest/date v0.3.0/go.mod h1:BI0uouVdmngYNUzGWeSYnokU+TrmwEsOqdt8Y6sso74= github.com/Azure/go-autorest/autorest/mocks v0.4.1/go.mod h1:LTp+uSrOhSkaKrUy935gNZuuIPPVsHlr9DSOxSayd+k= github.com/Azure/go-autorest/autorest/mocks v0.4.2 h1:PGN4EDXnuQbojHbU0UWoNvmu9AGVwYHG9/fkDYhtAfw= github.com/Azure/go-autorest/autorest/mocks v0.4.2/go.mod h1:Vy7OitM9Kei0i1Oj+LvyAWMXJHeKH1MVlzFugfVrmyU= github.com/Azure/go-autorest/autorest/to v0.4.0 h1:oXVqrxakqqV1UZdSazDOPOLvOIz+XA683u8EctwboHk= github.com/Azure/go-autorest/autorest/to v0.4.0/go.mod h1:fE8iZBn7LQR7zH/9XU2NcPR4o9jEImooCeWJcYV/zLE= github.com/Azure/go-autorest/autorest/validation v0.3.1 h1:AgyqjAd94fwNAoTjl/WQXg4VvFeRFpO+UhNyRXqF1ac= github.com/Azure/go-autorest/autorest/validation v0.3.1/go.mod h1:yhLgjC0Wda5DYXl6JAsWyUe4KVNffhoDhG0zVzUMo3E= github.com/Azure/go-autorest/logger v0.2.1 h1:IG7i4p/mDa2Ce4TRyAO8IHnVhAVF3RFU+ZtXWSmf4Tg= github.com/Azure/go-autorest/logger v0.2.1/go.mod h1:T9E3cAhj2VqvPOtCYAvby9aBXkZmbF5NWuPV8+WeEW8= github.com/Azure/go-autorest/tracing v0.6.0 h1:TYi4+3m5t6K48TGI9AUdb+IzbnSxvnvUMfuitfgcfuo= github.com/Azure/go-autorest/tracing v0.6.0/go.mod h1:+vhtPC754Xsa23ID7GlGsrdKBpUA79WCAKPPZVC2DeU= github.com/Azure/go-ntlmssp v0.0.0-20221128193559-754e69321358 h1:mFRzDkZVAjdal+s7s0MwaRv9igoPqLRdzOLzw/8Xvq8= github.com/Azure/go-ntlmssp v0.0.0-20221128193559-754e69321358/go.mod h1:chxPXzSsl7ZWRAuOIE23GDNzjWuZquvFlgA8xmpunjU= github.com/AzureAD/microsoft-authentication-extensions-for-go/cache v0.1.1 h1:WJTmL004Abzc5wDB5VtZG2PJk5ndYDgVacGqfirKxjM= github.com/AzureAD/microsoft-authentication-extensions-for-go/cache v0.1.1/go.mod h1:tCcJZ0uHAmvjsVYzEFivsRTN00oz5BEsRgQHu5JZ9WE= github.com/AzureAD/microsoft-authentication-library-for-go v1.6.0 h1:XRzhVemXdgvJqCH0sFfrBUTnUJSBrBf7++ypk+twtRs= github.com/AzureAD/microsoft-authentication-library-for-go v1.6.0/go.mod h1:HKpQxkWaGLJ+D/5H8QRpyQXA1eKjxkFlOMwck5+33Jk= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/BurntSushi/toml v0.4.1/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ= github.com/BurntSushi/toml v1.5.0/go.mod h1:ukJfTF/6rtPPRCnwkur4qwRxa8vTRFBF0uk2lLoLwho= github.com/BurntSushi/toml v1.6.0 h1:dRaEfpa2VI55EwlIW72hMRHdWouJeRF7TPYhI+AUQjk= github.com/BurntSushi/toml v1.6.0/go.mod h1:ukJfTF/6rtPPRCnwkur4qwRxa8vTRFBF0uk2lLoLwho= github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= github.com/ClickHouse/ch-go v0.71.0 h1:bUdZ/EZj/LcVHsMqaRUP2holqygrPWQKeMjc6nZoyRM= github.com/ClickHouse/ch-go v0.71.0/go.mod h1:NwbNc+7jaqfY58dmdDUbG4Jl22vThgx1cYjBw0vtgXw= github.com/ClickHouse/clickhouse-go/v2 v2.43.0 h1:fUR05TrF1GyvLDa/mAQjkx7KbgwdLRffs2n9O3WobtE= github.com/ClickHouse/clickhouse-go/v2 v2.43.0/go.mod h1:o6jf7JM/zveWC/PP277BLxjHy5KjnGX/jfljhM4s34g= github.com/DATA-DOG/go-sqlmock v1.5.2 h1:OcvFkGmslmlZibjAjaHm3L//6LiuBgolP7OputlJIzU= github.com/DATA-DOG/go-sqlmock v1.5.2/go.mod h1:88MAG/4G7SMwSE3CeA0ZKzrT5CiOU3OJ+JlNzwDqpNU= github.com/DataDog/datadog-go v3.2.0+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ= github.com/Files-com/files-sdk-go/v3 v3.2.97 h1:c+mQoiES/21JrHDAxJLCYICJO+bu8Clv0ZDNZe7Ndyk= github.com/Files-com/files-sdk-go/v3 v3.2.97/go.mod h1:Y/bCHoPJNPKz2hw1ADXjQXJP378HODwK+g/5SR2gqfU= github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.30.0 h1:sBEjpZlNHzK1voKq9695PJSX2o5NEXl7/OL3coiIY0c= github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.30.0/go.mod h1:P4WPRUkOhJC13W//jWpyfJNDAIpvRbAUIYLX/4jtlE0= github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.55.0 h1:UnDZ/zFfG1JhH/DqxIZYU/1CUAlTUScoXD/LcM2Ykk8= github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.55.0/go.mod h1:IA1C1U7jO/ENqm/vhi7V9YYpBsp+IMyqNrEN94N7tVc= github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/cloudmock v0.55.0 h1:7t/qx5Ost0s0wbA/VDrByOooURhp+ikYwv20i9Y07TQ= github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/cloudmock v0.55.0/go.mod h1:vB2GH9GAYYJTO3mEn8oYwzEdhlayZIdQz6zdzgUIRvA= github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.55.0 h1:0s6TxfCu2KHkkZPnBfsQ2y5qia0jl3MMrmBhu3nCOYk= github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.55.0/go.mod h1:Mf6O40IAyB9zR/1J8nGDDPirZQQPbYJni8Yisy7NTMc= 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= github.com/IBM/nzgo/v12 v12.0.11 h1:FZb1zMT1yjjgSP2gqmi3Mk0ihSFvTlSJZ2/y6yJHphc= github.com/IBM/nzgo/v12 v12.0.11/go.mod h1:4pvfEkfsrAdqlljsp8HNwv/uzNKy2fzoXBB1aRIssJg= github.com/IBM/sarama v1.47.0 h1:GcQFEd12+KzfPYeLgN69Fh7vLCtYRhVIx0rO4TZO318= github.com/IBM/sarama v1.47.0/go.mod h1:7gLLIU97nznOmA6TX++Qds+DRxH89P2XICY2KAQUzAY= github.com/JohnCGriffin/overflow v0.0.0-20211019200055-46fa312c352c/go.mod h1:X0CRv0ky0k6m906ixxpzmDRLvX58TFUKS2eePweuyxk= github.com/Masterminds/goutils v1.1.1 h1:5nUrii3FMTL5diU80unEVvNevw1nH4+ZV4DSLVJLSYI= github.com/Masterminds/goutils v1.1.1/go.mod h1:8cTjp+g8YejhMuvIA5y2vz3BpJxksy863GQaJW2MFNU= github.com/Masterminds/semver v1.5.0 h1:H65muMkzWKEuNDnfl9d70GUjFniHKHRbFPGBuZ3QEww= github.com/Masterminds/semver v1.5.0/go.mod h1:MB6lktGJrhw8PrUyiEoblNEGEQ+RzHPF078ddwwvV3Y= github.com/Masterminds/semver/v3 v3.1.1/go.mod h1:VPu/7SZ7ePZ3QOrcuXROw5FAcLl4a0cBrbBpGY/8hQs= github.com/Masterminds/semver/v3 v3.4.0 h1:Zog+i5UMtVoCU8oKka5P7i9q9HgrJeGzI9SA1Xbatp0= github.com/Masterminds/semver/v3 v3.4.0/go.mod h1:4V+yj/TJE1HU9XfppCwVMZq3I84lprf4nC11bSS5beM= github.com/Masterminds/sprig v2.22.0+incompatible h1:z4yfnGrZ7netVz+0EDJ0Wi+5VZCSYp4Z0m2dk6cEM60= github.com/Masterminds/sprig v2.22.0+incompatible/go.mod h1:y6hNFY5UBTIWBxnzTeuNhlNS5hqE0NB0E6fgfo2Br3o= github.com/Masterminds/sprig/v3 v3.3.0 h1:mQh0Yrg1XPo6vjYXgtf5OtijNAKJRNcTdOOGZe3tPhs= github.com/Masterminds/sprig/v3 v3.3.0/go.mod h1:Zy1iXRYNqNLUolqCpL4uhk6SHUMAOSCzdgBfDb35Lz0= github.com/Max-Sum/base32768 v0.0.0-20230304063302-18e6ce5945fd h1:nzE1YQBdx1bq9IlZinHa+HVffy+NmVRoKr+wHN8fpLE= github.com/Max-Sum/base32768 v0.0.0-20230304063302-18e6ce5945fd/go.mod h1:C8yoIfvESpM3GD07OCHU7fqI7lhwyZ2Td1rbNbTAhnc= github.com/Mellanox/rdmamap v1.1.0 h1:A/W1wAXw+6vm58f3VklrIylgV+eDJlPVIMaIKuxgUT4= github.com/Mellanox/rdmamap v1.1.0/go.mod h1:fN+/V9lf10ABnDCwTaXRjeeWijLt2iVLETnK+sx/LY8= github.com/Microsoft/go-winio v0.4.15/go.mod h1:tTuCMEN+UleMWgg9dVx4Hu52b1bJo+59jBh3ajtinzw= github.com/Microsoft/go-winio v0.5.2/go.mod h1:WpS1mjBmmwHBEWmogvA2mj8546UReBk4v8QkMxJ6pZY= github.com/Microsoft/go-winio v0.6.2 h1:F2VQgta7ecxGYO8k3ZZz3RS8fVIXVxONVUPlNERoyfY= github.com/Microsoft/go-winio v0.6.2/go.mod h1:yd8OoFMLzJbo9gZq8j5qaps8bJ9aShtEA8Ipt1oGCvU= github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= github.com/PaesslerAG/gval v1.2.4 h1:rhX7MpjJlcxYwL2eTTYIOBUyEKZ+A96T9vQySWkVUiU= github.com/PaesslerAG/gval v1.2.4/go.mod h1:XRFLwvmkTEdYziLdaCeCa5ImcGVrfQbeNUbVR+C6xac= github.com/PaesslerAG/jsonpath v0.1.0 h1:gADYeifvlqK3R3i2cR5B4DGgxLXIPb3TRTH1mGi0jPI= github.com/PaesslerAG/jsonpath v0.1.0/go.mod h1:4BzmtoM/PI8fPO4aQGIusjGxGir2BzcV0grWtFzq1Y8= github.com/ProtonMail/bcrypt v0.0.0-20211005172633-e235017c1baf h1:yc9daCCYUefEs69zUkSzubzjBbL+cmOXgnmt9Fyd9ug= github.com/ProtonMail/bcrypt v0.0.0-20211005172633-e235017c1baf/go.mod h1:o0ESU9p83twszAU8LBeJKFAAMX14tISa0yk4Oo5TOqo= github.com/ProtonMail/gluon v0.17.1-0.20230724134000-308be39be96e h1:lCsqUUACrcMC83lg5rTo9Y0PnPItE61JSfvMyIcANwk= github.com/ProtonMail/gluon v0.17.1-0.20230724134000-308be39be96e/go.mod h1:Og5/Dz1MiGpCJn51XujZwxiLG7WzvvjE5PRpZBQmAHo= github.com/ProtonMail/go-crypto v1.1.3 h1:nRBOetoydLeUb4nHajyO2bKqMLfWQ/ZPwkXqXxPxCFk= github.com/ProtonMail/go-crypto v1.1.3/go.mod h1:rA3QumHc/FZ8pAHreoekgiAbzpNsfQAosU5td4SnOrE= github.com/ProtonMail/go-mime v0.0.0-20230322103455-7d82a3887f2f h1:tCbYj7/299ekTTXpdwKYF8eBlsYsDVoggDAuAjoK66k= github.com/ProtonMail/go-mime v0.0.0-20230322103455-7d82a3887f2f/go.mod h1:gcr0kNtGBqin9zDW9GOHcVntrwnjrK+qdJ06mWYBybw= github.com/ProtonMail/go-srp v0.0.7 h1:Sos3Qk+th4tQR64vsxGIxYpN3rdnG9Wf9K4ZloC1JrI= github.com/ProtonMail/go-srp v0.0.7/go.mod h1:giCp+7qRnMIcCvI6V6U3S1lDDXDQYx2ewJ6F/9wdlJk= github.com/ProtonMail/gopenpgp/v2 v2.7.4 h1:Vz/8+HViFFnf2A6XX8JOvZMrA6F5puwNvvF21O1mRlo= github.com/ProtonMail/gopenpgp/v2 v2.7.4/go.mod h1:IhkNEDaxec6NyzSI0PlxapinnwPVIESk8/76da3Ct3g= github.com/PuerkitoBio/goquery v1.8.1 h1:uQxhNlArOIdbrH1tr0UXwdVFgDcZDrZVdcpygAcwmWM= github.com/PuerkitoBio/goquery v1.8.1/go.mod h1:Q8ICL1kNUJ2sXGoAhPGUdYDJvgQgHzJsnnd3H7Ho5jQ= github.com/RaveNoX/go-jsoncommentstrip v1.0.0/go.mod h1:78ihd09MekBnJnxpICcwzCMzGrKSKYe4AqU6PDYYpjk= github.com/SAP/go-hdb v1.16.1 h1:mjVEhrtA712ySd7+0kP5Wm+t8G6lICLyiSho5K4eQ2U= github.com/SAP/go-hdb v1.16.1/go.mod h1:LNpXz+MoCtka8RqefdbjwXXCXpqngFcsF3qpARsCR3U= github.com/aalpar/deheap v0.0.0-20210914013432-0cc84d79dec3 h1:hhdWprfSpFbN7lz3W1gM40vOgvSh1WCSMxYD6gGB4Hs= github.com/aalpar/deheap v0.0.0-20210914013432-0cc84d79dec3/go.mod h1:XaUnRxSCYgL3kkgX0QHIV0D+znljPIDImxlv2kbGv0Y= github.com/abbot/go-http-auth v0.4.0 h1:QjmvZ5gSC7jm3Zg54DqWE/T5m1t2AfDu6QlXJT0EVT0= github.com/abbot/go-http-auth v0.4.0/go.mod h1:Cz6ARTIzApMJDzh5bRMSUou6UMSp0IEXg9km/ci7TJM= github.com/aerospike/aerospike-client-go/v5 v5.11.0 h1:z3ZmDSm3I10VMXXIIrsFCFq3IenwFqTCnLNyvnFVzrk= github.com/aerospike/aerospike-client-go/v5 v5.11.0/go.mod h1:e/zYeIoBg9We63fLKa+h+198+fT1GdoLfKa+Pu4QSpg= github.com/ajstarks/deck v0.0.0-20200831202436-30c9fc6549a9/go.mod h1:JynElWSGnm/4RlzPXRlREEwqTHAN3T56Bv2ITsFT3gY= github.com/ajstarks/deck/generate v0.0.0-20210309230005-c3f852c02e19/go.mod h1:T13YZdzov6OU0A1+RfKZiZN9ca6VeKdBdyDV+BY97Tk= github.com/ajstarks/svgo v0.0.0-20180226025133-644b8db467af/go.mod h1:K08gAheRH3/J6wwsYMMT4xOr94bZjxIelGM0+d/wbFw= github.com/ajstarks/svgo v0.0.0-20211024235047-1546f124cd8b/go.mod h1:1KcenG0jGWcpt8ov532z81sp/kMMUG485J2InIOyADM= github.com/alecthomas/go-thrift v0.0.0-20170109061633-7914173639b2/go.mod h1:CxCgO+NdpMdi9SsTlGbc0W+/UNxO3I0AabOEJZ3w61w= github.com/alecthomas/kong v0.2.1/go.mod h1:+inYUSluD+p4L8KdviBSgzcqEjUQOfC5fQDRFuc36lI= github.com/alecthomas/participle v0.4.1 h1:P2PJWzwrSpuCWXKnzqvw0b0phSfH1kJo4p2HvLynVsI= github.com/alecthomas/participle v0.4.1/go.mod h1:T8u4bQOSMwrkTWOSyt8/jSFPEnRtd0FKFMjVfYBlqPs= github.com/alecthomas/repr v0.0.0-20181024024818-d37bc2a10ba1/go.mod h1:xTS7Pm1pD1mvyM075QCDSRqH6qRLXylzS24ZTpRiSzQ= github.com/alecthomas/repr v0.0.0-20210301060118-828286944d6a/go.mod h1:2kn6fqh/zIyPLmm3ugklbEi5hg5wS435eygvNfaDQL8= github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho= github.com/alecthomas/units v0.0.0-20240927000941-0f3dac36c52b h1:mimo19zliBX/vSQ6PWWSL9lK8qwHozUj03+zLoEB8O0= github.com/alecthomas/units v0.0.0-20240927000941-0f3dac36c52b/go.mod h1:fvzegU4vN3H1qMT+8wDmzjAcDONcgo2/SZ/TyfdUOFs= github.com/alexbrainman/sspi v0.0.0-20250919150558-7d374ff0d59e h1:4dAU9FXIyQktpoUAgOJK3OTFc/xug0PCXYCqU0FgDKI= github.com/alexbrainman/sspi v0.0.0-20250919150558-7d374ff0d59e/go.mod h1:cEWa1LVoE5KvSD9ONXsZrj0z6KqySlCCNKHlLzbqAt4= github.com/alitto/pond v1.9.2 h1:9Qb75z/scEZVCoSU+osVmQ0I0JOeLfdTDafrbcJ8CLs= github.com/alitto/pond v1.9.2/go.mod h1:xQn3P/sHTYcU/1BR3i86IGIrilcrGC2LiS+E2+CJWsI= github.com/alitto/pond/v2 v2.7.0 h1:c76L+yN916m/DRXjGCeUBHHu92uWnh/g1bwVk4zyyXg= github.com/alitto/pond/v2 v2.7.0/go.mod h1:xkjYEgQ05RSpWdfSd1nM3OVv7TBhLdy7rMp3+2Nq+yE= github.com/aliyun/alibaba-cloud-sdk-go v1.63.107 h1:qagvUyrgOnBIlVRQWOyCZGVKUIYbMBdGdJ104vBpRFU= github.com/aliyun/alibaba-cloud-sdk-go v1.63.107/go.mod h1:SOSDHfe1kX91v3W5QiBsWSLqeLxImobbMX1mxrFHsVQ= github.com/amir/raidman v0.0.0-20170415203553-1ccc43bfb9c9 h1:FXrPTd8Rdlc94dKccl7KPmdmIbVh/OjelJ8/vgMRzcQ= github.com/amir/raidman v0.0.0-20170415203553-1ccc43bfb9c9/go.mod h1:eliMa/PW+RDr2QLWRmLH1R1ZA4RInpmvOzDDXtaIZkc= github.com/andybalholm/brotli v1.0.0/go.mod h1:loMXtMfwqflxFJPmdbJO0a3KNoPuLBgiu3qAvBg8x/Y= github.com/andybalholm/brotli v1.0.4/go.mod h1:fO7iG3H7G2nSZ7m0zPUDn85XEX2GTukHGRSepvi9Eig= github.com/andybalholm/brotli v1.2.0 h1:ukwgCxwYrmACq68yiUqwIWnGY0cTPox/M94sVwToPjQ= github.com/andybalholm/brotli v1.2.0/go.mod h1:rzTDkvFWvIrjDXZHkuS16NPggd91W3kUSvPlQ1pLaKY= github.com/andybalholm/cascadia v1.3.2 h1:3Xi6Dw5lHF15JtdcmAHD3i1+T8plmv7BQ/nsViSLyss= github.com/andybalholm/cascadia v1.3.2/go.mod h1:7gtRlve5FxPPgIgX36uWBX58OdBsSS6lUvCFb+h7KvU= github.com/antchfx/jsonquery v1.3.6 h1:TaSfeAh7n6T11I74bsZ1FswreIfrbJ0X+OyLflx6mx4= github.com/antchfx/jsonquery v1.3.6/go.mod h1:fGzSGJn9Y826Qd3pC8Wx45avuUwpkePsACQJYy+58BU= github.com/antchfx/xmlquery v1.5.0 h1:uAi+mO40ZWfyU6mlUBxRVvL6uBNZ6LMU4M3+mQIBV4c= github.com/antchfx/xmlquery v1.5.0/go.mod h1:lJfWRXzYMK1ss32zm1GQV3gMIW/HFey3xDZmkP1SuNc= github.com/antchfx/xpath v1.3.2/go.mod h1:i54GszH55fYfBmoZXapTHN8T8tkcHfRgLyVwwqzXNcs= github.com/antchfx/xpath v1.3.5/go.mod h1:i54GszH55fYfBmoZXapTHN8T8tkcHfRgLyVwwqzXNcs= github.com/antchfx/xpath v1.3.6 h1:s0y+ElRRtTQdfHP609qFu0+c6bglDv20pqOViQjjdPI= github.com/antchfx/xpath v1.3.6/go.mod h1:i54GszH55fYfBmoZXapTHN8T8tkcHfRgLyVwwqzXNcs= github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= github.com/antithesishq/antithesis-sdk-go v0.6.0-default-no-op h1:kpBdlEPbRvff0mDD1gk7o9BhI16b9p5yYAXRlidpqJE= github.com/antithesishq/antithesis-sdk-go v0.6.0-default-no-op/go.mod h1:IUpT2DPAKh6i/YhSbt6Gl3v2yvUZjmKncl7U91fup7E= github.com/antlr4-go/antlr/v4 v4.13.1 h1:SqQKkuVZ+zWkMMNkjy5FZe5mr5WURWnlpmOuzYWrPrQ= github.com/antlr4-go/antlr/v4 v4.13.1/go.mod h1:GKmUxMtwp6ZgGwZSva4eWPC5mS6vUAmOABFgjdkM7Nw= github.com/apache/arrow-go/v18 v18.5.2 h1:3uoHjoaEie5eVsxx/Bt64hKwZx4STb+beAkqKOlq/lY= github.com/apache/arrow-go/v18 v18.5.2/go.mod h1:yNoizNTT4peTciJ7V01d2EgOkE1d0fQ1vZcFOsVtFsw= github.com/apache/arrow/go/v10 v10.0.1/go.mod h1:YvhnlEePVnBS4+0z3fhPfUy7W1Ikj0Ih0vcRo/gZ1M0= github.com/apache/arrow/go/v11 v11.0.0/go.mod h1:Eg5OsL5H+e299f7u5ssuXsuHQVEGC4xei5aX110hRiI= github.com/apache/arrow/go/v15 v15.0.2 h1:60IliRbiyTWCWjERBCkO1W4Qun9svcYoZrSLcyOsMLE= github.com/apache/arrow/go/v15 v15.0.2/go.mod h1:DGXsR3ajT524njufqf95822i+KTh+yea1jass9YXgjA= github.com/apache/inlong/inlong-sdk/dataproxy-sdk-twins/dataproxy-sdk-golang v1.0.7 h1:r1BYC/OGaKcav2llg5drf1ha1wL93LelKP2iPftI330= github.com/apache/inlong/inlong-sdk/dataproxy-sdk-twins/dataproxy-sdk-golang v1.0.7/go.mod h1:FUTK5FZpCPgoZbuPeIEOd5v+CzJ6dXl6rEORxMras14= github.com/apache/iotdb-client-go v1.3.5 h1:UHWXC/0GWMw/u7/yUK9XA8vCsQj+6zHsHA4CKRZZCdE= github.com/apache/iotdb-client-go v1.3.5/go.mod h1:3D6QYkqRmASS/4HsjU+U/3fscyc5M9xKRfywZsKuoZY= github.com/apache/thrift v0.15.0/go.mod h1:PHK3hniurgQaNMZYaCLEqXKsYK8upmhPbmdP2FXSqgU= github.com/apache/thrift v0.16.0/go.mod h1:PHK3hniurgQaNMZYaCLEqXKsYK8upmhPbmdP2FXSqgU= github.com/apache/thrift v0.22.0 h1:r7mTJdj51TMDe6RtcmNdQxgn9XcyfGDOzegMDRg47uc= github.com/apache/thrift v0.22.0/go.mod h1:1e7J/O1Ae6ZQMTYdy9xa3w9k+XHWPfRvdPyJeynQ+/g= github.com/apapsch/go-jsonmerge/v2 v2.0.0 h1:axGnT1gRIfimI7gJifB699GoE/oq+F2MU7Dml6nw9rQ= github.com/apapsch/go-jsonmerge/v2 v2.0.0/go.mod h1:lvDnEdqiQrp0O42VQGgmlKpxL1AP2+08jFMw88y4klk= github.com/apex/log v1.9.0 h1:FHtw/xuaM8AgmvDDTI9fiwoAL25Sq2cxojnZICUU8l0= github.com/apex/log v1.9.0/go.mod h1:m82fZlWIuiWzWP04XCTXmnX0xRkYYbCdYn8jbJeLBEA= github.com/apex/logs v1.0.0/go.mod h1:XzxuLZ5myVHDy9SAmYpamKKRNApGj54PfYLcFrXqDwo= github.com/aphistic/golf v0.0.0-20180712155816-02c07f170c5a/go.mod h1:3NqKYiepwy8kCu4PNA+aP7WUV72eXWJeP9/r3/K9aLE= github.com/aphistic/sweet v0.2.0/go.mod h1:fWDlIh/isSE9n6EPsRmC0det+whmX6dJid3stzu0Xys= github.com/appscode/go-querystring v0.0.0-20170504095604-0126cfb3f1dc h1:LoL75er+LKDHDUfU5tRvFwxH0LjPpZN8OoG8Ll+liGU= github.com/appscode/go-querystring v0.0.0-20170504095604-0126cfb3f1dc/go.mod h1:w648aMHEgFYS6xb0KVMMtZ2uMeemhiKCuD2vj6gY52A= github.com/aristanetworks/glog v0.0.0-20191112221043-67e8567f59f3 h1:Bmjk+DjIi3tTAU0wxGaFbfjGUqlxxSXARq9A96Kgoos= github.com/aristanetworks/glog v0.0.0-20191112221043-67e8567f59f3/go.mod h1:KASm+qXFKs/xjSoWn30NrWBBvdTTQq+UjkhjEJHfSFA= github.com/aristanetworks/goarista v0.0.0-20190325233358-a123909ec740 h1:FD4/ikKOFxwP8muWDypbmBWc634+YcAs3eBrYAmRdZY= github.com/aristanetworks/goarista v0.0.0-20190325233358-a123909ec740/go.mod h1:D/tb0zPVXnP7fmsLZjtdUhSsumbK/ij54UXjjVgMGxQ= github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o= github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY= github.com/armon/go-metrics v0.4.1 h1:hR91U9KYmb6bLBYLQjyM+3j+rcd/UhE+G78SFnF8gJA= github.com/armon/go-metrics v0.4.1/go.mod h1:E6amYzXo6aW1tqzoZGT755KkbgrJsSdpwZ+3JqfkOG4= github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= github.com/armon/go-radix v1.0.0/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= github.com/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/awnumar/memcall v0.4.0 h1:B7hgZYdfH6Ot1Goaz8jGne/7i8xD4taZie/PNSFZ29g= github.com/awnumar/memcall v0.4.0/go.mod h1:8xOx1YbfyuCg3Fy6TO8DK0kZUua3V42/goA5Ru47E8w= github.com/awnumar/memguard v0.23.0 h1:sJ3a1/SWlcuKIQ7MV+R9p0Pvo9CWsMbGZvcZQtmc68A= github.com/awnumar/memguard v0.23.0/go.mod h1:olVofBrsPdITtJ2HgxQKrEYEMyIBAIciVG4wNnZhW9M= github.com/aws/aws-msk-iam-sasl-signer-go v1.0.4 h1:2jAwFwA0Xgcx94dUId+K24yFabsKYDtAhCgyMit6OqE= github.com/aws/aws-msk-iam-sasl-signer-go v1.0.4/go.mod h1:MVYeeOhILFFemC/XlYTClvBjYZrg/EPd3ts885KrNTI= github.com/aws/aws-sdk-go v1.20.6/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= github.com/aws/aws-sdk-go v1.29.11/go.mod h1:1KvfttTE3SPKMpo8g2c6jL3ZKfXtFvKscTgahTma5Xg= github.com/aws/aws-sdk-go v1.44.263/go.mod h1:aVsgQcEevwlmQ7qHE9I3h+dtQgpqhFB+i8Phjh7fkwI= github.com/aws/aws-sdk-go-v2 v1.18.0/go.mod h1:uzbQtefpm44goOPmdKyAlXSNcwlRgF3ePWVW6EtJvvw= github.com/aws/aws-sdk-go-v2 v1.41.3 h1:4kQ/fa22KjDt13QCy1+bYADvdgcxpfH18f0zP542kZA= github.com/aws/aws-sdk-go-v2 v1.41.3/go.mod h1:mwsPRE8ceUUpiTgF7QmQIJ7lgsKUPQOUl3o72QBrE1o= github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.6 h1:N4lRUXZpZ1KVEUn6hxtco/1d2lgYhNn1fHkkl8WhlyQ= github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.6/go.mod h1:lyw7GFp3qENLh7kwzf7iMzAxDn+NzjXEAGjKS2UOKqI= github.com/aws/aws-sdk-go-v2/config v1.18.25/go.mod h1:dZnYpD5wTW/dQF0rRNLVypB396zWCcPiBIvdvSWHEg4= github.com/aws/aws-sdk-go-v2/config v1.32.11 h1:ftxI5sgz8jZkckuUHXfC/wMUc8u3fG1vQS0plr2F2Zs= github.com/aws/aws-sdk-go-v2/config v1.32.11/go.mod h1:twF11+6ps9aNRKEDimksp923o44w/Thk9+8YIlzWMmo= github.com/aws/aws-sdk-go-v2/credentials v1.13.24/go.mod h1:jYPYi99wUOPIFi0rhiOvXeSEReVOzBqFNOX5bXYoG2o= github.com/aws/aws-sdk-go-v2/credentials v1.19.11 h1:NdV8cwCcAXrCWyxArt58BrvZJ9pZ9Fhf9w6Uh5W3Uyc= github.com/aws/aws-sdk-go-v2/credentials v1.19.11/go.mod h1:30yY2zqkMPdrvxBqzI9xQCM+WrlrZKSOpSJEsylVU+8= github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.13.3/go.mod h1:4Q0UFP0YJf0NrsEuEYHpM9fTSEVnD16Z3uyEF7J9JGM= github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.19 h1:INUvJxmhdEbVulJYHI061k4TVuS3jzzthNvjqvVvTKM= github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.19/go.mod h1:FpZN2QISLdEBWkayloda+sZjVJL+e9Gl0k1SyTgcswU= github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.17.43 h1:iLdpkYZ4cXIQMO7ud+cqMWR1xK5ESbt1rvN77tRi1BY= github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.17.43/go.mod h1:OgbsKPAswXDd5kxnR4vZov69p3oYjbvUyIRBAAV0y9o= github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.33/go.mod h1:7i0PF1ME/2eUPFcjkVIwq+DOygHEoK92t5cDqNgYbIw= github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.19 h1:/sECfyq2JTifMI2JPyZ4bdRN77zJmr6SrS1eL3augIA= github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.19/go.mod h1:dMf8A5oAqr9/oxOfLkC/c2LU/uMcALP0Rgn2BD5LWn0= github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.27/go.mod h1:UrHnn3QV/d0pBZ6QBAEQcqFLf8FAzLmoUfPVIueOvoM= github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.19 h1:AWeJMk33GTBf6J20XJe6qZoRSJo0WfUhsMdUKhoODXE= github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.19/go.mod h1:+GWrYoaAsV7/4pNHpwh1kiNLXkKaSoppxQq9lbH8Ejw= github.com/aws/aws-sdk-go-v2/internal/ini v1.3.34/go.mod h1:Etz2dj6UHYuw+Xw830KfzCfWGMzqvUTCjUj5b76GVDc= github.com/aws/aws-sdk-go-v2/internal/ini v1.8.5 h1:clHU5fm//kWS1C2HgtgWxfQbFbx4b6rx+5jzhgX9HrI= github.com/aws/aws-sdk-go-v2/internal/ini v1.8.5/go.mod h1:O3h0IK87yXci+kg6flUKzJnWeziQUKciKrLjcatSNcY= github.com/aws/aws-sdk-go-v2/internal/v4a v1.3.25 h1:r67ps7oHCYnflpgDy2LZU0MAQtQbYIOqNNnqGO6xQkE= github.com/aws/aws-sdk-go-v2/internal/v4a v1.3.25/go.mod h1:GrGY+Q4fIokYLtjCVB/aFfCVL6hhGUFl8inD18fDalE= github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.55.1 h1:s+ZS2lmYFeCISy20RkSerTmfMIzxlevj4LyWNuE3cfY= github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.55.1/go.mod h1:xXUsqpyas4oCIPxrKoCeqvyvFBLEYSohybRVV0bHq9A= github.com/aws/aws-sdk-go-v2/service/cloudwatchlogs v1.64.0 h1:6QLwTAIR2z3QmYxuHM8nfZkW/C/qn4cvhesHIE98/CE= github.com/aws/aws-sdk-go-v2/service/cloudwatchlogs v1.64.0/go.mod h1:RCkMRCGlsyFwF9Accj7GsHQFCIR9s8iRbv4LPYOT9wY= github.com/aws/aws-sdk-go-v2/service/dynamodb v1.56.1 h1:EkW4NqA2mwCkL7YCDYh6OpA/bCMhKYbZgpRHt2FD2Ow= github.com/aws/aws-sdk-go-v2/service/dynamodb v1.56.1/go.mod h1:OQp5333OH1IjmJmJpTU4IwoaOoCMnDrThg0zIx169rE= github.com/aws/aws-sdk-go-v2/service/ec2 v1.294.0 h1:776KnBqePBBR6zEDi0bUIHXzUBOISa2WgAKEgckUF8M= github.com/aws/aws-sdk-go-v2/service/ec2 v1.294.0/go.mod h1:rB577GvkmJADVOFGY8/j9sPv/ewcsEtQNsd9Lrn7Zx0= github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.6 h1:XAq62tBTJP/85lFD5oqOOe7YYgWxY9LvWq8plyDvDVg= github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.6/go.mod h1:x0nZssQ3qZSnIcePWLvcoFisRXJzcTVvYpAAdYX8+GI= github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.4.6 h1:HCpPsWqmYQieU7SS6E9HXfdAMSud0pteVXieJmcpIRI= github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.4.6/go.mod h1:ngUiVRCco++u+soRRVBIvBZxSMMvOVMXA4PJ36JLfSw= github.com/aws/aws-sdk-go-v2/service/internal/endpoint-discovery v1.11.19 h1:jdCj9vbCXwzTcIJX+MVd2UdssFhRJFTrWlPZwZB8Hpk= github.com/aws/aws-sdk-go-v2/service/internal/endpoint-discovery v1.11.19/go.mod h1:Dgg2d5WGRr7YB8JJsELskBxLUhgwWppXPwlvmuQKhbc= github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.27/go.mod h1:EOwBD4J4S5qYszS5/3DpkejfuK+Z5/1uzICfPaZLtqw= github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.19 h1:X1Tow7suZk9UCJHE1Iw9GMZJJl0dAnKXXP1NaSDHwmw= github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.19/go.mod h1:/rARO8psX+4sfjUQXp5LLifjUt8DuATZ31WptNJTyQA= github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.18.6 h1:BbGDtTi0T1DYlmjBiCr/le3wzhA37O8QTC5/Ab8+EXk= github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.18.6/go.mod h1:hLMJt7Q8ePgViKupeymbqI0la+t9/iYFBjxQCFwuAwI= github.com/aws/aws-sdk-go-v2/service/kinesis v1.43.2 h1:WhTMEbudr8A351zRMU48WLERglge1qMzmb6BrlbekPg= github.com/aws/aws-sdk-go-v2/service/kinesis v1.43.2/go.mod h1:yDk2FJbvOCzH16j8Pa2FLGKh8MEH6/8/2Vqn3IKzmXE= github.com/aws/aws-sdk-go-v2/service/s3 v1.71.0 h1:nyuzXooUNJexRT0Oy0UQY6AhOzxPxhtt4DcBIHyCnmw= github.com/aws/aws-sdk-go-v2/service/s3 v1.71.0/go.mod h1:sT/iQz8JK3u/5gZkT+Hmr7GzVZehUMkRZpOaAwYXeGY= github.com/aws/aws-sdk-go-v2/service/signin v1.0.7 h1:Y2cAXlClHsXkkOvWZFXATr34b0hxxloeQu/pAZz2row= github.com/aws/aws-sdk-go-v2/service/signin v1.0.7/go.mod h1:idzZ7gmDeqeNrSPkdbtMp9qWMgcBwykA7P7Rzh5DXVU= github.com/aws/aws-sdk-go-v2/service/sso v1.12.10/go.mod h1:ouy2P4z6sJN70fR3ka3wD3Ro3KezSxU6eKGQI2+2fjI= github.com/aws/aws-sdk-go-v2/service/sso v1.30.12 h1:iSsvB9EtQ09YrsmIc44Heqlx5ByGErqhPK1ZQLppias= github.com/aws/aws-sdk-go-v2/service/sso v1.30.12/go.mod h1:fEWYKTRGoZNl8tZ77i61/ccwOMJdGxwOhWCkp6TXAr0= github.com/aws/aws-sdk-go-v2/service/ssooidc v1.14.10/go.mod h1:AFvkxc8xfBe8XA+5St5XIHHrQQtkxqrRincx4hmMHOk= github.com/aws/aws-sdk-go-v2/service/ssooidc v1.35.16 h1:EnUdUqRP1CNzt2DkV67tJx6XDN4xlfBFm+bzeNOQVb0= github.com/aws/aws-sdk-go-v2/service/ssooidc v1.35.16/go.mod h1:Jic/xv0Rq/pFNCh3WwpH4BEqdbSAl+IyHro8LbibHD8= github.com/aws/aws-sdk-go-v2/service/sts v1.19.0/go.mod h1:BgQOMsg8av8jset59jelyPW7NoZcZXLVpDsXunGDrk8= github.com/aws/aws-sdk-go-v2/service/sts v1.41.8 h1:XQTQTF75vnug2TXS8m7CVJfC2nniYPZnO1D4Np761Oo= github.com/aws/aws-sdk-go-v2/service/sts v1.41.8/go.mod h1:Xgx+PR1NUOjNmQY+tRMnouRp83JRM8pRMw/vCaVhPkI= github.com/aws/aws-sdk-go-v2/service/timestreamwrite v1.35.18 h1:DBfY5W2ToKP7un6+yGXASdYizVPmd/5MbbHsw9V5pxw= github.com/aws/aws-sdk-go-v2/service/timestreamwrite v1.35.18/go.mod h1:lLyc9054UJfVChPbErlh151Zybxw/BdqPO0CyNmRaZE= github.com/aws/smithy-go v1.13.5/go.mod h1:Tg+OJXh4MB2R/uN61Ko2f6hTZwB/ZYGOtib8J3gBHzA= github.com/aws/smithy-go v1.24.2 h1:FzA3bu/nt/vDvmnkg+R8Xl46gmzEDam6mZ1hzmwXFng= github.com/aws/smithy-go v1.24.2/go.mod h1:YE2RhdIuDbA5E5bTdciG9KrW3+TiEONeUWCqxX9i1Fc= github.com/aybabtme/rgbterm v0.0.0-20170906152045-cc83f3b3ce59/go.mod h1:q/89r3U2H7sSsE2t6Kca0lfwTK8JdoNGS/yzM/4iH5I= github.com/benbjohnson/clock v1.3.5 h1:VvXlSJBzZpA/zum6Sj74hxwYI2DIxRWuNIoXAzHZz5o= github.com/benbjohnson/clock v1.3.5/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= github.com/bitly/go-hostpool v0.1.0 h1:XKmsF6k5el6xHG3WPJ8U0Ku/ye7njX7W81Ng7O2ioR0= github.com/bitly/go-hostpool v0.1.0/go.mod h1:4gOCgp6+NZnVqlKyZ/iBZFTAJKembaVENUpMkpg42fw= github.com/bketelsen/crypt v0.0.3-0.20200106085610-5cbc8cc4026c/go.mod h1:MKsuJmJgSg28kpZDP6UIiPt0e0Oz0kqKNGyRaWEPv84= github.com/blang/semver/v4 v4.0.0 h1:1PFHFE6yCCTv8C1TeyNNarDzntLi7wMI5i/pzqYIsAM= github.com/blang/semver/v4 v4.0.0/go.mod h1:IbckMUScFkM3pff0VJDNKRiT6TG/YpiHIM2yvyW5YoQ= github.com/bluenviron/gomavlib/v3 v3.3.0 h1:ul1yiDslfvsqCjLs+by1eSdU8Oud5qwemoO5ZBpX/fs= github.com/bluenviron/gomavlib/v3 v3.3.0/go.mod h1:pPrXt2HspzeIKNlvSDCrPzwPSLPDXORfhWJ8vT8zEKk= github.com/blues/jsonata-go v1.5.4 h1:XCsXaVVMrt4lcpKeJw6mNJHqQpWU751cnHdCFUq3xd8= github.com/blues/jsonata-go v1.5.4/go.mod h1:uns2jymDrnI7y+UFYCqsRTEiAH22GyHnNXrkupAVFWI= github.com/bmatcuk/doublestar v1.1.1 h1:YroD6BJCZBYx06yYFEWvUuKVWQn3vLLQAVmDmvTSaiQ= github.com/bmatcuk/doublestar v1.1.1/go.mod h1:UD6OnuiIn0yFxxA2le/rnRU1G4RaI4UvFv1sNto9p6w= github.com/bmatcuk/doublestar/v3 v3.0.0 h1:TQtVPlDnAYwcrVNB2JiGuMc++H5qzWZd9PhkNo5WyHI= github.com/bmatcuk/doublestar/v3 v3.0.0/go.mod h1:6PcTVMw80pCY1RVuoqu3V++99uQB3vsSYKPTd8AWA0k= github.com/bmatcuk/doublestar/v4 v4.10.0 h1:zU9WiOla1YA122oLM6i4EXvGW62DvKZVxIe6TYWexEs= github.com/bmatcuk/doublestar/v4 v4.10.0/go.mod h1:xBQ8jztBU6kakFMg+8WGxn0c6z1fTSPVIjEY1Wr7jzc= github.com/bmizerany/assert v0.0.0-20160611221934-b7ed37b82869 h1:DDGfHa7BWjL4YnC6+E63dPcxHo2sUxDIu8g3QgEJdRY= github.com/bmizerany/assert v0.0.0-20160611221934-b7ed37b82869/go.mod h1:Ekp36dRnpXw/yCqJaO+ZrUyxD+3VXMFFr56k5XYrpB4= github.com/boombuler/barcode v1.0.0/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8= github.com/boombuler/barcode v1.0.1/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8= github.com/boschrexroth/ctrlx-datalayer-golang v1.3.1 h1:7Se/SKFSyMfJh23QlebwmFJWku6ZAKNOgAWgOPWTfH0= github.com/boschrexroth/ctrlx-datalayer-golang v1.3.1/go.mod h1:i0ex6o3HhWHDSS0KEmRuHZOk3FVdJamzyk+tp3qmxkg= github.com/bradenaw/juniper v0.15.2 h1:0JdjBGEF2jP1pOxmlNIrPhAoQN7Ng5IMAY5D0PHMW4U= github.com/bradenaw/juniper v0.15.2/go.mod h1:UX4FX57kVSaDp4TPqvSjkAAewmRFAfXf27BOs5z9dq8= github.com/bradfitz/iter v0.0.0-20191230175014-e8f45d346db8 h1:GKTyiRCL6zVf5wWaqKnf+7Qs6GbEPfd4iMOitWzXJx8= github.com/bradfitz/iter v0.0.0-20191230175014-e8f45d346db8/go.mod h1:spo1JLcs67NmW1aVLEgtA8Yy1elc+X8y5SRW1sFW4Og= github.com/brutella/dnssd v1.2.14 h1:qLpTnRTm5peo2jA30hqMIbCuWn8x3sFg3e9o9ODOobw= github.com/brutella/dnssd v1.2.14/go.mod h1:tG4GE8orv6+irE5rdsNgb6MJSxm6cyMUKdC5jmD22gk= github.com/bsm/ginkgo/v2 v2.12.0 h1:Ny8MWAHyOepLGlLKYmXG4IEkioBysk6GpaRTLC8zwWs= github.com/bsm/ginkgo/v2 v2.12.0/go.mod h1:SwYbGRRDovPVboqFv0tPTcG1sN61LM1Z4ARdbAV9g4c= github.com/bsm/gomega v1.27.10 h1:yeMWxP2pV2fG3FgAODIY8EiRE3dy0aeFYt4l7wh6yKA= github.com/bsm/gomega v1.27.10/go.mod h1:JyEr/xRbxbtgWNi8tIEVPUYZ5Dzef52k01W3YH0H+O0= github.com/buengese/sgzip v0.1.1 h1:ry+T8l1mlmiWEsDrH/YHZnCVWD2S3im1KLsyO+8ZmTU= github.com/buengese/sgzip v0.1.1/go.mod h1:i5ZiXGF3fhV7gL1xaRRL1nDnmpNj0X061FQzOS8VMas= github.com/bufbuild/protocompile v0.14.1 h1:iA73zAf/fyljNjQKwYzUHD6AD4R8KMasmwa/FBatYVw= github.com/bufbuild/protocompile v0.14.1/go.mod h1:ppVdAIhbr2H8asPk6k4pY7t9zB1OU5DoEw9xY/FUi1c= github.com/bwmarrin/snowflake v0.3.0 h1:xm67bEhkKh6ij1790JB83OujPR5CzNe8QuQqAgISZN0= github.com/bwmarrin/snowflake v0.3.0/go.mod h1:NdZxfVWX+oR6y2K0o6qAYv6gIOP9rjG0/E9WsDpxqwE= github.com/caio/go-tdigest v3.1.0+incompatible h1:uoVMJ3Q5lXmVLCCqaMGHLBWnbGoN6Lpu7OAUPR60cds= github.com/caio/go-tdigest v3.1.0+incompatible/go.mod h1:sHQM/ubZStBUmF1WbB8FAm8q9GjDajLC5T7ydxE3JHI= github.com/caio/go-tdigest/v4 v4.0.1 h1:sx4ZxjmIEcLROUPs2j1BGe2WhOtHD6VSe6NNbBdKYh4= github.com/caio/go-tdigest/v4 v4.0.1/go.mod h1:Wsa+f0EZnV2gShdj1adgl0tQSoXRxtM0QioTgukFw8U= github.com/calebcase/tmpfile v1.0.3 h1:BZrOWZ79gJqQ3XbAQlihYZf/YCV0H4KPIdM5K5oMpJo= github.com/calebcase/tmpfile v1.0.3/go.mod h1:UAUc01aHeC+pudPagY/lWvt2qS9ZO5Zzof6/tIUzqeI= github.com/cenkalti/backoff v2.2.1+incompatible h1:tNowT99t7UNflLxfYYSlKYsBpXdEet03Pg2g16Swow4= github.com/cenkalti/backoff v2.2.1+incompatible/go.mod h1:90ReRw6GdpyfrHakVjL/QHaoyV4aDUVVkXQJJJ3NXXM= github.com/cenkalti/backoff/v4 v4.0.0/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.3.0 h1:MyRJ/UdXutAwSAT+s3wNd7MfTIcy71VQueUuFK343L8= github.com/cenkalti/backoff/v4 v4.3.0/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE= github.com/cenkalti/backoff/v5 v5.0.3 h1:ZN+IMa753KfX5hd8vVaMixjnqRZ3y8CuJKRKj1xcsSM= github.com/cenkalti/backoff/v5 v5.0.3/go.mod h1:rkhZdG3JZukswDf7f0cwqPNk4K0sa+F97BxZthm/crw= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= github.com/census-instrumentation/opencensus-proto v0.3.0/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= github.com/census-instrumentation/opencensus-proto v0.4.1/go.mod h1:4T9NM4+4Vw91VeyqjLS6ao50K5bOcLKN6Q42XnYaRYw= github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/cespare/xxhash/v2 v2.1.2/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/chilts/sid v0.0.0-20190607042430-660e94789ec9 h1:z0uK8UQqjMVYzvk4tiiu3obv2B44+XBsvgEJREQfnO8= github.com/chilts/sid v0.0.0-20190607042430-660e94789ec9/go.mod h1:Jl2neWsQaDanWORdqZ4emBl50J4/aRBBS4FyyG9/PFo= github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= github.com/cilium/ebpf v0.5.0/go.mod h1:4tRaxcgiL706VnOzHOdBlY8IEAIdxINsQBcU4xJJXRs= github.com/cilium/ebpf v0.7.0/go.mod h1:/oI2+1shJiTGAMgl6/RgJr36Eo1jzrRcAWbcXO2usCA= github.com/circonus-labs/circonus-gometrics v2.3.1+incompatible/go.mod h1:nmEj6Dob7S7YxXgwXpfOuvO54S+tGdZdw9fuRZt25Ag= github.com/circonus-labs/circonusllhist v0.1.3/go.mod h1:kMXHVDlOchFAehlya5ePtbp5jckzBHf4XRpQvBOLI+I= github.com/cisco-ie/nx-telemetry-proto v0.0.0-20230117155933-f64c045c77df h1:GmrltUp5Qf5XhT+LmqMDizsgm/6VHTSxPWRdrq21yRo= github.com/cisco-ie/nx-telemetry-proto v0.0.0-20230117155933-f64c045c77df/go.mod h1:rJDd05J5hqWVU9MjJ+5jw1CuLn/jRhvU0xtFEzzqjwM= github.com/clarify/clarify-go v0.4.1 h1:T0ba573qXp4dkM1CbPimvku1lJKNyIC27bcGEOTGVfw= github.com/clarify/clarify-go v0.4.1/go.mod h1:iTdVABQ3Qu7JK9xhg+oOfhvxS4I5AP0bt9HJTlG/PPU= github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= github.com/clipperhouse/uax29/v2 v2.7.0 h1:+gs4oBZ2gPfVrKPthwbMzWZDaAFPGYK72F0NJv2v7Vk= github.com/clipperhouse/uax29/v2 v2.7.0/go.mod h1:EFJ2TJMRUaplDxHKj1qAEhCtQPW2tJSwu5BF98AuoVM= github.com/cloudevents/sdk-go/v2 v2.16.2 h1:ZYDFrYke4FD+jM8TZTJJO6JhKHzOQl2oqpFK1D+NnQM= github.com/cloudevents/sdk-go/v2 v2.16.2/go.mod h1:laOcGImm4nVJEU+PHnUrKL56CKmRL65RlQF0kRmW/kg= github.com/cloudflare/circl v1.3.7 h1:qlCDlTPz2n9fu58M0Nh1J/JzcFpfgkFHHX3O35r5vcU= github.com/cloudflare/circl v1.3.7/go.mod h1:sRTcRWXGLrKw6yIGJ+l7amYJFfAXbZG0kBSc8r4zxgA= github.com/cloudinary/cloudinary-go/v2 v2.9.0 h1:8C76QklmuV4qmKAC7cUnu9D68X9kCkFMuLspPikECCo= github.com/cloudinary/cloudinary-go/v2 v2.9.0/go.mod h1:ireC4gqVetsjVhYlwjUJwKTbZuWjEIynbR9zQTlqsvo= github.com/cloudsoda/go-smb2 v0.0.0-20241223203758-52b943b88fd6 h1:mLY/79N73URZ2J/oRKTxmfhCgxThzBmjQ6XOjX5tYjI= github.com/cloudsoda/go-smb2 v0.0.0-20241223203758-52b943b88fd6/go.mod h1:0aLYPsmguHbok591y6hI5yAqU0drbUzrPEO10ZpgTTw= github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= github.com/cncf/udpa/go v0.0.0-20200629203442-efcf912fb354/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= github.com/cncf/udpa/go v0.0.0-20210930031921-04548b0d99d4/go.mod h1:6pvJx4me5XPnfI9Z40ddWsdw2W/uZgQLFXToKeRcDiI= github.com/cncf/udpa/go v0.0.0-20220112060539-c52dc94e7fbe/go.mod h1:6pvJx4me5XPnfI9Z40ddWsdw2W/uZgQLFXToKeRcDiI= github.com/cncf/xds/go v0.0.0-20210312221358-fbca930ec8ed/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cncf/xds/go v0.0.0-20210805033703-aa0b78936158/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cncf/xds/go v0.0.0-20210922020428-25de7278fc84/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cncf/xds/go v0.0.0-20211001041855-01bcc9b48dfe/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cncf/xds/go v0.0.0-20211011173535-cb28da3451f1/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cncf/xds/go v0.0.0-20220314180256-7f1daf1720fc/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cncf/xds/go v0.0.0-20230105202645-06c439db220b/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cncf/xds/go v0.0.0-20230607035331-e9ce68804cb4/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cncf/xds/go v0.0.0-20251210132809-ee656c7534f5 h1:6xNmx7iTtyBRev0+D/Tv1FZd4SCg8axKApyNyRsAt/w= github.com/cncf/xds/go v0.0.0-20251210132809-ee656c7534f5/go.mod h1:KdCmV+x/BuvyMxRnYBlmVaq4OLiKW6iRQfvC62cvdkI= github.com/cockroachdb/apd v1.1.0 h1:3LFP3629v+1aKXU5Q37mxmRxX/pIu1nijXydLShEq5I= github.com/cockroachdb/apd v1.1.0/go.mod h1:8Sl8LxpKi29FqWXR16WEFZRNSz3SoPzUzeMeY4+DwBQ= github.com/coder/websocket v1.8.14 h1:9L0p0iKiNOibykf283eHkKUHHrpG7f65OE3BhhO7v9g= github.com/coder/websocket v1.8.14/go.mod h1:NX3SzP+inril6yawo5CQXx8+fk145lPDC6pumgx0mVg= github.com/colinmarc/hdfs/v2 v2.4.0 h1:v6R8oBx/Wu9fHpdPoJJjpGSUxo8NhHIwrwsfhFvU9W0= github.com/colinmarc/hdfs/v2 v2.4.0/go.mod h1:0NAO+/3knbMx6+5pCv+Hcbaz4xn/Zzbn9+WIib2rKVI= github.com/compose-spec/compose-go v1.20.2 h1:u/yfZHn4EaHGdidrZycWpxXgFffjYULlTbRfJ51ykjQ= github.com/compose-spec/compose-go v1.20.2/go.mod h1:+MdqXV4RA7wdFsahh/Kb8U0pAJqkg7mr4PM9tFKU8RM= github.com/containerd/errdefs v1.0.0 h1:tg5yIfIlQIrxYtu9ajqY42W3lpS19XqdxRQeEwYG8PI= github.com/containerd/errdefs v1.0.0/go.mod h1:+YBYIdtsnF4Iw6nWZhJcqGSg/dwvV7tyJ/kCkyJ2k+M= github.com/containerd/errdefs/pkg v0.3.0 h1:9IKJ06FvyNlexW690DXuQNx2KA2cUJXx151Xdx3ZPPE= github.com/containerd/errdefs/pkg v0.3.0/go.mod h1:NJw6s9HwNuRhnjJhM7pylWwMyAkmCQvQ4GpJHEqRLVk= github.com/containerd/log v0.1.0 h1:TCJt7ioM2cr/tfR8GPbGf9/VRAX8D2B4PjzCpfX540I= github.com/containerd/log v0.1.0/go.mod h1:VRRf09a7mHDIRezVKTRCrOq78v577GXq3bSa3EhrzVo= github.com/containerd/platforms v0.2.1 h1:zvwtM3rz2YHPQsF2CHYM8+KtB5dvhISiXh5ZpSBQv6A= github.com/containerd/platforms v0.2.1/go.mod h1:XHCb+2/hzowdiut9rkudds9bE5yJ7npe7dG/wG+uFPw= github.com/coocood/freecache v1.2.5 h1:FmhRQ8cLLVq9zWhHVYODUEZ0xu6rTPrVeAnX1AEIf7I= github.com/coocood/freecache v1.2.5/go.mod h1:RBUWa/Cy+OHdfTGFEhEuE1pMCMX51Ncizj7rthiQ3vk= github.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk= github.com/coreos/etcd v3.3.13+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= github.com/coreos/go-semver v0.3.1 h1:yi21YpKnrx1gt5R+la8n5WgS0kCrsPp33dmEyHReZr4= github.com/coreos/go-semver v0.3.1/go.mod h1:irMmmIw/7yzSRPWryHsK7EYSg09caPQL03VsM8rvUec= github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= github.com/coreos/go-systemd v0.0.0-20190719114852-fd7a80b32e1f/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= github.com/coreos/go-systemd/v22 v22.7.0 h1:LAEzFkke61DFROc7zNLX/WA2i5J8gYqe0rSj9KI28KA= github.com/coreos/go-systemd/v22 v22.7.0/go.mod h1:xNUYtjHu2EDXbsxz1i41wouACIwT7Ybq9o0BQhMwD0w= github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= github.com/couchbase/go-couchbase v0.1.1 h1:ClFXELcKj/ojyoTYbsY34QUrrYCBi/1G749sXSCkdhk= github.com/couchbase/go-couchbase v0.1.1/go.mod h1:+/bddYDxXsf9qt0xpDUtRR47A2GjaXmGGAqQ/k3GJ8A= github.com/couchbase/gomemcached v0.1.3 h1:HIc5qMYNbuhB7zNaiEtj61DCYkquAwrQlf64q7JzdEY= github.com/couchbase/gomemcached v0.1.3/go.mod h1:mxliKQxOv84gQ0bJWbI+w9Wxdpt9HjDvgW9MjCym5Vo= github.com/couchbase/goutils v0.1.0 h1:0WLlKJilu7IBm98T8nS9+J36lBFVLRUSIUtyD/uWpAE= github.com/couchbase/goutils v0.1.0/go.mod h1:BQwMFlJzDjFDG3DJUdU0KORxn88UlsOULuxLExMh3Hs= github.com/cpuguy83/dockercfg v0.3.2 h1:DlJTyZGBDlXqUZ2Dk2Q3xHs/FtnooJJVaad2S9GKorA= github.com/cpuguy83/dockercfg v0.3.2/go.mod h1:sugsbF4//dDlL/i+S+rtpIWp+5h0BHJHfjj5/jFyUJc= github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= github.com/cpuguy83/go-md2man/v2 v2.0.7 h1:zbFlGlXEAKlwXpmvle3d8Oe3YnkKIK4xSRTd3sHPnBo= github.com/cpuguy83/go-md2man/v2 v2.0.7/go.mod h1:oOW0eioCTA6cOiMLiUPZOpcVxMig6NIQQ7OS05n1F4g= github.com/creack/goselect v0.1.3 h1:MaGNMclRo7P2Jl21hBpR1Cn33ITSbKP6E49RtfblLKc= github.com/creack/goselect v0.1.3/go.mod h1:a/NhLweNvqIYMuxcMOuWY516Cimucms3DglDzQP3hKY= github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7DoTY= github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/creack/pty v1.1.18 h1:n56/Zwd5o6whRC5PMGretI4IdRLlmBXYNjScPaBgsbY= github.com/creack/pty v1.1.18/go.mod h1:MOBLtS5ELjhRRrroQr9kyvTxUAFNvYEK993ew/Vr4O4= github.com/creasty/defaults v1.8.0 h1:z27FJxCAa0JKt3utc0sCImAEb+spPucmKoOdLHvHYKk= github.com/creasty/defaults v1.8.0/go.mod h1:iGzKe6pbEHnpMPtfDXZEr0NVxWnPTjb1bbDy08fPzYM= github.com/cronokirby/saferith v0.33.0 h1:TgoQlfsD4LIwx71+ChfRcIpjkw+RPOapDEVxa+LhwLo= github.com/cronokirby/saferith v0.33.0/go.mod h1:QKJhjoqUtBsXCAVEjw38mFqoi7DebT7kthcD7UzbnoA= github.com/cyphar/filepath-securejoin v0.6.1 h1:5CeZ1jPXEiYt3+Z6zqprSAgSWiggmpVyciv8syjIpVE= github.com/cyphar/filepath-securejoin v0.6.1/go.mod h1:A8hd4EnAeyujCJRrICiOWqjS1AX0a9kM5XL+NwKoYSc= github.com/danieljoos/wincred v1.2.2 h1:774zMFJrqaeYCK2W57BgAem/MLi6mtSE47MB6BOJ0i0= github.com/danieljoos/wincred v1.2.2/go.mod h1:w7w4Utbrz8lqeMbDAK0lkNJUv5sAOkFi7nd/ogr0Uh8= github.com/datadope-io/go-zabbix/v2 v2.0.1 h1:kGlyzfFqbwhMph4Mo0hpYxxBHI14eHuV5TVy+7uNonE= github.com/datadope-io/go-zabbix/v2 v2.0.1/go.mod h1:hRbQWszykTUPoR6g5fJXfNwPFZpP3nDNSZ9HrEKuKCM= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/devigned/tab v0.1.1 h1:3mD6Kb1mUOYeLpJvTVSDwSg5ZsfSxfvxGRTxRsJsITA= github.com/devigned/tab v0.1.1/go.mod h1:XG9mPq0dFghrYvoBF3xdRrJzSTX1b7IQrvaL9mzjeJY= github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f h1:lO4WD4F/rVNCu3HqELle0jiPLLBs70cWOduZpkS1E78= github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f/go.mod h1:cuUVRXasLTGF7a8hSLbxyZXjz+1KgoB3wDUb6vlszIc= github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no= github.com/digitalocean/go-libvirt v0.0.0-20250417173424-a6a66ef779d6 h1:jk2z9emvvDmaTwTdVOvQCK3POtH6+fEvWUtqMBjvnq0= github.com/digitalocean/go-libvirt v0.0.0-20250417173424-a6a66ef779d6/go.mod h1:vumyuXRJJvjCdabRsu/BvoCirqGHC5bakkC9G0V3Mgw= github.com/dimchansky/utfbom v1.1.1 h1:vV6w1AhK4VMnhBno/TPVCoK9U/LP0PkLCS9tbxHdi/U= github.com/dimchansky/utfbom v1.1.1/go.mod h1:SxdoEBH5qIqFocHMyGOXVAybYJdr71b1Q/j0mACtrfE= github.com/distribution/reference v0.6.0 h1:0IXCQ5g4/QMHHkarYzh5l+u8T3t73zM5QvfrDyIgxBk= github.com/distribution/reference v0.6.0/go.mod h1:BbU0aIcezP1/5jX/8MP0YiH4SdvB5Y4f/wlDRiLyi3E= github.com/djherbis/times v1.6.0 h1:w2ctJ92J8fBvWPxugmXIv7Nz7Q3iDMKNx9v5ocVH20c= github.com/djherbis/times v1.6.0/go.mod h1:gOHeRAz2h+VJNZ5Gmc/o7iD9k4wW7NMVqieYCY99oc0= github.com/dnaeon/go-vcr v1.2.0 h1:zHCHvJYTMh1N7xnV7zf1m1GPBF9Ad0Jk/whtQ1663qI= github.com/dnaeon/go-vcr v1.2.0/go.mod h1:R4UdLID7HZT3taECzJs4YgbbH6PIGXB6W/sc5OLb6RQ= github.com/docker/distribution v2.7.1+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= github.com/docker/docker v24.0.6+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= github.com/docker/docker v28.5.2+incompatible h1:DBX0Y0zAjZbSrm1uzOkdr1onVghKaftjlSWt4AFexzM= github.com/docker/docker v28.5.2+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= github.com/docker/go-connections v0.4.0/go.mod h1:Gbd7IOopHjR8Iph03tsViu4nIes5XhDvyHbTtUxmeec= github.com/docker/go-connections v0.6.0 h1:LlMG9azAe1TqfR7sO+NJttz1gy6KO7VJBh+pMmjSD94= github.com/docker/go-connections v0.6.0/go.mod h1:AahvXYshr6JgfUJGdDCs2b5EZG/vmaMAntpSFH5BFKE= github.com/docker/go-units v0.4.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= github.com/docker/go-units v0.5.0 h1:69rxXcBk27SvSaaxTtLh/8llcHD8vYHT7WSdRZ/jvr4= github.com/docker/go-units v0.5.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= github.com/docopt/docopt-go v0.0.0-20180111231733-ee0de3bc6815/go.mod h1:WwZ+bS3ebgob9U8Nd0kOddGdZWjyMGR8Wziv+TBNwSE= github.com/dropbox/dropbox-sdk-go-unofficial/v6 v6.0.5 h1:FT+t0UEDykcor4y3dMVKXIiWJETBpRgERYTGlmMd7HU= github.com/dropbox/dropbox-sdk-go-unofficial/v6 v6.0.5/go.mod h1:rSS3kM9XMzSQ6pw91Qgd6yB5jdt70N4OdtrAf74As5M= github.com/dropbox/godropbox v0.0.0-20180512210157-31879d3884b9 h1:NAvZb7gqQfLSNBPzVsvI7eZMosXtg2g2kxXrei90CtU= github.com/dropbox/godropbox v0.0.0-20180512210157-31879d3884b9/go.mod h1:glr97hP/JuXb+WMYCizc4PIFuzw1lCR97mwbe1VVXhQ= github.com/dsnet/compress v0.0.1/go.mod h1:Aw8dCMJ7RioblQeTqt88akK31OvO8Dhf5JflhBbQEHo= github.com/dsnet/golib v0.0.0-20171103203638-1ea166775780/go.mod h1:Lj+Z9rebOhdfkVLjJ8T6VcRQv3SXugXy999NBtR9aFY= github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY= github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto= github.com/dvsekhvalnov/jose2go v1.7.0 h1:bnQc8+GMnidJZA8zc6lLEAb4xNrIqHwO+9TzqvtQZPo= github.com/dvsekhvalnov/jose2go v1.7.0/go.mod h1:QsHjhyTlD/lAVqn/NSbVZmSCGeDehTB/mPZadG+mhXU= github.com/dynatrace-oss/dynatrace-metric-utils-go v0.5.0 h1:wHGPJSXvwKQVf/XfhjUPyrhpcPKWNy8F3ikH+eiwoBg= github.com/dynatrace-oss/dynatrace-metric-utils-go v0.5.0/go.mod h1:PseHFo8Leko7J4A/TfZ6kkHdkzKBLUta6hRZR/OEbbc= github.com/eapache/go-resiliency v1.7.0 h1:n3NRTnBn5N0Cbi/IeOHuQn9s2UwVUH7Ga0ZWcP+9JTA= github.com/eapache/go-resiliency v1.7.0/go.mod h1:5yPzW0MIvSe0JDsv0v+DvcjEv2FyD6iZYSs1ZI+iQho= github.com/eapache/queue v1.1.0 h1:YOEu7KNc61ntiQlcEeUIoDTJ2o8mQznoNvUhiigpIqc= github.com/eapache/queue v1.1.0/go.mod h1:6eCeP0CKFpHLu8blIFXhExK/dRa7WDZfr6jVFPTqq+I= github.com/ebitengine/purego v0.10.0 h1:QIw4xfpWT6GWTzaW5XEKy3HXoqrJGx1ijYHzTF0/ISU= github.com/ebitengine/purego v0.10.0/go.mod h1:iIjxzd6CiRiOG0UyXP+V1+jWqUXVjPKLAI0mRfJZTmQ= github.com/echlebek/crock v1.0.1 h1:KbzamClMIfVIkkjq/GTXf+N16KylYBpiaTitO3f1ujg= github.com/echlebek/crock v1.0.1/go.mod h1:/kvwHRX3ZXHj/kHWJkjXDmzzRow54EJuHtQ/PapL/HI= github.com/echlebek/timeproxy v1.0.0 h1:V41/v8tmmMDNMA2GrBPI45nlXb3F7+OY+nJz1BqKsCk= github.com/echlebek/timeproxy v1.0.0/go.mod h1:0dg2Lnb8no/jFwoMQKMTU6iAivgoMptGqSTprhnrRtk= github.com/eclipse/paho.golang v0.23.0 h1:KHgl2wz6EJo7cMBmkuhpt7C576vP+kpPv7jjvSyR6Mk= github.com/eclipse/paho.golang v0.23.0/go.mod h1:nQRhTkoZv8EAiNs5UU0/WdQIx2NrnWUpL9nsGJTQN04= github.com/eclipse/paho.mqtt.golang v1.5.1 h1:/VSOv3oDLlpqR2Epjn1Q7b2bSTplJIeV2ISgCl2W7nE= github.com/eclipse/paho.mqtt.golang v1.5.1/go.mod h1:1/yJCneuyOoCOzKSsOTUc0AJfpsItBGWvYpBLimhArU= github.com/elastic/go-sysinfo v1.8.1 h1:4Yhj+HdV6WjbCRgGdZpPJ8lZQlXZLKDAeIkmQ/VRvi4= github.com/elastic/go-sysinfo v1.8.1/go.mod h1:JfllUnzoQV/JRYymbH3dO1yggI3mV2oTKSXsDHM+uIM= github.com/elastic/go-windows v1.0.0 h1:qLURgZFkkrYyTTkvYpsZIgf83AUsdIHfvlJaqaZ7aSY= github.com/elastic/go-windows v1.0.0/go.mod h1:TsU0Nrp7/y3+VwE82FoZF8gC/XFg/Elz6CcloAxnPgU= github.com/emersion/go-message v0.18.0 h1:7LxAXHRpSeoO/Wom3ZApVZYG7c3d17yCScYce8WiXA8= github.com/emersion/go-message v0.18.0/go.mod h1:Zi69ACvzaoV/MBnrxfVBPV3xWEuCmC2nEN39oJF4B8A= github.com/emersion/go-textwrapper v0.0.0-20200911093747-65d896831594 h1:IbFBtwoTQyw0fIM5xv1HF+Y+3ZijDR839WMulgxCcUY= github.com/emersion/go-textwrapper v0.0.0-20200911093747-65d896831594/go.mod h1:aqO8z8wPrjkscevZJFVE1wXJrLpC5LtJG7fqLOsPb2U= github.com/emersion/go-vcard v0.0.0-20230815062825-8fda7d206ec9 h1:ATgqloALX6cHCranzkLb8/zjivwQ9DWWDCQRnxTPfaA= github.com/emersion/go-vcard v0.0.0-20230815062825-8fda7d206ec9/go.mod h1:HMJKR5wlh/ziNp+sHEDV2ltblO4JD2+IdDOWtGcQBTM= github.com/emiago/sipgo v1.2.1 h1:5JTwogbe3yQFA3sjBVueN2Q4WTU350tGeBwPYT8HMv0= github.com/emiago/sipgo v1.2.1/go.mod h1:DuwAxBZhKMqIzQFPGZb1MVAGU6Wuxj64oTOhd5dx/FY= github.com/emicklei/go-restful/v3 v3.12.2 h1:DhwDP0vY3k8ZzE0RunuJy8GhNpPL6zqLkDf9B/a0/xU= github.com/emicklei/go-restful/v3 v3.12.2/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc= github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= github.com/envoyproxy/go-control-plane v0.9.7/go.mod h1:cwu0lG7PUMfa9snN8LXBig5ynNVH9qI8YYLbd1fK2po= github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= github.com/envoyproxy/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= github.com/envoyproxy/go-control-plane v0.9.9-0.20210512163311-63b5d3c536b0/go.mod h1:hliV/p42l8fGbc6Y9bQ70uLwIvmJyVE5k4iMKlh8wCQ= github.com/envoyproxy/go-control-plane v0.9.10-0.20210907150352-cf90f659a021/go.mod h1:AFq3mo9L8Lqqiid3OhADV3RfLJnjiw63cSpi+fDTRC0= github.com/envoyproxy/go-control-plane v0.10.2-0.20220325020618-49ff273808a1/go.mod h1:KJwIaB5Mv44NWtYuAOFCVOjcI94vtpEz2JU/D2v6IjE= github.com/envoyproxy/go-control-plane v0.10.3/go.mod h1:fJJn/j26vwOu972OllsvAgJJM//w9BV6Fxbg2LuVd34= github.com/envoyproxy/go-control-plane v0.11.1-0.20230524094728-9239064ad72f/go.mod h1:sfYdkwUW4BA3PbKjySwjJy+O4Pu0h62rlqCMHNk+K+Q= github.com/envoyproxy/go-control-plane v0.14.0 h1:hbG2kr4RuFj222B6+7T83thSPqLjwBIfQawTkC++2HA= github.com/envoyproxy/go-control-plane v0.14.0/go.mod h1:NcS5X47pLl/hfqxU70yPwL9ZMkUlwlKxtAohpi2wBEU= github.com/envoyproxy/go-control-plane/envoy v1.36.0 h1:yg/JjO5E7ubRyKX3m07GF3reDNEnfOboJ0QySbH736g= github.com/envoyproxy/go-control-plane/envoy v1.36.0/go.mod h1:ty89S1YCCVruQAm9OtKeEkQLTb+Lkz0k8v9W0Oxsv98= github.com/envoyproxy/go-control-plane/ratelimit v0.1.0 h1:/G9QYbddjL25KvtKTv3an9lx6VBE2cnb8wp1vEGNYGI= github.com/envoyproxy/go-control-plane/ratelimit v0.1.0/go.mod h1:Wk+tMFAFbCXaJPzVVHnPgRKdUdwW/KdbRt94AzgRee4= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= github.com/envoyproxy/protoc-gen-validate v0.6.7/go.mod h1:dyJXwwfPK2VSqiB9Klm1J6romD608Ba7Hij42vrOBCo= github.com/envoyproxy/protoc-gen-validate v0.9.1/go.mod h1:OKNgG7TCp5pF4d6XftA0++PMirau2/yoOwVac3AbF2w= github.com/envoyproxy/protoc-gen-validate v0.10.1/go.mod h1:DRjgyB0I43LtJapqN6NiRwroiAU2PaFuvk/vjgh61ss= github.com/envoyproxy/protoc-gen-validate v1.3.0 h1:TvGH1wof4H33rezVKWSpqKz5NXWg5VPuZ0uONDT6eb4= github.com/envoyproxy/protoc-gen-validate v1.3.0/go.mod h1:HvYl7zwPa5mffgyeTUHA9zHIH36nmrm7oCbo4YKoSWA= github.com/facebook/time v0.0.0-20250903103710-a5911c32cdb9 h1:IghB0/AakzNKu4+KBY+RT7J4TiMXwmZ1DCzOTR+0wmQ= github.com/facebook/time v0.0.0-20250903103710-a5911c32cdb9/go.mod h1:bp0KsBqhjbum8LF5Canem6aGBHWk5EGZRRN7z3rMp0E= github.com/facebookgo/stack v0.0.0-20160209184415-751773369052 h1:JWuenKqqX8nojtoVVWjGfOF9635RETekkoH6Cc9SX0A= github.com/facebookgo/stack v0.0.0-20160209184415-751773369052/go.mod h1:UbMTZqLaRiH3MsBH8va0n7s1pQYcu3uTb8G4tygF4Zg= github.com/facebookgo/stackerr v0.0.0-20150612192056-c2fcf88613f4 h1:fP04zlkPjAGpsduG7xN3rRkxjAqkJaIQnnkNYYw/pAk= github.com/facebookgo/stackerr v0.0.0-20150612192056-c2fcf88613f4/go.mod h1:SBHk9aNQtiw4R4bEuzHjVmZikkUKCnO1v3lPQ21HZGk= github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= github.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU= github.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk= github.com/fatih/color v1.18.0 h1:S8gINlzdQ840/4pfAwic/ZE0djQEH3wM94VfqLTZcOM= github.com/fatih/color v1.18.0/go.mod h1:4FelSpRwEGDpQ12mAdzqdOukCy4u8WUtOY6lkT/6HfU= github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2Wg= github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= github.com/flynn/noise v1.0.1 h1:vPp/jdQLXC6ppsXSj/pM3W1BIJ5FEHE2TulSJBpb43Y= github.com/flynn/noise v1.0.1/go.mod h1:xbMo+0i6+IGbYdJhF31t2eR1BIU0CYc12+BNAKwUTag= github.com/fogleman/gg v1.2.1-0.20190220221249-0403632d5b90/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k= github.com/fogleman/gg v1.3.0/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k= github.com/fortytw2/leaktest v1.3.0 h1:u8491cBMTQ8ft8aeV+adlcytMZylmA5nnwwkRZjI8vw= github.com/fortytw2/leaktest v1.3.0/go.mod h1:jDsjWgpAGjm2CA7WthBh/CdZYEPF31XHquHwclZch5g= github.com/frankban/quicktest v1.11.0/go.mod h1:K+q6oSqb0W0Ininfk863uOk1lMy69l/P6txr3mVT54s= github.com/frankban/quicktest v1.11.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.6 h1:7Xjx+VpznH+oBnejlPUj8oUpdxnVs4f8XU8WnHkI4W8= github.com/frankban/quicktest v1.14.6/go.mod h1:4ptaffx2x8+WTWXmUCuVU6aPUX1/Mz7zb5vbUoiM6w0= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= github.com/fsnotify/fsnotify v1.9.0 h1:2Ml+OJNzbYCTzsxtv8vKSFD9PbJjmhYF14k/jKC7S9k= github.com/fsnotify/fsnotify v1.9.0/go.mod h1:8jBTzvmWwFyi3Pb8djgCCO5IBqzKJ/Jwo8TRcHyHii0= github.com/fxamacker/cbor/v2 v2.9.0 h1:NpKPmjDBgUfBms6tr6JZkTHtfFGcMKsw3eGcmD/sapM= github.com/fxamacker/cbor/v2 v2.9.0/go.mod h1:vM4b+DJCtHn+zz7h3FFp/hDAI9WNWCsZj23V5ytsSxQ= github.com/gabriel-vasile/mimetype v1.4.13 h1:46nXokslUBsAJE/wMsp5gtO500a4F3Nkz9Ufpk2AcUM= github.com/gabriel-vasile/mimetype v1.4.13/go.mod h1:d+9Oxyo1wTzWdyVUPMmXFvp4F9tea18J8ufA774AB3s= github.com/geoffgarside/ber v1.1.0 h1:qTmFG4jJbwiSzSXoNJeHcOprVzZ8Ulde2Rrrifu5U9w= github.com/geoffgarside/ber v1.1.0/go.mod h1:jVPKeCbj6MvQZhwLYsGwaGI52oUorHoHKNecGT85ZCc= github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= github.com/go-asn1-ber/asn1-ber v1.5.8-0.20250403174932-29230038a667 h1:BP4M0CvQ4S3TGls2FvczZtj5Re/2ZzkV9VwqPHH/3Bo= github.com/go-asn1-ber/asn1-ber v1.5.8-0.20250403174932-29230038a667/go.mod h1:hEBeB/ic+5LoWskz+yKT7vGhhPYkProFKoKdwZRWMe0= github.com/go-chi/chi/v5 v5.2.5 h1:Eg4myHZBjyvJmAFjFvWgrqDTXFyOzjj7YIm3L3mu6Ug= github.com/go-chi/chi/v5 v5.2.5/go.mod h1:X7Gx4mteadT3eDOMTsXzmI4/rwUpOwBHLpAfupzFJP0= github.com/go-darwin/apfs v0.0.0-20211011131704-f84b94dbf348 h1:JnrjqG5iR07/8k7NqrLNilRsl3s1EPRQEGvbPyOce68= github.com/go-darwin/apfs v0.0.0-20211011131704-f84b94dbf348/go.mod h1:Czxo/d1g948LtrALAZdL04TL/HnkopquAjxYUuI02bo= github.com/go-faster/city v1.0.1 h1:4WAxSZ3V2Ws4QRDrscLEDcibJY8uf41H6AhXDrNDcGw= github.com/go-faster/city v1.0.1/go.mod h1:jKcUJId49qdW3L1qKHH/3wPeUstCVpVSXTM6vO3VcTw= github.com/go-faster/errors v0.7.1 h1:MkJTnDoEdi9pDabt1dpWf7AA8/BaSYZqibYyhZ20AYg= github.com/go-faster/errors v0.7.1/go.mod h1:5ySTjWFiphBs07IKuiL69nxdfd5+fzh1u7FPGZP2quo= github.com/go-fonts/dejavu v0.1.0/go.mod h1:4Wt4I4OU2Nq9asgDCteaAaWZOV24E+0/Pwo0gppep4g= github.com/go-fonts/latin-modern v0.2.0/go.mod h1:rQVLdDMK+mK1xscDwsqM5J8U2jrRa3T0ecnM9pNujks= github.com/go-fonts/liberation v0.1.1/go.mod h1:K6qoJYypsmfVjWg8KOVDQhLc8UDgIK2HYqyqAO9z7GY= github.com/go-fonts/liberation v0.2.0/go.mod h1:K6qoJYypsmfVjWg8KOVDQhLc8UDgIK2HYqyqAO9z7GY= github.com/go-fonts/stix v0.1.0/go.mod h1:w/c1f0ldAUlJmLBvlbkvVXLAD+tAMqobIIQpmnUIzUY= github.com/go-git/go-billy/v5 v5.6.0 h1:w2hPNtoehvJIxR00Vb4xX94qHQi/ApZfX+nBE2Cjio8= github.com/go-git/go-billy/v5 v5.6.0/go.mod h1:sFDq7xD3fn3E0GOwUSZqHo9lrkmx8xJhA0ZrfvjBRGM= github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= github.com/go-jose/go-jose/v4 v4.1.3 h1:CVLmWDhDVRa6Mi/IgCgaopNosCaHz7zrMeF9MlZRkrs= github.com/go-jose/go-jose/v4 v4.1.3/go.mod h1:x4oUasVrzR7071A4TnHLGSPpNOm2a21K9Kf04k1rs08= github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= github.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY= 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-latex/latex v0.0.0-20210118124228-b3d85cf34e07/go.mod h1:CO1AlKB2CSIqUrmQPqA0gdRIlnLEY0gK5JGjh37zN5U= github.com/go-latex/latex v0.0.0-20210823091927-c0d11ff05a81/go.mod h1:SX0U8uGpxhq9o2S/CELCSUxEWWAuoCUcVCQWv7G2OCk= github.com/go-ldap/ldap/v3 v3.4.12 h1:1b81mv7MagXZ7+1r7cLTWmyuTqVqdwbtJSjC0DAp9s4= github.com/go-ldap/ldap/v3 v3.4.12/go.mod h1:+SPAGcTtOfmGsCb3h1RFiq4xpp4N636G75OEace8lNo= 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= github.com/go-logfmt/logfmt v0.6.1 h1:4hvbpePJKnIzH1B+8OR/JPbTx37NktoI9LE2QZBBkvE= github.com/go-logfmt/logfmt v0.6.1/go.mod h1:EV2pOAQoZaT1ZXZbqDl5hrymndi4SY9ED9/z6CO0XAk= github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= github.com/go-logr/logr v1.4.3 h1:CjnDlHq8ikf6E492q6eKboGOC0T8CDaOvkHCIg8idEI= github.com/go-logr/logr v1.4.3/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= github.com/go-ole/go-ole v1.3.0 h1:Dt6ye7+vXGIKZ7Xtk4s6/xVdGDQynvom7xCFEdWr6uE= github.com/go-ole/go-ole v1.3.0/go.mod h1:5LS6F96DhAwUc7C+1HLexzMXY1xGRSryjyPPKW6zv78= github.com/go-openapi/jsonpointer v0.22.4 h1:dZtK82WlNpVLDW2jlA1YCiVJFVqkED1MegOUy9kR5T4= github.com/go-openapi/jsonpointer v0.22.4/go.mod h1:elX9+UgznpFhgBuaMQ7iu4lvvX1nvNsesQ3oxmYTw80= github.com/go-openapi/jsonreference v0.21.4 h1:24qaE2y9bx/q3uRK/qN+TDwbok1NhbSmGjjySRCHtC8= github.com/go-openapi/jsonreference v0.21.4/go.mod h1:rIENPTjDbLpzQmQWCj5kKj3ZlmEh+EFVbz3RTUh30/4= github.com/go-openapi/swag v0.25.4 h1:OyUPUFYDPDBMkqyxOTkqDYFnrhuhi9NR6QVUvIochMU= github.com/go-openapi/swag v0.25.4/go.mod h1:zNfJ9WZABGHCFg2RnY0S4IOkAcVTzJ6z2Bi+Q4i6qFQ= github.com/go-openapi/swag/cmdutils v0.25.4 h1:8rYhB5n6WawR192/BfUu2iVlxqVR9aRgGJP6WaBoW+4= github.com/go-openapi/swag/cmdutils v0.25.4/go.mod h1:pdae/AFo6WxLl5L0rq87eRzVPm/XRHM3MoYgRMvG4A0= github.com/go-openapi/swag/conv v0.25.4 h1:/Dd7p0LZXczgUcC/Ikm1+YqVzkEeCc9LnOWjfkpkfe4= github.com/go-openapi/swag/conv v0.25.4/go.mod h1:3LXfie/lwoAv0NHoEuY1hjoFAYkvlqI/Bn5EQDD3PPU= github.com/go-openapi/swag/fileutils v0.25.4 h1:2oI0XNW5y6UWZTC7vAxC8hmsK/tOkWXHJQH4lKjqw+Y= github.com/go-openapi/swag/fileutils v0.25.4/go.mod h1:cdOT/PKbwcysVQ9Tpr0q20lQKH7MGhOEb6EwmHOirUk= github.com/go-openapi/swag/jsonname v0.25.4 h1:bZH0+MsS03MbnwBXYhuTttMOqk+5KcQ9869Vye1bNHI= github.com/go-openapi/swag/jsonname v0.25.4/go.mod h1:GPVEk9CWVhNvWhZgrnvRA6utbAltopbKwDu8mXNUMag= github.com/go-openapi/swag/jsonutils v0.25.4 h1:VSchfbGhD4UTf4vCdR2F4TLBdLwHyUDTd1/q4i+jGZA= github.com/go-openapi/swag/jsonutils v0.25.4/go.mod h1:7OYGXpvVFPn4PpaSdPHJBtF0iGnbEaTk8AvBkoWnaAY= github.com/go-openapi/swag/jsonutils/fixtures_test v0.25.4 h1:IACsSvBhiNJwlDix7wq39SS2Fh7lUOCJRmx/4SN4sVo= github.com/go-openapi/swag/jsonutils/fixtures_test v0.25.4/go.mod h1:Mt0Ost9l3cUzVv4OEZG+WSeoHwjWLnarzMePNDAOBiM= github.com/go-openapi/swag/loading v0.25.4 h1:jN4MvLj0X6yhCDduRsxDDw1aHe+ZWoLjW+9ZQWIKn2s= github.com/go-openapi/swag/loading v0.25.4/go.mod h1:rpUM1ZiyEP9+mNLIQUdMiD7dCETXvkkC30z53i+ftTE= github.com/go-openapi/swag/mangling v0.25.4 h1:2b9kBJk9JvPgxr36V23FxJLdwBrpijI26Bx5JH4Hp48= github.com/go-openapi/swag/mangling v0.25.4/go.mod h1:6dxwu6QyORHpIIApsdZgb6wBk/DPU15MdyYj/ikn0Hg= github.com/go-openapi/swag/netutils v0.25.4 h1:Gqe6K71bGRb3ZQLusdI8p/y1KLgV4M/k+/HzVSqT8H0= github.com/go-openapi/swag/netutils v0.25.4/go.mod h1:m2W8dtdaoX7oj9rEttLyTeEFFEBvnAx9qHd5nJEBzYg= github.com/go-openapi/swag/stringutils v0.25.4 h1:O6dU1Rd8bej4HPA3/CLPciNBBDwZj9HiEpdVsb8B5A8= github.com/go-openapi/swag/stringutils v0.25.4/go.mod h1:GTsRvhJW5xM5gkgiFe0fV3PUlFm0dr8vki6/VSRaZK0= github.com/go-openapi/swag/typeutils v0.25.4 h1:1/fbZOUN472NTc39zpa+YGHn3jzHWhv42wAJSN91wRw= github.com/go-openapi/swag/typeutils v0.25.4/go.mod h1:Ou7g//Wx8tTLS9vG0UmzfCsjZjKhpjxayRKTHXf2pTE= github.com/go-openapi/swag/yamlutils v0.25.4 h1:6jdaeSItEUb7ioS9lFoCZ65Cne1/RZtPBZ9A56h92Sw= github.com/go-openapi/swag/yamlutils v0.25.4/go.mod h1:MNzq1ulQu+yd8Kl7wPOut/YHAAU/H6hL91fF+E2RFwc= github.com/go-openapi/testify/enable/yaml/v2 v2.0.2 h1:0+Y41Pz1NkbTHz8NngxTuAXxEodtNSI1WG1c/m5Akw4= github.com/go-openapi/testify/enable/yaml/v2 v2.0.2/go.mod h1:kme83333GCtJQHXQ8UKX3IBZu6z8T5Dvy5+CW3NLUUg= github.com/go-openapi/testify/v2 v2.0.2 h1:X999g3jeLcoY8qctY/c/Z8iBHTbwLz7R2WXd6Ub6wls= github.com/go-openapi/testify/v2 v2.0.2/go.mod h1:HCPmvFFnheKK2BuwSA0TbbdxJ3I16pjwMkYkP4Ywn54= github.com/go-pdf/fpdf v0.5.0/go.mod h1:HzcnA+A23uwogo0tp9yU+l3V+KXhiESpt1PMayhOh5M= github.com/go-pdf/fpdf v0.6.0/go.mod h1:HzcnA+A23uwogo0tp9yU+l3V+KXhiESpt1PMayhOh5M= github.com/go-redis/redis/v7 v7.4.1 h1:PASvf36gyUpr2zdOUS/9Zqc80GbM+9BDyiJSJDDOrTI= github.com/go-redis/redis/v7 v7.4.1/go.mod h1:JDNMw23GTyLNC4GZu9njt15ctBQVn7xjRfnwdHj/Dcg= github.com/go-redis/redis/v8 v8.11.5 h1:AcZZR7igkdvfVmQTPnu9WE37LRrO/YrBH5zWyjDC0oI= github.com/go-redis/redis/v8 v8.11.5/go.mod h1:gREzHqY1hg6oD9ngVRbLStwAWKhA0FEgq8Jd4h5lpwo= github.com/go-resty/resty/v2 v2.17.1 h1:x3aMpHK1YM9e4va/TMDRlusDDoZiQ+ViDu/WpA6xTM4= github.com/go-resty/resty/v2 v2.17.1/go.mod h1:kCKZ3wWmwJaNc7S29BRtUhJwy7iqmn+2mLtQrOyQlVA= github.com/go-sql-driver/mysql v1.5.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= github.com/go-sql-driver/mysql v1.9.3 h1:U/N249h2WzJ3Ukj8SowVFjdtZKfu9vlLZxjPXV1aweo= github.com/go-sql-driver/mysql v1.9.3/go.mod h1:qn46aNg1333BRMNU69Lq93t8du/dwxI64Gl8i5p1WMU= github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= github.com/go-stack/stack v1.8.1 h1:ntEHSVwIt7PNXNpgPmVfMrNhLtgjlmnZha2kOpuRiDw= github.com/go-stack/stack v1.8.1/go.mod h1:dcoOX6HbPZSZptuspn9bctJ+N/CnF5gGygcUP3XYfe4= github.com/go-stomp/stomp v2.1.4+incompatible h1:D3SheUVDOz9RsjVWkoh/1iCOwD0qWjyeTZMUZ0EXg2Y= github.com/go-stomp/stomp v2.1.4+incompatible/go.mod h1:VqCtqNZv1226A1/79yh+rMiFUcfY3R109np+7ke4n0c= github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE= github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 h1:tfuBGBXKqDEevZMzYi5KSi8KkcZtzBcTgAUUtapy0OI= github.com/go-task/slim-sprig/v3 v3.0.0 h1:sUs3vkvUymDpBKi3qH1YSqBQk9+9D/8M2mN1vB6EwHI= github.com/go-task/slim-sprig/v3 v3.0.0/go.mod h1:W848ghGpv3Qj3dhTPRyJypKRiqCdHZiAzKg9hl15HA8= github.com/go-test/deep v1.1.1 h1:0r/53hagsehfO4bzD2Pgr/+RgHqhmf+k1Bpse2cTu1U= github.com/go-test/deep v1.1.1/go.mod h1:5C2ZWiW0ErCdrYzpqxLbTX7MG14M9iiw8DgHncVwcsE= github.com/go-viper/mapstructure/v2 v2.5.0 h1:vM5IJoUAy3d7zRSVtIwQgBj7BiWtMPfmPEgAXnvj1Ro= github.com/go-viper/mapstructure/v2 v2.5.0/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= github.com/goburrow/modbus v0.1.0 h1:DejRZY73nEM6+bt5JSP6IsFolJ9dVcqxsYbpLbeW/ro= github.com/goburrow/modbus v0.1.0/go.mod h1:Kx552D5rLIS8E7TyUwQ/UdHEqvX5T8tyiGBTlzMcZBg= github.com/goburrow/serial v0.1.1-0.20211022031912-bfb69110f8dd h1:qJthTC7IG7e/QYR4i2QHxcDmDdB72FXsaGo4CUQvsPo= github.com/goburrow/serial v0.1.1-0.20211022031912-bfb69110f8dd/go.mod h1:sAiqG0nRVswsm1C97xsttiYCzSLBmUZ/VSlVLZJ8haA= github.com/gobwas/glob v0.2.3 h1:A4xDbljILXROh+kObIiy5kIaPYD8e96x1tgBhUI5J+Y= github.com/gobwas/glob v0.2.3/go.mod h1:d3Ez4x06l9bZtSvzIay5+Yzi0fmZzPgnTbPcKjJAkT8= github.com/gobwas/httphead v0.1.0 h1:exrUm0f4YX0L7EBwZHuCF4GDp8aJfVeBrlLQrs6NqWU= github.com/gobwas/httphead v0.1.0/go.mod h1:O/RXo79gxV8G+RqlR/otEwx4Q36zl9rqC5u12GKvMCM= github.com/gobwas/pool v0.2.1 h1:xfeeEhW7pwmX8nuLVlqbzVc7udMDrwetjEv+TZIz1og= github.com/gobwas/pool v0.2.1/go.mod h1:q8bcK0KcYlCgd9e7WYLm9LpyS+YeLd8JVDW6WezmKEw= github.com/gobwas/ws v1.3.2 h1:zlnbNHxumkRvfPWgfXu8RBwyNR1x8wh9cf5PTOCqs9Q= github.com/gobwas/ws v1.3.2/go.mod h1:hRKAFb8wOxFROYNsT1bqfWnhX+b5MFeJM9r2ZSwg/KY= github.com/goccy/go-json v0.9.11/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I= github.com/goccy/go-json v0.10.5 h1:Fq85nIqj+gXn/S5ahsiTlK3TmC85qgirsdTP/+DeaC4= github.com/goccy/go-json v0.10.5/go.mod h1:oq7eo15ShAhp70Anwd5lgX2pLfOS3QCiwU/PULtXL6M= github.com/godbus/dbus v0.0.0-20190726142602-4481cbc300e2 h1:ZpnhV/YsD2/4cESfV5+Hoeu/iUR3ruzNvZ+yQfO03a0= github.com/godbus/dbus v0.0.0-20190726142602-4481cbc300e2/go.mod h1:bBOAhwG1umN6/6ZUMtDFBMQR8jRg9O75tm9K00oMsK4= github.com/godbus/dbus/v5 v5.1.0 h1:4KLkAxT3aOY8Li4FRJe/KvhoNFFxo0m6fNuFUO8QJUk= github.com/godbus/dbus/v5 v5.1.0/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= github.com/gofrs/flock v0.8.1 h1:+gYjHKf32LDeiEEFhQaotPbLuUXjY5ZqxKgXy7n59aw= github.com/gofrs/flock v0.8.1/go.mod h1:F1TvTiK9OcQqauNUHlbJvyl9Qa1QvF/gOUDKA14jxHU= github.com/gofrs/uuid v3.3.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM= github.com/gofrs/uuid v4.0.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM= github.com/gofrs/uuid v4.4.0+incompatible h1:3qXRTX8/NbyulANqlc0lchS1gqAVxRgsuW1YrTJupqA= github.com/gofrs/uuid v4.4.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM= github.com/gofrs/uuid/v5 v5.4.0 h1:EfbpCTjqMuGyq5ZJwxqzn3Cbr2d0rUZU7v5ycAk/e/0= github.com/gofrs/uuid/v5 v5.4.0/go.mod h1:CDOjlDMVAtN56jqyRUZh58JT31Tiw7/oQyEXZV+9bD8= github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4= github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= github.com/goji/httpauth v0.0.0-20160601135302-2da839ab0f4d/go.mod h1:nnjvkQ9ptGaCkuDUx6wNykzzlUixGxvkme+H/lnzb+A= github.com/golang-jwt/jwt/v4 v4.0.0/go.mod h1:/xlHOz8bRuivTWchD4jCa+NbatV+wEUSzwAxVc6locg= github.com/golang-jwt/jwt/v4 v4.2.0/go.mod h1:/xlHOz8bRuivTWchD4jCa+NbatV+wEUSzwAxVc6locg= github.com/golang-jwt/jwt/v4 v4.5.0/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0= github.com/golang-jwt/jwt/v4 v4.5.2 h1:YtQM7lnr8iZ+j5q71MGKkNw9Mn7AjHM68uc9g5fXeUI= github.com/golang-jwt/jwt/v4 v4.5.2/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0= github.com/golang-jwt/jwt/v5 v5.3.1 h1:kYf81DTWFe7t+1VvL7eS+jKFVWaUnK9cB1qbwn63YCY= github.com/golang-jwt/jwt/v5 v5.3.1/go.mod h1:fxCRLWMO43lRc8nhHWY6LGqRcf+1gQWArsqaEUEa5bE= github.com/golang-sql/civil v0.0.0-20220223132316-b832511892a9 h1:au07oEsX2xN0ktxqI+Sida1w446QrXBRJ0nee3SNZlA= github.com/golang-sql/civil v0.0.0-20220223132316-b832511892a9/go.mod h1:8vg3r2VgvsThLBIFL93Qb5yWzgyZWhEmBwUJWevAkK0= github.com/golang-sql/sqlexp v0.1.0 h1:ZCD6MBpcuOVfGVqsEmY5/4FtYiKz6tSyUv9LPEDei6A= github.com/golang-sql/sqlexp v0.1.0/go.mod h1:J4ad9Vo8ZCWQ2GMrC4UCQy1JpCbwU9m3EOqtpKwwwHI= github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k= github.com/golang/geo v0.0.0-20190916061304-5b978397cfec h1:lJwO/92dFXWeXOZdoGXgptLmNLwynMSHUmU6besqtiw= github.com/golang/geo v0.0.0-20190916061304-5b978397cfec/go.mod h1:QZ0nwyI2jOfgRAoBvP+ab5aRr7c9x7lhGEJrKvBwjWI= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= github.com/golang/glog v1.0.0/go.mod h1:EWib/APOK0SL3dFbYqvxE3UYd8E6s1ouQ7iEp/0LWV4= github.com/golang/glog v1.1.0/go.mod h1:pfYeQZ3JWZoXTV5sFc986z3HTpwQs9At6P4ImfuP3NQ= github.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da h1:oI5xCqsCo564l8iNU+DwB5epxmsaqB+rhGL0m5jtYqE= github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y= github.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= github.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= github.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4= github.com/golang/mock v1.5.0/go.mod h1:CWnOUgYIOo4TcNZ0wHX3YZCqsaM1I1Jvs6v3mP3KVu8= github.com/golang/mock v1.6.0 h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc= github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs= github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= github.com/golang/protobuf v1.3.4/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= github.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk= github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8= github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= github.com/golang/protobuf v1.5.1/go.mod h1:DopwsBzvsk0Fs44TXzsVbJyPhcCPeIwnvohx4u74HPM= github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/golang/snappy v1.0.0 h1:Oy607GVXHs7RtbggtPBnr2RmDArIsAefDwvrdWvRhGs= github.com/golang/snappy v1.0.0/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/btree v1.1.3 h1:CVpQJjYgC4VbzxeGVHfvZrv1ctoYCAI8vbl07Fcxlyg= github.com/google/btree v1.1.3/go.mod h1:qOPhT0dTNdNzV6Z/lhRX0YXUafgPLFUh+gZMl761Gm4= github.com/google/cel-go v0.27.0 h1:e7ih85+4qVrBuqQWTW4FKSqZYokVuc3HnhH5keboFTo= github.com/google/cel-go v0.27.0/go.mod h1:tTJ11FWqnhw5KKpnWpvW9CJC3Y9GK4EIS0WXnBbebzw= github.com/google/flatbuffers v1.12.0/go.mod h1:1AeVuKshWv4vARoZatz6mlQ0JxURH0Kv5+zNeJKJCa8= github.com/google/flatbuffers v2.0.8+incompatible/go.mod h1:1AeVuKshWv4vARoZatz6mlQ0JxURH0Kv5+zNeJKJCa8= github.com/google/flatbuffers v25.12.19+incompatible h1:haMV2JRRJCe1998HeW/p0X9UaMTK6SDo0ffLn2+DbLs= github.com/google/flatbuffers v25.12.19+incompatible/go.mod h1:1AeVuKshWv4vARoZatz6mlQ0JxURH0Kv5+zNeJKJCa8= github.com/google/gnostic-models v0.7.0 h1:qwTtogB15McXDaNqTZdzPJRHvaVJlAl+HVQnLmJEJxo= github.com/google/gnostic-models v0.7.0/go.mod h1:whL5G0m6dmc5cPxKc5bdKdEN3UjI7OUGxBlw57miDrQ= github.com/google/gnxi v0.0.0-20231026134436-d82d9936af15 h1:EETGSLGKBReUUYZdztSp45EzTE6CHw2qMKIfyPrgp6c= github.com/google/gnxi v0.0.0-20231026134436-d82d9936af15/go.mod h1:w8XuCWhpJuVsGdFLU9bLN9CBLROXSDp9tO1SFgg2l+4= github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.4.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8/DtOE= github.com/google/go-cmp v0.5.8/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8= github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU= github.com/google/go-github/v32 v32.1.0 h1:GWkQOdXqviCPx7Q7Fj+KyPoGm4SwHRh8rheoPhd27II= github.com/google/go-github/v32 v32.1.0/go.mod h1:rIEpZD9CTDQwDK9GDrtMTycQNA4JU3qBsCizh3q2WCI= github.com/google/go-querystring v1.0.0/go.mod h1:odCYkC5MyYFN7vkCjXpyrEuKhc/BUO6wN/zVPAxq5ck= github.com/google/go-querystring v1.2.0 h1:yhqkPbu2/OH+V9BfpCVPZkNmUXhb2gBxJArfhIxNtP0= github.com/google/go-querystring v1.2.0/go.mod h1:8IFJqpSRITyJ8QhQ13bmbeMBDfmeEJZD5A0egEOmkqU= github.com/google/go-tpm v0.9.8 h1:slArAR9Ft+1ybZu0lBwpSmpwhRXaa85hWtMinMyRAWo= github.com/google/go-tpm v0.9.8/go.mod h1:h9jEsEECg7gtLis0upRBQU+GhYVH6jMjrFxI8u6bVUY= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0= github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/licensecheck v0.3.1 h1:QoxgoDkaeC4nFrtGN1jV7IPmDCHFNIVh54e5hSt6sPs= github.com/google/licensecheck v0.3.1/go.mod h1:ORkR35t/JjW+emNKtfJDII0zlciG9JgbT7SmsohlHmY= github.com/google/martian v2.1.0+incompatible h1:/CP5g8u/VJHijgedC/Legn3BAbAaWPgecwXBIDzw5no= github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= github.com/google/martian/v3 v3.1.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= github.com/google/martian/v3 v3.2.1/go.mod h1:oBOf6HBosgwRXnUGWUB05QECsc6uvmMiJ3+6W4l/CUk= github.com/google/martian/v3 v3.3.2/go.mod h1:oBOf6HBosgwRXnUGWUB05QECsc6uvmMiJ3+6W4l/CUk= github.com/google/martian/v3 v3.3.3 h1:DIhPTQrbPkgs2yJYdXU/eNACCG5DVQjySNRNlflZ9Fc= github.com/google/martian/v3 v3.3.3/go.mod h1:iEPrYcgCF7jA9OtScMFQyAlZZ4YXTKEtJ1E6RWzmBA0= github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= github.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= github.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= github.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= github.com/google/pprof v0.0.0-20201023163331-3e6fc7fc9c4c/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20201203190320-1bf35d6f28c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20201218002935-b9804c9f04c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-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-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-20210720184732-4bb14d4b1be1/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20260202012954-cb029daf43ef h1:xpF9fUHpoIrrjX24DURVKiwHcFpw19ndIs+FwTSMbno= github.com/google/pprof v0.0.0-20260202012954-cb029daf43ef/go.mod h1:MxpfABSjhmINe3F1It9d+8exIHFvUqtLIRCdOGNXqiI= github.com/google/protobuf v3.11.4+incompatible/go.mod h1:lUQ9D1ePzbH2PrIS7ob/bjm9HXyH5WHB0Akwh7URreM= github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= github.com/google/s2a-go v0.1.9 h1:LGD7gtMgezd8a/Xak7mEWL0PjoTQFvpRudN895yqKW0= github.com/google/s2a-go v0.1.9/go.mod h1:YA0Ei2ZQL3acow2O62kdp9UlnvMmU7kA6Eutn0dXayM= github.com/google/uuid v1.1.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.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/googleapis/enterprise-certificate-proxy v0.0.0-20220520183353-fd19c99a87aa/go.mod h1:17drOmN3MwGY7t0e+Ei9b45FFGA3fBs3x36SsCg1hq8= github.com/googleapis/enterprise-certificate-proxy v0.1.0/go.mod h1:17drOmN3MwGY7t0e+Ei9b45FFGA3fBs3x36SsCg1hq8= github.com/googleapis/enterprise-certificate-proxy v0.2.0/go.mod h1:8C0jb7/mgJe/9KK8Lm7X9ctZC2t60YyIpYEI16jx0Qg= github.com/googleapis/enterprise-certificate-proxy v0.2.1/go.mod h1:AwSRAtLfXpU5Nm3pW+v7rGDHp09LsPtGY9MduiEsR9k= github.com/googleapis/enterprise-certificate-proxy v0.2.3/go.mod h1:AwSRAtLfXpU5Nm3pW+v7rGDHp09LsPtGY9MduiEsR9k= github.com/googleapis/enterprise-certificate-proxy v0.3.14 h1:yh8ncqsbUY4shRD5dA6RlzjJaT4hi3kII+zYw8wmLb8= github.com/googleapis/enterprise-certificate-proxy v0.3.14/go.mod h1:vqVt9yG9480NtzREnTlmGSBmFrA+bzb0yl0TxoBQXOg= github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= github.com/googleapis/gax-go/v2 v2.1.0/go.mod h1:Q3nei7sK6ybPYH7twZdmQpAd1MKb7pfu6SK+H1/DsU0= github.com/googleapis/gax-go/v2 v2.1.1/go.mod h1:hddJymUZASv3XPyGkUpKj8pPO47Rmb0eJc8R6ouapiM= github.com/googleapis/gax-go/v2 v2.2.0/go.mod h1:as02EH8zWkzwUoLbBaFeQ+arQaj/OthfcblKl4IGNaM= github.com/googleapis/gax-go/v2 v2.3.0/go.mod h1:b8LNqSzNabLiUpXKkY7HAR5jr6bIT99EXz9pXxye9YM= github.com/googleapis/gax-go/v2 v2.4.0/go.mod h1:XOTVJ59hdnfJLIP/dh8n5CGryZR2LxK9wbMD5+iXC6c= github.com/googleapis/gax-go/v2 v2.5.1/go.mod h1:h6B0KMMFNtI2ddbGJn3T3ZbwkeT6yqEF02fYlzkUCyo= github.com/googleapis/gax-go/v2 v2.6.0/go.mod h1:1mjbznJAPHFpesgE5ucqfYEscaz5kMdcIDwU/6+DDoY= github.com/googleapis/gax-go/v2 v2.7.0/go.mod h1:TEop28CZZQ2y+c0VxMUmu1lV+fQx57QpBWsYpwqHJx8= github.com/googleapis/gax-go/v2 v2.7.1/go.mod h1:4orTrqY6hXxxaUL4LHIPl6lGo8vAE38/qKbhSAKP6QI= github.com/googleapis/gax-go/v2 v2.18.0 h1:jxP5Uuo3bxm3M6gGtV94P4lliVetoCB4Wk2x8QA86LI= github.com/googleapis/gax-go/v2 v2.18.0/go.mod h1:uSzZN4a356eRG985CzJ3WfbFSpqkLTjsnhWGJR6EwrE= github.com/googleapis/go-type-adapters v1.0.0/go.mod h1:zHW75FOG2aur7gAO2B+MLby+cLsWGBF62rFAi7WjWO4= github.com/googleapis/google-cloud-go-testing v0.0.0-20200911160855-bcd43fbb19e8/go.mod h1:dvDLG8qkwmyD9a/MJJN3XJcT3xFxOKAvTZGvuZmac9g= github.com/gopacket/gopacket v1.5.0 h1:9s9fcSUVKFlRV97B77Bq9XNV3ly2gvvsneFMQUGjc+M= github.com/gopacket/gopacket v1.5.0/go.mod h1:i3NaGaqfoWKAr1+g7qxEdWsmfT+MXuWkAe9+THv8LME= github.com/gopcua/opcua v0.8.0 h1:nB9vDewEmuXmSQf1C9inCHPblFwsH21FeB2Kk6o6Y7U= github.com/gopcua/opcua v0.8.0/go.mod h1:Z6aellk0gIzznZd2UX+Syd/hUMBt65gRlTakpGo6se8= github.com/gophercloud/gophercloud/v2 v2.11.1 h1:jCs4vLH8sJgRqrPzqVfWgl7uI6JnIIlsgeIRM0uHjxY= github.com/gophercloud/gophercloud/v2 v2.11.1/go.mod h1:Rm0YvKQ4QYX2rY9XaDKnjRzSGwlG5ge4h6ABYnmkKQM= github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/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/gorcon/rcon v1.4.0 h1:pYwZ8Rhcgfh/LhdPBncecuEo5thoFvPIuMSWovz1FME= github.com/gorcon/rcon v1.4.0/go.mod h1:M6v6sNmr/NET9YIf+2rq+cIjTBridoy62uzQ58WgC1I= github.com/gorilla/mux v1.8.0/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So= github.com/gorilla/mux v1.8.1 h1:TuBL49tXwgrFYWhqrNgrUNEY92u81SPhu7sTdzQEiWY= github.com/gorilla/mux v1.8.1/go.mod h1:AKf9I4AEqPTmMytcMc0KkNouC66V3BtZ4qD5fmWSiMQ= github.com/gorilla/schema v1.4.1 h1:jUg5hUjCSDZpNGLuXQOgIWGdlgrIdYvgQ0wZtdK1M3E= github.com/gorilla/schema v1.4.1/go.mod h1:Dg5SSm5PV60mhF2NFaTV1xuYYj8tV8NOPRo4FggUMnM= github.com/gorilla/securecookie v1.1.1/go.mod h1:ra0sb63/xPlUeL+yeDciTfxMRAA+MP+HVt/4epWDjd4= github.com/gorilla/securecookie v1.1.2 h1:YCIWL56dvtr73r6715mJs5ZvhtnY73hBvEF8kXD8ePA= github.com/gorilla/securecookie v1.1.2/go.mod h1:NfCASbcHqRSY+3a8tlWJwsQap2VX5pwzwo4h3eOamfo= github.com/gorilla/sessions v1.2.1 h1:DHd3rPN5lE3Ts3D8rKkQ8x/0kqfeNmBAaiSi+o7FsgI= github.com/gorilla/sessions v1.2.1/go.mod h1:dk2InVEVJ0sfLlnXv9EAgkf6ecYs/i80K/zI+bUmuGM= github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/gorilla/websocket v1.5.4-0.20250319132907-e064f32e3674 h1:JeSE6pjso5THxAzdVpqr6/geYxZytqFMBCOtn/ujyeo= github.com/gorilla/websocket v1.5.4-0.20250319132907-e064f32e3674/go.mod h1:r4w70xmWCQKmi1ONH4KIaBptdivuRPyosB9RmPlGEwA= github.com/gosnmp/gosnmp v1.43.2 h1:F9loz6uMCNtIQj0RNO5wz/mZ+FZt2WyNKJYOvw+Zosw= github.com/gosnmp/gosnmp v1.43.2/go.mod h1:smHIwoaqr1M+HTAEd7+mKkPs8lp3Lf/U+htPUql1Q3c= github.com/grafana/regexp v0.0.0-20250905093917-f7b3be9d1853 h1:cLN4IBkmkYZNnk7EAJ0BHIethd+J6LqxFNw5mSiI2bM= github.com/grafana/regexp v0.0.0-20250905093917-f7b3be9d1853/go.mod h1:+JKpmjMGhpgPL+rXZ5nsZieVzvarn86asRlBg4uNGnk= github.com/grid-x/modbus v0.0.0-20240503115206-582f2ab60a18 h1:8V5xRtdD70kGC4/IHqFq+kcBSWr4k6nscAUgWwJ6A5k= github.com/grid-x/modbus v0.0.0-20240503115206-582f2ab60a18/go.mod h1:WpbUAyptAAi0VAriSRopZa6uhiJOJCTz7KFvgGtNRXc= github.com/grid-x/serial v0.0.0-20211107191517-583c7356b3aa h1:Rsn6ARgNkXrsXJIzhkE4vQr5Gbx2LvtEMv4BJOK4LyU= github.com/grid-x/serial v0.0.0-20211107191517-583c7356b3aa/go.mod h1:kdOd86/VGFWRrtkNwf1MPk0u1gIjc4Y7R2j7nhwc7Rk= github.com/grpc-ecosystem/go-grpc-middleware v1.0.0/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk= github.com/grpc-ecosystem/grpc-gateway v1.9.0/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= github.com/grpc-ecosystem/grpc-gateway/v2 v2.7.0/go.mod h1:hgWBS7lorOAVIJEQMi4ZsPv9hVvWI6+ch50m39Pf2Ks= github.com/grpc-ecosystem/grpc-gateway/v2 v2.11.3/go.mod h1:o//XUCC/F+yRGJoPO/VU0GSB0f8Nhgmxx0VIRUvaC0w= github.com/grpc-ecosystem/grpc-gateway/v2 v2.28.0 h1:HWRh5R2+9EifMyIHV7ZV+MIZqgz+PMpZ14Jynv3O2Zs= github.com/grpc-ecosystem/grpc-gateway/v2 v2.28.0/go.mod h1:JfhWUomR1baixubs02l85lZYYOm7LV6om4ceouMv45c= github.com/gsterjov/go-libsecret v0.0.0-20161001094733-a6f4afe4910c h1:6rhixN/i8ZofjG1Y75iExal34USq5p+wiN1tpie8IrU= github.com/gsterjov/go-libsecret v0.0.0-20161001094733-a6f4afe4910c/go.mod h1:NMPJylDgVpX0MLRlPy15sqSwOFv/U1GZ2m21JhFfek0= github.com/gwos/tcg/sdk v0.0.0-20240830123415-f8a34bba6358 h1:QmKzhYk6KMjUutu9Sy4DyOkRgj1Dv+iFnea4t8KrCZg= github.com/gwos/tcg/sdk v0.0.0-20240830123415-f8a34bba6358/go.mod h1:h40FJV0HuULqXSSKf7kfCbOxEcQAD74a5e2LC2+rYiQ= 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/hashicorp/consul/api v1.1.0/go.mod h1:VmuI/Lkw1nC05EYQWNKwWGbkg+FbDBtguAZLlVdkD9Q= github.com/hashicorp/consul/api v1.33.4 h1:AJkZp6qzgAYcMIU0+CjJ0Rb7+byfh0dazFK/gzlOcJk= github.com/hashicorp/consul/api v1.33.4/go.mod h1:BkH3WEUzsnWvJJaHoDqKqoe2Q2EIixx7Gjj6MTwYnOA= github.com/hashicorp/consul/sdk v0.1.1/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8= github.com/hashicorp/consul/sdk v0.17.2 h1:sC0jgNhJkZX3wo1DCrkG12r+1JlZQpWvk3AoL3yZE4Q= github.com/hashicorp/consul/sdk v0.17.2/go.mod h1:VjccKcw6YhMhjH84/ZhTXZ0OG4SUq+K25P6DiCV/Hvg= github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= github.com/hashicorp/errwrap v1.1.0 h1:OxrOeh75EUXMY8TBjag2fzXGZ40LB6IKw45YeGUDY2I= github.com/hashicorp/errwrap v1.1.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= github.com/hashicorp/go-cleanhttp v0.5.0/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= github.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= github.com/hashicorp/go-cleanhttp v0.5.2 h1:035FKYIWjmULyFRBKPs8TBQoi0x6d9G4xc9neXJWAZQ= github.com/hashicorp/go-cleanhttp v0.5.2/go.mod h1:kO/YDlP8L1346E6Sodw+PrpBSV4/SoxCXGY6BqNFT48= github.com/hashicorp/go-hclog v1.6.3 h1:Qr2kF+eVWjTiYmU7Y31tYlP1h0q/X3Nl3tPGdaB11/k= github.com/hashicorp/go-hclog v1.6.3/go.mod h1:W4Qnvbt70Wk/zYJryRzDRU/4r0kIg0PVHBcfoyhpF5M= github.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= github.com/hashicorp/go-immutable-radix v1.3.1 h1:DKHmCUm2hRBK510BaiZlwvpD40f8bJFeZnpfm2KLowc= github.com/hashicorp/go-immutable-radix v1.3.1/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= github.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM= github.com/hashicorp/go-msgpack v0.5.5 h1:i9R9JSrqIz0QVLz3sz+i3YJdT7TTSLcfLLzJi9aZTuI= github.com/hashicorp/go-msgpack v0.5.5/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM= github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk= github.com/hashicorp/go-multierror v1.1.0/go.mod h1:spPvp8C1qA32ftKqdAHm4hHTbPw+vmowP0z+KUhOZdA= github.com/hashicorp/go-multierror v1.1.1 h1:H5DkEtf6CXdFp0N0Em5UCwQpXMWke8IA0+lD48awMYo= github.com/hashicorp/go-multierror v1.1.1/go.mod h1:iw975J/qwKPdAO1clOe2L8331t/9/fmwbPZ6JB6eMoM= github.com/hashicorp/go-retryablehttp v0.5.3/go.mod h1:9B5zBasrRhHXnJnui7y6sL7es7NDiJgTc6Er0maI1Xs= github.com/hashicorp/go-retryablehttp v0.7.8 h1:ylXZWnqa7Lhqpk0L1P1LzDtGcCR0rPVUrx/c8Unxc48= github.com/hashicorp/go-retryablehttp v0.7.8/go.mod h1:rjiScheydd+CxvumBsIrFKlx3iS0jrZ7LvzFGFmuKbw= github.com/hashicorp/go-rootcerts v1.0.0/go.mod h1:K6zTfqpRlCUIjkwsN4Z+hiSfzSTQa6eBIzfwKfwNnHU= 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/parseutil v0.2.0 h1:U+kC2dOhMFQctRfhK0gRctKAPTloZdMU5ZJxaesJ/VM= github.com/hashicorp/go-secure-stdlib/parseutil v0.2.0/go.mod h1:Ll013mhdmsVDuoIXVfBtvgGJsXDYkTw1kooNcoCXuE0= github.com/hashicorp/go-secure-stdlib/strutil v0.1.2 h1:kes8mmyCpxJsI7FTwtzRqEy9CdjCtrXrXGuOpxEA7Ts= github.com/hashicorp/go-secure-stdlib/strutil v0.1.2/go.mod h1:Gou2R9+il93BqX25LAKCLuM+y9U2T4hlwvT1yprcna4= github.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU= github.com/hashicorp/go-sockaddr v1.0.7 h1:G+pTkSO01HpR5qCxg7lxfsFEZaG+C0VssTy/9dbT+Fw= github.com/hashicorp/go-sockaddr v1.0.7/go.mod h1:FZQbEYa1pxkQ7WLpyXJ6cbjpT8q0YgQaK/JakXqGyWw= github.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4= github.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= github.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= github.com/hashicorp/go-uuid v1.0.2/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= github.com/hashicorp/go-uuid v1.0.3 h1:2gKiV6YVmrJ1i2CKKa9obLvRieoRGviZFL26PcT/Co8= github.com/hashicorp/go-uuid v1.0.3/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= github.com/hashicorp/go-version v1.8.0 h1:KAkNb1HAiZd1ukkxDFGmokVZe1Xy9HG6NUp+bPle2i4= github.com/hashicorp/go-version v1.8.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= github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/hashicorp/golang-lru v1.0.2 h1:dV3g9Z/unq5DpblPpw+Oqcv4dU/1omnb4Ok8iPY6p1c= github.com/hashicorp/golang-lru v1.0.2/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= github.com/hashicorp/golang-lru/v2 v2.0.7 h1:a+bsQ5rvGLjzHuww6tVxozPZFVghXaHOwFs4luLUK2k= github.com/hashicorp/golang-lru/v2 v2.0.7/go.mod h1:QeFd9opnmA6QUJc5vARoKUSoFhyfM2/ZepoAG6RGpeM= github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= github.com/hashicorp/hcl v1.0.1-vault-7 h1:ag5OxFVy3QYTFTJODRzTKVZ6xvdfLLCA1cy/Y6xGI0I= github.com/hashicorp/hcl v1.0.1-vault-7/go.mod h1:XYhtn6ijBSAj6n4YqAaf7RBPS4I06AItNorpy+MoQNM= 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.4/go.mod h1:mtBihi+LeNXGtG8L9dX59gAEa12BDtBQSp4v/YAJqrc= github.com/hashicorp/memberlist v0.1.3/go.mod h1:ajVTdAv/9Im8oMAAj5G31PhhMCZJV2pPBoIllUwCN7I= github.com/hashicorp/memberlist v0.5.0 h1:EtYPN8DpAURiapus508I4n9CzHs2W+8NZGbmmR/prTM= github.com/hashicorp/memberlist v0.5.0/go.mod h1:yvyXLpo0QaGE59Y7hDTsTzDD25JYBZ4mHgHUZ8lrOI0= github.com/hashicorp/packer-plugin-sdk v0.3.2 h1:4Kqq7B8CRDMbfZmkloyz11t1hfqazJuBbW8ZFo4QlN4= github.com/hashicorp/packer-plugin-sdk v0.3.2/go.mod h1:XZRvL9kRqJJtB6rf9Lu2zWLJbf2/4ImWXDjp9O9UQGE= github.com/hashicorp/serf v0.8.2/go.mod h1:6hOLApaqBFA1NXqRQAsxw9QxuDEvNxSQRwA/JwenrHc= github.com/hashicorp/serf v0.10.1 h1:Z1H2J60yRKvfDYAOZLd2MU0ND4AH/WDz7xYHDWQsIPY= github.com/hashicorp/serf v0.10.1/go.mod h1:yL2t6BqATOLGc5HF7qbFkTfXoPIY0WZdWHfEvMqbG+4= github.com/hashicorp/vault-client-go v0.4.3 h1:zG7STGVgn/VK6rnZc0k8PGbfv2x/sJExRKHSUg3ljWc= github.com/hashicorp/vault-client-go v0.4.3/go.mod h1:4tDw7Uhq5XOxS1fO+oMtotHL7j4sB9cp0T7U6m4FzDY= github.com/hashicorp/vault/api v1.22.0 h1:+HYFquE35/B74fHoIeXlZIP2YADVboaPjaSicHEZiH0= github.com/hashicorp/vault/api v1.22.0/go.mod h1:IUZA2cDvr4Ok3+NtK2Oq/r+lJeXkeCrHRmqdyWfpmGM= github.com/hashicorp/vault/api/auth/approle v0.11.0 h1:ViUvgqoSTqHkMi1L1Rr/LnQ+PWiRaGUBGvx4UPfmKOw= github.com/hashicorp/vault/api/auth/approle v0.11.0/go.mod h1:v8ZqBRw+GP264ikIw2sEBKF0VT72MEhLWnZqWt3xEG8= github.com/henrybear327/Proton-API-Bridge v1.0.0 h1:gjKAaWfKu++77WsZTHg6FUyPC5W0LTKWQciUm8PMZb0= github.com/henrybear327/Proton-API-Bridge v1.0.0/go.mod h1:gunH16hf6U74W2b9CGDaWRadiLICsoJ6KRkSt53zLts= github.com/henrybear327/go-proton-api v1.0.0 h1:zYi/IbjLwFAW7ltCeqXneUGJey0TN//Xo851a/BgLXw= github.com/henrybear327/go-proton-api v1.0.0/go.mod h1:w63MZuzufKcIZ93pwRgiOtxMXYafI8H74D77AxytOBc= github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= github.com/huandu/xstrings v1.5.0 h1:2ag3IFq9ZDANvthTwTiqSSZLjDc+BedvHPAp5tJy2TI= github.com/huandu/xstrings v1.5.0/go.mod h1:y5/lhBue+AyNmUVz9RLU9xbLR0o4KIIExikq4ovT0aE= github.com/iancoleman/strcase v0.2.0/go.mod h1:iwCmte+B7n89clKwxIoIXy/HfoL7AsD47ZCWhYzw7ho= github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/icholy/digest v1.1.0 h1:HfGg9Irj7i+IX1o1QAmPfIBNu/Q5A5Tu3n/MED9k9H4= github.com/icholy/digest v1.1.0/go.mod h1:QNrsSGQ5v7v9cReDI0+eyjsXGUoRSUZQHeQ5C4XLa0Y= github.com/imdario/mergo v0.3.16 h1:wwQJbIsHYGMUyLSPrEq1CT16AhnhNJQ51+4fdHUnCl4= github.com/imdario/mergo v0.3.16/go.mod h1:WBLT9ZmE3lPoWsEzCh9LPo3TiwVN+ZKEjmz+hD27ysY= github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8= github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= github.com/influxdata/influxdb-observability/common v0.5.12 h1:4YwZ+vsodz6VfoiX+ZqVotmnyCa9vCCPksSBK/WLjBs= github.com/influxdata/influxdb-observability/common v0.5.12/go.mod h1:u+CABnGO/F1IK51pDlZQroh4+igJNo695XrbLGDBhVc= github.com/influxdata/influxdb-observability/influx2otel v0.5.12 h1:u0lNE3+63rILk4mtmCYsNyczH/1wEXnM+1aBzBe5akk= github.com/influxdata/influxdb-observability/influx2otel v0.5.12/go.mod h1:bM407XIJYnrJYJ9Q3q2ytDSOyFhiYmGm0Sz1Qf48RPk= github.com/influxdata/influxdb-observability/otel2influx v0.5.12 h1:t9gmVOOHbZyEAvIYSoO97Tde1KArVtiYdM0/0Dhmuio= github.com/influxdata/influxdb-observability/otel2influx v0.5.12/go.mod h1:YGsb8xYfjHvcr2y0+Nj7kOHMTw7fWDbAA4g/qJKkvaU= github.com/influxdata/line-protocol-corpus v0.0.0-20210519164801-ca6fa5da0184/go.mod h1:03nmhxzZ7Xk2pdG+lmMd7mHDfeVOYFyhOgwO61qWU98= github.com/influxdata/line-protocol-corpus v0.0.0-20210922080147-aa28ccfb8937 h1:MHJNQ+p99hFATQm6ORoLmpUCF7ovjwEFshs/NHzAbig= github.com/influxdata/line-protocol-corpus v0.0.0-20210922080147-aa28ccfb8937/go.mod h1:BKR9c0uHSmRgM/se9JhFHtTT7JTO67X23MtKMHtZcpo= github.com/influxdata/line-protocol/v2 v2.0.0-20210312151457-c52fdecb625a/go.mod h1:6+9Xt5Sq1rWx+glMgxhcg2c0DUaehK+5TDcPZ76GypY= github.com/influxdata/line-protocol/v2 v2.1.0/go.mod h1:QKw43hdUBg3GTk2iC3iyCxksNj7PX9aUSeYOYE/ceHY= github.com/influxdata/line-protocol/v2 v2.2.1 h1:EAPkqJ9Km4uAxtMRgUubJyqAr6zgWM0dznKMLRauQRE= github.com/influxdata/line-protocol/v2 v2.2.1/go.mod h1:DmB3Cnh+3oxmG6LOBIxce4oaL4CPj3OmMPgvauXh+tM= github.com/influxdata/tail v1.0.1-0.20241014115250-3e0015cb677a h1:IJBVizlP2eArwAurfli2Em5N7pTK1YCbDsdDtnou024= github.com/influxdata/tail v1.0.1-0.20241014115250-3e0015cb677a/go.mod h1:VeiWgI3qaGdJWust2fP27a6J+koITo/1c/UhxeOxgaM= github.com/influxdata/toml v0.0.0-20251106153700-c381e153d076 h1:FqEkdokbxeBpCtZix3tLcIu2/OClDLCoKlbKXFLOEwo= github.com/influxdata/toml v0.0.0-20251106153700-c381e153d076/go.mod h1:zApaNFpP/bTpQItGZNNUMISDMDAnTXu9UqJ4yT3ocz8= github.com/intel/iaevents v1.1.0 h1:FzxMBfXk/apG2EUXUCfaq3gUQ+q+TgZ1HNMjjUILUGE= github.com/intel/iaevents v1.1.0/go.mod h1:CyUUzXw0lHRCsmyyF7Pwco9Y7NiTNQUUlcJ7RJAazKs= github.com/intel/powertelemetry v1.0.2 h1:092xOflYu+YXzY3c/fQ2DpK1ePy9q9ulbm5yiNYrVkc= github.com/intel/powertelemetry v1.0.2/go.mod h1:+PHKI9RElL7J1sTjgg3DGxtscD+IiLNmUzV1MOSCZt4= github.com/jackc/chunkreader v1.0.0/go.mod h1:RT6O25fNZIuasFJRyZ4R/Y2BbhasbmZXF9QQ7T3kePo= github.com/jackc/chunkreader/v2 v2.0.0/go.mod h1:odVSm741yZoC3dpHEUXIqA9tQRhFrgOHwnPIn9lDKlk= github.com/jackc/chunkreader/v2 v2.0.1 h1:i+RDz65UE+mmpjTfyz0MoVTnzeYxroil2G82ki7MGG8= github.com/jackc/chunkreader/v2 v2.0.1/go.mod h1:odVSm741yZoC3dpHEUXIqA9tQRhFrgOHwnPIn9lDKlk= github.com/jackc/pgconn v0.0.0-20190420214824-7e0022ef6ba3/go.mod h1:jkELnwuX+w9qN5YIfX0fl88Ehu4XC3keFuOJJk9pcnA= github.com/jackc/pgconn v0.0.0-20190824142844-760dd75542eb/go.mod h1:lLjNuW/+OfW9/pnVKPazfWOgNfH2aPem8YQ7ilXGvJE= github.com/jackc/pgconn v0.0.0-20190831204454-2fabfa3c18b7/go.mod h1:ZJKsE/KZfsUgOEh9hBm+xYTstcNHg7UPMVJqRfQxq4s= github.com/jackc/pgconn v1.8.0/go.mod h1:1C2Pb36bGIP9QHGBYCjnyhqu7Rv3sGshaQUvmfGIB/o= github.com/jackc/pgconn v1.9.0/go.mod h1:YctiPyvzfU11JFxoXokUOOKQXQmDMoJL9vJzHH8/2JY= github.com/jackc/pgconn v1.9.1-0.20210724152538-d89c8390a530/go.mod h1:4z2w8XhRbP1hYxkpTuBjTS3ne3J48K83+u0zoyvg2pI= github.com/jackc/pgconn v1.14.3 h1:bVoTr12EGANZz66nZPkMInAV/KHD2TxH9npjXXgiB3w= github.com/jackc/pgconn v1.14.3/go.mod h1:RZbme4uasqzybK2RK5c65VsHxoyaml09lx3tXOcO/VM= github.com/jackc/pgio v1.0.0 h1:g12B9UwVnzGhueNavwioyEEpAmqMe1E/BN9ES+8ovkE= github.com/jackc/pgio v1.0.0/go.mod h1:oP+2QK2wFfUWgr+gxjoBH9KGBb31Eio69xUb0w5bYf8= github.com/jackc/pgmock v0.0.0-20190831213851-13a1b77aafa2/go.mod h1:fGZlG77KXmcq05nJLRkk0+p82V8B8Dw8KN2/V9c/OAE= github.com/jackc/pgmock v0.0.0-20201204152224-4fe30f7445fd/go.mod h1:hrBW0Enj2AZTNpt/7Y5rr2xe/9Mn757Wtb2xeBzPv2c= github.com/jackc/pgmock v0.0.0-20210724152146-4ad1a8207f65 h1:DadwsjnMwFjfWc9y5Wi/+Zz7xoE5ALHsRQlOctkOiHc= github.com/jackc/pgmock v0.0.0-20210724152146-4ad1a8207f65/go.mod h1:5R2h2EEX+qri8jOWMbJCtaPWkrrNc7OHwsp2TCqp7ak= github.com/jackc/pgpassfile v1.0.0 h1:/6Hmqy13Ss2zCq62VdNG8tM1wchn8zjSGOBJ6icpsIM= github.com/jackc/pgpassfile v1.0.0/go.mod h1:CEx0iS5ambNFdcRtxPj5JhEz+xB6uRky5eyVu/W2HEg= github.com/jackc/pgproto3 v1.1.0/go.mod h1:eR5FA3leWg7p9aeAqi37XOTgTIbkABlvcPB3E5rlc78= github.com/jackc/pgproto3/v2 v2.0.0-alpha1.0.20190420180111-c116219b62db/go.mod h1:bhq50y+xrl9n5mRYyCBFKkpRVTLYJVWeCc+mEAI3yXA= github.com/jackc/pgproto3/v2 v2.0.0-alpha1.0.20190609003834-432c2951c711/go.mod h1:uH0AWtUmuShn0bcesswc4aBTWGvw0cAxIJp+6OB//Wg= github.com/jackc/pgproto3/v2 v2.0.0-rc3/go.mod h1:ryONWYqW6dqSg1Lw6vXNMXoBJhpzvWKnT95C46ckYeM= github.com/jackc/pgproto3/v2 v2.0.0-rc3.0.20190831210041-4c03ce451f29/go.mod h1:ryONWYqW6dqSg1Lw6vXNMXoBJhpzvWKnT95C46ckYeM= github.com/jackc/pgproto3/v2 v2.0.6/go.mod h1:WfJCnwN3HIg9Ish/j3sgWXnAfK8A9Y0bwXYU5xKaEdA= github.com/jackc/pgproto3/v2 v2.1.1/go.mod h1:WfJCnwN3HIg9Ish/j3sgWXnAfK8A9Y0bwXYU5xKaEdA= github.com/jackc/pgproto3/v2 v2.3.3 h1:1HLSx5H+tXR9pW3in3zaztoEwQYRC9SQaYUHjTSUOag= github.com/jackc/pgproto3/v2 v2.3.3/go.mod h1:WfJCnwN3HIg9Ish/j3sgWXnAfK8A9Y0bwXYU5xKaEdA= github.com/jackc/pgservicefile v0.0.0-20200714003250-2b9c44734f2b/go.mod h1:vsD4gTJCa9TptPL8sPkXrLZ+hDuNrZCnj29CQpr4X1E= github.com/jackc/pgservicefile v0.0.0-20221227161230-091c0ba34f0a h1:bbPeKD0xmW/Y25WS6cokEszi5g+S0QxI/d45PkRi7Nk= github.com/jackc/pgservicefile v0.0.0-20221227161230-091c0ba34f0a/go.mod h1:5TJZWKEWniPve33vlWYSoGYefn3gLQRzjfDlhSJ9ZKM= github.com/jackc/pgtype v0.0.0-20190421001408-4ed0de4755e0/go.mod h1:hdSHsc1V01CGwFsrv11mJRHWJ6aifDLfdV3aVjFF0zg= github.com/jackc/pgtype v0.0.0-20190824184912-ab885b375b90/go.mod h1:KcahbBH1nCMSo2DXpzsoWOAfFkdEtEJpPbVLq8eE+mc= github.com/jackc/pgtype v0.0.0-20190828014616-a8802b16cc59/go.mod h1:MWlu30kVJrUS8lot6TQqcg7mtthZ9T0EoIBFiJcmcyw= github.com/jackc/pgtype v1.8.1-0.20210724151600-32e20a603178/go.mod h1:C516IlIV9NKqfsMCXTdChteoXmwgUceqaLfjg2e3NlM= github.com/jackc/pgtype v1.14.0/go.mod h1:LUMuVrfsFfdKGLw+AFFVv6KtHOFMwRgDDzBt76IqCA4= github.com/jackc/pgtype v1.14.4 h1:fKuNiCumbKTAIxQwXfB/nsrnkEI6bPJrrSiMKgbJ2j8= github.com/jackc/pgtype v1.14.4/go.mod h1:aKeozOde08iifGosdJpz9MBZonJOUJxqNpPBcMJTlVA= github.com/jackc/pgx/v4 v4.0.0-20190420224344-cc3461e65d96/go.mod h1:mdxmSJJuR08CZQyj1PVQBHy9XOp5p8/SHH6a0psbY9Y= github.com/jackc/pgx/v4 v4.0.0-20190421002000-1b8f0016e912/go.mod h1:no/Y67Jkk/9WuGR0JG/JseM9irFbnEPbuWV2EELPNuM= github.com/jackc/pgx/v4 v4.0.0-pre1.0.20190824185557-6972a5742186/go.mod h1:X+GQnOEnf1dqHGpw7JmHqHc1NxDoalibchSk9/RWuDc= github.com/jackc/pgx/v4 v4.12.1-0.20210724153913-640aa07df17c/go.mod h1:1QD0+tgSXP7iUjYm9C1NxKhny7lq6ee99u/z+IHFcgs= github.com/jackc/pgx/v4 v4.18.2/go.mod h1:Ey4Oru5tH5sB6tV7hDmfWFahwF15Eb7DNXlRKx2CkVw= github.com/jackc/pgx/v4 v4.18.3 h1:dE2/TrEsGX3RBprb3qryqSV9Y60iZN1C6i8IrmW9/BA= github.com/jackc/pgx/v4 v4.18.3/go.mod h1:Ey4Oru5tH5sB6tV7hDmfWFahwF15Eb7DNXlRKx2CkVw= github.com/jackc/puddle v0.0.0-20190413234325-e4ced69a3a2b/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk= github.com/jackc/puddle v0.0.0-20190608224051-11cab39313c9/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk= github.com/jackc/puddle v1.1.3/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk= github.com/jackc/puddle v1.3.0 h1:eHK/5clGOatcjX3oWGBO/MpxpbHzSwud5EWTSCI+MX0= github.com/jackc/puddle v1.3.0/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk= github.com/jaegertracing/jaeger v1.47.0 h1:XXxTMO+GxX930gxKWsg90rFr6RswkCRIW0AgWFnTYsg= github.com/jaegertracing/jaeger v1.47.0/go.mod h1:mHU/OHFML51CijQql4+rLfgPOcIb9MhxOMn+RKQwrJc= 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= github.com/jcmturner/dnsutils/v2 v2.0.0/go.mod h1:b0TnjGOvI/n42bZa+hmXL+kFJZsFT7G4t3HTlQ184QM= github.com/jcmturner/gofork v1.7.6 h1:QH0l3hzAU1tfT3rZCnW5zXl+orbkNMMRGJfdJjHVETg= github.com/jcmturner/gofork v1.7.6/go.mod h1:1622LH6i/EZqLloHfE7IeZ0uEJwMSUyQ/nDd82IeqRo= github.com/jcmturner/goidentity/v6 v6.0.1 h1:VKnZd2oEIMorCTsFBnJWbExfNN7yZr3EhJAxwOkZg6o= github.com/jcmturner/goidentity/v6 v6.0.1/go.mod h1:X1YW3bgtvwAXju7V3LCIMpY0Gbxyjn/mY9zx4tFonSg= github.com/jcmturner/gokrb5/v8 v8.4.4 h1:x1Sv4HaTpepFkXbt2IkL29DXRf8sOfZXo8eRKh687T8= github.com/jcmturner/gokrb5/v8 v8.4.4/go.mod h1:1btQEpgT6k+unzCwX1KdWMEwPPkkgBtP+F6aCACiMrs= github.com/jcmturner/rpc/v2 v2.0.3 h1:7FXXj8Ti1IaVFpSAziCZWNzbNuZmnvw/i6CqLNdWfZY= github.com/jcmturner/rpc/v2 v2.0.3/go.mod h1:VUJYCIDm3PVOEHw8sgt091/20OJjskO/YJki3ELg/Hc= github.com/jedib0t/go-pretty/v6 v6.7.8 h1:BVYrDy5DPBA3Qn9ICT+PokP9cvCv1KaHv2i+Hc8sr5o= github.com/jedib0t/go-pretty/v6 v6.7.8/go.mod h1:YwC5CE4fJ1HFUDeivSV1r//AmANFHyqczZk+U6BDALU= github.com/jeremija/gosubmit v0.2.8 h1:mmSITBz9JxVtu8eqbN+zmmwX7Ij2RidQxhcwRVI4wqA= github.com/jeremija/gosubmit v0.2.8/go.mod h1:Ui+HS073lCFREXBbdfrJzMB57OI/bdxTiLtrDHHhFPI= github.com/jeremywohl/flatten/v2 v2.0.0-20211013061545-07e4a09fb8e4 h1:eA9wi6ZzpIRobvXkn/S2Lyw1hr2pc71zxzOPl7Xjs4w= github.com/jeremywohl/flatten/v2 v2.0.0-20211013061545-07e4a09fb8e4/go.mod h1:s9g9Dfls+aEgucKXKW+i8MRZuLXT2MrD/WjYpMnWfOw= github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= github.com/jlaffaye/ftp v0.2.1-0.20240918233326-1b970516f5d3 h1:ZxO6Qr2GOXPdcW80Mcn3nemvilMPvpWqxrNfK2ZnNNs= github.com/jlaffaye/ftp v0.2.1-0.20240918233326-1b970516f5d3/go.mod h1:dvLUr/8Fs9a2OBrEnCC5duphbkz/k/mSy5OkXg3PAgI= github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= github.com/jmespath/go-jmespath v0.4.0 h1:BEgLn5cpjn8UN1mAw4NjwDrS35OdebyEtFe+9YPoQUg= github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo= github.com/jmespath/go-jmespath/internal/testify v1.5.1 h1:shLQSRRSCCPj3f2gpwzGwWFoC7ycTf1rcQZHOlsJ6N8= github.com/jmespath/go-jmespath/internal/testify v1.5.1/go.mod h1:L3OGu8Wl2/fWfCI6z80xFu9LTZmf1ZRjMHUOPmWr69U= github.com/jmhodges/clock v1.2.0 h1:eq4kys+NI0PLngzaHEe7AmPT90XMGIEySD1JfV1PDIs= github.com/jmhodges/clock v1.2.0/go.mod h1:qKjhA7x7u/lQpPB1XAqX1b1lCI/w3/fNuYpI/ZjLynI= github.com/joeshaw/multierror v0.0.0-20140124173710-69b34d4ec901 h1:rp+c0RAYOWj8l6qbCUTSiRLG/iKnW3K3/QfPPuSsBt4= github.com/joeshaw/multierror v0.0.0-20140124173710-69b34d4ec901/go.mod h1:Z86h9688Y0wesXCyonoVr47MasHilkuLMqGhRZ4Hpak= github.com/joho/godotenv v1.5.1 h1:7eLL/+HRGLY0ldzfGMeQkb7vMd0as4CfYvUVzLqw0N0= github.com/joho/godotenv v1.5.1/go.mod h1:f4LDr5Voq0i2e/R5DDNOoa2zzDfwtkZa6DnEwAbqwq4= github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= github.com/josharian/intern v1.0.0 h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8HmY= github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y= github.com/josharian/native v0.0.0-20200817173448-b6b71def0850/go.mod h1:7X/raswPFr05uY3HiLlYeyQntB6OO7E/d2Cu7qoaN2w= github.com/josharian/native v1.0.0/go.mod h1:7X/raswPFr05uY3HiLlYeyQntB6OO7E/d2Cu7qoaN2w= github.com/josharian/native v1.1.0 h1:uuaP0hAbW7Y4l0ZRQ6C9zfb7Mg1mbFKry/xzDAfmtLA= github.com/josharian/native v1.1.0/go.mod h1:7X/raswPFr05uY3HiLlYeyQntB6OO7E/d2Cu7qoaN2w= github.com/jpillora/backoff v0.0.0-20180909062703-3050d21c67d7/go.mod h1:2iMrUgbbvHEiQClaW2NsSzMyGHqN+rDFqY705q49KG0= github.com/jpillora/backoff v1.0.0 h1:uvFg412JmmHBHw7iwprIxkPMI+sGQ4kzOWsMeHnm2EA= github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4= github.com/jsimonetti/rtnetlink v0.0.0-20190606172950-9527aa82566a/go.mod h1:Oz+70psSo5OFh8DBl0Zv2ACw7Esh6pPUphlvZG9x7uw= github.com/jsimonetti/rtnetlink v0.0.0-20200117123717-f846d4f6c1f4/go.mod h1:WGuG/smIU4J/54PblvSbh+xvCZmpJnFgr3ds6Z55XMQ= github.com/jsimonetti/rtnetlink v0.0.0-20201009170750-9c6f07d100c1/go.mod h1:hqoO/u39cqLeBLebZ8fWdE96O7FxrAsRYhnVOdgHxok= github.com/jsimonetti/rtnetlink v0.0.0-20201216134343-bde56ed16391/go.mod h1:cR77jAZG3Y3bsb8hF6fHJbFoyFukLFOkQ98S0pQz3xw= github.com/jsimonetti/rtnetlink v0.0.0-20201220180245-69540ac93943/go.mod h1:z4c53zj6Eex712ROyh8WI0ihysb5j2ROyV42iNogmAs= github.com/jsimonetti/rtnetlink v0.0.0-20210122163228-8d122574c736/go.mod h1:ZXpIyOK59ZnN7J0BV99cZUPmsqDRZ3eq5X+st7u/oSA= github.com/jsimonetti/rtnetlink v0.0.0-20210212075122-66c871082f2b/go.mod h1:8w9Rh8m+aHZIG69YPGGem1i5VzoyRC8nw2kA8B+ik5U= github.com/jsimonetti/rtnetlink v0.0.0-20210525051524-4cc836578190/go.mod h1:NmKSdU4VGSiv1bMsdqNALI4RSvvjtz65tTMCnD05qLo= github.com/jsimonetti/rtnetlink v0.0.0-20211022192332-93da33804786/go.mod h1:v4hqbTdfQngbVSZJVWUhGE/lbTFf9jb+ygmNUDQMuOs= github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= github.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= github.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7C0MuV77Wo= github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= github.com/jtolio/noiseconn v0.0.0-20231127013910-f6d9ecbf1de7 h1:JcltaO1HXM5S2KYOYcKgAV7slU0xPy1OcvrVgn98sRQ= github.com/jtolio/noiseconn v0.0.0-20231127013910-f6d9ecbf1de7/go.mod h1:MEkhEPFwP3yudWO0lj6vfYpLIB+3eIcuIW+e0AZzUQk= github.com/juju/gnuflag v0.0.0-20171113085948-2ce1bb71843d/go.mod h1:2PavIy+JPciBPrBUjwbNvtwB6RQlve+hkpll6QSNmOE= github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= github.com/jung-kurt/gofpdf v1.0.0/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes= github.com/jung-kurt/gofpdf v1.0.3-0.20190309125859-24315acbbda5/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes= github.com/jzelinskie/whirlpool v0.0.0-20201016144138-0675e54bb004 h1:G+9t9cEtnC9jFiTxyptEKuNIAbiN5ZCQzX2a74lj3xg= github.com/jzelinskie/whirlpool v0.0.0-20201016144138-0675e54bb004/go.mod h1:KmHnJWQrgEvbuy0vcvj00gtMqbvNn1L+3YUZLK/B92c= github.com/karrick/godirwalk v1.16.2 h1:eY2INUWoB2ZfpF/kXasyjWJ3Ncuof6qZuNWYZFN3kAI= github.com/karrick/godirwalk v1.16.2/go.mod h1:j4mkqPuvaLI8mp1DroR3P6ad7cyYd4c1qeJ3RV7ULlk= github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51 h1:Z9n2FFNUXsshfwJMBgNA0RU6/i7WVaAegv3PtuIHPMs= github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51/go.mod h1:CzGEWj7cYgsdH8dAjBGEr58BoE7ScuLd+fwFZ44+/x8= github.com/keybase/go-keychain v0.0.1 h1:way+bWYa6lDppZoZcgMbYsvC7GxljxrskdNInRtuthU= github.com/keybase/go-keychain v0.0.1/go.mod h1:PdEILRW3i9D8JcdM+FmY6RwkHGnhHxXwkPPMeUgOK1k= github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q= 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/kisielk/sqlstruct v0.0.0-20201105191214-5f3e10d3ab46/go.mod h1:yyMNCyc/Ib3bDTKd379tNMpB/7/H5TjM2Y9QJ5THLbE= github.com/klauspost/asmfmt v1.3.2 h1:4Ri7ox3EwapiOjCki+hw14RyKk201CN4rzyCJRFLpK4= github.com/klauspost/asmfmt v1.3.2/go.mod h1:AG8TuvYojzulgDAMCnYn50l/5QV3Bs/tp6j0HLHbNSE= github.com/klauspost/compress v1.4.1/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= github.com/klauspost/compress v1.10.10/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= github.com/klauspost/compress v1.13.6/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk= github.com/klauspost/compress v1.15.9/go.mod h1:PhcZ0MbTNciWF3rruxRgKxI5NkcHHrHUDtV4Yw2GlzU= github.com/klauspost/compress v1.18.4 h1:RPhnKRAQ4Fh8zU2FY/6ZFDwTVTxgJ/EMydqSTzE9a2c= github.com/klauspost/compress v1.18.4/go.mod h1:R0h/fSBs8DE4ENlcrlib3PsXS61voFxhIs2DeRhCvJ4= github.com/klauspost/cpuid v1.2.0/go.mod h1:Pj4uuM528wm8OyEC2QMXAi2YiTZ96dNQPGgoMS4s3ek= github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= github.com/klauspost/cpuid/v2 v2.3.0 h1:S4CRMLnYUhGeDFDqkGriYKdfoFlDnMtqTiI/sFzhA9Y= github.com/klauspost/cpuid/v2 v2.3.0/go.mod h1:hqwkgyIinND0mEev00jJYCxPNVRVXFQeu1XKlok6oO0= github.com/klauspost/pgzip v1.2.4/go.mod h1:Ch1tH69qFZu15pkjo5kYi6mth2Zzwzt50oCQKQE9RUs= github.com/klauspost/pgzip v1.2.5/go.mod h1:Ch1tH69qFZu15pkjo5kYi6mth2Zzwzt50oCQKQE9RUs= github.com/klauspost/pgzip v1.2.6 h1:8RXeL5crjEUFnR2/Sn6GJNWtSQ3Dk8pq4CL3jvdDyjU= github.com/klauspost/pgzip v1.2.6/go.mod h1:Ch1tH69qFZu15pkjo5kYi6mth2Zzwzt50oCQKQE9RUs= github.com/kolo/xmlrpc v0.0.0-20220921171641-a4b6fa1dd06b h1:udzkj9S/zlT5X367kqJis0QP7YMxobob6zhzq6Yre00= github.com/kolo/xmlrpc v0.0.0-20220921171641-a4b6fa1dd06b/go.mod h1:pcaDhQK0/NJZEvtCO0qQPPropqV0sJOJ6YW7X+9kRwM= github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/koofr/go-httpclient v0.0.0-20240520111329-e20f8f203988 h1:CjEMN21Xkr9+zwPmZPaJJw+apzVbjGL5uK/6g9Q2jGU= github.com/koofr/go-httpclient v0.0.0-20240520111329-e20f8f203988/go.mod h1:/agobYum3uo/8V6yPVnq+R82pyVGCeuWW5arT4Txn8A= github.com/koofr/go-koofrclient v0.0.0-20221207135200-cbd7fc9ad6a6 h1:FHVoZMOVRA+6/y4yRlbiR3WvsrOcKBd/f64H7YiWR2U= github.com/koofr/go-koofrclient v0.0.0-20221207135200-cbd7fc9ad6a6/go.mod h1:MRAz4Gsxd+OzrZ0owwrUHc0zLESL+1Y5syqK/sJxK2A= github.com/kr/fs v0.1.0 h1:Jskdu9ieNAYnjxsi0LbQp1ulIKZV1LAFgK1tWhpZgl8= github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg= github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= github.com/kr/pretty v0.3.0/go.mod h1:640gp4NfQd8pI5XOwp5fnNeVWj67G7CFk/SaSQn7NBk= github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/pty v1.1.8/go.mod h1:O1sed60cT9XZ5uDucP5qwvh+TE3NnUj51EiZO/lmSfw= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc= github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= github.com/leesper/go_rng v0.0.0-20190531154944-a612b043e353 h1:X/79QL0b4YJVO5+OsPH9rF2u428CIrGL/jLmPsoOQQ4= github.com/leesper/go_rng v0.0.0-20190531154944-a612b043e353/go.mod h1:N0SVk0uhy+E1PZ3C9ctsPRlvOPAFPkCNlcPBDkt0N3U= github.com/leodido/go-syslog/v4 v4.3.0 h1:bbSpI/41bYK9iSdlYzcwvlxuLOE8yi4VTFmedtnghdA= github.com/leodido/go-syslog/v4 v4.3.0/go.mod h1:eJ8rUfDN5OS6dOkCOBYlg2a+hbAg6pJa99QXXgMrd98= github.com/leodido/ragel-machinery v0.0.0-20190525184631-5f46317e436b h1:11UHH39z1RhZ5dc4y4r/4koJo6IYFgTRMe/LlwRTEw0= github.com/leodido/ragel-machinery v0.0.0-20190525184631-5f46317e436b/go.mod h1:WZxr2/6a/Ar9bMDc2rN/LJrE/hF6bXE4LPyDSIxwAfg= github.com/lib/pq v1.0.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= github.com/lib/pq v1.1.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.10.2 h1:AqzbZs4ZoCBp+GtejcpCpcxM3zlSMx29dXbUSeVtJb8= github.com/lib/pq v1.10.2/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= github.com/likexian/gokit v0.25.16 h1:wwBeUIN/OdoPp6t00xTnZE8Di/+s969Bl5N2Kw6bzP8= github.com/likexian/gokit v0.25.16/go.mod h1:Wqd4f+iifV0qxA1N3MqePJTUsmRy/lpst9/yXriDx/4= github.com/likexian/whois v1.15.7 h1:sajjDhi2bVD71AHJhjV7jLYxN92H4AWhTwxM8hmj7c0= github.com/likexian/whois v1.15.7/go.mod h1:kdPQtYb+7SQVftBEbCblDadUkycN7Mg1k1/Li/rwvmc= github.com/likexian/whois-parser v1.24.21 h1:MxsrGRxDOiZIVp7q7N/yAIbKuN4QAkGjCpOtTDA5OsM= github.com/likexian/whois-parser v1.24.21/go.mod h1:o3DUruO65Pb8WXCJCTlSVkTbwuYVrBCeoMTw2q0mxY4= github.com/linkedin/goavro/v2 v2.15.0 h1:pDj1UrjUOO62iXhgBiE7jQkpNIc5/tA5eZsgolMjgVI= github.com/linkedin/goavro/v2 v2.15.0/go.mod h1:KXx+erlq+RPlGSPmLF7xGo6SAbh8sCQ53x064+ioxhk= github.com/logzio/azure-monitor-metrics-receiver v1.1.0 h1:L2LU/jWTOFibZeSKUeEDBdPY6iFL1gkSE3A/9mnk/Ms= github.com/logzio/azure-monitor-metrics-receiver v1.1.0/go.mod h1:6J/ZJtFGAuv3XvLWOWTefbi1BBHvnawNjUTGcx2qUG4= github.com/loov/hrtime v1.0.1/go.mod h1:yDY3Pwv2izeY4sq7YcPX/dtLwzg5NU1AxWuWxKwd0p0= github.com/loov/hrtime v1.0.3/go.mod h1:yDY3Pwv2izeY4sq7YcPX/dtLwzg5NU1AxWuWxKwd0p0= github.com/loov/hrtime/hrplot v1.0.2/go.mod h1:9t65xYn4d42ntjv40Wt5lbU72/VC5S0zGDgjC8kD5BU= github.com/loov/plot v0.0.0-20200413101321-e09a6f01d2f5/go.mod h1:gSrhfSMoiPGG0CZ9E66kXjaHxFw0fzJhooyicOnz5z4= github.com/lpar/date v1.0.0 h1:bq/zVqFTUmsxvd/CylidY4Udqpr9BOFrParoP6p0x/I= github.com/lpar/date v1.0.0/go.mod h1:KjYe0dDyMQTgpqcUz4LEIeM5VZwhggjVx/V2dtc8NSo= github.com/lufia/plan9stats v0.0.0-20260216142805-b3301c5f2a88 h1:PTw+yKnXcOFCR6+8hHTyWBeQ/P4Nb7dd4/0ohEcWQuM= github.com/lufia/plan9stats v0.0.0-20260216142805-b3301c5f2a88/go.mod h1:autxFIvghDt3jPTLoqZ9OZ7s9qTGNAWmYCjVFWPX/zg= github.com/lxc/incus/v6 v6.22.0 h1:/r6SPAczA4ICaSxYD/5wgdKWxbKCiY8TP+vW9aip2kM= github.com/lxc/incus/v6 v6.22.0/go.mod h1:I47u8wLmRKdYitDpOAD3I2xuuUfT3bHT8fp8Ybjg51U= github.com/lyft/protoc-gen-star v0.6.0/go.mod h1:TGAoBVkt8w7MPG72TrKIu85MIdXwDuzJYeZuUPFPNwA= github.com/lyft/protoc-gen-star v0.6.1/go.mod h1:TGAoBVkt8w7MPG72TrKIu85MIdXwDuzJYeZuUPFPNwA= github.com/lyft/protoc-gen-star/v2 v2.0.1/go.mod h1:RcCdONR2ScXaYnQC5tUzxzlpA3WVYF7/opLeUgcQs/o= github.com/magiconair/properties v1.8.1/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= github.com/magiconair/properties v1.8.4/go.mod h1:y3VJvCyxH9uVvJTWEGAELF3aiYNyPKd5NZ3oSwXrF60= github.com/magiconair/properties v1.8.10 h1:s31yESBquKXCV9a/ScB3ESkOjUYYv+X0rg8SYxI99mE= github.com/magiconair/properties v1.8.10/go.mod h1:Dhd985XPs7jluiymwWYZ0G4Z61jb3vdS329zhj2hYo0= github.com/mailru/easyjson v0.7.1/go.mod h1:KAzv3t3aY1NaHWoQz1+4F1ccyAH66Jk7yos7ldAVICs= github.com/mailru/easyjson v0.9.0 h1:PrnmzHw7262yW8sTBwxi1PdJA3Iw/EKBa8psRf7d9a4= github.com/mailru/easyjson v0.9.0/go.mod h1:1+xMtQp2MRNVL/V1bOzuP3aP8VNwRW55fQUto+XFtTU= github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= github.com/mattn/go-colorable v0.1.1/go.mod h1:FuOcm+DKB9mbwrcAfNl7/TZVBZ6rcnceauSikq3lYCQ= 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.9/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= github.com/mattn/go-colorable v0.1.12/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4= github.com/mattn/go-colorable v0.1.14 h1:9A9LHSqF/7dyVVX6g0U9cwm9pG3kP9gSzcuIPHPsaIE= github.com/mattn/go-colorable v0.1.14/go.mod h1:6LmQG8QLFO4G5z1gPvYEzlUgJ2wF+stgPZH1UqBm1s8= github.com/mattn/go-ieproxy v0.0.1/go.mod h1:pYabZ6IHcRpFh7vIaLfK7rdcWgFEb3SFJ6/gNWuh88E= github.com/mattn/go-ieproxy v0.0.11 h1:MQ/5BuGSgDAHZOJe6YY80IF2UVCfGkwfo6AeD7HtHYo= github.com/mattn/go-ieproxy v0.0.11/go.mod h1:/NsJd+kxZBmjMc5hrJCKMbP57B84rvq9BiDRbtO9AS0= github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= github.com/mattn/go-isatty v0.0.5/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= github.com/mattn/go-isatty v0.0.7/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= github.com/mattn/go-isatty v0.0.11/go.mod h1:PhnuNfih5lzO57/f3n+odYbM4JtupLOxQOAqxQCu2WE= github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94= github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= github.com/mattn/go-runewidth v0.0.20 h1:WcT52H91ZUAwy8+HUkdM3THM6gXqXuLJi9O3rjcQQaQ= github.com/mattn/go-runewidth v0.0.20/go.mod h1:XBkDxAl56ILZc9knddidhrOlY5R/pDhgLpndooCuJAs= github.com/mattn/go-sqlite3 v1.14.14/go.mod h1:NyWgC/yNuGj7Q9rpYnZvas74GogHl5/Z4A/KQRfk6bU= github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= github.com/mdlayher/apcupsd v0.0.0-20220319200143-473c7b5f3c6a h1:JOlLsLUQnokTyWWwEvOVoKH3XUl6oDMP8jisO54l6J8= github.com/mdlayher/apcupsd v0.0.0-20220319200143-473c7b5f3c6a/go.mod h1:960H6oqSawdujauTeLX9BOx+ZdYX0TdG9xE9br5bino= github.com/mdlayher/ethtool v0.0.0-20210210192532-2b88debcdd43/go.mod h1:+t7E0lkKfbBsebllff1xdTmyJt8lH37niI6kwFk9OTo= github.com/mdlayher/ethtool v0.0.0-20211028163843-288d040e9d60/go.mod h1:aYbhishWc4Ai3I2U4Gaa2n3kHWSwzme6EsG/46HRQbE= github.com/mdlayher/genetlink v1.0.0/go.mod h1:0rJ0h4itni50A86M2kHcgS85ttZazNt7a8H2a2cw0Gc= github.com/mdlayher/genetlink v1.1.0/go.mod h1:1cAHdejIIk9zbWfP3gW30vY1QUlwyuhaqfkyANVVf10= github.com/mdlayher/genetlink v1.2.0 h1:4yrIkRV5Wfk1WfpWTcoOlGmsWgQj3OtQN9ZsbrE+XtU= github.com/mdlayher/genetlink v1.2.0/go.mod h1:ra5LDov2KrUCZJiAtEvXXZBxGMInICMXIwshlJ+qRxQ= github.com/mdlayher/netlink v0.0.0-20190409211403-11939a169225/go.mod h1:eQB3mZE4aiYnlUsyGGCOpPETfdQq4Jhsgf1fk3cwQaA= github.com/mdlayher/netlink v1.0.0/go.mod h1:KxeJAFOFLG6AjpyDkQ/iIhxygIUKD+vcwqcnu43w/+M= github.com/mdlayher/netlink v1.1.0/go.mod h1:H4WCitaheIsdF9yOYu8CFmCgQthAPIWZmcKp9uZHgmY= github.com/mdlayher/netlink v1.1.1/go.mod h1:WTYpFb/WTvlRJAyKhZL5/uy69TDDpHHu2VZmb2XgV7o= github.com/mdlayher/netlink v1.2.0/go.mod h1:kwVW1io0AZy9A1E2YYgaD4Cj+C+GPkU6klXCMzIJ9p8= github.com/mdlayher/netlink v1.2.1/go.mod h1:bacnNlfhqHqqLo4WsYeXSqfyXkInQ9JneWI68v1KwSU= github.com/mdlayher/netlink v1.2.2-0.20210123213345-5cc92139ae3e/go.mod h1:bacnNlfhqHqqLo4WsYeXSqfyXkInQ9JneWI68v1KwSU= github.com/mdlayher/netlink v1.3.0/go.mod h1:xK/BssKuwcRXHrtN04UBkwQ6dY9VviGGuriDdoPSWys= github.com/mdlayher/netlink v1.4.0/go.mod h1:dRJi5IABcZpBD2A3D0Mv/AiX8I9uDEu5oGkAVrekmf8= github.com/mdlayher/netlink v1.4.1/go.mod h1:e4/KuJ+s8UhfUpO9z00/fDZZmhSrs+oxyqAS9cNgn6Q= github.com/mdlayher/netlink v1.4.2/go.mod h1:13VaingaArGUTUxFLf/iEovKxXji32JAtF858jZYEug= github.com/mdlayher/netlink v1.6.0/go.mod h1:0o3PlBmGst1xve7wQ7j/hwpNaFaH4qCRyWCdcZk8/vA= github.com/mdlayher/netlink v1.7.2 h1:/UtM3ofJap7Vl4QWCPDGXY8d3GIY2UGSDbK+QWmY8/g= github.com/mdlayher/netlink v1.7.2/go.mod h1:xraEF7uJbxLhc5fpHL4cPe221LI2bdttWlU+ZGLfQSw= github.com/mdlayher/socket v0.0.0-20210307095302-262dc9984e00/go.mod h1:GAFlyu4/XV68LkQKYzKhIo/WW7j3Zi0YRAz/BOoanUc= github.com/mdlayher/socket v0.0.0-20211007213009-516dcbdf0267/go.mod h1:nFZ1EtZYK8Gi/k6QNu7z7CgO20i/4ExeQswwWuPmG/g= github.com/mdlayher/socket v0.0.0-20211102153432-57e3fa563ecb/go.mod h1:nFZ1EtZYK8Gi/k6QNu7z7CgO20i/4ExeQswwWuPmG/g= github.com/mdlayher/socket v0.1.1/go.mod h1:mYV5YIZAfHh4dzDVzI8x8tWLWCliuX8Mon5Awbj+qDs= github.com/mdlayher/socket v0.5.1 h1:VZaqt6RkGkt2OE9l3GcC6nZkqD3xKeQLyfleW/uBcos= github.com/mdlayher/socket v0.5.1/go.mod h1:TjPLHI1UgwEv5J1B5q0zTZq12A/6H7nKmtTanQE37IQ= github.com/mdlayher/vsock v1.2.1 h1:pC1mTJTvjo1r9n9fbm7S1j04rCgCzhCOS5DY0zqHlnQ= github.com/mdlayher/vsock v1.2.1/go.mod h1:NRfCibel++DgeMD8z/hP+PPTjlNJsdPOmxcnENvE+SE= github.com/mgutz/ansi v0.0.0-20170206155736-9520e82c474b/go.mod h1:01TrycV0kFyexm33Z7vhZRXopbI8J3TDReVlkTgMUxE= github.com/mholt/archiver/v3 v3.5.0/go.mod h1:qqTTPUK/HZPFgFQ/TJ3BzvTpF/dPtFVJXdQbCmeMxwc= github.com/microsoft/ApplicationInsights-Go v0.4.4 h1:G4+H9WNs6ygSCe6sUyxRc2U81TI5Es90b2t/MwX5KqY= github.com/microsoft/ApplicationInsights-Go v0.4.4/go.mod h1:fKRUseBqkw6bDiXTs3ESTiU/4YTIHsQS4W3fP2ieF4U= github.com/microsoft/go-mssqldb v1.9.8 h1:d4IFMvF/o+HdpXUqbBfzHvn/NlFA75YGcfHUUvDFJEM= github.com/microsoft/go-mssqldb v1.9.8/go.mod h1:eGSRSGAW4hKMy5YcAenhCDjIRm2rhqIdmmwgciMzLus= github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= github.com/miekg/dns v1.1.26/go.mod h1:bPDLeHnStXmXAq1m/Ch/hvfNHr14JKNPMBo3VZKjuso= github.com/miekg/dns v1.1.41/go.mod h1:p6aan82bvRIyn+zDIv9xYNUpwa73JcSh9BKwknJysuI= github.com/miekg/dns v1.1.54/go.mod h1:uInx36IzPl7FYnDcMeVWxj9byh7DutNykX4G9Sj60FY= github.com/miekg/dns v1.1.72 h1:vhmr+TF2A3tuoGNkLDFK9zi36F2LS+hKTRW0Uf8kbzI= github.com/miekg/dns v1.1.72/go.mod h1:+EuEPhdHOsfk6Wk5TT2CzssZdqkmFhf8r+aVyDEToIs= github.com/mikioh/ipaddr v0.0.0-20190404000644-d465c8ab6721 h1:RlZweED6sbSArvlE924+mUcZuXKLBHA35U7LN621Bws= github.com/mikioh/ipaddr v0.0.0-20190404000644-d465c8ab6721/go.mod h1:Ickgr2WtCLZ2MDGd4Gr0geeCH5HybhRJbonOgQpvSxc= github.com/minio/asm2plan9s v0.0.0-20200509001527-cdd76441f9d8 h1:AMFGa4R4MiIpspGNG7Z948v4n35fFGB3RR3G/ry4FWs= github.com/minio/asm2plan9s v0.0.0-20200509001527-cdd76441f9d8/go.mod h1:mC1jAcsrzbxHt8iiaC+zU4b1ylILSosueou12R++wfY= github.com/minio/c2goasm v0.0.0-20190812172519-36a3d3bbc4f3 h1:+n/aFZefKZp7spd8DFdX7uMikMLXX4oubIzJF4kv/wI= github.com/minio/c2goasm v0.0.0-20190812172519-36a3d3bbc4f3/go.mod h1:RagcQ7I8IeTMnF8JTXieKnO4Z6JCsikNEzj0DwauVzE= github.com/minio/highwayhash v1.0.4-0.20251030100505-070ab1a87a76 h1:KGuD/pM2JpL9FAYvBrnBBeENKZNh6eNtjqytV6TYjnk= github.com/minio/highwayhash v1.0.4-0.20251030100505-070ab1a87a76/go.mod h1:GGYsuwP/fPD6Y9hMiXuapVvlIUEhFhMTh0rxU3ik1LQ= github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc= github.com/mitchellh/cli v1.1.0/go.mod h1:xcISNoH86gajksDmfB23e/pu+B+GeFRMYmoHXxx3xhI= github.com/mitchellh/copystructure v1.2.0 h1:vpKXTN4ewci03Vljg/q9QvCGUDttBOGBIa15WveJJGw= github.com/mitchellh/copystructure v1.2.0/go.mod h1:qLl+cE2AmVv+CoeAwDPye/v+N2HKCj9FbZEVFJRxO9s= github.com/mitchellh/go-homedir v1.0.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y= github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= github.com/mitchellh/go-testing-interface v1.0.0/go.mod h1:kRemZodwjscx+RGhAo8eIhFbs2+BFgRtFPeD/KE+zxI= github.com/mitchellh/gox v0.4.0/go.mod h1:Sd9lOJ0+aimLBi73mGofS1ycjY8lL3uZM3JPS42BGNg= github.com/mitchellh/iochan v1.0.0/go.mod h1:JwYml1nuB7xOzsp52dPpHFffvOCDupsG0QubkSMEySY= github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= github.com/mitchellh/mapstructure v1.3.3/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= github.com/mitchellh/mapstructure v1.5.1-0.20220423185008-bf980b35cac4 h1:BpfhmLKZf+SjVanKKhCgf3bg+511DmU9eDQTen7LLbY= github.com/mitchellh/mapstructure v1.5.1-0.20220423185008-bf980b35cac4/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= github.com/mitchellh/reflectwalk v1.0.2 h1:G2LzWKi524PWgd3mLHV8Y5k7s6XUvT0Gef6zxSIeXaQ= github.com/mitchellh/reflectwalk v1.0.2/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw= github.com/moby/docker-image-spec v1.3.1 h1:jMKff3w6PgbfSa69GfNg+zN/XLhfXJGnEx3Nl2EsFP0= github.com/moby/docker-image-spec v1.3.1/go.mod h1:eKmb5VW8vQEh/BAr2yvVNvuiJuY6UIocYsFu/DxxRpo= github.com/moby/go-archive v0.2.0 h1:zg5QDUM2mi0JIM9fdQZWC7U8+2ZfixfTYoHL7rWUcP8= github.com/moby/go-archive v0.2.0/go.mod h1:mNeivT14o8xU+5q1YnNrkQVpK+dnNe/K6fHqnTg4qPU= github.com/moby/ipvs v1.1.0 h1:ONN4pGaZQgAx+1Scz5RvWV4Q7Gb+mvfRh3NsPS+1XQQ= github.com/moby/ipvs v1.1.0/go.mod h1:4VJMWuf098bsUMmZEiD4Tjk/O7mOn3l1PTD3s4OoYAs= github.com/moby/moby v24.0.6+incompatible/go.mod h1:fDXVQ6+S340veQPv35CzDahGBmHsiclFwfEygB/TWMc= github.com/moby/patternmatcher v0.6.0 h1:GmP9lR19aU5GqSSFko+5pRqHi+Ohk1O69aFiKkVGiPk= github.com/moby/patternmatcher v0.6.0/go.mod h1:hDPoyOpDY7OrrMDLaYoY3hf52gNCR/YOUYxkhApJIxc= github.com/moby/sys/atomicwriter v0.1.0 h1:kw5D/EqkBwsBFi0ss9v1VG3wIkVhzGvLklJ+w3A14Sw= github.com/moby/sys/atomicwriter v0.1.0/go.mod h1:Ul8oqv2ZMNHOceF643P6FKPXeCmYtlQMvpizfsSoaWs= github.com/moby/sys/mountinfo v0.7.2 h1:1shs6aH5s4o5H2zQLn796ADW1wMrIwHsyJ2v9KouLrg= github.com/moby/sys/mountinfo v0.7.2/go.mod h1:1YOa8w8Ih7uW0wALDUgT1dTTSBrZ+HiBLGws92L2RU4= github.com/moby/sys/sequential v0.6.0 h1:qrx7XFUd/5DxtqcoH1h438hF5TmOvzC/lspjy7zgvCU= github.com/moby/sys/sequential v0.6.0/go.mod h1:uyv8EUTrca5PnDsdMGXhZe6CCe8U/UiTWd+lL+7b/Ko= github.com/moby/sys/user v0.4.0 h1:jhcMKit7SA80hivmFJcbB1vqmw//wU61Zdui2eQXuMs= github.com/moby/sys/user v0.4.0/go.mod h1:bG+tYYYJgaMtRKgEmuueC0hJEAZWwtIbZTB+85uoHjs= github.com/moby/sys/userns v0.1.0 h1:tVLXkFOxVu9A64/yh59slHVv9ahO9UIev4JZusOLG/g= github.com/moby/sys/userns v0.1.0/go.mod h1:IHUYgu/kao6N8YZlp9Cf444ySSvCmDlmzUcYfDHOl28= github.com/moby/term v0.5.0/go.mod h1:8FzsFHVUBGZdbDsJw/ot+X+d5HLUbvklYLJ9uGfcI3Y= github.com/moby/term v0.5.2 h1:6qk3FJAFDs6i/q3W/pQ97SX192qKfZgGjCQqfCJkgzQ= github.com/moby/term v0.5.2/go.mod h1:d3djjFCrjnB+fl8NJux+EJzu0msscUP+f8it8hPkFLc= github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee h1:W5t00kpgFdJifH4BDsTlE89Zl93FEloxaWZfGcifgq8= github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= github.com/mohae/deepcopy v0.0.0-20170929034955-c48cc78d4826 h1:RWengNIwukTxcDr9M+97sNutRR1RKhG96O6jWumTTnw= github.com/mohae/deepcopy v0.0.0-20170929034955-c48cc78d4826/go.mod h1:TaXosZuwdSHYgviHp1DAtfrULt5eUgsSMsZf+YrPgl8= github.com/montanaflynn/stats v0.0.0-20171201202039-1bf9dbcd8cbe/go.mod h1:wL8QJuTMNUDYhXwkmfOly8iTdp5TEcJFWZD2D7SIkUc= github.com/montanaflynn/stats v0.7.1 h1:etflOAAHORrCC44V+aR6Ftzort912ZU+YLiSTuV8eaE= github.com/montanaflynn/stats v0.7.1/go.mod h1:etXPPgVO6n31NxCd9KQUMvCM+ve0ruNzt6R8Bnaayow= github.com/morikuni/aec v1.0.0/go.mod h1:BbKIizmSmc5MMPqRYbxO4ZU0S0+P200+tUnFx7PXmsc= github.com/morikuni/aec v1.1.0 h1:vBBl0pUnvi/Je71dsRrhMBtreIqNMYErSAbEeb8jrXQ= github.com/morikuni/aec v1.1.0/go.mod h1:xDRgiq/iw5l+zkao76YTKzKttOp2cwPEne25HDkJnBw= github.com/mtibben/percent v0.2.1 h1:5gssi8Nqo8QU/r2pynCm+hBQHpkB/uNK7BJCFogWdzs= github.com/mtibben/percent v0.2.1/go.mod h1:KG9uO+SZkUp+VkRHsCdYQV3XSZrrSpR3O9ibNBTZrns= github.com/muhlemmer/gu v0.3.1 h1:7EAqmFrW7n3hETvuAdmFmn4hS8W+z3LgKtrnow+YzNM= github.com/muhlemmer/gu v0.3.1/go.mod h1:YHtHR+gxM+bKEIIs7Hmi9sPT3ZDUvTN/i88wQpZkrdM= github.com/muhlemmer/httpforwarded v0.1.0 h1:x4DLrzXdliq8mprgUMR0olDvHGkou5BJsK/vWUetyzY= github.com/muhlemmer/httpforwarded v0.1.0/go.mod h1:yo9czKedo2pdZhoXe+yDkGVbU0TJ0q9oQ90BVoDEtw0= github.com/multiplay/go-ts3 v1.2.0 h1:LaN6iz9TZjHXxhLwfU0gjUgDxX0Hq7BCbuyuRhYMl3U= github.com/multiplay/go-ts3 v1.2.0/go.mod h1:OdNmiO3uV++4SldaJDQTIGg8gNAu5MOiccZiAqVqUZA= github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq1c1nUAm88MOHcQC9l5mIlSMApZMrHA= github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f h1:KUppIJq7/+SVif2QVs3tOP0zanoHgBEVAwHxUSIzRqU= github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= github.com/naoina/go-stringutil v0.1.0 h1:rCUeRUHjBjGTSHl0VC00jUPLz8/F9dDzYI70Hzifhks= github.com/naoina/go-stringutil v0.1.0/go.mod h1:XJ2SJL9jCtBh+P9q5btrd/Ylo8XwT/h1USek5+NqSA0= github.com/nats-io/jwt/v2 v2.8.0 h1:K7uzyz50+yGZDO5o772eRE7atlcSEENpL7P+b74JV1g= github.com/nats-io/jwt/v2 v2.8.0/go.mod h1:me11pOkwObtcBNR8AiMrUbtVOUGkqYjMQZ6jnSdVUIA= github.com/nats-io/nats-server/v2 v2.12.5 h1:EOHLbsLJgUHUwzkj9gBTOlubkX+dmSs0EYWMdBiHivU= github.com/nats-io/nats-server/v2 v2.12.5/go.mod h1:JQDAKcwdXs0NRhvYO31dzsXkzCyDkOBS7SKU3Nozu14= github.com/nats-io/nats.go v1.49.0 h1:yh/WvY59gXqYpgl33ZI+XoVPKyut/IcEaqtsiuTJpoE= github.com/nats-io/nats.go v1.49.0/go.mod h1:fDCn3mN5cY8HooHwE2ukiLb4p4G4ImmzvXyJt+tGwdw= github.com/nats-io/nkeys v0.4.15 h1:JACV5jRVO9V856KOapQ7x+EY8Jo3qw1vJt/9Jpwzkk4= github.com/nats-io/nkeys v0.4.15/go.mod h1:CpMchTXC9fxA5zrMo4KpySxNjiDVvr8ANOSZdiNfUrs= github.com/nats-io/nuid v1.0.1 h1:5iA8DT8V7q8WK2EScv2padNa/rTESc1KdnPw4TC2paw= github.com/nats-io/nuid v1.0.1/go.mod h1:19wcPz3Ph3q0Jbyiqsd0kePYG7A95tJPxeL+1OSON2c= github.com/ncruces/go-strftime v1.0.0 h1:HMFp8mLCTPp341M/ZnA4qaf7ZlsbTc+miZjCLOFAw7w= github.com/ncruces/go-strftime v1.0.0/go.mod h1:Fwc5htZGVVkseilnfgOVb9mKy6w1naJmn9CehxcKcls= github.com/ncw/swift/v2 v2.0.3 h1:8R9dmgFIWs+RiVlisCEfiQiik1hjuR0JnOkLxaP9ihg= github.com/ncw/swift/v2 v2.0.3/go.mod h1:cbAO76/ZwcFrFlHdXPjaqWZ9R7Hdar7HpjRXBfbjigk= github.com/netsampler/goflow2/v2 v2.2.6 h1:pm+UEykIYV+lGJzrunYLNehoQtHlipJTp3lFhBpUkj0= github.com/netsampler/goflow2/v2 v2.2.6/go.mod h1:sKVfADpYP0NvkEeMRMh8/vz6T1yq4z1JZqO+N0+RGqk= github.com/newrelic/newrelic-telemetry-sdk-go v0.8.1 h1:6OX5VXMuj2salqNBc41eXKz6K+nV6OB/hhlGnAKCbwU= github.com/newrelic/newrelic-telemetry-sdk-go v0.8.1/go.mod h1:2kY6OeOxrJ+RIQlVjWDc/pZlT3MIf30prs6drzMfJ6E= github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= github.com/nsqio/go-nsq v1.1.0 h1:PQg+xxiUjA7V+TLdXw7nVrJ5Jbl3sN86EhGCQj4+FYE= github.com/nsqio/go-nsq v1.1.0/go.mod h1:vKq36oyeVXgsS5Q8YEO7WghqidAVXQlcFxzQbQTuDEY= github.com/nwaples/rardecode v1.1.0/go.mod h1:5DzqNKiOdpKKBH87u8VlvAnPZMXcGRhxWkRpHbbfGS0= github.com/nwaples/tacplus v0.0.3 h1:i3v/BUWWrbKq00BzFDrgcPksUF4HwAWvS8Zk63ezYXg= github.com/nwaples/tacplus v0.0.3/go.mod h1:y5ZA9N5V2JbmwO766S+ET9zuu5FtL1OtdfBCYrbTIgw= github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE= github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU= github.com/oapi-codegen/runtime v1.1.1 h1:EXLHh0DXIJnWhdRPN2w4MXAzFyE4CskzhNLUmtpMYro= github.com/oapi-codegen/runtime v1.1.1/go.mod h1:SK9X900oXmPWilYR5/WKPzt3Kqxn/uS/+lbpREv+eCg= github.com/oklog/run v1.1.0/go.mod h1:sVPdnTZT1zYwAJeCMu2Th4T21pA3FPOQRfWjQlk7DVU= github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U= github.com/oliveagle/jsonpath v0.0.0-20180606110733-2e52cf6e6852/go.mod h1:eqOVx5Vwu4gd2mmMZvVZsgIqNSaW3xxRThUJ0k/TPk4= github.com/olivere/elastic v6.2.37+incompatible h1:UfSGJem5czY+x/LqxgeCBgjDn6St+z8OnsCuxwD3L0U= github.com/olivere/elastic v6.2.37+incompatible/go.mod h1:J+q1zQJTgAz9woqsbVRqGeB5G1iqDKVBWLNSYW8yfJ8= github.com/olivere/elastic/v7 v7.0.12/go.mod h1:14rWX28Pnh3qCKYRVnSGXWLf9MbLonYS/4FDCY3LAPo= github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.8.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.10.1/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk= github.com/onsi/ginkgo v1.16.4/go.mod h1:dX+/inL/fNMqNlz0e9LfyB9TswhZpCVdJM/Z6Vvnwo0= github.com/onsi/ginkgo v1.16.5 h1:8xi0RTUf59SOSfEtZMvwTvXYMzG4gV23XVHOZiXNtnE= github.com/onsi/ginkgo v1.16.5/go.mod h1:+E8gABHa3K6zRBolWtd+ROzc/U5bkGt0FwiG042wbpU= github.com/onsi/ginkgo/v2 v2.27.2 h1:LzwLj0b89qtIy6SSASkzlNvX6WktqurSHwkk2ipF/Ns= github.com/onsi/ginkgo/v2 v2.27.2/go.mod h1:ArE1D/XhNXBXCBkKOLkbsb2c81dQHCRcF5zwn/ykDRo= github.com/onsi/gomega v1.5.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= github.com/onsi/gomega v1.7.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= github.com/onsi/gomega v1.15.0/go.mod h1:cIuvLEne0aoVhAgh/O6ac0Op8WWw9H6eYCriF+tEHG0= github.com/onsi/gomega v1.38.2 h1:eZCjf2xjZAqe+LeWvKb5weQ+NcPwX84kqJ0cZNxok2A= github.com/onsi/gomega v1.38.2/go.mod h1:W2MJcYxRGV63b418Ai34Ud0hEdTVXq9NW9+Sx6uXf3k= github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatatest v0.101.0 h1:TCQYvGS2MKTotOTQDnHUSd4ljEzXRzHXopdv71giKWU= github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatatest v0.101.0/go.mod h1:Nl2d4DSK/IbaWnnBxYyhMNUW6C9sb5/4idVZrSW/5Ps= github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatautil v0.145.0 h1:sB4yuYx45zig1ceQ+kmrEYy0xMZ+mGagwYIFtJkkU1w= github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatautil v0.145.0/go.mod h1:uLhceuH7ZtiVxk+B0MHI0vhJG2Y4aOzT/hrV6c5KjVU= github.com/openconfig/gnmi v0.0.0-20200414194230-1597cc0f2600/go.mod h1:M/EcuapNQgvzxo1DDXHK4tx3QpYM/uG4l591v33jG2A= github.com/openconfig/gnmi v0.0.0-20200508230933-d19cebf5e7be/go.mod h1:M/EcuapNQgvzxo1DDXHK4tx3QpYM/uG4l591v33jG2A= github.com/openconfig/gnmi v0.0.0-20220503232738-6eb133c65a13/go.mod h1:h365Ifq35G6kLZDQlRvrccTt2LKK90VpjZLMNGxJRYc= github.com/openconfig/gnmi v0.14.1 h1:qKMuFvhIRR2/xxCOsStPQ25aKpbMDdWr3kI+nP9bhMs= github.com/openconfig/gnmi v0.14.1/go.mod h1:whr6zVq9PCU8mV1D0K9v7Ajd3+swoN6Yam9n8OH3eT0= github.com/openconfig/goyang v0.0.0-20200115183954-d0a48929f0ea/go.mod h1:dhXaV0JgHJzdrHi2l+w0fZrwArtXL7jEFoiqLEdmkvU= github.com/openconfig/goyang v0.2.2/go.mod h1:vX61x01Q46AzbZUzG617vWqh/cB+aisc+RrNkXRd3W8= github.com/openconfig/goyang v1.0.0/go.mod h1:vX61x01Q46AzbZUzG617vWqh/cB+aisc+RrNkXRd3W8= github.com/openconfig/goyang v1.6.3 h1:9nWXBwd6b4+nZr8ni7O4zUXVhrVMXCLFz8os5YWFuo4= github.com/openconfig/goyang v1.6.3/go.mod h1:5WolITjek1NF8yrNERyVZ7jqjOClJTpO8p/+OwmETM4= github.com/openconfig/gribi v0.1.1-0.20210423184541-ce37eb4ba92f/go.mod h1:OoH46A2kV42cIXGyviYmAlGmn6cHjGduyC2+I9d/iVs= github.com/openconfig/grpctunnel v0.0.0-20210610163803-fde4a9dc048d/go.mod h1:x9tAZ4EwqCQ0jI8D6S8Yhw9Z0ee7/BxWQX0k0Uib5Q8= github.com/openconfig/ygot v0.6.0/go.mod h1:o30svNf7O0xK+R35tlx95odkDmZWS9JyWWQSmIhqwAs= github.com/openconfig/ygot v0.10.4/go.mod h1:oCQNdXnv7dWc8scTDgoFkauv1wwplJn5HspHcjlxSAQ= github.com/openconfig/ygot v0.20.0/go.mod h1:7ZiBFNc4n/1Hkv2v2dAEpxisqDznp0JVpLR13Toe4AY= github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8Oi/yOhh5U= github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM= github.com/opencontainers/image-spec v1.0.2/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0= github.com/opencontainers/image-spec v1.1.1 h1:y0fUlFfIZhPF1W537XOLg0/fcx6zcHCJwooC2xJA040= github.com/opencontainers/image-spec v1.1.1/go.mod h1:qpqAh3Dmcf36wStyyWU+kCeDgrGnAve2nCC8+7h8Q0M= github.com/opencontainers/runtime-spec v1.3.0 h1:YZupQUdctfhpZy3TM39nN9Ika5CBWT5diQ8ibYCRkxg= github.com/opencontainers/runtime-spec v1.3.0/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= github.com/opencontainers/umoci v0.6.1-0.20251213054154-70fc5ee1f4df h1:9hvwN64VeuL1L0Jgp8bxTPmd5IZQoHmeXGWrVqsEhN0= github.com/opencontainers/umoci v0.6.1-0.20251213054154-70fc5ee1f4df/go.mod h1:s6d/s4QJAZTF92hEU6ozuHjE0+VRc6kVe1QIWfvL7KY= github.com/opensearch-project/opensearch-go/v2 v2.3.0 h1:nQIEMr+A92CkhHrZgUhcfsrZjibvB3APXf2a1VwCmMQ= github.com/opensearch-project/opensearch-go/v2 v2.3.0/go.mod h1:8LDr9FCgUTVoT+5ESjc2+iaZuldqE+23Iq0r1XeNue8= github.com/opentracing-contrib/go-observer v0.0.0-20170622124052-a52f23424492 h1:lM6RxxfUMrYL/f8bWEUqdXrANWtrL7Nndbm9iFN0DlU= github.com/opentracing-contrib/go-observer v0.0.0-20170622124052-a52f23424492/go.mod h1:Ngi6UdF0k5OKD5t5wlmGhe/EDKPoUM3BXZSSfIuJbis= github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= github.com/opentracing/opentracing-go v1.2.1-0.20220228012449-10b1cf09e00b h1:FfH+VrHHk6Lxt9HdVS0PXzSXFyS2NbZKXv33FYPol0A= github.com/opentracing/opentracing-go v1.2.1-0.20220228012449-10b1cf09e00b/go.mod h1:AC62GU6hc0BrNm+9RK9VSiwa/EUe1bkIeFORAMcHvJU= github.com/openzipkin-contrib/zipkin-go-opentracing v0.5.0 h1:uhcF5Jd7rP9DVEL10Siffyepr6SvlKbUsjH5JpNCRi8= github.com/openzipkin-contrib/zipkin-go-opentracing v0.5.0/go.mod h1:+oCZ5GXXr7KPI/DNOQORPTq5AWHfALJj9c72b0+YsEY= github.com/openzipkin/zipkin-go v0.4.3 h1:9EGwpqkgnwdEIJ+Od7QVSEIH+ocmm5nPat0G7sjsSdg= github.com/openzipkin/zipkin-go v0.4.3/go.mod h1:M9wCJZFWCo2RiY+o1eBCEMe0Dp2S5LDHcMZmk3RmK7c= github.com/oracle/oci-go-sdk/v65 v65.80.0 h1:Rr7QLMozd2DfDBKo6AB3DzLYQxAwuOG118+K5AAD5E8= github.com/oracle/oci-go-sdk/v65 v65.80.0/go.mod h1:IBEV9l1qBzUpo7zgGaRUhbB05BVfcDGYRFBCPlTcPp0= github.com/oxtoacart/bpool v0.0.0-20190530202638-03653db5a59c h1:rp5dCmg/yLR3mgFuSOe4oEnDDmGLROTvMragMUXpTQw= github.com/oxtoacart/bpool v0.0.0-20190530202638-03653db5a59c/go.mod h1:X07ZCGwUbLaax7L0S3Tw4hpejzu63ZrrQiUe6W0hcy0= github.com/p4lang/p4runtime v1.5.0 h1:GSccPwIFfeRjyrUSDe19DmqsHia7tGsU8vFuH2JxPTU= github.com/p4lang/p4runtime v1.5.0/go.mod h1:exHLJdkEhs+S2DLCkdvHnLbw9uyJoIbAzwMmHUeD37Y= github.com/panjf2000/ants/v2 v2.11.3 h1:AfI0ngBoXJmYOpDh9m516vjqoUu2sLrIVgppI9TZVpg= github.com/panjf2000/ants/v2 v2.11.3/go.mod h1:8u92CYMUc6gyvTIw8Ru7Mt7+/ESnJahz5EVtqfrilek= github.com/panjf2000/gnet/v2 v2.9.7 h1:6zW7Jl3oAfXwSuh1PxHLndoL2MQRWx0AJR6aaQjxUgA= github.com/panjf2000/gnet/v2 v2.9.7/go.mod h1:WQTxDWYuQ/hz3eccH0FN32IVuvZ19HewEWx0l62fx7E= github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= github.com/pascaldekloe/goe v0.1.0 h1:cBOtyMzM9HTpWjXfbbunk26uA6nG3a8n06Wieeh0MwY= github.com/pascaldekloe/goe v0.1.0/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= github.com/patrickmn/go-cache v2.1.0+incompatible h1:HRMgzkcYKYpi3C8ajMPV8OFXaaRUnok+kx1WdO15EQc= github.com/patrickmn/go-cache v2.1.0+incompatible/go.mod h1:3Qf8kWWT7OJRJbdiICTKqZju1ZixQ/KpMGzzAfe6+WQ= github.com/paulmach/orb v0.12.0 h1:z+zOwjmG3MyEEqzv92UN49Lg1JFYx0L9GpGKNVDKk1s= github.com/paulmach/orb v0.12.0/go.mod h1:5mULz1xQfs3bmQm63QEJA6lNGujuRafwA5S/EnuLaLU= github.com/paulmach/protoscan v0.2.1/go.mod h1:SpcSwydNLrxUGSDvXvO0P7g7AuhJ7lcKfDlhJCDw2gY= github.com/pavlo-v-chernykh/keystore-go/v4 v4.5.0 h1:2nosf3P75OZv2/ZO/9Px5ZgZ5gbKrzA3joN1QMfOGMQ= github.com/pavlo-v-chernykh/keystore-go/v4 v4.5.0/go.mod h1:lAVhWwbNaveeJmxrxuSTxMgKpF6DjnuVpn6T8WiBwYQ= github.com/pborman/ansi v1.0.0 h1:OqjHMhvlSuCCV5JT07yqPuJPQzQl+WXsiZ14gZsqOrQ= github.com/pborman/ansi v1.0.0/go.mod h1:SgWzwMAx1X/Ez7i90VqF8LRiQtx52pWDiQP+x3iGnzw= github.com/pborman/getopt v0.0.0-20190409184431-ee0cd42419d3/go.mod h1:85jBQOZwpVEaDAr341tbn15RS4fCAsIst0qp7i8ex1o= github.com/pcolladosoto/goslurm v0.1.0 h1:d2KigvDfsIIeVeHHj/pTtajz2T0cHHqhGk9iJWUdGaM= github.com/pcolladosoto/goslurm v0.1.0/go.mod h1:eLuBFfN/tj4O/HDMrAJXb+3s3rGhdHQVZFcOUV1Sbbo= github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= github.com/pelletier/go-toml v1.8.1/go.mod h1:T2/BmBdy8dvIRq1a/8aqjN41wvWlN4lrapLU/GW4pbc= github.com/pelletier/go-toml v1.9.5/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c= github.com/pengsrc/go-shared v0.2.1-0.20190131101655-1999055a4a14 h1:XeOYlK9W1uCmhjJSsY78Mcuh7MVkNjTzmHx1yBzizSU= github.com/pengsrc/go-shared v0.2.1-0.20190131101655-1999055a4a14/go.mod h1:jVblp62SafmidSkvWrXyxAme3gaTfEtWwRPGz5cpvHg= github.com/peterbourgon/ff/v3 v3.3.1/go.mod h1:zjJVUhx+twciwfDl0zBcFzl4dW8axCRyXE/eKY9RztQ= github.com/peterbourgon/unixtransport v0.0.7 h1:HhN7nydIDwlXWFzB6mbzQLcl46UdZLHrmF2lFfAgvnY= github.com/peterbourgon/unixtransport v0.0.7/go.mod h1:o8aUkOCa8W/BIXpi15uKvbSabjtBh0JhSOJGSfoOhAU= github.com/philhofer/fwd v1.2.0 h1:e6DnBTl7vGY+Gz322/ASL4Gyp1FspeMvx1RNDoToZuM= github.com/philhofer/fwd v1.2.0/go.mod h1:RqIHx9QI14HlwKwm98g9Re5prTQ6LdeRQn+gXJFxsJM= github.com/phpdave11/gofpdf v1.4.2/go.mod h1:zpO6xFn9yxo3YLyMvW8HcKWVdbNqgIfOOp2dXMnm1mY= github.com/phpdave11/gofpdi v1.0.12/go.mod h1:vBmVV0Do6hSBHC8uKUQ71JGW+ZGQq74llk/7bXwjDoI= github.com/phpdave11/gofpdi v1.0.13/go.mod h1:vBmVV0Do6hSBHC8uKUQ71JGW+ZGQq74llk/7bXwjDoI= github.com/pierrec/lz4/v4 v4.0.3/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4= github.com/pierrec/lz4/v4 v4.1.15/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4= github.com/pierrec/lz4/v4 v4.1.25 h1:kocOqRffaIbU5djlIBr7Wh+cx82C0vtFb0fOurZHqD0= github.com/pierrec/lz4/v4 v4.1.25/go.mod h1:EoQMVJgeeEOMsCqCzqFm2O0cJvljX2nGZjcRIPL34O4= github.com/pion/dtls/v3 v3.1.2 h1:gqEdOUXLtCGW+afsBLO0LtDD8GnuBBjEy6HRtyofZTc= github.com/pion/dtls/v3 v3.1.2/go.mod h1:Hw/igcX4pdY69z1Hgv5x7wJFrUkdgHwAn/Q/uo7YHRo= github.com/pion/logging v0.2.2/go.mod h1:k0/tDVsRCX2Mb2ZEmTqNa7CWsQPc+YYCB7Q+5pahoms= github.com/pion/logging v0.2.4 h1:tTew+7cmQ+Mc1pTBLKH2puKsOvhm32dROumOZ655zB8= github.com/pion/logging v0.2.4/go.mod h1:DffhXTKYdNZU+KtJ5pyQDjvOAh/GsNSyv1lbkFbe3so= github.com/pion/transport/v2 v2.2.10 h1:ucLBLE8nuxiHfvkFKnkDQRYWYfp8ejf4YBOPfaQpw6Q= github.com/pion/transport/v2 v2.2.10/go.mod h1:sq1kSLWs+cHW9E+2fJP95QudkzbK7wscs8yYgQToO5E= github.com/pion/transport/v3 v3.0.6 h1:k1mQU06bmmX143qSWgXFqSH1KUJceQvIUuVH/K5ELWw= github.com/pion/transport/v3 v3.0.6/go.mod h1:HvJr2N/JwNJAfipsRleqwFoR3t/pWyHeZUs89v3+t5s= github.com/pion/transport/v4 v4.0.1 h1:sdROELU6BZ63Ab7FrOLn13M6YdJLY20wldXW2Cu2k8o= github.com/pion/transport/v4 v4.0.1/go.mod h1:nEuEA4AD5lPdcIegQDpVLgNoDGreqM/YqmEx3ovP4jM= github.com/pkg/browser v0.0.0-20240102092130-5ac0b6a4141c h1:+mdjkGKdHQG3305AYmdv1U2eRNDiU2ErMBj1gwrq8eQ= github.com/pkg/browser v0.0.0-20240102092130-5ac0b6a4141c/go.mod h1:7rwL4CYBLnjLxUqIJNnCWiEdr3bn6IUYi15bNlnbCCU= github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA= github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/sftp v1.10.1/go.mod h1:lYOWFsE0bwd1+KfKJaKeuokY15vzFx25BLbzYYoAxZI= github.com/pkg/sftp v1.13.1/go.mod h1:3HaPG6Dq1ILlpPZRO0HVMrsydcdLt6HRDccSgb87qRg= github.com/pkg/sftp v1.13.10 h1:+5FbKNTe5Z9aspU88DPIKJ9z2KZoaGCu6Sr6kKR/5mU= github.com/pkg/sftp v1.13.10/go.mod h1:bJ1a7uDhrX/4OII+agvy28lzRvQrmIQuaHrcI1HbeGA= github.com/pkg/xattr v0.4.12 h1:rRTkSyFNTRElv6pkA3zpjHpQ90p/OdHQC1GmGh1aTjM= github.com/pkg/xattr v0.4.12/go.mod h1:di8WF84zAKk8jzR1UBTEWh9AUlIZZ7M/JNt8e9B6ktU= github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10 h1:GFCKgmp0tecUJ0sJuv4pzYCqS9+RGSn52M3FUwPs+uo= github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10/go.mod h1:t/avpk3KcrXxUnYOhZhMXJlSEyie6gQbtLq5NM3loB8= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI= github.com/posener/complete v1.2.3/go.mod h1:WZIdtGGp+qx0sLrYKtIRAruyNpv6hFCicSgv7Sy7s/s= github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55 h1:o4JXh1EVt9k/+g42oCprj/FisM4qX9L3sZB3upGN2ZU= github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55/go.mod h1:OmDBASR4679mdNQnz2pUhc2G8CO2JrUAVFDRBDP/hJE= github.com/prometheus-community/pro-bing v0.8.0 h1:CEY/g1/AgERRDjxw5P32ikcOgmrSuXs7xon7ovx6mNc= github.com/prometheus-community/pro-bing v0.8.0/go.mod h1:Idyxz8raDO6TgkUN6ByiEGvWJNyQd40kN9ZUeho3lN0= github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= github.com/prometheus/client_golang v0.9.3/go.mod h1:/TN21ttK/J9q6uSwhBd54HahCDft0ttaMvbicHlPoso= github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= github.com/prometheus/client_golang v1.4.0/go.mod h1:e9GMxYsXl05ICDXkRhurwBS4Q3OK1iX/F2sw+iXX5zU= github.com/prometheus/client_golang v1.23.2 h1:Je96obch5RDVy3FDMndoUsjAhG5Edi49h0RJWRi/o0o= github.com/prometheus/client_golang v1.23.2/go.mod h1:Tb1a6LWHB3/SPIzCoaDXI4I8UHKeFTEQ1YCr+0Gyqmg= github.com/prometheus/client_golang/exp v0.0.0-20260108101519-fb0838f53562 h1:vwqZvuobg82U0gcG2eVrFH27806bUbNr32SvfRbvdsg= github.com/prometheus/client_golang/exp v0.0.0-20260108101519-fb0838f53562/go.mod h1:PmAYDB13uBFBG9qE1qxZZgZWhg7Rg6SfKM5DMK7hjyI= github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/client_model v0.3.0/go.mod h1:LDGWKZIo7rky3hgvBe+caln+Dr3dPggB5dvjtD7w9+w= github.com/prometheus/client_model v0.6.2 h1:oBsgwpGs7iVziMvrGhE53c/GrLUsZdHnqNwqPLxwZyk= github.com/prometheus/client_model v0.6.2/go.mod h1:y3m2F6Gdpfy6Ut/GBsUqTWZqCUvMVzSfMLjcu6wAwpE= github.com/prometheus/common v0.0.0-20181113130724-41aa239b4cce/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= github.com/prometheus/common v0.4.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= github.com/prometheus/common v0.9.1/go.mod h1:yhUN8i9wzaXS3w1O07YhxHEBxD+W35wd8bs7vj7HSQ4= github.com/prometheus/common v0.67.5 h1:pIgK94WWlQt1WLwAC5j2ynLaBRDiinoAb86HZHTUGI4= github.com/prometheus/common v0.67.5/go.mod h1:SjE/0MzDEEAyrdr5Gqc6G+sXI67maCxzaT3A2+HqjUw= github.com/prometheus/otlptranslator v1.0.0 h1:s0LJW/iN9dkIH+EnhiD3BlkkP5QVIUVEoIwkU+A6qos= github.com/prometheus/otlptranslator v1.0.0/go.mod h1:vRYWnXvI6aWGpsdY/mOT/cbeVRBlPWtBNDb7kGR3uKM= github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= github.com/prometheus/procfs v0.0.0-20190425082905-87a4384529e0/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= github.com/prometheus/procfs v0.0.0-20190507164030-5867b95ac084/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= github.com/prometheus/procfs v0.0.8/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+GxbHq6oeK9A= github.com/prometheus/procfs v0.20.1 h1:XwbrGOIplXW/AU3YhIhLODXMJYyC1isLFfYCsTEycfc= github.com/prometheus/procfs v0.20.1/go.mod h1:o9EMBZGRyvDrSPH1RqdxhojkuXstoe4UlK79eF5TGGo= github.com/prometheus/prometheus v0.310.0 h1:iS0Uul/dHjy8ifBnqo3YEOhRxlTOWantRoDWwmIowwA= github.com/prometheus/prometheus v0.310.0/go.mod h1:rs6XoWKvgAStqxHxb2Twh1BR6rp7qw7fmUgW+gaXjbw= github.com/prometheus/sigv4 v0.4.1 h1:EIc3j+8NBea9u1iV6O5ZAN8uvPq2xOIUPcqCTivHuXs= github.com/prometheus/sigv4 v0.4.1/go.mod h1:eu+ZbRvsc5TPiHwqh77OWuCnWK73IdkETYY46P4dXOU= github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU= github.com/putdotio/go-putio/putio v0.0.0-20200123120452-16d982cac2b8 h1:Y258uzXU/potCYnQd1r6wlAnoMB68BiCkCcCnKx1SH8= github.com/putdotio/go-putio/putio v0.0.0-20200123120452-16d982cac2b8/go.mod h1:bSJjRokAHHOhA+XFxplld8w2R/dXLH7Z3BZ532vhFwU= github.com/rabbitmq/amqp091-go v1.10.0 h1:STpn5XsHlHGcecLmMFCtg7mqq0RnD+zFr4uzukfVhBw= github.com/rabbitmq/amqp091-go v1.10.0/go.mod h1:Hy4jKW5kQART1u+JkDTF9YYOQUHXqMuhrgxOEeS7G4o= github.com/rclone/rclone v1.69.3 h1:UbNEc7pVYDYhoMzlj9+NG/vYjDKI4SSQgZCsWeSYZng= github.com/rclone/rclone v1.69.3/go.mod h1:5ryHJK+Y28R7SXpYOWv0mP85Fh4kSh2fZWLN5oPuc8Q= github.com/rcrowley/go-metrics v0.0.0-20250401214520-65e299d6c5c9 h1:bsUq1dX0N8AOIL7EB/X911+m4EHsnWEHeJ0c+3TTBrg= github.com/rcrowley/go-metrics v0.0.0-20250401214520-65e299d6c5c9/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= github.com/redis/go-redis/v9 v9.18.0 h1:pMkxYPkEbMPwRdenAzUNyFNrDgHx9U+DrBabWNfSRQs= github.com/redis/go-redis/v9 v9.18.0/go.mod h1:k3ufPphLU5YXwNTUcCRXGxUoF1fqxnhFQmscfkCoDA0= github.com/relvacode/iso8601 v1.3.0 h1:HguUjsGpIMh/zsTczGN3DVJFxTU/GX+MMmzcKoMO7ko= github.com/relvacode/iso8601 v1.3.0/go.mod h1:FlNp+jz+TXpyRqgmM7tnzHHzBnz776kmAH2h3sZCn0I= github.com/remyoudompheng/bigfft v0.0.0-20200410134404-eec4a21b6bb0/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo= github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec h1:W09IVJc94icq4NjY3clb7Lk8O1qJ8BdBEF8z0ibU0rE= github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo= github.com/rfjakob/eme v1.1.2 h1:SxziR8msSOElPayZNFfQw4Tjx/Sbaeeh3eRvrHVMUs4= github.com/rfjakob/eme v1.1.2/go.mod h1:cVvpasglm/G3ngEfcfT/Wt0GwhkuO32pf/poW6Nyk1k= github.com/riemann/riemann-go-client v0.5.1-0.20211206220514-f58f10cdce16 h1:bGXoxRwUpPTCaQ86DRE+3wqE9vh3aH8W0HH5L/ygOFM= github.com/riemann/riemann-go-client v0.5.1-0.20211206220514-f58f10cdce16/go.mod h1:4rS0vfmzOMwfFPhi6Zve4k/59TsBepqd6WESNULE0ho= github.com/robbiet480/go.nut v0.0.0-20220219091450-bd8f121e1fa1 h1:YmFqprZILGlF/X3tvMA4Rwn3ySxyE3hGUajBHkkaZbM= github.com/robbiet480/go.nut v0.0.0-20220219091450-bd8f121e1fa1/go.mod h1:pL1huxuIlWub46MsMVJg4p7OXkzbPp/APxh9IH0eJjQ= github.com/robertkrimen/otto v0.0.0-20191219234010-c382bd3c16ff h1:+6NUiITWwE5q1KO6SAfUX918c+Tab0+tGAM/mtdlUyA= github.com/robertkrimen/otto v0.0.0-20191219234010-c382bd3c16ff/go.mod h1:xvqspoSXJTIpemEonrMDFq6XzwHYYgToXWj5eRX1OtY= github.com/robfig/cron/v3 v3.0.1 h1:WdRxkvbJztn8LMz/QEvLN5sBU+xKpSqwwUO1Pjr4qDs= github.com/robfig/cron/v3 v3.0.1/go.mod h1:eQICP3HwyT7UooqI/z+Ov+PtYAWygg1TEWWzGIFLtro= github.com/robinson/gos7 v0.0.0-20240315073918-1f14519e4846 h1:CnAbtX0j07ZVR/TnD5V6ypFTrASJlfr+fc4OY2da9eg= github.com/robinson/gos7 v0.0.0-20240315073918-1f14519e4846/go.mod h1:AMHIeh1KJ7Xa2RVOMHdv9jXKrpw0D4EWGGQMHLb2doc= github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= github.com/rogpeppe/fastuuid v1.1.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= github.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs= github.com/rogpeppe/go-internal v1.14.1 h1:UQB4HGPB6osV0SQTLymcB4TgvyWu6ZyliaW0tI/otEQ= github.com/rogpeppe/go-internal v1.14.1/go.mod h1:MaRKkUm5W0goXpeCfT7UZI6fk/L7L7so1lCWt35ZSgc= github.com/rootless-containers/proto/go-proto v0.0.0-20260207013450-f6ee952d53d9 h1:3w2GInbYbp08pUeQoM3qI1L4v8htpwHQN9AkfILlUSw= github.com/rootless-containers/proto/go-proto v0.0.0-20260207013450-f6ee952d53d9/go.mod h1:LLjEAc6zmycfeN7/1fxIphWQPjHpTt7ElqT7eVf8e4A= github.com/rs/cors v1.11.1 h1:eU3gRzXLRK57F5rKMGMZURNdIG4EoAmX8k94r9wXWHA= github.com/rs/cors v1.11.1/go.mod h1:XyqrcTp5zjWr1wsJ8PIRZssZ8b/WMcMf71DJnit4EMU= github.com/rs/xid v1.2.1/go.mod h1:+uKXf+4Djp6Md1KODXJxgGQPKngRmWyn10oCKFzNHOQ= github.com/rs/zerolog v1.13.0/go.mod h1:YbFCdg8HfsridGWAh22vktObvhZbQsZXe4/zB0OKkWU= github.com/rs/zerolog v1.15.0/go.mod h1:xYTKnLHcpfU2225ny5qZjxnj9NvkumZYjJHlAThCjNc= github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/russross/blackfriday/v2 v2.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf35Ld67mk= github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/ruudk/golang-pdf417 v0.0.0-20181029194003-1af4ab5afa58/go.mod h1:6lfFZQK844Gfx8o5WFuvpxWRwnSoipWe/p622j1v06w= github.com/ruudk/golang-pdf417 v0.0.0-20201230142125-a7e3863a1245/go.mod h1:pQAZKsJ8yyVxGRWYNEm9oFB8ieLgKFnamEyDmSA0BRk= github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= 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/sabhiram/go-gitignore v0.0.0-20210923224102-525f6e181f06 h1:OkMGxebDjyw0ULyrTYWeN0UNCCkmCWfjPnIA2W6oviI= github.com/sabhiram/go-gitignore v0.0.0-20210923224102-525f6e181f06/go.mod h1:+ePHsJ1keEjQtpvf9HHw0f4ZeJ0TLRsxhunSI2hYJSs= github.com/safchain/ethtool v0.7.0 h1:rlJzfDetsVvT61uz8x1YIcFn12akMfuPulHtZjtb7Is= github.com/safchain/ethtool v0.7.0/go.mod h1:MenQKEjXdfkjD3mp2QdCk8B/hwvkrlOTm/FD4gTpFxQ= github.com/samber/lo v1.47.0 h1:z7RynLwP5nbyRscyvcD043DWYoOcYRv3mV8lBeqOCLc= github.com/samber/lo v1.47.0/go.mod h1:RmDH9Ct32Qy3gduHQuKJ3gW1fMHAnE/fAzQuf6He5cU= github.com/santhosh-tekuri/jsonschema/v5 v5.3.1 h1:lZUw3E0/J3roVtGQ+SCrUrg3ON6NgVqpn3+iol9aGu4= github.com/santhosh-tekuri/jsonschema/v5 v5.3.1/go.mod h1:uToXkOrWAZ6/Oc07xWQrPOhJotwFIyu2bBVN41fcDUY= github.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0= github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529 h1:nn5Wsu0esKSJiIVhscUtVbo7ada43DJhG55ua/hjS5I= github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= github.com/seancfoley/bintree v1.3.1 h1:cqmmQK7Jm4aw8gna0bP+huu5leVOgHGSJBEpUx3EXGI= github.com/seancfoley/bintree v1.3.1/go.mod h1:hIUabL8OFYyFVTQ6azeajbopogQc2l5C/hiXMcemWNU= github.com/seancfoley/ipaddress-go v1.7.1 h1:fDWryS+L8iaaH5RxIKbY0xB5Z+Zxk8xoXLN4S4eAPdQ= github.com/seancfoley/ipaddress-go v1.7.1/go.mod h1:TQRZgv+9jdvzHmKoPGBMxyiaVmoI0rYpfEk8Q/sL/Iw= github.com/segmentio/asm v1.2.1 h1:DTNbBqs57ioxAD4PrArqftgypG4/qNpXoJx8TVXxPR0= github.com/segmentio/asm v1.2.1/go.mod h1:BqMnlJP91P8d+4ibuonYZw9mfnzI9HfxselHZr5aAcs= github.com/sensu/sensu-go/api/core/v2 v2.16.0 h1:HOq4rFkQ1S5ZjxmMTLc5J5mAbECrnKWvtXXbMqr3j9s= github.com/sensu/sensu-go/api/core/v2 v2.16.0/go.mod h1:MjM7+MCGEyTAgaZ589SiGHwYiaYF7N/58dU0J070u/0= github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo= github.com/shirou/gopsutil/v4 v4.26.2 h1:X8i6sicvUFih4BmYIGT1m2wwgw2VG9YgrDTi7cIRGUI= github.com/shirou/gopsutil/v4 v4.26.2/go.mod h1:LZ6ewCSkBqUpvSOf+LsTGnRinC6iaNUNMGBtDkJBaLQ= github.com/shopspring/decimal v0.0.0-20180709203117-cd690d0c9e24/go.mod h1:M+9NzErvs504Cn4c5DxATwIqPbtswREoFCre64PpcG4= github.com/shopspring/decimal v1.2.0/go.mod h1:DKyhrW/HYNuLGql+MJL6WCR6knT2jwCFRcu2hWCYk4o= github.com/shopspring/decimal v1.3.1/go.mod h1:DKyhrW/HYNuLGql+MJL6WCR6knT2jwCFRcu2hWCYk4o= github.com/shopspring/decimal v1.4.0 h1:bxl37RwXBklmTi0C79JfXCEBD1cqqHt0bbgBAGFp81k= github.com/shopspring/decimal v1.4.0/go.mod h1:gawqmDU56v4yIKSwfBSFip1HdCCXN8/+DMd9qYNcwME= github.com/showwin/speedtest-go v1.7.10 h1:9o5zb7KsuzZKn+IE2//z5btLKJ870JwO6ETayUkqRFw= github.com/showwin/speedtest-go v1.7.10/go.mod h1:Ei7OCTmNPdWofMadzcfgq1rUO7mvJy9Jycj//G7vyfA= github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= github.com/signalfx/com_signalfx_metrics_protobuf v0.0.3 h1:32k2QLgsKhcEs55q4REPKyIadvid5FPy2+VMgvbmKJ0= github.com/signalfx/com_signalfx_metrics_protobuf v0.0.3/go.mod h1:gJrXWi7wSGXfiC7+VheQaz+ypdCt5SmZNL+BRxUe7y4= github.com/signalfx/gohistogram v0.0.0-20160107210732-1ccfd2ff5083 h1:WsShHmu12ZztYPfh9b+I+VjYD1o8iOHhB67WZCMEEE8= github.com/signalfx/gohistogram v0.0.0-20160107210732-1ccfd2ff5083/go.mod h1:adPDS6s7WaajdFBV9mQ7i0dKfQ8xiDnF9ZNETVPpp7c= github.com/signalfx/golib/v3 v3.3.54 h1:jUwTnaIXLHT0I1+hXoX0cPLdICIwBjB3e5/NGnnjgJY= github.com/signalfx/golib/v3 v3.3.54/go.mod h1:KDQZIYpJ3yXPz/KysPQQEYooWdpq4eQZPsjwKR5secc= github.com/signalfx/sapm-proto v0.12.0 h1:OtOe+Jm8L61Ml8K6X8a89zc8/RlaaMRElCImeGKR/Ew= github.com/signalfx/sapm-proto v0.12.0/go.mod h1:wQEki8RNCYjkv19jw5aWDcmDMTQru0ckfUbgHI69U2E= github.com/sijms/go-ora/v2 v2.9.0 h1:+iQbUeTeCOFMb5BsOMgUhV8KWyrv9yjKpcK4x7+MFrg= github.com/sijms/go-ora/v2 v2.9.0/go.mod h1:QgFInVi3ZWyqAiJwzBQA+nbKYKH77tdp1PYoCqhR2dU= github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMBDgk/93Q= github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= github.com/sirupsen/logrus v1.9.4 h1:TsZE7l11zFCLZnZ+teH4Umoq5BhEIfIzfRDZ1Uzql2w= github.com/sirupsen/logrus v1.9.4/go.mod h1:ftWc9WdOfJ0a92nsE2jF5u5ZwH8Bv2zdeOC42RjbV2g= github.com/skratchdot/open-golang v0.0.0-20200116055534-eef842397966 h1:JIAuq3EEf9cgbU6AtGPK4CTG3Zf6CKMNqf0MHTggAUA= github.com/skratchdot/open-golang v0.0.0-20200116055534-eef842397966/go.mod h1:sUM3LWHvSMaG192sy56D9F7CNvL7jUJVXoqM1QKLnog= github.com/sleepinggenius2/gosmi v0.4.4 h1:xgu+Mt7CptuB10IPt3SVXBAA9tARToT4B9xGzjjxQX8= github.com/sleepinggenius2/gosmi v0.4.4/go.mod h1:l8OniPmd3bJzw0MXP2/qh7AhP/e+bTY2CNivIhsnDT0= github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= github.com/smartystreets/assertions v1.0.0/go.mod h1:kHHU4qYBaI3q23Pp3VPrmWhuIUrLW/7eUrw0BU5VaoM= github.com/smartystreets/assertions v1.0.1/go.mod h1:kHHU4qYBaI3q23Pp3VPrmWhuIUrLW/7eUrw0BU5VaoM= github.com/smartystreets/assertions v1.2.0 h1:42S6lae5dvLc7BrLu/0ugRtcFVjoJNMC/N3yZFZkDFs= github.com/smartystreets/assertions v1.2.0/go.mod h1:tcbTF8ujkAEcZ8TElKY+i30BzYlVhC/LOxJk7iOWnoo= github.com/smartystreets/go-aws-auth v0.0.0-20180515143844-0c1422d1fdb9/go.mod h1:SnhjPscd9TpLiy1LpzGSKh3bXCfxxXuqd9xmQJy3slM= github.com/smartystreets/goconvey v1.6.4 h1:fv0U8FUIMPNf1L9lnHLvLhgicrIVChEkdzIKYqbNC9s= github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= github.com/smartystreets/gunit v1.0.0/go.mod h1:qwPWnhz6pn0NnRBP++URONOVyNkPyr4SauJk4cUOwJs= github.com/smartystreets/gunit v1.1.3/go.mod h1:EH5qMBab2UclzXUcpR8b93eHsIlp9u+pDQIRp5DZNzQ= github.com/snowflakedb/gosnowflake v1.19.0 h1:Oy/w5/hXiSJV09kgG9zpFZFjNRNvF5Cet7r6vzd87OQ= github.com/snowflakedb/gosnowflake v1.19.0/go.mod h1:7D4+cLepOWrerVsH+tevW3zdMJ5/WrEN7ZceAC6xBv0= github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM= github.com/sony/gobreaker v0.5.0 h1:dRCvqm0P490vZPmy7ppEk2qCnCieBooFJ+YoXGYB+yg= github.com/sony/gobreaker v0.5.0/go.mod h1:ZKptC7FHNvhBz7dN2LGjPVBz2sZJmc0/PkyDJOjmxWY= github.com/spacemonkeygo/monkit/v3 v3.0.22 h1:4/g8IVItBDKLdVnqrdHZrCVPpIrwDBzl1jrV0IHQHDU= github.com/spacemonkeygo/monkit/v3 v3.0.22/go.mod h1:XkZYGzknZwkD0AKUnZaSXhRiVTLCkq7CWVa3IsE72gA= github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= github.com/spf13/afero v1.3.3/go.mod h1:5KUK8ByomD5Ti5Artl0RtHeI5pTF7MIDuXL3yY520V4= github.com/spf13/afero v1.6.0/go.mod h1:Ai8FlHk4v/PARR026UzYexafAt9roJ7LcLMAmO6Z93I= github.com/spf13/afero v1.9.2/go.mod h1:iUV7ddyEEZPO5gA3zD4fJt6iStLlL+Lg4m2cihcDf8Y= github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= github.com/spf13/cast v1.3.1/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= github.com/spf13/cast v1.10.0 h1:h2x0u2shc1QuLHfxi+cTJvs30+ZAHOGRic8uyGTDWxY= github.com/spf13/cast v1.10.0/go.mod h1:jNfB8QC9IA6ZuY2ZjDp0KtFO2LZZlg4S/7bzP6qqeHo= github.com/spf13/cobra v1.1.1/go.mod h1:WnodtKOvamDL/PwE2M4iKs8aMDBZ5Q5klgD3qfVJQMI= github.com/spf13/cobra v1.10.2 h1:DMTTonx5m65Ic0GOoRY2c16WCbHxOOw6xxezuLaBpcU= github.com/spf13/cobra v1.10.2/go.mod h1:7C1pvHqHw5A4vrJfjNwvOdzYu0Gml16OCs2GRiTUUS4= github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= github.com/spf13/jwalterweatherman v1.1.0/go.mod h1:aNWZUN0dPAAO/Ljvb5BEdw96iTZ0EXowPYD95IqWIGo= github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= github.com/spf13/pflag v1.0.10 h1:4EBh2KAYBwaONj6b2Ye1GiHfwjqyROoF4RwYO+vPwFk= github.com/spf13/pflag v1.0.10/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= github.com/spf13/viper v1.7.0/go.mod h1:8WkrPz2fc9jxqZNCJI/76HCieCp4Q8HaLFoCha5qpdg= github.com/spf13/viper v1.7.1/go.mod h1:8WkrPz2fc9jxqZNCJI/76HCieCp4Q8HaLFoCha5qpdg= github.com/spiffe/go-spiffe/v2 v2.6.0 h1:l+DolpxNWYgruGQVV0xsfeya3CsC7m8iBzDnMpsbLuo= github.com/spiffe/go-spiffe/v2 v2.6.0/go.mod h1:gm2SeUoMZEtpnzPNs2Csc0D/gX33k1xIx7lEzqblHEs= github.com/spkg/bom v0.0.0-20160624110644-59b7046e48ad/go.mod h1:qLr4V1qq6nMqFKkMo8ZTx3f+BZEkzsRUY10Xsm2mwU0= github.com/srebhan/cborquery v1.0.4 h1:R+PZ/ZKpgf2z0d9jkr2aCP53GI0PCC9Ibz8iqX/Pluk= github.com/srebhan/cborquery v1.0.4/go.mod h1:667M4EgeI9mJPFV5Mhyxg8rAuRO0SIIrgGtgZcFLqpE= github.com/srebhan/protobufquery v1.0.4 h1:MLMo7nS02HSwux538Id3SCkf/FShA4MK3pppc9U/acY= github.com/srebhan/protobufquery v1.0.4/go.mod h1:qMuAoKJAsVFYmyLE4H0dQ8F9+gBBHw+LBMqAZ326uA4= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE= github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= github.com/stretchr/objx v0.5.2 h1:xuMeJ0Sdp5ZMRXx/aWO6RZxdr3beISkG5/G/aIRr3pY= github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA= github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.2/go.mod h1:R6va5+xMeoiuVRoj+gSkQ7d3FALtqAAGI1FQKckRals= github.com/stretchr/testify v1.7.5/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= github.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= github.com/stretchr/testify v1.8.3/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U= github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U= github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw= github.com/t3rm1n4l/go-mega v0.0.0-20241213150454-ec0027fb0002 h1:jevGbwKzMmHLgHAaDaMJLQX3jpXUWjUvnsrPeMgkM7o= github.com/t3rm1n4l/go-mega v0.0.0-20241213150454-ec0027fb0002/go.mod h1:0Mv/XWQoRWF7d7jkc4DufsAJQg8xyZ5NtCkY59wECQY= github.com/tbrandon/mbserver v0.0.0-20170611213546-993e1772cc62 h1:Oj2e7Sae4XrOsk3ij21QjjEgAcVSeo9nkp0dI//cD2o= github.com/tbrandon/mbserver v0.0.0-20170611213546-993e1772cc62/go.mod h1:qUzPVlSj2UgxJkVbH0ZwuuiR46U8RBMDT5KLY78Ifpw= github.com/tdrn-org/go-hue v0.3.0 h1:ywIlfTx9lcDp+n9XyGNY/9mUihW82lsWUanTzvdfeMc= github.com/tdrn-org/go-hue v0.3.0/go.mod h1:KUnPy2lGoP43ygNoCg6jVEhf8h5fpRn0Esjxq9syCnU= github.com/tdrn-org/go-nsdp v0.5.0 h1:bOs8qABaP/BSQlWeziZx9gjGkC2ld9UQek9p5w6PvdY= github.com/tdrn-org/go-nsdp v0.5.0/go.mod h1:zp7CxiCPcyXHo+s6tn+wrNBr1qQe1G/hOh/FybM5xiM= github.com/tdrn-org/go-tr064 v0.2.3 h1:hTKavfSTiUqmy02UvhHrvTQv6tTTkmGjYnOKv37br10= github.com/tdrn-org/go-tr064 v0.2.3/go.mod h1:3MAciJ87LZgVVkvl9Ns+dYAaS6oa5zEbyyL+T2a154E= github.com/tedsuo/ifrit v0.0.0-20180802180643-bea94bb476cc/go.mod h1:eyZnKCc955uh98WQvzOm0dgAeLnf2O0Rz0LPoC5ze+0= github.com/testcontainers/testcontainers-go v0.41.0 h1:mfpsD0D36YgkxGj2LrIyxuwQ9i2wCKAD+ESsYM1wais= github.com/testcontainers/testcontainers-go v0.41.0/go.mod h1:pdFrEIfaPl24zmBjerWTTYaY0M6UHsqA1YSvsoU40MI= github.com/testcontainers/testcontainers-go/modules/azure v0.40.0 h1:a4Qn4UEgL3uzpY1Hhuzh2c87u/CuSoTaV12timQfHQU= github.com/testcontainers/testcontainers-go/modules/azure v0.40.0/go.mod h1:047cjSoIxghqTQt8OVeLwLO918jOTrRnKYSEG5L6paQ= github.com/testcontainers/testcontainers-go/modules/kafka v0.40.0 h1:BW4CMO6rYLvJRC7UF4l0rudnwm7IX/kJPvGd9MCJM6I= github.com/testcontainers/testcontainers-go/modules/kafka v0.40.0/go.mod h1:O4U0SUR8blhkRLLfIFHQqNRKzee7fOxzya2H+rnl4OY= github.com/testcontainers/testcontainers-go/modules/vault v0.41.0 h1:Hx5n69IeJBhMkiQ7V3RBCq1iPUrWCv+KEwZCjoWRc3Y= github.com/testcontainers/testcontainers-go/modules/vault v0.41.0/go.mod h1:dEQvxqPf62AIxEzymv+rD8+4A5TIvTA0/Etoh7csZbE= github.com/thomasklein94/packer-plugin-libvirt v0.5.0 h1:aj2HLHZZM/ClGLIwVp9rrgh+2TOU/w4EiaZHAwCpOgs= github.com/thomasklein94/packer-plugin-libvirt v0.5.0/go.mod h1:GwN82FQ6KxCNKtS8LNUgLbwTZs90GGhBzCmTNkrTCrY= github.com/tidwall/gjson v1.10.2/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk= github.com/tidwall/gjson v1.18.0 h1:FIDeeyB800efLX89e5a8Y0BNH+LOngJyGrIWxG2FKQY= github.com/tidwall/gjson v1.18.0/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk= github.com/tidwall/match v1.1.1 h1:+Ho715JplO36QYgwN9PGYNhgZvoUSc9X2c80KVTi+GA= github.com/tidwall/match v1.1.1/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JTxsfmM= github.com/tidwall/pretty v1.0.0/go.mod h1:XNkn88O1ChpSDQmQeStsy+sBenx6DDtFZJxhVysOjyk= github.com/tidwall/pretty v1.2.0/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU= github.com/tidwall/pretty v1.2.1 h1:qjsOFOWWQl+N3RsoF5/ssm1pHmJJwhjlSbZ51I6wMl4= github.com/tidwall/pretty v1.2.1/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU= github.com/tidwall/tinylru v1.1.0/go.mod h1:3+bX+TJ2baOLMWTnlyNWHh4QMnFyARg2TLTQ6OFbzw8= github.com/tidwall/tinylru v1.2.1 h1:VgBr72c2IEr+V+pCdkPZUwiQ0KJknnWIYbhxAVkYfQk= github.com/tidwall/tinylru v1.2.1/go.mod h1:9bQnEduwB6inr2Y7AkBP7JPgCkyrhTV/ZpX0oOOpBI4= github.com/tidwall/wal v1.2.1 h1:xQvwnRF3e+xBC4NvFvl1mPGJHU0aH5zNzlUKnKGIImA= github.com/tidwall/wal v1.2.1/go.mod h1:r6lR1j27W9EPalgHiB7zLJDYu3mzW5BQP5KrzBpYY/E= github.com/tinylib/msgp v1.6.3 h1:bCSxiTz386UTgyT1i0MSCvdbWjVW+8sG3PjkGsZQt4s= github.com/tinylib/msgp v1.6.3/go.mod h1:RSp0LW9oSxFut3KzESt5Voq4GVWyS+PSulT77roAqEA= github.com/tj/assert v0.0.0-20171129193455-018094318fb0/go.mod h1:mZ9/Rh9oLWpLLDRpvE+3b7gP/C2YyLFYxNmcLnPTMe0= github.com/tj/assert v0.0.3 h1:Df/BlaZ20mq6kuai7f5z2TvPFiwC3xaWJSDQNiIS3Rk= github.com/tj/assert v0.0.3/go.mod h1:Ne6X72Q+TB1AteidzQncjw9PabbMp4PBMZ1k+vd1Pvk= github.com/tj/go-buffer v1.1.0/go.mod h1:iyiJpfFcR2B9sXu7KvjbT9fpM4mOelRSDTbntVj52Uc= github.com/tj/go-elastic v0.0.0-20171221160941-36157cbbebc2/go.mod h1:WjeM0Oo1eNAjXGDx2yma7uG2XoyRZTq1uv3M/o7imD0= github.com/tj/go-kinesis v0.0.0-20171128231115-08b17f58cb1b/go.mod h1:/yhzCV0xPfx6jb1bBgRFjl5lytqVqZXEaeqWP8lTEao= github.com/tj/go-spin v1.1.0/go.mod h1:Mg1mzmePZm4dva8Qz60H2lHwmJ2loum4VIrLgVnKwh4= github.com/tklauser/go-sysconf v0.3.16 h1:frioLaCQSsF5Cy1jgRBrzr6t502KIIwQ0MArYICU0nA= github.com/tklauser/go-sysconf v0.3.16/go.mod h1:/qNL9xxDhc7tx3HSRsLWNnuzbVfh3e7gh/BmM179nYI= github.com/tklauser/numcpus v0.11.0 h1:nSTwhKH5e1dMNsCdVBukSZrURJRoHbSEQjdEbY+9RXw= github.com/tklauser/numcpus v0.11.0/go.mod h1:z+LwcLq54uWZTX0u/bGobaV34u6V7KNlTZejzM6/3MQ= github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= github.com/tv42/httpunix v0.0.0-20150427012821-b75d8614f926/go.mod h1:9ESjWnEqriFuLhtthL60Sar/7RFoluCcXsuvEwTV5KM= github.com/twmb/murmur3 v1.1.7 h1:ULWBiM04n/XoN3YMSJ6Z2pHDFLf+MeIVQU71ZPrvbWg= github.com/twmb/murmur3 v1.1.7/go.mod h1:Qq/R7NUyOfr65zD+6Q5IHKsJLwP7exErjN6lyyq3OSQ= github.com/uber/jaeger-client-go v2.30.0+incompatible h1:D6wyKGCecFaSRUpo8lCVbaOOb6ThwMmTEbhRwtKR97o= github.com/uber/jaeger-client-go v2.30.0+incompatible/go.mod h1:WVhlPFC8FDjOFMMWRy2pZqQJSXxYSwNYOkTr/Z6d3Kk= github.com/uber/jaeger-lib v2.4.1+incompatible h1:td4jdvLcExb4cBISKIpHuGoVXh+dVKhn2Um6rjCsSsg= github.com/uber/jaeger-lib v2.4.1+incompatible/go.mod h1:ComeNDZlWwrWnDv8aPp0Ba6+uUTzImX/AauajbLI56U= github.com/ulikunitz/xz v0.5.6/go.mod h1:2bypXElzHzzJZwzH67Y6wb67pO62Rzfn7BSiF4ABRW8= github.com/ulikunitz/xz v0.5.7/go.mod h1:nbz6k7qbPmH4IRqmfOplQw/tblSgqTqBwxkY0oWt/14= github.com/ulikunitz/xz v0.5.8/go.mod h1:nbz6k7qbPmH4IRqmfOplQw/tblSgqTqBwxkY0oWt/14= github.com/unknwon/goconfig v1.0.0 h1:rS7O+CmUdli1T+oDm7fYj1MwqNWtEJfNj+FqcUHML8U= github.com/unknwon/goconfig v1.0.0/go.mod h1:qu2ZQ/wcC/if2u32263HTVC39PeOQRSmidQk3DuDFQ8= github.com/urfave/cli v1.22.17 h1:SYzXoiPfQjHBbkYxbew5prZHS1TOLT3ierW8SYLqtVQ= github.com/urfave/cli v1.22.17/go.mod h1:b0ht0aqgH/6pBYzzxURyrM4xXNgsoT/n2ZzwQiEhNVo= github.com/urfave/cli/v2 v2.27.7 h1:bH59vdhbjLv3LAvIu6gd0usJHgoTTPhCFib8qqOwXYU= github.com/urfave/cli/v2 v2.27.7/go.mod h1:CyNAG/xg+iAOg0N4MPGZqVmv2rCoP267496AOXUZjA4= github.com/valyala/bytebufferpool v1.0.0 h1:GqA5TC/0021Y/b9FG4Oi9Mr3q7XYx6KllzawFIhcdPw= github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= github.com/vapourismo/knx-go v0.0.0-20240915133544-a6ab43471c11 h1:YzrpNqpAuAgUQ0vseiI3mAVz7zr0rM5LWdaGCCr6Ipc= github.com/vapourismo/knx-go v0.0.0-20240915133544-a6ab43471c11/go.mod h1:+iC7aAxEwuJ4mvdKaY0zCGT0dpIC/AtHt4yv2jr5FOo= github.com/vbatts/go-mtree v0.7.0 h1:ytmOc3MTRidZiBi9VBCyZ2BHe4fZS47L5v7BVXDWW4E= github.com/vbatts/go-mtree v0.7.0/go.mod h1:EjdpFC+LZy1TXbRGNa1MKKgjQ+7ew3foMFJK8o4/TdY= github.com/vertica/vertica-sql-go v1.3.5 h1:IrfH2WIgzZ45yDHyjVFrXU2LuKNIjF5Nwi90a6cfgUI= github.com/vertica/vertica-sql-go v1.3.5/go.mod h1:jnn2GFuv+O2Jcjktb7zyc4Utlbu9YVqpHH/lx63+1M4= github.com/vishvananda/netlink v1.1.0/go.mod h1:cTgwzPIzzgDAYoQrMm0EdrjRUBkTqKYppBueQtXaqoE= github.com/vishvananda/netlink v1.3.1 h1:3AEMt62VKqz90r0tmNhog0r/PpWKmrEShJU0wJW6bV0= github.com/vishvananda/netlink v1.3.1/go.mod h1:ARtKouGSTGchR8aMwmkzC0qiNPrrWO5JS/XMVl45+b4= github.com/vishvananda/netns v0.0.0-20191106174202-0a2b9b5464df/go.mod h1:JP3t17pCcGlemwknint6hfoeCVQrEMVwxRLRjXpq+BU= github.com/vishvananda/netns v0.0.5 h1:DfiHV+j8bA32MFM7bfEunvT8IAqQ/NzSJHtcmW5zdEY= github.com/vishvananda/netns v0.0.5/go.mod h1:SpkAiCQRtJ6TvvxPnOSyH3BMl6unz3xZlaprSwhNNJM= github.com/vjeantet/grok v1.0.1 h1:2rhIR7J4gThTgcZ1m2JY4TrJZNgjn985U28kT2wQrJ4= github.com/vjeantet/grok v1.0.1/go.mod h1:ax1aAchzC6/QMXMcyzHQGZWaW1l195+uMYIkCWPCNIo= github.com/vmware/govmomi v0.53.0 h1:e1bZCotAq7wm4xy95ePN2uoWwz28pNp/ewZZhpBY7/4= github.com/vmware/govmomi v0.53.0/go.mod h1:EWfuzPfxT5NV+aS2we02SLFdhvJkgeY7t7+TszgBSMY= github.com/wavefronthq/wavefront-sdk-go v0.15.0 h1:po9E3vh/0y7kOx8D9EtFp7kbSLLLKbmu/w/s1xGJAQU= github.com/wavefronthq/wavefront-sdk-go v0.15.0/go.mod h1:V72c8e+bXuLK8HpA6ioW0ll5mK9IPD+4IHNNDY75ksA= github.com/wlynxg/anet v0.0.3/go.mod h1:eay5PRQr7fIVAMbTbchTnO9gG65Hg/uYGdc7mguHxoA= github.com/x448/float16 v0.8.4 h1:qLwI1I70+NjRFUR3zs1JPUCgaCXSh3SW62uAKT1mSBM= github.com/x448/float16 v0.8.4/go.mod h1:14CWIYCyZA/cWjXOioeEpHeN/83MdbZDRQHoFcYsOfg= github.com/xanzy/ssh-agent v0.3.3 h1:+/15pJfg/RsTxqYcX6fHqOXZwwMP+2VyYWJeWM2qQFM= github.com/xanzy/ssh-agent v0.3.3/go.mod h1:6dzNDKs0J9rVPHPhaGCukekBHKqfl+L3KghI1Bc68Uw= 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.1.1/go.mod h1:RaEWvsqvNKKvBPvcKeFjrG2cJqOkHTiyTpzz23ni57g= github.com/xdg-go/scram v1.2.0 h1:bYKF2AEwG5rqd1BumT4gAnvwU/M9nBp2pTSxeZw7Wvs= github.com/xdg-go/scram v1.2.0/go.mod h1:3dlrS0iBaWKYVt2ZfA4cj48umJZ+cAEbR6/SjLA88I8= github.com/xdg-go/stringprep v1.0.3/go.mod h1:W3f5j4i+9rC0kuIEJL0ky1VpHXQU3ocBgklLGvcBnW8= github.com/xdg-go/stringprep v1.0.4 h1:XLI/Ng3O1Atzq0oBs3TWm+5ZVgkq2aqdlvP9JtoZ6c8= github.com/xdg-go/stringprep v1.0.4/go.mod h1:mPGuuIYwz7CmR2bT9j4GbQqutWS1zV24gijq1dTyGkM= github.com/xdg/scram v1.0.5 h1:TuS0RFmt5Is5qm9Tm2SoD89OPqe4IRiFtyFY4iwWXsw= github.com/xdg/scram v1.0.5/go.mod h1:lB8K/P019DLNhemzwFU4jHLhdvlE6uDZjXFejJXr49I= github.com/xdg/stringprep v1.0.3 h1:cmL5Enob4W83ti/ZHuZLuKD/xqJfus4fVPwE+/BDm+4= github.com/xdg/stringprep v1.0.3/go.mod h1:Jhud4/sHMO4oL310DaZAKk9ZaJ08SJfe+sJh0HrGL1Y= github.com/xi2/xz v0.0.0-20171230120015-48954b6210f8/go.mod h1:HUYIGzjTL3rfEspMxjDjgmT5uz5wzYJKVo23qUhYTos= github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= github.com/xrash/smetrics v0.0.0-20250705151800-55b8f293f342 h1:FnBeRrxr7OU4VvAzt5X7s6266i6cSVkkFPS0TuXWbIg= github.com/xrash/smetrics v0.0.0-20250705151800-55b8f293f342/go.mod h1:Ohn+xnUBiLI6FVj/9LpzZWtj1/D6lUovWYBkxHVV3aM= github.com/xyproto/randomstring v1.0.5 h1:YtlWPoRdgMu3NZtP45drfy1GKoojuR7hmRcnhZqKjWU= github.com/xyproto/randomstring v1.0.5/go.mod h1:rgmS5DeNXLivK7YprL0pY+lTuhNQW3iGxZ18UQApw/E= github.com/youmark/pkcs8 v0.0.0-20181117223130-1be2e3e5546d/go.mod h1:rHwXgn7JulP+udvsHwJoVG1YGAP6VLg4y9I5dyZdqmA= github.com/youmark/pkcs8 v0.0.0-20240726163527-a2c0da244d78 h1:ilQV1hzziu+LLM3zUTJ0trRztfwgjqKnBWNtSRkbmwM= github.com/youmark/pkcs8 v0.0.0-20240726163527-a2c0da244d78/go.mod h1:aL8wCCfTfSfmXjznFBSZNN13rSJjlIOI1fUNAtF7rmI= github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= github.com/yuin/goldmark v1.4.0/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= github.com/yuin/goldmark v1.4.1/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= github.com/yuin/goldmark v1.7.16 h1:n+CJdUxaFMiDUNnWC3dMWCIQJSkxH4uz3ZwQBkAlVNE= github.com/yuin/goldmark v1.7.16/go.mod h1:ip/1k0VRfGynBgxOz0yCqHrbZXhcjxyuS66Brc7iBKg= github.com/yuin/gopher-lua v0.0.0-20200816102855-ee81675732da h1:NimzV1aGyq29m5ukMK0AMWEhFaL/lrEOaephfuoiARg= github.com/yuin/gopher-lua v0.0.0-20200816102855-ee81675732da/go.mod h1:E1AXubJBdNmFERAOucpDIxNzeGfLzg0mYh+UfMWdChA= github.com/yunify/qingstor-sdk-go/v3 v3.2.0 h1:9sB2WZMgjwSUNZhrgvaNGazVltoFUUfuS9f0uCWtTr8= github.com/yunify/qingstor-sdk-go/v3 v3.2.0/go.mod h1:KciFNuMu6F4WLk9nGwwK69sCGKLCdd9f97ac/wfumS4= github.com/yusufpapurcu/wmi v1.2.4 h1:zFUKzehAFReQwLys1b/iSMl+JQGSCSjtVqQn9bBrPo0= github.com/yusufpapurcu/wmi v1.2.4/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0= github.com/zeebo/assert v1.3.0/go.mod h1:Pq9JiuJQpG8JLJdtkwrJESF0Foym2/D9XMU5ciN/wJ0= github.com/zeebo/assert v1.3.1 h1:vukIABvugfNMZMQO1ABsyQDJDTVQbn+LWSMy1ol1h6A= github.com/zeebo/assert v1.3.1/go.mod h1:Pq9JiuJQpG8JLJdtkwrJESF0Foym2/D9XMU5ciN/wJ0= github.com/zeebo/blake3 v0.2.3 h1:TFoLXsjeXqRNFxSbk35Dk4YtszE/MQQGK10BH4ptoTg= github.com/zeebo/blake3 v0.2.3/go.mod h1:mjJjZpnsyIVtVgTOSpJ9vmRE4wgDeyt2HU3qXvvKCaQ= github.com/zeebo/errs v1.4.0 h1:XNdoD/RRMKP7HD0UhJnIzUy74ISdGGxURlYG8HSWSfM= github.com/zeebo/errs v1.4.0/go.mod h1:sgbWHsvVuTPHcqJJGQ1WhI5KbWlHYz+2+2C/LSEtCw4= github.com/zeebo/xxh3 v1.0.2/go.mod h1:5NWz9Sef7zIDm2JHfFlcQvNekmcEl9ekUZQQKCYaDcA= github.com/zeebo/xxh3 v1.1.0 h1:s7DLGDK45Dyfg7++yxI0khrfwq9661w9EN78eP/UZVs= github.com/zeebo/xxh3 v1.1.0/go.mod h1:IisAie1LELR4xhVinxWS5+zf1lA4p0MW4T+w+W07F5s= github.com/zenazn/goji v0.9.0/go.mod h1:7S9M489iMyHBNxwZnk9/EHS098H4/F6TATF2mIxtB1Q= github.com/zentures/cityhash v0.0.0-20131128155616-cdd6a94144ab h1:BD4YbH4Y0ysgbrP9jGuDB0BxkqyTRk6Y70o3D5Z5ayc= github.com/zentures/cityhash v0.0.0-20131128155616-cdd6a94144ab/go.mod h1:SvJE1nX57VqPOyqkQGEGcJPWZqeB3FCZ8s7a0uSlG+A= github.com/zitadel/logging v0.7.0 h1:eugftwMM95Wgqwftsvj81isL0JK/hoScVqp/7iA2adQ= github.com/zitadel/logging v0.7.0/go.mod h1:9A6h9feBF/3u0IhA4uffdzSDY7mBaf7RE78H5sFMINQ= github.com/zitadel/oidc/v3 v3.45.4 h1:GKyWaPRVQ8sCu9XgJ3NgNGtG52FzwVJpzXjIUG2+YrI= github.com/zitadel/oidc/v3 v3.45.4/go.mod h1:XALmFXS9/kSom9B6uWin1yJ2WTI/E4Ti5aXJdewAVEs= github.com/zitadel/schema v1.3.2 h1:gfJvt7dOMfTmxzhscZ9KkapKo3Nei3B6cAxjav+lyjI= github.com/zitadel/schema v1.3.2/go.mod h1:IZmdfF9Wu62Zu6tJJTH3UsArevs3Y4smfJIj3L8fzxw= go.bug.st/serial v1.6.4 h1:7FmqNPgVp3pu2Jz5PoPtbZ9jJO5gnEnZIvnI1lzve8A= go.bug.st/serial v1.6.4/go.mod h1:nofMJxTeNVny/m6+KaafC6vJGj3miwQZ6vW4BZUGJPI= go.einride.tech/aip v0.79.0 h1:19zdPlZzlUvxOA8syAFw4LkdJdXepzyTl6gt9XEeqdU= go.einride.tech/aip v0.79.0/go.mod h1:E8+wdTApA70odnpFzJgsGogHozC2JCIhFJBKPr8bVig= go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= go.etcd.io/bbolt v1.3.10 h1:+BqfJTcCzTItrop8mq/lbzL8wSGtj94UO/3U31shqG0= go.etcd.io/bbolt v1.3.10/go.mod h1:bK3UQLPJZly7IlNmV7uVHJDxfe5aK9Ll93e/74Y9oEQ= go.etcd.io/etcd/api/v3 v3.5.4 h1:OHVyt3TopwtUQ2GKdd5wu3PmmipR4FTwCqoEjSyRdIc= go.etcd.io/etcd/api/v3 v3.5.4/go.mod h1:5GB2vv4A4AOn3yk7MftYGHkUfGtDHnEraIjym4dYz5A= go.mongodb.org/mongo-driver v1.11.4/go.mod h1:PTSz5yu21bkT/wXpkS7WR5f0ddqw5quethTUn9WM+2g= go.mongodb.org/mongo-driver v1.17.9 h1:IexDdCuuNJ3BHrELgBlyaH9p60JXAvdzWR128q+U5tU= go.mongodb.org/mongo-driver v1.17.9/go.mod h1:LlOhpH5NUEfhxcAwG0UEkMqwYcc4JU18gtCdGudk/tQ= go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk= go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E= go.opencensus.io v0.24.0 h1:y73uSU6J157QMP2kn2r30vwW1A2W2WFwSCGnAVxeaD0= go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo= go.opentelemetry.io/auto/sdk v1.2.1 h1:jXsnJ4Lmnqd11kwkBV2LgLoFMZKizbCi5fNZ/ipaZ64= go.opentelemetry.io/auto/sdk v1.2.1/go.mod h1:KRTj+aOaElaLi+wW1kO/DZRXwkF4C5xPbEe3ZiIhN7Y= go.opentelemetry.io/collector v0.81.0 h1:pF+sB8xNXlg/W0a0QTLz4mUWyool1a9toVj8LmLoFqg= go.opentelemetry.io/collector/consumer/consumererror v0.135.0 h1:OTu0rLPWxWc03sqeYHdWGJFUA3W2DfgC1sHLZx8NMXI= go.opentelemetry.io/collector/consumer/consumererror v0.135.0/go.mod h1:eGPILc8iMAnunFz4vxxSsGQ4wx7/XdAYagfsmNLdSp0= go.opentelemetry.io/collector/featuregate v1.53.0 h1:cgjXdtl7jezWxq6V0eohe/JqjY4PBotZGb5+bTR2OJw= go.opentelemetry.io/collector/featuregate v1.53.0/go.mod h1:PS7zY/zaCb28EqciePVwRHVhc3oKortTFXsi3I6ee4g= go.opentelemetry.io/collector/internal/testutil v0.147.0 h1:DFlRxBRp23/sZnpTITK25yqe0d56yNvK+63IaWc6OsU= go.opentelemetry.io/collector/internal/testutil v0.147.0/go.mod h1:Jkjs6rkqs973LqgZ0Fe3zrokQRKULYXPIf4HuqStiEE= go.opentelemetry.io/collector/pdata v1.53.0 h1:DlYDbRwammEZaxDZHINx5v0n8SEOVNniPbi6FRTlVkA= go.opentelemetry.io/collector/pdata v1.53.0/go.mod h1:LRSYGNjKXaUrZEwZv3Yl+8/zV2HmRGKXW62zB2bysms= go.opentelemetry.io/collector/pdata/pprofile v0.140.0 h1:b9TZ6UnyzsT/ERQw2VKGi/NYLtKSmjG7cgQuc9wZt5s= go.opentelemetry.io/collector/pdata/pprofile v0.140.0/go.mod h1:/2s/YBWGbu+r8MuKu5zas08iSqe+3P6xnbRpfE2DWAA= go.opentelemetry.io/collector/pdata/testdata v0.135.0 h1:bp+9wKAifJcoYdS+qTwtgcKPM129wIKLUGAAxKY4lck= go.opentelemetry.io/collector/pdata/testdata v0.135.0/go.mod h1:w0gTft2xsn/adYgUGNBhDDjVhKCvvA9fHTKIbh7rx0o= go.opentelemetry.io/collector/semconv v0.128.0 h1:MzYOz7Vgb3Kf5D7b49pqqgeUhEmOCuT10bIXb/Cc+k4= go.opentelemetry.io/collector/semconv v0.128.0/go.mod h1:OPXer4l43X23cnjLXIZnRj/qQOjSuq4TgBLI76P9hns= go.opentelemetry.io/contrib/detectors/gcp v1.39.0 h1:kWRNZMsfBHZ+uHjiH4y7Etn2FK26LAGkNFw7RHv1DhE= go.opentelemetry.io/contrib/detectors/gcp v1.39.0/go.mod h1:t/OGqzHBa5v6RHZwrDBJ2OirWc+4q/w2fTbLZwAKjTk= go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.63.0 h1:YH4g8lQroajqUwWbq/tr2QX1JFmEXaDLgG+ew9bLMWo= go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.63.0/go.mod h1:fvPi2qXDqFs8M4B4fmJhE92TyQs9Ydjlg3RvfUp+NbQ= go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.65.0 h1:7iP2uCb7sGddAr30RRS6xjKy7AZ2JtTOPA3oolgVSw8= go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.65.0/go.mod h1:c7hN3ddxs/z6q9xwvfLPk+UHlWRQyaeR1LdgfL/66l0= go.opentelemetry.io/otel v1.41.0 h1:YlEwVsGAlCvczDILpUXpIpPSL/VPugt7zHThEMLce1c= go.opentelemetry.io/otel v1.41.0/go.mod h1:Yt4UwgEKeT05QbLwbyHXEwhnjxNO6D8L5PQP51/46dE= go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v0.44.0 h1:jd0+5t/YynESZqsSyPz+7PAFdEop0dlN0+PkyHYo8oI= go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v0.44.0/go.mod h1:U707O40ee1FpQGyhvqnzmCJm1Wh6OX6GGBVn0E6Uyyk= go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.40.0 h1:QKdN8ly8zEMrByybbQgv8cWBcdAarwmIPZ6FThrWXJs= go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.40.0/go.mod h1:bTdK1nhqF76qiPoCCdyFIV+N/sRHYXYCTQc+3VCi3MI= go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.41.0 h1:inYW9ZhgqiDqh6BioM7DVHHzEGVq76Db5897WLGZ5Go= go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.41.0/go.mod h1:Izur+Wt8gClgMJqO/cZ8wdeeMryJ/xxiOVgFSSfpDTY= go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.40.0 h1:ZrPRak/kS4xI3AVXy8F7pipuDXmDsrO8Lg+yQjBLjw0= go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.40.0/go.mod h1:3y6kQCWztq6hyW8Z9YxQDDm0Je9AJoFar2G0yDcmhRk= go.opentelemetry.io/otel/metric v1.41.0 h1:rFnDcs4gRzBcsO9tS8LCpgR0dxg4aaxWlJxCno7JlTQ= go.opentelemetry.io/otel/metric v1.41.0/go.mod h1:xPvCwd9pU0VN8tPZYzDZV/BMj9CM9vs00GuBjeKhJps= go.opentelemetry.io/otel/sdk v1.41.0 h1:YPIEXKmiAwkGl3Gu1huk1aYWwtpRLeskpV+wPisxBp8= go.opentelemetry.io/otel/sdk v1.41.0/go.mod h1:ahFdU0G5y8IxglBf0QBJXgSe7agzjE4GiTJ6HT9ud90= go.opentelemetry.io/otel/sdk/metric v1.41.0 h1:siZQIYBAUd1rlIWQT2uCxWJxcCO7q3TriaMlf08rXw8= go.opentelemetry.io/otel/sdk/metric v1.41.0/go.mod h1:HNBuSvT7ROaGtGI50ArdRLUnvRTRGniSUZbxiWxSO8Y= go.opentelemetry.io/otel/trace v1.41.0 h1:Vbk2co6bhj8L59ZJ6/xFTskY+tGAbOnCtQGVVa9TIN0= go.opentelemetry.io/otel/trace v1.41.0/go.mod h1:U1NU4ULCoxeDKc09yCWdWe+3QoyweJcISEVa1RBzOis= go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= go.opentelemetry.io/proto/otlp v0.15.0/go.mod h1:H7XAot3MsfNsj7EXtrA2q5xSNQ10UqI405h3+duxN4U= go.opentelemetry.io/proto/otlp v0.19.0/go.mod h1:H7XAot3MsfNsj7EXtrA2q5xSNQ10UqI405h3+duxN4U= go.opentelemetry.io/proto/otlp v1.10.0 h1:IQRWgT5srOCYfiWnpqUYz9CVmbO8bFmKcwYxpuCSL2g= go.opentelemetry.io/proto/otlp v1.10.0/go.mod h1:/CV4QoCR/S9yaPj8utp3lvQPoqMtxXdzn7ozvvozVqk= go.opentelemetry.io/proto/otlp/collector/profiles/v1development v0.3.0 h1:AWBLtJn3ajH399gyOuJdqPsC9w152x3xGVVO/UK3vyM= go.opentelemetry.io/proto/otlp/collector/profiles/v1development v0.3.0/go.mod h1:kCdbxyM9kfmv3v4ZQzZ2pACxoQ6lE0IsjP+UcZwQnr4= go.opentelemetry.io/proto/otlp/profiles/v1development v0.3.0 h1:ZQs05qo3Yh4KUHeVH6v89xErwmsvgA/cLX2/w5Ikp+k= go.opentelemetry.io/proto/otlp/profiles/v1development v0.3.0/go.mod h1:3iiRVKaCfVo0UI1ZaSMm5WbCBbINRqVlD9SUmvyBNrY= go.opentelemetry.io/proto/slim/otlp v1.9.0 h1:fPVMv8tP3TrsqlkH1HWYUpbCY9cAIemx184VGkS6vlE= go.opentelemetry.io/proto/slim/otlp v1.9.0/go.mod h1:xXdeJJ90Gqyll+orzUkY4bOd2HECo5JofeoLpymVqdI= go.opentelemetry.io/proto/slim/otlp/collector/profiles/v1development v0.2.0 h1:o13nadWDNkH/quoDomDUClnQBpdQQ2Qqv0lQBjIXjE8= go.opentelemetry.io/proto/slim/otlp/collector/profiles/v1development v0.2.0/go.mod h1:Gyb6Xe7FTi/6xBHwMmngGoHqL0w29Y4eW8TGFzpefGA= go.opentelemetry.io/proto/slim/otlp/profiles/v1development v0.2.0 h1:EiUYvtwu6PMrMHVjcPfnsG3v+ajPkbUeH+IL93+QYyk= go.opentelemetry.io/proto/slim/otlp/profiles/v1development v0.2.0/go.mod h1:mUUHKFiN2SST3AhJ8XhJxEoeVW12oqfXog0Bo8W3Ec4= go.starlark.net v0.0.0-20260210143700-b62fd896b91b h1:mDO9/2PuBcapqFbhiCmFcEQZvlQnk3ILEZR+a8NL1z4= go.starlark.net v0.0.0-20260210143700-b62fd896b91b/go.mod h1:YKMCv9b1WrfWmeqdV5MAuEHWsu5iC+fe6kYl2sQjdI8= go.step.sm/crypto v0.76.2 h1:JJ/yMcs/rmcCAwlo+afrHjq74XBFRTJw5B2y4Q4Z4c4= go.step.sm/crypto v0.76.2/go.mod h1:m6KlB/HzIuGFep0UWI5e0SYi38UxpoKeCg6qUaHV6/Q= go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= go.uber.org/atomic v1.5.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= go.uber.org/atomic v1.6.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= go.uber.org/atomic v1.9.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= go.uber.org/atomic v1.11.0 h1:ZvwS0R+56ePWxUNi+Atn9dWONBPp/AUETXlHW0DxSjE= go.uber.org/atomic v1.11.0/go.mod h1:LUxbIzbOniOlMKjJjyPfpl4v+PKK2cNJn91OQbhoJI0= go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= go.uber.org/multierr v1.3.0/go.mod h1:VgVr7evmIr6uPjLBxg28wmKNXyqE9akIJ5XnfpiKl+4= go.uber.org/multierr v1.5.0/go.mod h1:FeouvMocqHpRaaGuG9EjoKcStLC43Zu/fmqdUMPcKYU= go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee/go.mod h1:vJERXedbb3MVM5f9Ejo0C68/HhF8uaILCdgjnY+goOA= go.uber.org/zap v1.9.1/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= go.uber.org/zap v1.13.0/go.mod h1:zwrFLgMcdUuIBviXEYEH1YKNaOBnKXsx2IPda5bBwHM= go.uber.org/zap v1.27.1 h1:08RqriUEv8+ArZRYSTXy1LeBScaMpVSTBhCeaZYfMYc= go.uber.org/zap v1.27.1/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E= go.yaml.in/yaml/v2 v2.4.3 h1:6gvOSjQoTB3vt1l+CU+tSyi/HOjfOjRLJ4YwYZGwRO0= go.yaml.in/yaml/v2 v2.4.3/go.mod h1:zSxWcmIDjOzPXpjlTTbAsKokqkDNAVtZO0WOMiT90s8= go.yaml.in/yaml/v3 v3.0.4 h1:tfq32ie2Jv2UxXFdLJdh3jXuOzWiL1fo0bu/FbuKpbc= go.yaml.in/yaml/v3 v3.0.4/go.mod h1:DhzuOOF2ATzADvBadXxruRBLzYTpT36CKvDb3+aBEFg= golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/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-20190411191339-88737f569e3a/go.mod h1:WFFai1msRO1wXaEeE5yQxYXgSfI8pQAWXbQop6sCtWE= golang.org/x/crypto v0.0.0-20190426145343-a29dc8fdc734/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190820162420-60c769a6c586/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190923035154-9ee001bba392/go.mod h1:/lpIB1dKB+9EgE3H3cr1v9wB50oz8l4C4h62xy7jSTY= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20200302210943-78000ba7a073/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200709230013-948cd5f35899/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20201203163018-be400aefbc4c/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= 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-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20211108221036-ceb1ce70b4fa/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20211202192323-5770296d904e/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/crypto v0.0.0-20220722155217-630584e8d5aa/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/crypto v0.1.0/go.mod h1:RecgLatLF4+eUMCP1PoPZQb+cVrJcOPbHkTkbkB9sbw= golang.org/x/crypto v0.3.0/go.mod h1:hebNnKkNXi2UzZN1eVRvBB7co0a+JxK6XbPiWVs/3J4= golang.org/x/crypto v0.6.0/go.mod h1:OFC/31mSvZgRz0V1QTNCzfAI1aIRzbiufJtkMIlEp58= golang.org/x/crypto v0.12.0/go.mod h1:NF0Gs7EO5K4qLn+Ylc+fih8BSTeIjAP05siRnAh98yw= golang.org/x/crypto v0.13.0/go.mod h1:y6Z2r+Rw4iayiXXAIxJIDAJ1zMW4yaTpebo8fPOliYc= golang.org/x/crypto v0.14.0/go.mod h1:MVFd36DqK4CsrnJYDkBA3VC4m2GkXAM0PvzMCn4JQf4= golang.org/x/crypto v0.17.0/go.mod h1:gCAAfMLgwOJRpTjQ2zCCt2OcSfYMTeZVSRtQlPC7Nq4= golang.org/x/crypto v0.19.0/go.mod h1:Iy9bg/ha4yyC70EfRS8jz+B6ybOBKMaSxLj6P6oBDfU= golang.org/x/crypto v0.20.0/go.mod h1:Xwo95rrVNIoSMx9wa1JroENMToLWn3RNVrTBpLHgZPQ= golang.org/x/crypto v0.21.0/go.mod h1:0BP7YvVV9gBbVKyeTG0Gyn+gZm94bibOW5BjDEYAOMs= golang.org/x/crypto v0.23.0/go.mod h1:CKFgDieR+mRhux2Lsu27y0fO304Db0wZe70UKqHu0v8= golang.org/x/crypto v0.31.0/go.mod h1:kDsLvtWBEx7MV9tJOj9bnXsPbxwJQ6csT/x4KIN4Ssk= golang.org/x/crypto v0.49.0 h1:+Ng2ULVvLHnJ/ZFEq4KdcDd/cfjrrjjNSXNzxg0Y4U4= golang.org/x/crypto v0.49.0/go.mod h1:ErX4dUh2UM+CFYiXZRTcMpEcN8b/1gxEuv3nODoYtCA= 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= golang.org/x/exp v0.0.0-20190125153040-c74c464bbbf2/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek= golang.org/x/exp v0.0.0-20191002040644-a1355ae1e2c3/go.mod h1:NOZ3BPKG0ec/BKJQgnvsSFpcKLM5xXVWnvZS97DWHgE= golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY= golang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= golang.org/x/exp v0.0.0-20220827204233-334a2380cb91/go.mod h1:cyybsKvd6eL0RnXn6p/Grxp8F5bW7iYuBgsNCOHpMYE= golang.org/x/exp v0.0.0-20260218203240-3dfff04db8fa h1:Zt3DZoOFFYkKhDT3v7Lm9FDMEV06GpzjG2jrqW+QTE0= golang.org/x/exp v0.0.0-20260218203240-3dfff04db8fa/go.mod h1:K79w1Vqn7PoiZn+TkNpx3BUWUQksGO3JcVX6qIjytmA= golang.org/x/image v0.0.0-20180708004352-c73c2afc3b81/go.mod h1:ux5Hcp/YLpHSI86hEcLt0YII63i6oz57MZXIpbrjZUs= golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= golang.org/x/image v0.0.0-20190910094157-69e4b8554b2a/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= golang.org/x/image v0.0.0-20200119044424-58c23975cae1/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= golang.org/x/image v0.0.0-20200430140353-33d19683fad8/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= golang.org/x/image v0.0.0-20200618115811-c13761719519/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= golang.org/x/image v0.0.0-20201208152932-35266b937fa6/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= golang.org/x/image v0.0.0-20210216034530-4410531fe030/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= golang.org/x/image v0.0.0-20210607152325-775e3b0c77b9/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM= golang.org/x/image v0.0.0-20210628002857-a66eb6448b8d/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM= golang.org/x/image v0.0.0-20211028202545-6944b10bf410/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM= golang.org/x/image v0.0.0-20220302094943-723b81ca9867/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM= golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= golang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= golang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs= golang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= golang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= golang.org/x/lint v0.0.0-20210508222113-6edffad5e616/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY= golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.5.0/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro= golang.org/x/mod v0.5.1/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro= golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= golang.org/x/mod v0.6.0/go.mod h1:4mET923SAdbXp2ki8ey+zGs1SLqsuM2Y0uvdZR/fUNI= golang.org/x/mod v0.7.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/mod v0.9.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/mod v0.12.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/mod v0.15.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= golang.org/x/mod v0.17.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= golang.org/x/mod v0.34.0 h1:xIHgNUUnW6sYkcM5Jleh05DvLOtwc6RitGHbDk4akRI= golang.org/x/mod v0.34.0/go.mod h1:ykgH52iCZe79kzLLMhyCUzhMci+nQj+0XkbXpNYtVjY= 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= golang.org/x/net v0.0.0-20181023162649-9b4f9f5ad519/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20181201002055-351d144fa1fc/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20181220203305-927f97764cc3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190206173232-65e2d4e15006/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190813141303-74dc4d7220e7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190827160401-ba9fcec4b297/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190923162816-aa69164e4478/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20191007182048-72f939374954/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20191112182307-2180aed22343/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200222125558-5a598a2470a0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200501053045-e0ff5e5a1de5/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200506145744-7e3656a0809f/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200513185701-a91f0712d120/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20201010224723-4f7140c49acb/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20201031054903-ff519b6c9102/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20201209123823-ac852fbbde11/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20201216054612-986b41b23924/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20201224014010-6772e930b67b/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210119194325-5f4716e94777/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= 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-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= golang.org/x/net v0.0.0-20210805182204-aaa1db679c0d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20210813160813-60bc85c4be6d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20210928044308-7d9f5e0b762b/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20211020060615-d418f374d309/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20211111083644-e5c967477495/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20211201190559-0a0e4e1bb54c/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20211208012354-db4efeb81f4b/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= golang.org/x/net v0.0.0-20220325170049-de3da57026de/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= golang.org/x/net v0.0.0-20220412020605-290c469a71a5/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= golang.org/x/net v0.0.0-20220425223048-2871e0cb64e4/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= golang.org/x/net v0.0.0-20220607020251-c690dde0001d/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= golang.org/x/net v0.0.0-20220617184016-355a448f1bc9/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= golang.org/x/net v0.0.0-20220624214902-1bab6f366d9e/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= golang.org/x/net v0.0.0-20220909164309-bea034e7d591/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= golang.org/x/net v0.0.0-20221012135044-0b7e1fb9d458/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= golang.org/x/net v0.0.0-20221014081412-f15817d10f9b/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= golang.org/x/net v0.1.0/go.mod h1:Cx3nUiGt4eDBEyega/BKRp+/AlGL8hYe7U9odMt2Cco= golang.org/x/net v0.2.0/go.mod h1:KqCZLdyyvdV855qA2rE3GC2aiw5xGR5TEjj8smXukLY= golang.org/x/net v0.4.0/go.mod h1:MBQ8lrhLObU/6UmLb4fmbmk5OcyYmqtbGd/9yIeKjEE= golang.org/x/net v0.5.0/go.mod h1:DivGGAXEgPSlEBzxGzZI+ZLohi+xUj054jfeKui00ws= golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= golang.org/x/net v0.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc= golang.org/x/net v0.9.0/go.mod h1:d48xBJpPfHeWQsugry2m+kC02ZBRGRgulfHnEXEuWns= golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= golang.org/x/net v0.14.0/go.mod h1:PpSgVXXLK0OxS0F31C1/tv6XNguvCrnXIDrFMspZIUI= golang.org/x/net v0.15.0/go.mod h1:idbUs1IY1+zTqbi8yxTbhexhEEk5ur9LInksu6HrEpk= golang.org/x/net v0.17.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE= golang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44= golang.org/x/net v0.23.0/go.mod h1:JKghWKKOSdJwpW2GEx0Ja7fmaKnMsbu+MWVZTokSYmg= golang.org/x/net v0.25.0/go.mod h1:JkAGAh7GEvH74S6FOH42FLoXpXbE/aqXSrIQjXgsiwM= golang.org/x/net v0.33.0/go.mod h1:HXLR5J+9DxmrqMwG9qjGCxZ+zKXxBru04zlTvWlWuN4= golang.org/x/net v0.52.0 h1:He/TN1l0e4mmR3QqHMT2Xab3Aj3L9qjbhRm78/6jrW0= golang.org/x/net v0.52.0/go.mod h1:R1MAz7uMZxVMualyPXb+VaqGSa3LIaUqk0eEt3w36Sw= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20200902213428-5d25da1a8d43/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20201109201403-9fd604954f58/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20201208152858-08078c50e5b5/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20210218202405-ba52d332ba99/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20210220000619-9bb904979d93/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20210313182246-cd4f82c27b84/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20210628180205-a41e5a781914/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20210805134026-6f1e6394065a/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20210819190943-2bc19b11175f/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20211104180415-d3ed0bb246c8/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20220223155221-ee480838109b/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= golang.org/x/oauth2 v0.0.0-20220309155454-6242fa91716a/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= golang.org/x/oauth2 v0.0.0-20220411215720-9780585627b5/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= golang.org/x/oauth2 v0.0.0-20220608161450-d0670ef3b1eb/go.mod h1:jaDAt6Dkxork7LmZnYtzbRWj0W47D86a3TGe0YHBvmE= golang.org/x/oauth2 v0.0.0-20220622183110-fd043fe589d2/go.mod h1:jaDAt6Dkxork7LmZnYtzbRWj0W47D86a3TGe0YHBvmE= golang.org/x/oauth2 v0.0.0-20220822191816-0ebed06d0094/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg= golang.org/x/oauth2 v0.0.0-20220909003341-f21342109be1/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg= golang.org/x/oauth2 v0.0.0-20221006150949-b44042a4b9c1/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg= golang.org/x/oauth2 v0.0.0-20221014153046-6fdb5e3db783/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg= golang.org/x/oauth2 v0.4.0/go.mod h1:RznEsdpjGAINPTOF0UH/t+xJ75L18YO3Ho6Pyn+uRec= golang.org/x/oauth2 v0.5.0/go.mod h1:9/XBHVqLaWO3/BRHs5jbpYCnOZVjj5V0ndyaAM7KB4I= golang.org/x/oauth2 v0.6.0/go.mod h1:ycmewcwgD4Rpr3eZJLSB4Kyyljb3qDh40vJ8STE5HKw= golang.org/x/oauth2 v0.7.0/go.mod h1:hPLQkd9LyjfXTiRohC/41GhcFqxisoUQ99sCUOHO9x4= golang.org/x/oauth2 v0.36.0 h1:peZ/1z27fi9hUOFCAZaHyrpWG5lwe0RJEEEeH0ThlIs= golang.org/x/oauth2 v0.36.0/go.mod h1:YDBUJMTkDnJS+A4BP4eZBjCqtokkg1hODuPjwiGPO7Q= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220601150217-0de741cfad7f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220819030929-7fc1605a5dde/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220929204114-8fcdb60fdcc0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.3.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y= golang.org/x/sync v0.6.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sync v0.7.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sync v0.10.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sync v0.20.0 h1:e0PTpb7pjO8GAtTs2dQ6jYa5BWYlMuX047Dco/pItO4= golang.org/x/sync v0.20.0/go.mod h1:9xrNwdLfx4jkKbNva9FpL6vEN7evnE43NNNJQ2LF3+0= golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20181026203630-95b1ffbd15a5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20181107165924-66b7b1311ac8/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190204203706-41f3e6584952/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190403152447-81d4e9dc473e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190411185658-b44545bcd369/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190606203320-7fc4e5ec1444/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190813064441-fde4db37ae7a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190826190057-c7b8b68b1456/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190922100055-0a153f010e69/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190924154521-2837fb4f24fe/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191008105621-543471e840be/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191010194322-b09406accb47/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191112214154-59a1497f0cea/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200331124033-c3d80250170d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200501052902-10377860bb8e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200511232937-7e40ca221e25/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200519105757-fe76b779f299/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200905004654-be1d3432aa8f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201009025420-dfb3f7c4e634/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201118182958-a01c418693c7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201201145000-ef89a241ccb3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201204225414-ed752295db88/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201214210602-f9fddec55a1e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201218084310-7d0127a74742/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210104204734-6f8348627aad/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210110051926-789bb1bd4061/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210112080510-489259a85091/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210123111255-9b0068b26619/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 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-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-20210304124612-50617c2ba197/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210305230114-8fe3ee5dd75b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210423185535-09eb48e85fd7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210514084401-e8d321eab015/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210525143221-35b2ab0089ea/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210603125802-9665404d3644/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210616094352-59db8d763f22/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210806184541-e5e7981a1069/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210809222454-d867a43fc93e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210816183151-1e6c022a8912/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-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-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211007075335-d3039528d8ac/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211025201205-69cdffdb9359/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211103235746-7861aae1554b/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211110154304-99a53858aa08/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211124211545-fe61309f8881/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211205182925-97ca703d548d/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211210111614-af8b64212486/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211214234402-4825e8c3871d/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220128215802-99c3d69c2c27/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220209214540-3681064d5158/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220227234510-4e6760a101f9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220328115105-d36c6a25d886/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220408201424-a24fb2fb8a0f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220502124256-b6088ccd6cba/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220503163025-988cb79eb6c6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220610221304-9f5ed59c137d/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220615213510-4f61da869c0c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220624220833-87e55d714810/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220728004956-3c1f35247d10/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220829200755-d48e67d00261/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.2.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.3.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.4.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.7.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.10.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.15.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/sys v0.18.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/sys v0.21.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/sys v0.28.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/sys v0.42.0 h1:omrd2nAlyT5ESRdCLYdm3+fMfNFE/+Rf4bDIQImRJeo= golang.org/x/sys v0.42.0/go.mod h1:4GL1E5IUh+htKOUEOaiffhrAeqysfVGipDYzABqnCmw= golang.org/x/telemetry v0.0.0-20240228155512-f48c80bd79b2/go.mod h1:TeRTkGYfJXctD9OcfyVLyj2J3IxLnKwHJR8f4D8a3YE= golang.org/x/telemetry v0.0.0-20260209163413-e7419c687ee4 h1:bTLqdHv7xrGlFbvf5/TXNxy/iUwwdkjhqQTJDjW7aj0= golang.org/x/telemetry v0.0.0-20260209163413-e7419c687ee4/go.mod h1:g5NllXBEermZrmR51cJDQxmJUHUOfRAaNyWBM+R+548= 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-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.1.0/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.2.0/go.mod h1:TVmDHMZPmdnySmBfhjOoOdhjzdE1h4u1VwSiw2l1Nuc= golang.org/x/term v0.3.0/go.mod h1:q750SLmJuPmVoN1blW3UFBPREJfb1KmY3vwxfr+nFDA= golang.org/x/term v0.4.0/go.mod h1:9P2UbLfCdcvo3p/nzKvsmas4TnlujnuoV9hGgYzW1lQ= golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= golang.org/x/term v0.6.0/go.mod h1:m6U89DPEgQRMq3DNkDClhWw02AUbt2daBVO4cn4Hv9U= golang.org/x/term v0.7.0/go.mod h1:P32HKFT3hSsZrRxla30E9HqToFYAQPCMs/zFMBUFqPY= golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo= golang.org/x/term v0.11.0/go.mod h1:zC9APTIj3jG3FdV/Ons+XE1riIZXG4aZ4GTHiPZJPIU= golang.org/x/term v0.12.0/go.mod h1:owVbMEjm3cBLCHdkQu9b1opXd4ETQWc3BhuQGKgXgvU= golang.org/x/term v0.13.0/go.mod h1:LTmsnFJwVN6bCy1rVCoS+qHT1HhALEFxKncY3WNNh4U= golang.org/x/term v0.15.0/go.mod h1:BDl952bC7+uMoWR75FIrCDx79TPU9oHkTZ9yRbYOrX0= golang.org/x/term v0.17.0/go.mod h1:lLRBjIVuehSbZlaOtGMbcMncT+aqLLLmKrsjNrUguwk= golang.org/x/term v0.18.0/go.mod h1:ILwASektA3OnRv7amZ1xhE/KTR+u50pbXfZ03+6Nx58= golang.org/x/term v0.20.0/go.mod h1:8UkIAJTvZgivsXaD6/pH6U9ecQzZ45awqEOzuCvwpFY= golang.org/x/term v0.27.0/go.mod h1:iMsnZpn0cago0GOrHO2+Y7u7JPn5AylBrcoWkElMTSM= golang.org/x/term v0.41.0 h1:QCgPso/Q3RTJx2Th4bDLqML4W6iJiaXFq2/ftQF13YU= golang.org/x/term v0.41.0/go.mod h1:3pfBgksrReYfZ5lvYM0kSO0LIkAl4Yl2bXOkKP7Ec2A= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= golang.org/x/text v0.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ= golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.5.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.6.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= golang.org/x/text v0.12.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= golang.org/x/text v0.15.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= golang.org/x/text v0.21.0/go.mod h1:4IBbMaMmOPCJ8SecivzSH54+73PCFmPWxNTLm+vZkEQ= golang.org/x/text v0.35.0 h1:JOVx6vVDFokkpaq1AEptVzLTpDe9KGpj5tR4/X+ybL8= golang.org/x/text v0.35.0/go.mod h1:khi/HExzZJ2pGnjenulevKNX1W67CUy0AsXcNubPGCA= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20220922220347-f3bd1da661af/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.1.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.3.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.15.0 h1:bbrp8t3bGUeFOx08pvsMYRTCVSMk89u4tKbNOZbp88U= golang.org/x/time v0.15.0/go.mod h1:Y4YMaQmXwGQZoFaVFk4YpCt4FLQMYKZe9oeV/f4MSno= golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20180525024113-a5b4c53f6e8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-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-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= golang.org/x/tools v0.0.0-20190425163242-31fd60d6bfdc/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20190823170909-c4a336ef6a2f/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-20190927191325-030b2cf1153e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191029041327-9cc4af7d6b2c/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191029190741-b9c20aec41a5/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191112195655-aa38f8e97acc/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191216173652-a0e659d51361/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200103221440-774c71fcf114/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200117161641-43d50277825c/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200122220014-bf1340f18c4a/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200204074204-1cc6d1ef6c74/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200207183749-b753a1ba74fa/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200212150539-ea181f53ac56/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200224181240-023911ca70b2/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200227222343-706bc42d1f0d/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200304193943-95d2e580d8eb/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= golang.org/x/tools v0.0.0-20200312045724-11d5b4c81c7d/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= golang.org/x/tools v0.0.0-20200331025713-a30bf2db82d4/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8= golang.org/x/tools v0.0.0-20200501065659-ab2804fb9c9d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20200512131952-2bc93b1c0c88/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20200515010526-7d3b6ebf133d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20200618134242-20370b0cb4b2/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= golang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= golang.org/x/tools v0.0.0-20200904185747-39188db58858/go.mod h1:Cj7w3i3Rnn0Xh82ur9kSqwfTHTeVxaDqrfMjpcNT6bE= golang.org/x/tools v0.0.0-20201110124207-079ba7bd75cd/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20201124115921-2c860bdd6e78/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20201201161351-ac6f37ff4c2a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20201208233053-a543418bbed2/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-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= golang.org/x/tools v0.1.3/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.4/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.7/go.mod h1:LGqMHiF4EqQNHR1JncWGqT5BVaXmza+X+BDGol+dOxo= golang.org/x/tools v0.1.8/go.mod h1:nABZi5QlRsZVlzPpHl034qft6wpY4eDcsTt5AaioBiU= golang.org/x/tools v0.1.9/go.mod h1:nABZi5QlRsZVlzPpHl034qft6wpY4eDcsTt5AaioBiU= golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= golang.org/x/tools v0.2.0/go.mod h1:y4OqIKeOV/fWJetJ8bXPU1sEVniLMIyDAZWeHdV+NTA= golang.org/x/tools v0.3.0/go.mod h1:/rWhSS2+zyEVwoJf8YAX6L2f0ntZ7Kn/mGgAWcipA5k= golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= golang.org/x/tools v0.7.0/go.mod h1:4pg6aUX35JBAogB10C9AtvVL+qowtN4pT3CGSQex14s= golang.org/x/tools v0.13.0/go.mod h1:HvlwmtVNQAhOuCjW7xxvovg8wbNq7LwfXh/k7wXUl58= golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d/go.mod h1:aiJjzUbINMkxbQROHiO6hDPo2LHcIPhhQsa9DLh0yGk= golang.org/x/tools v0.42.0 h1:uNgphsn75Tdz5Ji2q36v/nsFSfR/9BRFvqhGBaJGd5k= golang.org/x/tools v0.42.0/go.mod h1:Ma6lCIwGZvHK6XtgbswSoWroEkhugApmsXyrUmBhfr0= golang.org/x/tools/go/expect v0.1.1-deprecated h1:jpBZDwmgPhXsKZC6WhL20P4b/wmnpsEAGHaNy0n/rJM= golang.org/x/tools/go/expect v0.1.1-deprecated/go.mod h1:eihoPOH+FgIqa3FpoTwguz/bVUSGBlGQU67vpBeOrBY= golang.org/x/xerrors v0.0.0-20190410155217-1f06c39b4373/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20190513163551-3ee3066db522/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20220411194840-2f41105eb62f/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20220517211312-f3a8303e98df/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= golang.org/x/xerrors v0.0.0-20220609144429-65e65417b02f/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= golang.org/x/xerrors v0.0.0-20240903120638-7835f813f4da h1:noIWHXmPHxILtqtCOPIhSt0ABwskkZKjD3bXGnZGpNY= golang.org/x/xerrors v0.0.0-20240903120638-7835f813f4da/go.mod h1:NDW/Ps6MPRej6fsCIbMTohpP40sJ/P/vI1MoTEGwX90= golang.zx2c4.com/go118/netip v0.0.0-20211111135330-a4a02eeacf9d/go.mod h1:5yyfuiqVIJ7t+3MqrpTQ+QqRkMWiESiyDvPNvKYCecg= golang.zx2c4.com/wintun v0.0.0-20211104114900-415007cec224/go.mod h1:deeaetjYA+DHMHg+sMSMI58GrEteJUUzzw7en6TJQcI= golang.zx2c4.com/wireguard v0.0.0-20211129173154-2dd424e2d808/go.mod h1:TjUWrnD5ATh7bFvmm/ALEJZQ4ivKbETb6pmyj1vUoNI= golang.zx2c4.com/wireguard v0.0.0-20211209221555-9c9e7e272434 h1:3zl8RkJNQ8wfPRomwv/6DBbH2Ut6dgMaWTxM0ZunWnE= golang.zx2c4.com/wireguard v0.0.0-20211209221555-9c9e7e272434/go.mod h1:TjUWrnD5ATh7bFvmm/ALEJZQ4ivKbETb6pmyj1vUoNI= golang.zx2c4.com/wireguard/wgctrl v0.0.0-20211230205640-daad0b7ba671 h1:tJAYx7pB6b5bNqi7XatStqFT2zFAxhXcGDq1R6FqqjU= golang.zx2c4.com/wireguard/wgctrl v0.0.0-20211230205640-daad0b7ba671/go.mod h1:Q2XNgour4QSkFj0BWCkVlW0HWJwQgNMsMahpSlI0Eno= gonum.org/v1/gonum v0.0.0-20180816165407-929014505bf4/go.mod h1:Y+Yx5eoAFn32cQvJDxZx5Dpnq+c3wtXuadVZAcxbbBo= gonum.org/v1/gonum v0.8.2/go.mod h1:oe/vMfY3deqTw+1EZJhuvEW2iwGF1bW9wwu7XCu0+v0= gonum.org/v1/gonum v0.9.3/go.mod h1:TZumC3NeyVQskjXqmyWt4S3bINhy7B4eYwW69EbyX+0= gonum.org/v1/gonum v0.11.0/go.mod h1:fSG4YDCxxUZQJ7rKsQrj0gMOg00Il0Z96/qMA4bVQhA= gonum.org/v1/gonum v0.17.0 h1:VbpOemQlsSMrYmn7T2OUvQ4dqxQXU+ouZFQsZOx50z4= gonum.org/v1/gonum v0.17.0/go.mod h1:El3tOrEuMpv2UdMrbNlKEh9vd86bmQ6vqIcDwxEOc1E= gonum.org/v1/netlib v0.0.0-20190313105609-8cb42192e0e0/go.mod h1:wa6Ws7BG/ESfp6dHfk7C6KdzKA7wR7u/rKwOGE66zvw= gonum.org/v1/plot v0.0.0-20190515093506-e2840ee46a6b/go.mod h1:Wt8AAjI+ypCyYX3nZBvf6cAIx93T+c/OS2HFAYskSZc= gonum.org/v1/plot v0.9.0/go.mod h1:3Pcqqmp6RHvJI72kgb8fThyUnav364FOsdDo2aGW5lY= gonum.org/v1/plot v0.10.1/go.mod h1:VZW5OlhkL1mysU9vaqNHnsy86inf6Ot+jB3r+BczCEo= google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= google.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= google.golang.org/api v0.13.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= google.golang.org/api v0.14.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= google.golang.org/api v0.15.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= google.golang.org/api v0.17.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= google.golang.org/api v0.18.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= google.golang.org/api v0.19.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= google.golang.org/api v0.20.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= google.golang.org/api v0.22.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= google.golang.org/api v0.24.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= google.golang.org/api v0.28.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= google.golang.org/api v0.29.0/go.mod h1:Lcubydp8VUV7KeIHD9z2Bys/sm/vGKnG1UHuDBSrHWM= google.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz5138Fc= google.golang.org/api v0.35.0/go.mod h1:/XrVsuzM0rZmrsbjJutiuftIzeuTQcEeaYcSk/mQ1dg= google.golang.org/api v0.36.0/go.mod h1:+z5ficQTmoYpPn8LCUNVpK5I7hwkpjbcgqA7I34qYtE= google.golang.org/api v0.40.0/go.mod h1:fYKFpnQN0DsDSKRVRcQSDQNtqWPfM9i+zNPxepjRCQ8= google.golang.org/api v0.41.0/go.mod h1:RkxM5lITDfTzmyKFPt+wGrCJbVfniCr2ool8kTBzRTU= google.golang.org/api v0.43.0/go.mod h1:nQsDGjRXMo4lvh5hP0TKqF244gqhGcr/YSIykhUk/94= google.golang.org/api v0.47.0/go.mod h1:Wbvgpq1HddcWVtzsVLyfLp8lDg6AA241LmgIL59tHXo= 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.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.61.0/go.mod h1:xQRti5UdCmoCEqFxcz93fTl338AVqDgyaDRuOZ3hg9I= google.golang.org/api v0.63.0/go.mod h1:gs4ij2ffTRXwuzzgJl/56BdwJaA194ijkfn++9tDuPo= google.golang.org/api v0.67.0/go.mod h1:ShHKP8E60yPsKNw/w8w+VYaj9H6buA5UqDp8dhbQZ6g= google.golang.org/api v0.70.0/go.mod h1:Bs4ZM2HGifEvXwd50TtW70ovgJffJYw2oRCOFU/SkfA= google.golang.org/api v0.71.0/go.mod h1:4PyU6e6JogV1f9eA4voyrTY2batOLdgZ5qZ5HOCc4j8= google.golang.org/api v0.74.0/go.mod h1:ZpfMZOVRMywNyvJFeqL9HRWBgAuRfSjJFpe9QtRRyDs= google.golang.org/api v0.75.0/go.mod h1:pU9QmyHLnzlpar1Mjt4IbapUCy8J+6HD6GeELN69ljA= google.golang.org/api v0.77.0/go.mod h1:pU9QmyHLnzlpar1Mjt4IbapUCy8J+6HD6GeELN69ljA= google.golang.org/api v0.78.0/go.mod h1:1Sg78yoMLOhlQTeF+ARBoytAcH1NNyyl390YMy6rKmw= google.golang.org/api v0.80.0/go.mod h1:xY3nI94gbvBrE0J6NHXhxOmW97HG7Khjkku6AFB3Hyg= google.golang.org/api v0.84.0/go.mod h1:NTsGnUFJMYROtiquksZHBWtHfeMC7iYthki7Eq3pa8o= google.golang.org/api v0.85.0/go.mod h1:AqZf8Ep9uZ2pyTvgL+x0D3Zt0eoT9b5E8fmzfu6FO2g= google.golang.org/api v0.90.0/go.mod h1:+Sem1dnrKlrXMR/X0bPnMWyluQe4RsNoYfmNLhOIkzw= google.golang.org/api v0.93.0/go.mod h1:+Sem1dnrKlrXMR/X0bPnMWyluQe4RsNoYfmNLhOIkzw= google.golang.org/api v0.95.0/go.mod h1:eADj+UBuxkh5zlrSntJghuNeg8HwQ1w5lTKkuqaETEI= google.golang.org/api v0.96.0/go.mod h1:w7wJQLTM+wvQpNf5JyEcBoxK0RH7EDrh/L4qfsuJ13s= google.golang.org/api v0.97.0/go.mod h1:w7wJQLTM+wvQpNf5JyEcBoxK0RH7EDrh/L4qfsuJ13s= google.golang.org/api v0.98.0/go.mod h1:w7wJQLTM+wvQpNf5JyEcBoxK0RH7EDrh/L4qfsuJ13s= google.golang.org/api v0.99.0/go.mod h1:1YOf74vkVndF7pG6hIHuINsM7eWwpVTAfNMNiL91A08= google.golang.org/api v0.100.0/go.mod h1:ZE3Z2+ZOr87Rx7dqFsdRQkRBk36kDtp/h+QpHbB7a70= google.golang.org/api v0.102.0/go.mod h1:3VFl6/fzoA+qNuS1N1/VfXY4LjoXN/wzeIp7TweWwGo= google.golang.org/api v0.103.0/go.mod h1:hGtW6nK1AC+d9si/UBhw8Xli+QMOf6xyNAyJw4qU9w0= google.golang.org/api v0.106.0/go.mod h1:2Ts0XTHNVWxypznxWOYUeI4g3WdP9Pk2Qk58+a/O9MY= google.golang.org/api v0.107.0/go.mod h1:2Ts0XTHNVWxypznxWOYUeI4g3WdP9Pk2Qk58+a/O9MY= google.golang.org/api v0.108.0/go.mod h1:2Ts0XTHNVWxypznxWOYUeI4g3WdP9Pk2Qk58+a/O9MY= google.golang.org/api v0.110.0/go.mod h1:7FC4Vvx1Mooxh8C5HWjzZHcavuS2f6pmJpZx60ca7iI= google.golang.org/api v0.111.0/go.mod h1:qtFHvU9mhgTJegR31csQ+rwxyUTHOKFqCKWp1J0fdw0= google.golang.org/api v0.114.0/go.mod h1:ifYI2ZsFK6/uGddGfAD5BMxlnkBqCmqHSDUVi45N5Yg= google.golang.org/api v0.272.0 h1:eLUQZGnAS3OHn31URRf9sAmRk3w2JjMx37d2k8AjJmA= google.golang.org/api v0.272.0/go.mod h1:wKjowi5LNJc5qarNvDCvNQBn3rVK8nSy6jg2SwRwzIA= google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= google.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8= google.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= google.golang.org/genproto v0.0.0-20191115194625-c23dd37a84c9/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= google.golang.org/genproto v0.0.0-20191216164720-4f79533eabd1/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= google.golang.org/genproto v0.0.0-20191230161307-f3c370f40bfb/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= google.golang.org/genproto v0.0.0-20200115191322-ca5a22157cba/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= google.golang.org/genproto v0.0.0-20200122232147-0452cf42e150/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= google.golang.org/genproto v0.0.0-20200204135345-fa8e72b47b90/go.mod h1:GmwEX6Z4W5gMy59cAlVYjN9JhxgbQH6Gn+gFDQe2lzA= google.golang.org/genproto v0.0.0-20200212174721-66ed5ce911ce/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200224152610-e50cd9704f63/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200228133532-8c2c7df3a383/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200305110556-506484158171/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200312145019-da6875a35672/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200331122359-1ee6d9798940/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200430143042-b979b6f78d84/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200511104702-f5ebc3bea380/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200513103714-09dca8ec2884/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200515170657-fc4c6c6a6587/go.mod h1:YsZOwe1myG/8QRHRsmBRE1LrgQY60beZKjly0O1fX9U= google.golang.org/genproto v0.0.0-20200519141106-08726f379972/go.mod h1:YsZOwe1myG/8QRHRsmBRE1LrgQY60beZKjly0O1fX9U= google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= google.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA= google.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20200904004341-0bd0a958aa1d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20201109203340-2640f1f9cdfb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20201201144952-b05cb90ed32e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20201210142538-e3217bee35cc/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20201214200347-8c77b98c765d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20210108203827-ffc7fda8c3d7/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20210222152913-aa3ee6e6a81c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20210226172003-ab064af71705/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20210303154014-9728d6b83eeb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20210310155132-4ce2db91004e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20210319143718-93e7006c17a6/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20210329143202-679c6ae281ee/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A= google.golang.org/genproto v0.0.0-20210402141018-6c239bbf2bb1/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A= google.golang.org/genproto v0.0.0-20210513213006-bf773b8c8384/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-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-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= google.golang.org/genproto v0.0.0-20210909211513-a8c4777a87af/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= google.golang.org/genproto v0.0.0-20210924002016-3dee208752a0/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= google.golang.org/genproto v0.0.0-20211118181313-81c1377c94b1/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= google.golang.org/genproto v0.0.0-20211206160659-862468c7d6e0/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= google.golang.org/genproto v0.0.0-20211208223120-3a66f561d7aa/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= google.golang.org/genproto v0.0.0-20211221195035-429b39de9b1c/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= google.golang.org/genproto v0.0.0-20220126215142-9970aeb2e350/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= google.golang.org/genproto v0.0.0-20220207164111-0872dc986b00/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= google.golang.org/genproto v0.0.0-20220218161850-94dd64e39d7c/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= google.golang.org/genproto v0.0.0-20220222213610-43724f9ea8cf/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= google.golang.org/genproto v0.0.0-20220304144024-325a89244dc8/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= google.golang.org/genproto v0.0.0-20220310185008-1973136f34c6/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= google.golang.org/genproto v0.0.0-20220324131243-acbaeb5b85eb/go.mod h1:hAL49I2IFola2sVEjAn7MEwsja0xp51I0tlGAf9hz4E= google.golang.org/genproto v0.0.0-20220329172620-7be39ac1afc7/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= google.golang.org/genproto v0.0.0-20220407144326-9054f6ed7bac/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= google.golang.org/genproto v0.0.0-20220413183235-5e96e2839df9/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= google.golang.org/genproto v0.0.0-20220414192740-2d67ff6cf2b4/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= google.golang.org/genproto v0.0.0-20220421151946-72621c1f0bd3/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= google.golang.org/genproto v0.0.0-20220429170224-98d788798c3e/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= google.golang.org/genproto v0.0.0-20220502173005-c8bf987b8c21/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4= google.golang.org/genproto v0.0.0-20220505152158-f39f71e6c8f3/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4= google.golang.org/genproto v0.0.0-20220518221133-4f43b3371335/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4= google.golang.org/genproto v0.0.0-20220523171625-347a074981d8/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4= google.golang.org/genproto v0.0.0-20220608133413-ed9918b62aac/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA= google.golang.org/genproto v0.0.0-20220616135557-88e70c0c3a90/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA= google.golang.org/genproto v0.0.0-20220617124728-180714bec0ad/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA= google.golang.org/genproto v0.0.0-20220624142145-8cd45d7dbd1f/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA= google.golang.org/genproto v0.0.0-20220628213854-d9e0b6570c03/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA= google.golang.org/genproto v0.0.0-20220722212130-b98a9ff5e252/go.mod h1:GkXuJDJ6aQ7lnJcRF+SJVgFdQhypqgl3LB1C9vabdRE= google.golang.org/genproto v0.0.0-20220801145646-83ce21fca29f/go.mod h1:iHe1svFLAZg9VWz891+QbRMwUv9O/1Ww+/mngYeThbc= google.golang.org/genproto v0.0.0-20220815135757-37a418bb8959/go.mod h1:dbqgFATTzChvnt+ujMdZwITVAJHFtfyN1qUhDqEiIlk= google.golang.org/genproto v0.0.0-20220817144833-d7fd3f11b9b1/go.mod h1:dbqgFATTzChvnt+ujMdZwITVAJHFtfyN1qUhDqEiIlk= google.golang.org/genproto v0.0.0-20220822174746-9e6da59bd2fc/go.mod h1:dbqgFATTzChvnt+ujMdZwITVAJHFtfyN1qUhDqEiIlk= google.golang.org/genproto v0.0.0-20220829144015-23454907ede3/go.mod h1:dbqgFATTzChvnt+ujMdZwITVAJHFtfyN1qUhDqEiIlk= google.golang.org/genproto v0.0.0-20220829175752-36a9c930ecbf/go.mod h1:dbqgFATTzChvnt+ujMdZwITVAJHFtfyN1qUhDqEiIlk= google.golang.org/genproto v0.0.0-20220913154956-18f8339a66a5/go.mod h1:0Nb8Qy+Sk5eDzHnzlStwW3itdNaWoZA5XeSG+R3JHSo= google.golang.org/genproto v0.0.0-20220914142337-ca0e39ece12f/go.mod h1:0Nb8Qy+Sk5eDzHnzlStwW3itdNaWoZA5XeSG+R3JHSo= google.golang.org/genproto v0.0.0-20220915135415-7fd63a7952de/go.mod h1:0Nb8Qy+Sk5eDzHnzlStwW3itdNaWoZA5XeSG+R3JHSo= google.golang.org/genproto v0.0.0-20220916172020-2692e8806bfa/go.mod h1:0Nb8Qy+Sk5eDzHnzlStwW3itdNaWoZA5XeSG+R3JHSo= google.golang.org/genproto v0.0.0-20220919141832-68c03719ef51/go.mod h1:0Nb8Qy+Sk5eDzHnzlStwW3itdNaWoZA5XeSG+R3JHSo= google.golang.org/genproto v0.0.0-20220920201722-2b89144ce006/go.mod h1:ht8XFiar2npT/g4vkk7O0WYS1sHOHbdujxbEp7CJWbw= google.golang.org/genproto v0.0.0-20220926165614-551eb538f295/go.mod h1:woMGP53BroOrRY3xTxlbr8Y3eB/nzAvvFM83q7kG2OI= google.golang.org/genproto v0.0.0-20220926220553-6981cbe3cfce/go.mod h1:woMGP53BroOrRY3xTxlbr8Y3eB/nzAvvFM83q7kG2OI= google.golang.org/genproto v0.0.0-20221010155953-15ba04fc1c0e/go.mod h1:3526vdqwhZAwq4wsRUaVG555sVgsNmIjRtO7t/JH29U= google.golang.org/genproto v0.0.0-20221014173430-6e2ab493f96b/go.mod h1:1vXfmgAz9N9Jx0QA82PqRVauvCz1SGSz739p0f183jM= google.golang.org/genproto v0.0.0-20221014213838-99cd37c6964a/go.mod h1:1vXfmgAz9N9Jx0QA82PqRVauvCz1SGSz739p0f183jM= google.golang.org/genproto v0.0.0-20221024153911-1573dae28c9c/go.mod h1:9qHF0xnpdSfF6knlcsnpzUu5y+rpwgbvsyGAZPBMg4s= google.golang.org/genproto v0.0.0-20221024183307-1bc688fe9f3e/go.mod h1:9qHF0xnpdSfF6knlcsnpzUu5y+rpwgbvsyGAZPBMg4s= google.golang.org/genproto v0.0.0-20221027153422-115e99e71e1c/go.mod h1:CGI5F/G+E5bKwmfYo09AXuVN4dD894kIKUFmVbP2/Fo= google.golang.org/genproto v0.0.0-20221109142239-94d6d90a7d66/go.mod h1:rZS5c/ZVYMaOGBfO68GWtjOw/eLaZM1X6iVtgjZ+EWg= google.golang.org/genproto v0.0.0-20221114212237-e4508ebdbee1/go.mod h1:rZS5c/ZVYMaOGBfO68GWtjOw/eLaZM1X6iVtgjZ+EWg= google.golang.org/genproto v0.0.0-20221117204609-8f9c96812029/go.mod h1:rZS5c/ZVYMaOGBfO68GWtjOw/eLaZM1X6iVtgjZ+EWg= google.golang.org/genproto v0.0.0-20221118155620-16455021b5e6/go.mod h1:rZS5c/ZVYMaOGBfO68GWtjOw/eLaZM1X6iVtgjZ+EWg= google.golang.org/genproto v0.0.0-20221201164419-0e50fba7f41c/go.mod h1:rZS5c/ZVYMaOGBfO68GWtjOw/eLaZM1X6iVtgjZ+EWg= google.golang.org/genproto v0.0.0-20221201204527-e3fa12d562f3/go.mod h1:rZS5c/ZVYMaOGBfO68GWtjOw/eLaZM1X6iVtgjZ+EWg= google.golang.org/genproto v0.0.0-20221202195650-67e5cbc046fd/go.mod h1:cTsE614GARnxrLsqKREzmNYJACSWWpAWdNMwnD7c2BE= google.golang.org/genproto v0.0.0-20221227171554-f9683d7f8bef/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= google.golang.org/genproto v0.0.0-20230110181048-76db0878b65f/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= google.golang.org/genproto v0.0.0-20230112194545-e10362b5ecf9/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= google.golang.org/genproto v0.0.0-20230113154510-dbe35b8444a5/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= google.golang.org/genproto v0.0.0-20230123190316-2c411cf9d197/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= google.golang.org/genproto v0.0.0-20230124163310-31e0e69b6fc2/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= google.golang.org/genproto v0.0.0-20230125152338-dcaf20b6aeaa/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= google.golang.org/genproto v0.0.0-20230127162408-596548ed4efa/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= google.golang.org/genproto v0.0.0-20230209215440-0dfe4f8abfcc/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= google.golang.org/genproto v0.0.0-20230216225411-c8e22ba71e44/go.mod h1:8B0gmkoRebU8ukX6HP+4wrVQUY1+6PkQ44BSyIlflHA= google.golang.org/genproto v0.0.0-20230222225845-10f96fb3dbec/go.mod h1:3Dl5ZL0q0isWJt+FVcfpQyirqemEuLAK/iFvg1UP1Hw= google.golang.org/genproto v0.0.0-20230223222841-637eb2293923/go.mod h1:3Dl5ZL0q0isWJt+FVcfpQyirqemEuLAK/iFvg1UP1Hw= google.golang.org/genproto v0.0.0-20230303212802-e74f57abe488/go.mod h1:TvhZT5f700eVlTNwND1xoEZQeWTB2RY/65kplwl/bFA= google.golang.org/genproto v0.0.0-20230306155012-7f2fa6fef1f4/go.mod h1:NWraEVixdDnqcqQ30jipen1STv2r/n24Wb7twVTGR4s= google.golang.org/genproto v0.0.0-20230320184635-7606e756e683/go.mod h1:NWraEVixdDnqcqQ30jipen1STv2r/n24Wb7twVTGR4s= google.golang.org/genproto v0.0.0-20230323212658-478b75c54725/go.mod h1:UUQDJDOlWu4KYeJZffbWgBkS1YFobzKbLVfK69pe0Ak= google.golang.org/genproto v0.0.0-20230330154414-c0448cd141ea/go.mod h1:UUQDJDOlWu4KYeJZffbWgBkS1YFobzKbLVfK69pe0Ak= google.golang.org/genproto v0.0.0-20230331144136-dcfb400f0633/go.mod h1:UUQDJDOlWu4KYeJZffbWgBkS1YFobzKbLVfK69pe0Ak= google.golang.org/genproto v0.0.0-20230410155749-daa745c078e1/go.mod h1:nKE/iIaLqn2bQwXBg8f1g2Ylh6r5MN5CmZvuzZCgsCU= google.golang.org/genproto v0.0.0-20260217215200-42d3e9bedb6d h1:vsOm753cOAMkt76efriTCDKjpCbK18XGHMJHo0JUKhc= google.golang.org/genproto v0.0.0-20260217215200-42d3e9bedb6d/go.mod h1:0oz9d7g9QLSdv9/lgbIjowW1JoxMbxmBVNe8i6tORJI= google.golang.org/genproto/googleapis/api v0.0.0-20260217215200-42d3e9bedb6d h1:EocjzKLywydp5uZ5tJ79iP6Q0UjDnyiHkGRWxuPBP8s= google.golang.org/genproto/googleapis/api v0.0.0-20260217215200-42d3e9bedb6d/go.mod h1:48U2I+QQUYhsFrg2SY6r+nJzeOtjey7j//WBESw+qyQ= google.golang.org/genproto/googleapis/rpc v0.0.0-20260311181403-84a4fc48630c h1:xgCzyF2LFIO/0X2UAoVRiXKU5Xg6VjToG4i2/ecSswk= google.golang.org/genproto/googleapis/rpc v0.0.0-20260311181403-84a4fc48630c/go.mod h1:4Hqkh8ycfw05ld/3BWL7rJOSfebL2Q+DVDeRgYgxUU8= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= google.golang.org/grpc v1.27.1/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= google.golang.org/grpc v1.28.0/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKal+60= google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk= google.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= google.golang.org/grpc v1.31.1/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= google.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTpR3n0= google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc= google.golang.org/grpc v1.34.0/go.mod h1:WotjhfgOW/POjDeRt8vscBtXq+2VjORFy659qA51WJ8= google.golang.org/grpc v1.35.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= google.golang.org/grpc v1.36.1/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= google.golang.org/grpc v1.37.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= google.golang.org/grpc v1.37.1/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= google.golang.org/grpc v1.38.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= google.golang.org/grpc v1.39.0/go.mod h1:PImNr+rS9TWYb2O4/emRugxiyHZ5JyHW5F+RPnDzfrE= google.golang.org/grpc v1.39.1/go.mod h1:PImNr+rS9TWYb2O4/emRugxiyHZ5JyHW5F+RPnDzfrE= google.golang.org/grpc v1.40.0/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= google.golang.org/grpc v1.40.1/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= google.golang.org/grpc v1.42.0/go.mod h1:k+4IHHFw41K8+bbowsex27ge2rCb65oeWqe4jJ590SU= google.golang.org/grpc v1.44.0/go.mod h1:k+4IHHFw41K8+bbowsex27ge2rCb65oeWqe4jJ590SU= google.golang.org/grpc v1.45.0/go.mod h1:lN7owxKUQEqMfSyQikvvk5tf/6zMPsrK+ONuO11+0rQ= google.golang.org/grpc v1.46.0/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk= google.golang.org/grpc v1.46.2/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk= google.golang.org/grpc v1.47.0/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk= google.golang.org/grpc v1.48.0/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk= google.golang.org/grpc v1.49.0/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCDK+GI= google.golang.org/grpc v1.50.0/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCDK+GI= google.golang.org/grpc v1.50.1/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCDK+GI= google.golang.org/grpc v1.51.0/go.mod h1:wgNDFcnuBGmxLKI/qn4T+m5BtEBYXJPvibbUPsAIPww= google.golang.org/grpc v1.52.3/go.mod h1:pu6fVzoFb+NBYNAvQL08ic+lvB2IojljRYuun5vorUY= google.golang.org/grpc v1.53.0/go.mod h1:OnIrk0ipVdj4N5d9IUoFUx72/VlD7+jUsHwZgwSMQpw= google.golang.org/grpc v1.54.0/go.mod h1:PUSEXI6iWghWaB6lXM4knEgpJNu2qUcKfDtNci3EC2g= google.golang.org/grpc v1.56.3/go.mod h1:I9bI3vqKfayGqPUAwGdOSu7kt6oIJLixfffKrpXqQ9s= google.golang.org/grpc v1.79.3 h1:sybAEdRIEtvcD68Gx7dmnwjZKlyfuc61Dyo9pGXXkKE= google.golang.org/grpc v1.79.3/go.mod h1:KmT0Kjez+0dde/v2j9vzwoAScgEPx/Bw1CYChhHLrHQ= google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0/go.mod h1:6Kw0yEErY5E/yWrBtf03jp27GLLJujG4z/JK95pnjjw= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4= google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= google.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= google.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= google.golang.org/protobuf v1.29.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= google.golang.org/protobuf v1.30.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= google.golang.org/protobuf v1.36.11 h1:fV6ZwhNocDyBLK0dj+fg8ektcVegBBuEolpbTQyBNVE= google.golang.org/protobuf v1.36.11/go.mod h1:HTf+CrKn2C3g5S8VImy6tdcUvCska2kB7j23XfzDpco= gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20200902074654-038fdea0a05b/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= gopkg.in/evanphx/json-patch.v4 v4.13.0 h1:czT3CmqEaQ1aanPc5SdlgQrrEIb8w/wwCvWWnfEbYzo= gopkg.in/evanphx/json-patch.v4 v4.13.0/go.mod h1:p8EYWUEYMpynmqDbY58zCKCFZw8pRWMG4EsWvDvM72M= gopkg.in/fatih/pool.v2 v2.0.0 h1:xIFeWtxifuQJGk/IEPKsTduEKcKvPmhoiVDGpC40nKg= gopkg.in/fatih/pool.v2 v2.0.0/go.mod h1:8xVGeu1/2jr2wm5V9SPuMht2H5AEmf5aFMGSQixtjTY= gopkg.in/fsnotify.v1 v1.2.1/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= gopkg.in/fsnotify.v1 v1.4.7 h1:xOHLXZwVvI9hhs+cLKq5+I5onOuwQLhQwiu63xxlHs4= gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= gopkg.in/gorethink/gorethink.v3 v3.0.5 h1:e2Uc/Xe+hpcVQFsj6MuHlYog3r0JYpnTzwDj/y2O4MU= gopkg.in/gorethink/gorethink.v3 v3.0.5/go.mod h1:+3yIIHJUGMBK+wyPH+iN5TP+88ikFDfZdqTlK3Y9q8I= gopkg.in/inconshreveable/log15.v2 v2.0.0-20180818164646-67afb5ed74ec/go.mod h1:aPpfJ7XW+gOuirDoZ8gHhLh3kZ1B08FtV2bbmy7Jv3s= gopkg.in/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc= gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= gopkg.in/ini.v1 v1.51.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= gopkg.in/ini.v1 v1.62.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= gopkg.in/ini.v1 v1.67.1 h1:tVBILHy0R6e4wkYOn3XmiITt/hEVH4TFMYvAX2Ytz6k= gopkg.in/ini.v1 v1.67.1/go.mod h1:x/cyOwCgZqOkJoDIJ3c1KNHMo10+nLGAhh+kn3Zizss= gopkg.in/natefinch/lumberjack.v2 v2.2.1 h1:bBRl1b0OH9s/DuPhuXpNl+VtCaJXFZ5/uEFST95x9zc= gopkg.in/natefinch/lumberjack.v2 v2.2.1/go.mod h1:YD8tP3GAjkrDg1eZH7EGmyESg/lsYskCTPBJVb9jqSc= gopkg.in/olivere/elastic.v5 v5.0.86 h1:xFy6qRCGAmo5Wjx96srho9BitLhZl2fcnpuidPwduXM= gopkg.in/olivere/elastic.v5 v5.0.86/go.mod h1:M3WNlsF+WhYn7api4D87NIflwTV/c0iVs8cqfWhK+68= gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo= gopkg.in/sourcemap.v1 v1.0.5 h1:inv58fC9f9J3TK2Y2R1NPntXEn3/wjWHkonhIUODNTI= gopkg.in/sourcemap.v1 v1.0.5/go.mod h1:2RlvNNSMglmRrcvhfuzp4hQHwOtjxlbjX7UPY/GXb78= 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/tomb.v2 v2.0.0-20161208151619-d5d1b5820637 h1:yiW+nvdHb9LVqSHQBXfZCieqV4fzYhNBql77zY0ykqs= gopkg.in/tomb.v2 v2.0.0-20161208151619-d5d1b5820637/go.mod h1:BHsqpu/nsuzkT5BpiH1EMZPLyqSMM8JbIavyFACoFNk= gopkg.in/validator.v2 v2.0.1 h1:xF0KWyGWXm/LM2G1TrEjqOu4pa6coO9AlWSf3msVfDY= gopkg.in/validator.v2 v2.0.1/go.mod h1:lIUZBlB3Im4s/eYp39Ry/wkR02yOPhZ9IwIRBjuPuG8= gopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74= gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.0-20200605160147-a5ece683394c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.0-20200615113413-eeeca48fe776/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.0/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gotest.tools/v3 v3.5.1/go.mod h1:isy3WKz7GK6uNw/sbHzfKBLvlvXwUyV06n6brMxxopU= gotest.tools/v3 v3.5.2 h1:7koQfIKdy+I8UTetycgUqXWSDwpgv193Ka+qRsmBY8Q= gotest.tools/v3 v3.5.2/go.mod h1:LtdLGcnqToBH83WByAAi/wiwSFCArdFIUV/xxN4pcjA= honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= honnef.co/go/tools v0.1.3/go.mod h1:NgwopIslSNH47DimFoV78dnkksY2EFtX0ajyb3K/las= honnef.co/go/tools v0.2.1/go.mod h1:lPVVZ2BS5TfnjLyizF7o7hv7j9/L+8cZY2hLyjP9cGY= honnef.co/go/tools v0.2.2 h1:MNh1AVMyVX23VUHE2O27jm6lNj3vjO5DexS4A1xvnzk= honnef.co/go/tools v0.2.2/go.mod h1:lPVVZ2BS5TfnjLyizF7o7hv7j9/L+8cZY2hLyjP9cGY= howett.net/plist v0.0.0-20181124034731-591f970eefbb h1:jhnBjNi9UFpfpl8YZhA9CrOqpnJdvzuiHsl/dnxl11M= howett.net/plist v0.0.0-20181124034731-591f970eefbb/go.mod h1:vMygbs4qMhSZSc4lCUl2OEE+rDiIIJAIdR4m7MiMcm0= k8s.io/api v0.35.2 h1:tW7mWc2RpxW7HS4CoRXhtYHSzme1PN1UjGHJ1bdrtdw= k8s.io/api v0.35.2/go.mod h1:7AJfqGoAZcwSFhOjcGM7WV05QxMMgUaChNfLTXDRE60= k8s.io/apimachinery v0.35.2 h1:NqsM/mmZA7sHW02JZ9RTtk3wInRgbVxL8MPfzSANAK8= k8s.io/apimachinery v0.35.2/go.mod h1:jQCgFZFR1F4Ik7hvr2g84RTJSZegBc8yHgFWKn//hns= k8s.io/client-go v0.35.2 h1:YUfPefdGJA4aljDdayAXkc98DnPkIetMl4PrKX97W9o= k8s.io/client-go v0.35.2/go.mod h1:4QqEwh4oQpeK8AaefZ0jwTFJw/9kIjdQi0jpKeYvz7g= k8s.io/klog/v2 v2.130.1 h1:n9Xl7H1Xvksem4KFG4PYbdQCQxqc/tTUyrgXaOhHSzk= k8s.io/klog/v2 v2.130.1/go.mod h1:3Jpz1GvMt720eyJH1ckRHK1EDfpxISzJ7I9OYgaDtPE= k8s.io/kube-openapi v0.0.0-20250910181357-589584f1c912 h1:Y3gxNAuB0OBLImH611+UDZcmKS3g6CthxToOb37KgwE= k8s.io/kube-openapi v0.0.0-20250910181357-589584f1c912/go.mod h1:kdmbQkyfwUagLfXIad1y2TdrjPFWp2Q89B3qkRwf/pQ= k8s.io/utils v0.0.0-20260210185600-b8788abfbbc2 h1:AZYQSJemyQB5eRxqcPky+/7EdBj0xi3g0ZcxxJ7vbWU= k8s.io/utils v0.0.0-20260210185600-b8788abfbbc2/go.mod h1:xDxuJ0whA3d0I4mf/C4ppKHxXynQ+fxnkmQH0vTHnuk= layeh.com/radius v0.0.0-20221205141417-e7fbddd11d68 h1:2NDro2Jzkrqfngy/sA5GVnChs7fx8EzcQKFi/lI2cfg= layeh.com/radius v0.0.0-20221205141417-e7fbddd11d68/go.mod h1:pFWM9De99EY9TPVyHIyA56QmoRViVck/x41WFkUlc9A= lukechampine.com/uint128 v1.1.1/go.mod h1:c4eWIwlEGaxC/+H1VguhU4PHXNWDCDMUlWdIWl2j1gk= lukechampine.com/uint128 v1.2.0/go.mod h1:c4eWIwlEGaxC/+H1VguhU4PHXNWDCDMUlWdIWl2j1gk= modernc.org/cc/v3 v3.36.0/go.mod h1:NFUHyPn4ekoC/JHeZFfZurN6ixxawE1BnVonP/oahEI= modernc.org/cc/v3 v3.36.2/go.mod h1:NFUHyPn4ekoC/JHeZFfZurN6ixxawE1BnVonP/oahEI= modernc.org/cc/v3 v3.36.3/go.mod h1:NFUHyPn4ekoC/JHeZFfZurN6ixxawE1BnVonP/oahEI= modernc.org/cc/v4 v4.27.1 h1:9W30zRlYrefrDV2JE2O8VDtJ1yPGownxciz5rrbQZis= modernc.org/cc/v4 v4.27.1/go.mod h1:uVtb5OGqUKpoLWhqwNQo/8LwvoiEBLvZXIQ/SmO6mL0= modernc.org/ccgo/v3 v3.0.0-20220428102840-41399a37e894/go.mod h1:eI31LL8EwEBKPpNpA4bU1/i+sKOwOrQy8D87zWUcRZc= modernc.org/ccgo/v3 v3.0.0-20220430103911-bc99d88307be/go.mod h1:bwdAnOoaIt8Ax9YdWGjxWsdkPcZyRPHqrOvJxaKAKGw= modernc.org/ccgo/v3 v3.16.4/go.mod h1:tGtX0gE9Jn7hdZFeU88slbTh1UtCYKusWOoCJuvkWsQ= modernc.org/ccgo/v3 v3.16.6/go.mod h1:tGtX0gE9Jn7hdZFeU88slbTh1UtCYKusWOoCJuvkWsQ= modernc.org/ccgo/v3 v3.16.8/go.mod h1:zNjwkizS+fIFDrDjIAgBSCLkWbJuHF+ar3QRn+Z9aws= modernc.org/ccgo/v3 v3.16.9/go.mod h1:zNMzC9A9xeNUepy6KuZBbugn3c0Mc9TeiJO4lgvkJDo= modernc.org/ccgo/v4 v4.32.0 h1:hjG66bI/kqIPX1b2yT6fr/jt+QedtP2fqojG2VrFuVw= modernc.org/ccgo/v4 v4.32.0/go.mod h1:6F08EBCx5uQc38kMGl+0Nm0oWczoo1c7cgpzEry7Uc0= modernc.org/ccorpus v1.11.6/go.mod h1:2gEUTrWqdpH2pXsmTM1ZkjeSrUWDpjMu2T6m29L/ErQ= modernc.org/fileutil v1.4.0 h1:j6ZzNTftVS054gi281TyLjHPp6CPHr2KCxEXjEbD6SM= modernc.org/fileutil v1.4.0/go.mod h1:EqdKFDxiByqxLk8ozOxObDSfcVOv/54xDs/DUHdvCUU= modernc.org/gc/v2 v2.6.5 h1:nyqdV8q46KvTpZlsw66kWqwXRHdjIlJOhG6kxiV/9xI= modernc.org/gc/v2 v2.6.5/go.mod h1:YgIahr1ypgfe7chRuJi2gD7DBQiKSLMPgBQe9oIiito= modernc.org/gc/v3 v3.1.2 h1:ZtDCnhonXSZexk/AYsegNRV1lJGgaNZJuKjJSWKyEqo= modernc.org/gc/v3 v3.1.2/go.mod h1:HFK/6AGESC7Ex+EZJhJ2Gni6cTaYpSMmU/cT9RmlfYY= modernc.org/goabi0 v0.2.0 h1:HvEowk7LxcPd0eq6mVOAEMai46V+i7Jrj13t4AzuNks= modernc.org/goabi0 v0.2.0/go.mod h1:CEFRnnJhKvWT1c1JTI3Avm+tgOWbkOu5oPA8eH8LnMI= modernc.org/httpfs v1.0.6/go.mod h1:7dosgurJGp0sPaRanU53W4xZYKh14wfzX420oZADeHM= modernc.org/libc v0.0.0-20220428101251-2d5f3daf273b/go.mod h1:p7Mg4+koNjc8jkqwcoFBJx7tXkpj00G77X7A72jXPXA= modernc.org/libc v1.16.0/go.mod h1:N4LD6DBE9cf+Dzf9buBlzVJndKr/iJHG97vGLHYnb5A= modernc.org/libc v1.16.1/go.mod h1:JjJE0eu4yeK7tab2n4S1w8tlWd9MxXLRzheaRnAKymU= modernc.org/libc v1.16.17/go.mod h1:hYIV5VZczAmGZAnG15Vdngn5HSF5cSkbvfz2B7GRuVU= modernc.org/libc v1.16.19/go.mod h1:p7Mg4+koNjc8jkqwcoFBJx7tXkpj00G77X7A72jXPXA= modernc.org/libc v1.17.0/go.mod h1:XsgLldpP4aWlPlsjqKRdHPqCxCjISdHfM/yeWC5GyW0= modernc.org/libc v1.17.1/go.mod h1:FZ23b+8LjxZs7XtFMbSzL/EhPxNbfZbErxEHc7cbD9s= modernc.org/libc v1.70.0 h1:U58NawXqXbgpZ/dcdS9kMshu08aiA6b7gusEusqzNkw= modernc.org/libc v1.70.0/go.mod h1:OVmxFGP1CI/Z4L3E0Q3Mf1PDE0BucwMkcXjjLntvHJo= modernc.org/mathutil v1.2.2/go.mod h1:mZW8CKdRPY1v87qxC/wUdX5O1qDzXMP5TH3wjfpga6E= modernc.org/mathutil v1.4.1/go.mod h1:mZW8CKdRPY1v87qxC/wUdX5O1qDzXMP5TH3wjfpga6E= modernc.org/mathutil v1.5.0/go.mod h1:mZW8CKdRPY1v87qxC/wUdX5O1qDzXMP5TH3wjfpga6E= modernc.org/mathutil v1.7.1 h1:GCZVGXdaN8gTqB1Mf/usp1Y/hSqgI2vAGGP4jZMCxOU= modernc.org/mathutil v1.7.1/go.mod h1:4p5IwJITfppl0G4sUEDtCr4DthTaT47/N3aT6MhfgJg= modernc.org/memory v1.1.1/go.mod h1:/0wo5ibyrQiaoUoH7f9D8dnglAmILJ5/cxZlRECf+Nw= modernc.org/memory v1.2.0/go.mod h1:/0wo5ibyrQiaoUoH7f9D8dnglAmILJ5/cxZlRECf+Nw= modernc.org/memory v1.2.1/go.mod h1:PkUhL0Mugw21sHPeskwZW4D6VscE/GQJOnIpCnW6pSU= modernc.org/memory v1.11.0 h1:o4QC8aMQzmcwCK3t3Ux/ZHmwFPzE6hf2Y5LbkRs+hbI= modernc.org/memory v1.11.0/go.mod h1:/JP4VbVC+K5sU2wZi9bHoq2MAkCnrt2r98UGeSK7Mjw= modernc.org/opt v0.1.1/go.mod h1:WdSiB5evDcignE70guQKxYUl14mgWtbClRi5wmkkTX0= modernc.org/opt v0.1.3/go.mod h1:WdSiB5evDcignE70guQKxYUl14mgWtbClRi5wmkkTX0= modernc.org/opt v0.1.4 h1:2kNGMRiUjrp4LcaPuLY2PzUfqM/w9N23quVwhKt5Qm8= modernc.org/opt v0.1.4/go.mod h1:03fq9lsNfvkYSfxrfUhZCWPk1lm4cq4N+Bh//bEtgns= modernc.org/sortutil v1.2.1 h1:+xyoGf15mM3NMlPDnFqrteY07klSFxLElE2PVuWIJ7w= modernc.org/sortutil v1.2.1/go.mod h1:7ZI3a3REbai7gzCLcotuw9AC4VZVpYMjDzETGsSMqJE= modernc.org/sqlite v1.18.1/go.mod h1:6ho+Gow7oX5V+OiOQ6Tr4xeqbx13UZ6t+Fw9IRUG4d4= modernc.org/sqlite v1.46.2 h1:gkXQ6R0+AjxFC/fTDaeIVLbNLNrRoOK7YYVz5BKhTcE= modernc.org/sqlite v1.46.2/go.mod h1:hWjRO6Tj/5Ik8ieqxQybiEOUXy0NJFNp2tpvVpKlvig= modernc.org/strutil v1.1.1/go.mod h1:DE+MQQ/hjKBZS2zNInV5hhcipt5rLPWkmpbGeW5mmdw= modernc.org/strutil v1.1.3/go.mod h1:MEHNA7PdEnEwLvspRMtWTNnp2nnyvMfkimT1NKNAGbw= modernc.org/strutil v1.2.1 h1:UneZBkQA+DX2Rp35KcM69cSsNES9ly8mQWD71HKlOA0= modernc.org/strutil v1.2.1/go.mod h1:EHkiggD70koQxjVdSBM3JKM7k6L0FbGE5eymy9i3B9A= modernc.org/tcl v1.13.1/go.mod h1:XOLfOwzhkljL4itZkK6T72ckMgvj0BDsnKNdZVUOecw= modernc.org/token v1.0.0/go.mod h1:UGzOrNV1mAFSEB63lOFHIpNRUVMvYTc6yu1SMY/XTDM= modernc.org/token v1.1.0 h1:Xl7Ap9dKaEs5kLoOQeQmPWevfnk/DM5qcLcYlA8ys6Y= modernc.org/token v1.1.0/go.mod h1:UGzOrNV1mAFSEB63lOFHIpNRUVMvYTc6yu1SMY/XTDM= modernc.org/z v1.5.1/go.mod h1:eWFB510QWW5Th9YGZT81s+LwvaAs3Q2yr4sP0rmLkv8= moul.io/http2curl/v2 v2.3.0 h1:9r3JfDzWPcbIklMOs2TnIFzDYvfAZvjeavG6EzP7jYs= moul.io/http2curl/v2 v2.3.0/go.mod h1:RW4hyBjTWSYDOxapodpNEtX0g5Eb16sxklBqmd2RHcE= pgregory.net/rapid v1.1.0 h1:CMa0sjHSru3puNx+J0MIAuiiEV4N0qj8/cMWGBBCsjw= pgregory.net/rapid v1.1.0/go.mod h1:PY5XlDGj0+V1FCq0o192FdRhpKHGTRIWBgqjDBTrq04= 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= rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= sigs.k8s.io/json v0.0.0-20250730193827-2d320260d730 h1:IpInykpT6ceI+QxKBbEflcR5EXP7sU1kvOlxwZh5txg= sigs.k8s.io/json v0.0.0-20250730193827-2d320260d730/go.mod h1:mdzfpAEoE6DHQEN0uh9ZbOCuHbLK5wOm7dK4ctXE9Tg= sigs.k8s.io/randfill v1.0.0 h1:JfjMILfT8A6RbawdsK2JXGBR5AQVfd+9TbzrlneTyrU= sigs.k8s.io/randfill v1.0.0/go.mod h1:XeLlZ/jmk4i1HRopwe7/aU3H5n1zNUcX6TM94b3QxOY= sigs.k8s.io/structured-merge-diff/v6 v6.3.0 h1:jTijUJbW353oVOd9oTlifJqOGEkUw2jB/fXCbTiQEco= sigs.k8s.io/structured-merge-diff/v6 v6.3.0/go.mod h1:M3W8sfWvn2HhQDIbGWj3S099YozAsymCo/wrT5ohRUE= sigs.k8s.io/yaml v1.6.0 h1:G8fkbMSAFqgEFgh4b1wmtzDnioxFCUgTZhlbj5P9QYs= sigs.k8s.io/yaml v1.6.0/go.mod h1:796bPqUfzR/0jLAl6XjHl3Ck7MiyVv8dbTdyT3/pMf4= software.sslmate.com/src/go-pkcs12 v0.7.0 h1:Db8W44cB54TWD7stUFFSWxdfpdn6fZVcDl0w3R4RVM0= software.sslmate.com/src/go-pkcs12 v0.7.0/go.mod h1:Qiz0EyvDRJjjxGyUQa2cCNZn/wMyzrRJ/qcDXOQazLI= storj.io/common v0.0.0-20240812101423-26b53789c348 h1:Urs3fX+1Fyb+CFKGw0mCJV3MPR499WM+Vs6osw4Rqtk= storj.io/common v0.0.0-20240812101423-26b53789c348/go.mod h1:XMpwKxc04HCBl4H5IFCGv1ca5Dm0tvH4NL7Jx+JhxuA= storj.io/drpc v0.0.35-0.20240709171858-0075ac871661 h1:hLvEV2RMTscX3JHPd+LSQCeTt8i1Q0Yt7U2EdfyMnaQ= storj.io/drpc v0.0.35-0.20240709171858-0075ac871661/go.mod h1:Y9LZaa8esL1PW2IDMqJE7CFSNq7d5bQ3RI7mGPtmKMg= storj.io/eventkit v0.0.0-20240415002644-1d9596fee086 h1:TkytkGUI6zGtH5Qx/O0VxQCcYJqOOiwRq0oMi4uM5Tg= storj.io/eventkit v0.0.0-20240415002644-1d9596fee086/go.mod h1:S6p41RzIBKoeGAdrziksWkiijnZXql9YcNsc23t0u+8= storj.io/infectious v0.0.2 h1:rGIdDC/6gNYAStsxsZU79D/MqFjNyJc1tsyyj9sTl7Q= storj.io/infectious v0.0.2/go.mod h1:QEjKKww28Sjl1x8iDsjBpOM4r1Yp8RsowNcItsZJ1Vs= storj.io/picobuf v0.0.3 h1:xAUPB5ZUGfxkqd3bnw3zp01kkWb9wlhg4vtZWUs2S9A= storj.io/picobuf v0.0.3/go.mod h1:4V4xelV1RSCck5GgmkL/Txw9l6IfX3XcBzegmL5Kudo= storj.io/uplink v1.13.1 h1:C8RdW/upALoCyuF16Lod9XGCXEdbJAS+ABQy9JO/0pA= storj.io/uplink v1.13.1/go.mod h1:x0MQr4UfFsQBwgVWZAtEsLpuwAn6dg7G0Mpne1r516E= ================================================ FILE: info.plist ================================================ CFBundleExecutable telegraf_entry_mac CFBundleIconFile icon.icns CFBundleIdentifier com.influxdata.telegraf NSHighResolutionCapable LSUIElement ================================================ FILE: input.go ================================================ package telegraf type Input interface { PluginDescriber // Gather takes in an accumulator and adds the metrics that the Input // gathers. This is called every agent.interval Gather(Accumulator) error } type ServiceInput interface { Input // Start the ServiceInput. The Accumulator may be retained and used until // Stop returns. Start(Accumulator) error // Stop stops the services and closes any necessary channels and connections. // Metrics should not be written out to the accumulator once stop returns, so // Stop() should stop reading and wait for any in-flight metrics to write out // to the accumulator before returning. Stop() } ================================================ FILE: internal/choice/choice.go ================================================ // Package choice provides basic functions for working with // plugin options that must be one of several values. package choice import "fmt" // Contains return true if the choice in the list of choices. func Contains(choice string, choices []string) bool { for _, item := range choices { if item == choice { return true } } return false } // Check returns an error if a choice is not one of // the available choices. func Check(choice string, available []string) error { if !Contains(choice, available) { return fmt.Errorf("unknown choice %s", choice) } return nil } // CheckSlice returns an error if the choices is not a subset of // available. func CheckSlice(choices, available []string) error { for _, choice := range choices { err := Check(choice, available) if err != nil { return err } } return nil } ================================================ FILE: internal/clock/options.go ================================================ package clock import ( "time" "github.com/benbjohnson/clock" ) type config struct { clk clock.Clock start time.Time align bool notifier chan bool } type Option func(*config) func WithClock(clk clock.Clock) Option { return func(c *config) { c.clk = clk } } func WithAlignment(start time.Time) Option { return func(c *config) { c.start = start c.align = true } } func WithStartupNotification(notifier chan bool) Option { return func(c *config) { c.notifier = notifier } } ================================================ FILE: internal/clock/ticker.go ================================================ package clock import ( "context" "sync" "time" "github.com/benbjohnson/clock" "github.com/influxdata/telegraf/internal" ) type Ticker struct { C chan time.Time clk clock.Clock schedule time.Time interval time.Duration jitter time.Duration cancel context.CancelFunc wg sync.WaitGroup cfg *config } func NewTicker(interval, jitter, offset time.Duration, opt ...Option) *Ticker { // Apply the options cfg := &config{ clk: clock.New(), } for _, o := range opt { o(cfg) } schedule := cfg.clk.Now() // Align the scheduled trigger time to interval borders if cfg.align { // Add minimum interval size to avoid scheduling exceptionally short // intervals. This avoids an issue that can occur where the previous // interval ends slightly early due to very minor clock changes. schedule = internal.AlignTime(cfg.start.Add(interval/100), interval) } // Compute the scheduled first tick by adding the offset. By doing so, we // do not need to take the offset into account later. schedule = schedule.Add(offset) // Initialize the ticker instance and start it t := &Ticker{ C: make(chan time.Time, 1), clk: cfg.clk, schedule: schedule, interval: interval, jitter: jitter, cfg: cfg, } ctx, cancel := context.WithCancel(context.Background()) t.cancel = cancel t.wg.Add(1) go func() { defer t.wg.Done() t.run(ctx) }() return t } func (t *Ticker) Stop() { t.cancel() t.wg.Wait() } func (t *Ticker) run(ctx context.Context) { // Start with the first scheduled tick timer := t.clk.Timer(t.clk.Until(t.schedule) + internal.RandomDuration(t.jitter)) defer timer.Stop() if t.cfg.notifier != nil { t.cfg.notifier <- true } for { select { case ts := <-timer.C: // Compute the next scheduled interval by adding the interval and // randomizing the timing with the given jitter (if any). Note, we // need to remember the next scheduling without adding the ticker // to avoid drifting of the ticks by jitter/2 on average! t.schedule = t.schedule.Add(t.interval) timer.Reset(t.clk.Until(t.schedule) + internal.RandomDuration(t.jitter)) // Fire our event in a non-blocking fashion to avoid blocking the // ticker if the agent code did not read the channel yet select { case t.C <- ts: default: } case <-ctx.Done(): return } } } ================================================ FILE: internal/clock/ticker_aligned_test.go ================================================ package clock import ( "testing" "time" "github.com/benbjohnson/clock" "github.com/stretchr/testify/require" ) func TestAlignedTicker(t *testing.T) { interval := 10 * time.Second jitter := 0 * time.Second offset := 0 * time.Second clk := clock.NewMock() start := clk.Now() end := start.Add(60 * time.Second) ticker := NewTicker(interval, jitter, offset, WithClock(clk), WithAlignment(start)) defer ticker.Stop() expected := []time.Time{ time.Unix(10, 0).UTC(), time.Unix(20, 0).UTC(), time.Unix(30, 0).UTC(), time.Unix(40, 0).UTC(), time.Unix(50, 0).UTC(), time.Unix(60, 0).UTC(), } actual := make([]time.Time, 0) clk.Add(10 * time.Second) for !clk.Now().After(end) { ts := <-ticker.C actual = append(actual, ts.UTC()) clk.Add(10 * time.Second) } require.Equal(t, expected, actual) } func TestAlignedTickerJitter(t *testing.T) { interval := 10 * time.Second jitter := 5 * time.Second offset := 0 * time.Second clk := clock.NewMock() start := clk.Now() end := start.Add(61 * time.Second) ticker := NewTicker(interval, jitter, offset, WithClock(clk), WithAlignment(start)) defer ticker.Stop() last := start for !clk.Now().After(end) { select { case ts := <-ticker.C: dur := ts.Sub(last) // 10s interval + 5s jitter + up to 1s late firing. require.LessOrEqual(t, dur, 16*time.Second, "expected elapsed time to be less than 16 seconds, but was %s", dur) require.GreaterOrEqual(t, dur, 5*time.Second, "expected elapsed time to be more than 5 seconds, but was %s", dur) last = last.Add(interval) default: clk.Add(1 * time.Second) } } } func TestAlignedTickerOffset(t *testing.T) { interval := 10 * time.Second jitter := 0 * time.Second offset := 3 * time.Second clk := clock.NewMock() start := clk.Now() end := start.Add(61 * time.Second) ticker := NewTicker(interval, jitter, offset, WithClock(clk), WithAlignment(start)) defer ticker.Stop() expected := []time.Time{ time.Unix(13, 0).UTC(), time.Unix(23, 0).UTC(), time.Unix(33, 0).UTC(), time.Unix(43, 0).UTC(), time.Unix(53, 0).UTC(), } actual := make([]time.Time, 0) clk.Add(10*time.Second + offset) for !clk.Now().After(end) { ts := <-ticker.C actual = append(actual, ts.UTC()) clk.Add(10 * time.Second) } require.Equal(t, expected, actual) } func TestAlignedTickerMissedTick(t *testing.T) { interval := 10 * time.Second jitter := 0 * time.Second offset := 0 * time.Second clk := clock.NewMock() start := clk.Now() ticker := NewTicker(interval, jitter, offset, WithClock(clk), WithAlignment(start)) defer ticker.Stop() // Advance the time after we should have received two ticks but we did not // receive the first tick yet so the second one should be lost because the // channel is full. // NOTE: We need to use the range statement because the mock-clock // implementation will stop the clock once a time is issued. for range 25 { clk.Add(1 * time.Second) } ts := <-ticker.C require.Equal(t, time.Unix(10, 0).UTC(), ts.UTC()) // Advance the time further until we receive another tick for range 5 { clk.Add(1 * time.Second) } ts = <-ticker.C require.Equal(t, time.Unix(30, 0).UTC(), ts.UTC()) } // TestAlignedTickerJitterBehavior shows that AlignedTicker has different behavior. // It realigns to interval boundaries, so jitter doesn't accumulate as drift. // However, the average interval is still affected by jitter. // // Scenario: // - interval = 60s // - jitter = 10s // - start time = 12:02:22 // // Behavior: // - First trigger: next 60s boundary (12:03:00) + jitter = ~12:03:05 // - Second trigger: next 60s boundary (12:04:00) + jitter = ~12:04:07 // - The jitter variation averages out because of realignment func TestAlignedTickerJitterBehavior(t *testing.T) { interval := 60 * time.Second jitter := 10 * time.Second offset := 0 * time.Second // Start at 12:02:22 start := time.Date(2024, 1, 1, 12, 2, 22, 0, time.UTC) clk := clock.NewMock() clk.Set(start) ticker := NewTicker(interval, jitter, offset, WithClock(clk), WithAlignment(start)) defer ticker.Stop() // Collect 60 ticks const numTicks = 60 var triggers []time.Time for len(triggers) < numTicks { select { case ts := <-ticker.C: triggers = append(triggers, ts) default: clk.Add(1 * time.Second) } } firstTrigger := triggers[0] lastTrigger := triggers[numTicks-1] totalElapsed := lastTrigger.Sub(firstTrigger) expectedTime := time.Duration(numTicks-1) * interval drift := totalElapsed - expectedTime t.Logf("=== AlignedTicker (realigns to boundaries) ===") t.Logf("Start time: %s", start.Format("15:04:05")) t.Logf("First trigger: %s", firstTrigger.Format("15:04:05")) t.Logf("Last trigger: %s", lastTrigger.Format("15:04:05")) t.Logf("Total elapsed: %s", totalElapsed) t.Logf("Expected: %s", expectedTime) t.Logf("Drift: %s", drift) t.Logf("Avg interval: %.2fs", totalElapsed.Seconds()/float64(numTicks-1)) // AlignedTicker realigns to boundaries, so drift is minimal // The jitter variations cancel out over time if drift < 0 { drift = -drift } require.Less(t, drift, 1*time.Minute, "AlignedTicker should have minimal drift due to boundary realignment") } // Simulates running the Ticker for an hour and displays stats about the // operation. func TestAlignedTickerDistribution(t *testing.T) { if testing.Short() { t.Skip("skipping test in short mode.") } interval := 10 * time.Second jitter := 5 * time.Second offset := 0 * time.Second clk := clock.NewMock() start := clk.Now() ticker := NewTicker(interval, jitter, offset, WithClock(clk), WithAlignment(start)) defer ticker.Stop() dist := simulatedTickerDist(ticker, clk) dist.print() require.Less(t, 350, dist.count) require.True(t, 9 < dist.mean() && dist.mean() < 11) } func TestAlignedTickerDistributionWithOffset(t *testing.T) { if testing.Short() { t.Skip("skipping test in short mode.") } interval := 10 * time.Second jitter := 5 * time.Second offset := 3 * time.Second clk := clock.NewMock() start := clk.Now() ticker := NewTicker(interval, jitter, offset, WithClock(clk), WithAlignment(start)) defer ticker.Stop() dist := simulatedTickerDist(ticker, clk) dist.print() require.Less(t, 350, dist.count) require.True(t, 9 < dist.mean() && dist.mean() < 11) } ================================================ FILE: internal/clock/ticker_test.go ================================================ package clock import ( "fmt" "strings" "time" "github.com/benbjohnson/clock" ) type distribution struct { buckets [60]int count int waittime float64 } func simulatedTickerDist(ticker *Ticker, clk *clock.Mock) distribution { start := clk.Now() end := start.Add(1 * time.Hour) var dist distribution last := clk.Now() for !clk.Now().After(end) { select { case ts := <-ticker.C: dist.buckets[ts.Second()]++ dist.count++ dist.waittime += ts.Sub(last).Seconds() last = ts default: clk.Add(1 * time.Second) } } return dist } func (d *distribution) mean() float64 { return d.waittime / float64(d.count) } func (d distribution) print() { for i, count := range d.buckets { fmt.Printf("%2d %s\n", i, strings.Repeat("x", count)) } fmt.Printf("Average interval: %f\n", d.mean()) fmt.Printf("Count: %d\n", d.count) } ================================================ FILE: internal/clock/ticker_unaligned_test.go ================================================ package clock import ( "testing" "time" "github.com/benbjohnson/clock" "github.com/stretchr/testify/require" ) func TestUnalignedTicker(t *testing.T) { interval := 10 * time.Second jitter := 0 * time.Second offset := 0 * time.Second clk := clock.NewMock() clk.Add(1 * time.Second) startup := make(chan bool, 1) ticker := NewTicker(interval, jitter, offset, WithClock(clk), WithStartupNotification(startup)) defer ticker.Stop() expected := []time.Time{ time.Unix(1, 0).UTC(), time.Unix(11, 0).UTC(), time.Unix(21, 0).UTC(), time.Unix(31, 0).UTC(), time.Unix(41, 0).UTC(), time.Unix(51, 0).UTC(), time.Unix(61, 0).UTC(), } actual := make([]time.Time, 0, len(expected)) // Wait for the ticker to startup <-startup // The first tick fires immediately inside the Timer() constructor // (Timer(0) with deadline == now), so no clock advance is needed. // Blocking on each read ensures the ticker goroutine has called // timer.Reset() before the next clock advance, preventing the // race between clk.Add() and timer.Reset() that causes flaky // deadline shifts. actual = append(actual, (<-ticker.C).UTC()) for i := 1; i < len(expected); i++ { clk.Add(interval) actual = append(actual, (<-ticker.C).UTC()) } require.Equal(t, expected, actual) } // TestUnalignedTickerJitterBehavior shows UnalignedTicker behavior with jitter. // UnalignedTicker uses a fixed interval ticker internally, so jitter only adds // delay but doesn't cause cumulative drift. func TestUnalignedTickerJitterBehavior(t *testing.T) { interval := 60 * time.Second jitter := 10 * time.Second offset := 0 * time.Second clk := clock.NewMock() start := clk.Now() ticker := NewTicker(interval, jitter, offset, WithClock(clk)) defer ticker.Stop() // Collect 60 ticks const numTicks = 60 var triggers []time.Time for len(triggers) < numTicks { select { case ts := <-ticker.C: triggers = append(triggers, ts) default: clk.Add(1 * time.Second) } } firstTrigger := triggers[0] lastTrigger := triggers[numTicks-1] totalElapsed := lastTrigger.Sub(firstTrigger) expectedTime := time.Duration(numTicks-1) * interval drift := totalElapsed - expectedTime t.Logf("=== UnalignedTicker (fixed ticker + jitter sleep) ===") t.Logf("Start time: %s", start.Format("15:04:05")) t.Logf("First trigger: %s", firstTrigger.Format("15:04:05")) t.Logf("Last trigger: %s", lastTrigger.Format("15:04:05")) t.Logf("Total elapsed: %s", totalElapsed) t.Logf("Expected: %s", expectedTime) t.Logf("Drift: %s", drift) t.Logf("Avg interval: %.2fs", totalElapsed.Seconds()/float64(numTicks-1)) // UnalignedTicker uses clk.Ticker(interval) which fires at fixed intervals // The jitter is added as sleep AFTER each tick, but the ticker rhythm is fixed // So drift should be minimal (jitter variations average out) if drift < 0 { drift = -drift } require.Less(t, drift, 1*time.Minute, "UnalignedTicker should have minimal drift due to fixed internal ticker") } // Simulates running the Ticker for an hour and displays stats about the // operation. func TestUnalignedTickerDistribution(t *testing.T) { if testing.Short() { t.Skip("skipping test in short mode.") } interval := 10 * time.Second jitter := 5 * time.Second offset := 0 * time.Second clk := clock.NewMock() ticker := NewTicker(interval, jitter, offset, WithClock(clk)) defer ticker.Stop() dist := simulatedTickerDist(ticker, clk) dist.print() require.Less(t, 350, dist.count) require.True(t, 9 < dist.mean() && dist.mean() < 11) } func TestUnalignedTickerDistributionWithOffset(t *testing.T) { if testing.Short() { t.Skip("skipping test in short mode.") } interval := 10 * time.Second jitter := 5 * time.Second offset := 3 * time.Second clk := clock.NewMock() ticker := NewTicker(interval, jitter, offset, WithClock(clk)) defer ticker.Stop() dist := simulatedTickerDist(ticker, clk) dist.print() require.Less(t, 350, dist.count) require.True(t, 9 < dist.mean() && dist.mean() < 11) } ================================================ FILE: internal/clock/timer.go ================================================ package clock import ( "context" "sync" "time" "github.com/benbjohnson/clock" "github.com/influxdata/telegraf/internal" ) // Timer delivers ticks at regular but unaligned intervals. // // Because the next interval is scheduled based on the interval + jitter, you // are guaranteed at least interval seconds without missing a tick and ticks // will be evenly scheduled over time. // // On average you will have one collection each interval + (jitter/2). // // The first tick is emitted after interval+jitter seconds. // // Ticks are dropped for slow consumers. type Timer struct { C chan time.Time clk clock.Clock interval time.Duration jitter time.Duration cancel context.CancelFunc wg sync.WaitGroup cfg *config } func NewTimer(interval, jitter time.Duration, opt ...Option) *Timer { // Apply the options cfg := &config{ clk: clock.New(), } for _, o := range opt { o(cfg) } // Initialize the timer instance and start it t := &Timer{ C: make(chan time.Time, 1), clk: cfg.clk, interval: interval, jitter: jitter, cfg: cfg, } ctx, cancel := context.WithCancel(context.Background()) t.cancel = cancel t.wg.Add(1) go func() { defer t.wg.Done() t.run(ctx) }() return t } func (t *Timer) Stop() { t.cancel() t.wg.Wait() } func (t *Timer) run(ctx context.Context) { timer := t.clk.Timer(t.interval + internal.RandomDuration(t.jitter)) defer timer.Stop() if t.cfg.notifier != nil { t.cfg.notifier <- true } for { select { case ts := <-timer.C: // Compute the next tick by adding the interval and randomizing the // timing with the given jitter (if any). We don't ensure evenly // spaced ticks here but rather guarantee the minimum time between // ticks being 'interval' long. Note, on average the space between // ticks will be interval plus jitter/2! timer.Reset(t.interval + internal.RandomDuration(t.jitter)) // Fire our event in a non-blocking fashion to avoid blocking the // timer if the agent code did not read the channel yet select { case t.C <- ts: default: } case <-ctx.Done(): return } } } ================================================ FILE: internal/clock/timer_test.go ================================================ package clock import ( "testing" "time" "github.com/benbjohnson/clock" "github.com/stretchr/testify/require" ) func TestTimer(t *testing.T) { interval := 10 * time.Second jitter := 0 * time.Second clk := clock.NewMock() clk.Add(1 * time.Second) start := clk.Now() end := start.Add(60 * time.Second) startup := make(chan bool, 1) timer := NewTimer(interval, jitter, WithClock(clk), WithStartupNotification(startup)) defer timer.Stop() expected := []time.Time{ time.Unix(11, 0).UTC(), time.Unix(21, 0).UTC(), time.Unix(31, 0).UTC(), time.Unix(41, 0).UTC(), time.Unix(51, 0).UTC(), time.Unix(61, 0).UTC(), } // Wait for the timer to startup <-startup actual := make([]time.Time, 0, len(expected)) for !clk.Now().After(end) { select { case ts := <-timer.C: actual = append(actual, ts.UTC()) default: clk.Add(1 * time.Second) } } require.Equal(t, expected, actual) } // TestTimerJitterDrift demonstrates that with a Timer, jitter causes drift // over time. Each tick = interval + random(0, jitter), so the // average tick distance is interval + jitter/2. // // Scenario from issue #17287: // - interval = 60s // - jitter = 10s // // Current behavior: // - Each tick: interval + random(0-10s) // - Average interval: 60s + 5s = 65s // - After 60 ticks: expected 60min, actual ~65min (5min drift) // // This is intentional as Timer is used for flushing and there we want to // guarantee a minimum pause between flush cycles. func TestTimerJitterDrift(t *testing.T) { interval := 60 * time.Second jitter := 10 * time.Second clk := clock.NewMock() start := clk.Now() timer := NewTimer(interval, jitter, WithClock(clk)) defer timer.Stop() // Collect 60 ticks const numTicks = 60 var triggers []time.Time for len(triggers) < numTicks { select { case ts := <-timer.C: triggers = append(triggers, ts) default: clk.Add(1 * time.Second) } } // Calculate total elapsed time firstTrigger := triggers[0] lastTrigger := triggers[numTicks-1] totalElapsed := lastTrigger.Sub(firstTrigger) // Expected time for 59 intervals: 59 * 60s = 59 minutes expectedTime := time.Duration(numTicks-1) * interval // Calculate drift drift := totalElapsed - expectedTime t.Logf("=== Timer (interval + jitter each tick) ===") t.Logf("Start time: %s", start.Format("15:04:05")) t.Logf("First trigger: %s", firstTrigger.Format("15:04:05")) t.Logf("Last trigger: %s", lastTrigger.Format("15:04:05")) t.Logf("Total elapsed: %s", totalElapsed) t.Logf("Expected: %s (if no jitter drift)", expectedTime) t.Logf("Drift: %s", drift) t.Logf("Avg interval: %.2fs (expected ~65s with jitter)", totalElapsed.Seconds()/float64(numTicks-1)) // Current behavior: drift should be ~5 minutes (59 intervals * 5s avg jitter) // This confirms the bug from issue #17287 require.Greater(t, drift, 2*time.Minute, "Expected significant drift with Timer jitter behavior") require.Less(t, drift, 10*time.Minute, "Drift is larger than expected maximum") } // Simulates running the Ticker for an hour and displays stats about the // operation. func TestTimerDistribution(t *testing.T) { if testing.Short() { t.Skip("skipping test in short mode.") } interval := 10 * time.Second jitter := 5 * time.Second clk := clock.NewMock() timer := NewTimer(interval, jitter, WithClock(clk)) defer timer.Stop() dist := simulatedTimerDist(timer, clk) dist.print() require.Less(t, 275, dist.count) require.True(t, 12 < dist.mean() && 13 > dist.mean()) } func simulatedTimerDist(timer *Timer, clk *clock.Mock) distribution { start := clk.Now() end := start.Add(1 * time.Hour) var dist distribution last := clk.Now() for !clk.Now().After(end) { select { case ts := <-timer.C: dist.buckets[ts.Second()]++ dist.count++ dist.waittime += ts.Sub(last).Seconds() last = ts default: clk.Add(1 * time.Second) } } return dist } ================================================ FILE: internal/content_coding.go ================================================ package internal import ( "bufio" "bytes" "errors" "fmt" "io" "github.com/klauspost/compress/gzip" "github.com/klauspost/compress/zlib" "github.com/klauspost/compress/zstd" "github.com/klauspost/pgzip" ) const defaultMaxDecompressionSize int64 = 500 * 1024 * 1024 // 500MB // DecodingOption provide methods to change the decoding from the standard // configuration. type DecodingOption func(*decoderConfig) type decoderConfig struct { maxDecompressionSize int64 } func WithMaxDecompressionSize(maxDecompressionSize int64) DecodingOption { return func(cfg *decoderConfig) { cfg.maxDecompressionSize = maxDecompressionSize } } type encoderConfig struct { level int } // EncodingOption provide methods to change the encoding from the standard // configuration. type EncodingOption func(*encoderConfig) func WithCompressionLevel(level int) EncodingOption { return func(cfg *encoderConfig) { cfg.level = level } } // NewStreamContentDecoder returns a reader that will decode the stream // according to the encoding type. func NewStreamContentDecoder(encoding string, r io.Reader) (io.Reader, error) { switch encoding { case "gzip": return NewGzipReader(r) case "identity", "": return r, nil default: return nil, errors.New("invalid value for content_encoding") } } // GzipReader is similar to gzip.Reader but reads only a single gzip stream per read. type GzipReader struct { r io.Reader z *pgzip.Reader endOfStream bool } func NewGzipReader(r io.Reader) (io.Reader, error) { // We need a read that implements ByteReader in order to line up the next // stream. br := bufio.NewReader(r) // Reads the first gzip stream header. z, err := pgzip.NewReader(br) if err != nil { return nil, err } // Prevent future calls to Read from reading the following gzip header. z.Multistream(false) return &GzipReader{r: br, z: z}, nil } func (r *GzipReader) Read(b []byte) (int, error) { if r.endOfStream { // Reads the next gzip header and prepares for the next stream. err := r.z.Reset(r.r) if err != nil { return 0, err } r.z.Multistream(false) r.endOfStream = false } n, err := r.z.Read(b) // Since multistream is disabled, io.EOF indicates the end of the gzip // sequence. On the next read we must read the next gzip header. if errors.Is(err, io.EOF) { r.endOfStream = true return n, nil } return n, err } // NewContentEncoder returns a ContentEncoder for the encoding type. func NewContentEncoder(encoding string, options ...EncodingOption) (ContentEncoder, error) { switch encoding { case "gzip": return NewGzipEncoder(options...) case "identity", "": return NewIdentityEncoder(options...) case "zlib": return NewZlibEncoder(options...) case "zstd": return NewZstdEncoder(options...) default: return nil, errors.New("invalid value for content_encoding") } } type AutoDecoder struct { encoding string gzip *GzipDecoder identity *IdentityDecoder } func (a *AutoDecoder) SetEncoding(encoding string) { a.encoding = encoding } func (a *AutoDecoder) Decode(data []byte) ([]byte, error) { if a.encoding == "gzip" { return a.gzip.Decode(data) } return a.identity.Decode(data) } func NewAutoContentDecoder(options ...DecodingOption) *AutoDecoder { var a AutoDecoder a.identity = NewIdentityDecoder(options...) a.gzip = NewGzipDecoder(options...) return &a } // NewContentDecoder returns a ContentDecoder for the encoding type. func NewContentDecoder(encoding string, options ...DecodingOption) (ContentDecoder, error) { switch encoding { case "auto": return NewAutoContentDecoder(options...), nil case "gzip": return NewGzipDecoder(options...), nil case "identity", "": return NewIdentityDecoder(options...), nil case "zlib": return NewZlibDecoder(options...), nil case "zstd": return NewZstdDecoder(options...) default: return nil, errors.New("invalid value for content_encoding") } } // ContentEncoder applies a wrapper encoding to byte buffers. type ContentEncoder interface { Encode([]byte) ([]byte, error) } // GzipEncoder compresses the buffer using gzip at the default level. type GzipEncoder struct { pwriter *pgzip.Writer writer *gzip.Writer buf *bytes.Buffer } func NewGzipEncoder(options ...EncodingOption) (*GzipEncoder, error) { cfg := encoderConfig{level: gzip.DefaultCompression} for _, o := range options { o(&cfg) } // Check if the compression level is supported switch cfg.level { case gzip.NoCompression, gzip.DefaultCompression, gzip.BestSpeed, gzip.BestCompression: // Do nothing as those are valid levels default: return nil, errors.New("invalid compression level, only 0, 1 and 9 are supported") } var buf bytes.Buffer pw, err := pgzip.NewWriterLevel(&buf, cfg.level) if err != nil { return nil, err } w, err := gzip.NewWriterLevel(&buf, cfg.level) return &GzipEncoder{ pwriter: pw, writer: w, buf: &buf, }, err } func (e *GzipEncoder) Encode(data []byte) ([]byte, error) { // Parallel Gzip is only faster for larger data chunks. According to the // project's documentation the trade-off size is at about 1MB, so we switch // to parallel Gzip if the data is larger and run the built-in version // otherwise. if len(data) > 1024*1024 { return e.encodeBig(data) } return e.encodeSmall(data) } func (e *GzipEncoder) encodeSmall(data []byte) ([]byte, error) { e.buf.Reset() e.writer.Reset(e.buf) _, err := e.writer.Write(data) if err != nil { return nil, err } err = e.writer.Close() if err != nil { return nil, err } return e.buf.Bytes(), nil } func (e *GzipEncoder) encodeBig(data []byte) ([]byte, error) { e.buf.Reset() e.pwriter.Reset(e.buf) _, err := e.pwriter.Write(data) if err != nil { return nil, err } err = e.pwriter.Close() if err != nil { return nil, err } return e.buf.Bytes(), nil } type ZlibEncoder struct { writer *zlib.Writer buf *bytes.Buffer } func NewZlibEncoder(options ...EncodingOption) (*ZlibEncoder, error) { cfg := encoderConfig{level: zlib.DefaultCompression} for _, o := range options { o(&cfg) } switch cfg.level { case zlib.NoCompression, zlib.DefaultCompression, zlib.BestSpeed, zlib.BestCompression: // Do nothing as those are valid levels default: return nil, errors.New("invalid compression level, only 0, 1 and 9 are supported") } var buf bytes.Buffer w, err := zlib.NewWriterLevel(&buf, cfg.level) return &ZlibEncoder{ writer: w, buf: &buf, }, err } func (e *ZlibEncoder) Encode(data []byte) ([]byte, error) { e.buf.Reset() e.writer.Reset(e.buf) _, err := e.writer.Write(data) if err != nil { return nil, err } err = e.writer.Close() if err != nil { return nil, err } return e.buf.Bytes(), nil } type ZstdEncoder struct { encoder *zstd.Encoder } func NewZstdEncoder(options ...EncodingOption) (*ZstdEncoder, error) { cfg := encoderConfig{level: 3} for _, o := range options { o(&cfg) } // Map the levels var level zstd.EncoderLevel switch cfg.level { case 1: level = zstd.SpeedFastest case 3: level = zstd.SpeedDefault case 7: level = zstd.SpeedBetterCompression case 11: level = zstd.SpeedBestCompression default: return nil, errors.New("invalid compression level, only 1, 3, 7 and 11 are supported") } e, err := zstd.NewWriter(nil, zstd.WithEncoderLevel(level)) return &ZstdEncoder{ encoder: e, }, err } func (e *ZstdEncoder) Encode(data []byte) ([]byte, error) { return e.encoder.EncodeAll(data, make([]byte, 0, len(data))), nil } // IdentityEncoder is a null encoder that applies no transformation. type IdentityEncoder struct{} func NewIdentityEncoder(options ...EncodingOption) (*IdentityEncoder, error) { if len(options) > 0 { return nil, errors.New("identity encoder does not support options") } return &IdentityEncoder{}, nil } func (*IdentityEncoder) Encode(data []byte) ([]byte, error) { return data, nil } // ContentDecoder removes a wrapper encoding from byte buffers. type ContentDecoder interface { SetEncoding(string) Decode([]byte) ([]byte, error) } // GzipDecoder decompresses buffers with gzip compression. type GzipDecoder struct { preader *pgzip.Reader reader *gzip.Reader buf *bytes.Buffer maxDecompressionSize int64 } func NewGzipDecoder(options ...DecodingOption) *GzipDecoder { cfg := decoderConfig{maxDecompressionSize: defaultMaxDecompressionSize} for _, o := range options { o(&cfg) } return &GzipDecoder{ preader: new(pgzip.Reader), reader: new(gzip.Reader), buf: new(bytes.Buffer), maxDecompressionSize: cfg.maxDecompressionSize, } } func (*GzipDecoder) SetEncoding(string) {} func (d *GzipDecoder) Decode(data []byte) ([]byte, error) { // Parallel Gzip is only faster for larger data chunks. According to the // project's documentation the trade-off size is at about 1MB, so we switch // to parallel Gzip if the data is larger and run the built-in version // otherwise. if len(data) > 1024*1024 { return d.decodeBig(data) } return d.decodeSmall(data) } func (d *GzipDecoder) decodeSmall(data []byte) ([]byte, error) { err := d.reader.Reset(bytes.NewBuffer(data)) if err != nil { return nil, err } d.buf.Reset() n, err := io.CopyN(d.buf, d.reader, d.maxDecompressionSize) if err != nil && !errors.Is(err, io.EOF) { return nil, err } else if n == d.maxDecompressionSize { return nil, fmt.Errorf("size of decoded data exceeds allowed size %d", d.maxDecompressionSize) } err = d.reader.Close() if err != nil { return nil, err } return d.buf.Bytes(), nil } func (d *GzipDecoder) decodeBig(data []byte) ([]byte, error) { err := d.preader.Reset(bytes.NewBuffer(data)) if err != nil { return nil, err } d.buf.Reset() n, err := io.CopyN(d.buf, d.preader, d.maxDecompressionSize) if err != nil && !errors.Is(err, io.EOF) { return nil, err } else if n == d.maxDecompressionSize { return nil, fmt.Errorf("size of decoded data exceeds allowed size %d", d.maxDecompressionSize) } err = d.preader.Close() if err != nil { return nil, err } return d.buf.Bytes(), nil } type ZlibDecoder struct { buf *bytes.Buffer maxDecompressionSize int64 } func NewZlibDecoder(options ...DecodingOption) *ZlibDecoder { cfg := decoderConfig{maxDecompressionSize: defaultMaxDecompressionSize} for _, o := range options { o(&cfg) } return &ZlibDecoder{ buf: new(bytes.Buffer), maxDecompressionSize: cfg.maxDecompressionSize, } } func (*ZlibDecoder) SetEncoding(string) {} func (d *ZlibDecoder) Decode(data []byte) ([]byte, error) { d.buf.Reset() b := bytes.NewBuffer(data) r, err := zlib.NewReader(b) if err != nil { return nil, err } n, err := io.CopyN(d.buf, r, d.maxDecompressionSize) if err != nil && !errors.Is(err, io.EOF) { return nil, err } else if n == d.maxDecompressionSize { return nil, fmt.Errorf("size of decoded data exceeds allowed size %d", d.maxDecompressionSize) } err = r.Close() if err != nil { return nil, err } return d.buf.Bytes(), nil } type ZstdDecoder struct { decoder *zstd.Decoder } func NewZstdDecoder(options ...DecodingOption) (*ZstdDecoder, error) { cfg := decoderConfig{maxDecompressionSize: defaultMaxDecompressionSize} for _, o := range options { o(&cfg) } d, err := zstd.NewReader(nil, zstd.WithDecoderConcurrency(0), zstd.WithDecoderMaxWindow(uint64(cfg.maxDecompressionSize))) return &ZstdDecoder{ decoder: d, }, err } func (*ZstdDecoder) SetEncoding(string) {} func (d *ZstdDecoder) Decode(data []byte) ([]byte, error) { return d.decoder.DecodeAll(data, nil) } // IdentityDecoder is a null decoder that returns the input. type IdentityDecoder struct { } func NewIdentityDecoder(_ ...DecodingOption) *IdentityDecoder { return &IdentityDecoder{} } func (*IdentityDecoder) SetEncoding(string) {} func (*IdentityDecoder) Decode(data []byte) ([]byte, error) { return data, nil } ================================================ FILE: internal/content_coding_test.go ================================================ package internal import ( "bytes" "fmt" "io" "strings" "testing" "github.com/stretchr/testify/require" ) const maxDecompressionSize = 1024 func TestGzipEncodeDecode(t *testing.T) { enc, err := NewGzipEncoder() require.NoError(t, err) dec := NewGzipDecoder(WithMaxDecompressionSize(maxDecompressionSize)) payload, err := enc.Encode([]byte("howdy")) require.NoError(t, err) actual, err := dec.Decode(payload) require.NoError(t, err) require.Equal(t, "howdy", string(actual)) } func TestGzipReuse(t *testing.T) { enc, err := NewGzipEncoder() require.NoError(t, err) dec := NewGzipDecoder(WithMaxDecompressionSize(maxDecompressionSize)) payload, err := enc.Encode([]byte("howdy")) require.NoError(t, err) actual, err := dec.Decode(payload) require.NoError(t, err) require.Equal(t, "howdy", string(actual)) payload, err = enc.Encode([]byte("doody")) require.NoError(t, err) actual, err = dec.Decode(payload) require.NoError(t, err) require.Equal(t, "doody", string(actual)) } func TestZlibEncodeDecode(t *testing.T) { enc, err := NewZlibEncoder() require.NoError(t, err) dec := NewZlibDecoder(WithMaxDecompressionSize(maxDecompressionSize)) payload, err := enc.Encode([]byte("howdy")) require.NoError(t, err) actual, err := dec.Decode(payload) require.NoError(t, err) require.Equal(t, "howdy", string(actual)) } func TestZlibEncodeDecodeWithTooLargeMessage(t *testing.T) { enc, err := NewZlibEncoder() require.NoError(t, err) dec := NewZlibDecoder(WithMaxDecompressionSize(3)) payload, err := enc.Encode([]byte("howdy")) require.NoError(t, err) _, err = dec.Decode(payload) require.ErrorContains(t, err, "size of decoded data exceeds allowed size 3") } func TestZstdEncodeDecode(t *testing.T) { enc, err := NewZstdEncoder() require.NoError(t, err) dec, err := NewZstdDecoder(WithMaxDecompressionSize(maxDecompressionSize)) require.NoError(t, err) payload, err := enc.Encode([]byte("howdy")) require.NoError(t, err) actual, err := dec.Decode(payload) require.NoError(t, err) require.Equal(t, "howdy", string(actual)) } func TestZstdReuse(t *testing.T) { enc, err := NewZstdEncoder() require.NoError(t, err) dec, err := NewZstdDecoder(WithMaxDecompressionSize(maxDecompressionSize)) require.NoError(t, err) payload, err := enc.Encode([]byte("howdy")) require.NoError(t, err) actual, err := dec.Decode(payload) require.NoError(t, err) require.Equal(t, "howdy", string(actual)) payload, err = enc.Encode([]byte("doody")) require.NoError(t, err) actual, err = dec.Decode(payload) require.NoError(t, err) require.Equal(t, "doody", string(actual)) } func TestIdentityEncodeDecode(t *testing.T) { dec := NewIdentityDecoder(WithMaxDecompressionSize(maxDecompressionSize)) enc, err := NewIdentityEncoder() require.NoError(t, err) payload, err := enc.Encode([]byte("howdy")) require.NoError(t, err) actual, err := dec.Decode(payload) require.NoError(t, err) require.Equal(t, "howdy", string(actual)) } func TestStreamIdentityDecode(t *testing.T) { var r bytes.Buffer n, err := r.WriteString("howdy") require.NoError(t, err) require.Equal(t, 5, n) dec, err := NewStreamContentDecoder("identity", &r) require.NoError(t, err) data, err := io.ReadAll(dec) require.NoError(t, err) require.Equal(t, []byte("howdy"), data) } func TestStreamGzipDecode(t *testing.T) { enc, err := NewGzipEncoder() require.NoError(t, err) written, err := enc.Encode([]byte("howdy")) require.NoError(t, err) w := bytes.NewBuffer(written) dec, err := NewStreamContentDecoder("gzip", w) require.NoError(t, err) b := make([]byte, 10) n, err := dec.Read(b) require.NoError(t, err) require.Equal(t, 5, n) require.Equal(t, []byte("howdy"), b[:n]) } func TestCompressionLevel(t *testing.T) { tests := []struct { algorithm string validLevels []int errormsg string }{ { algorithm: "gzip", validLevels: []int{0, 1, 9}, errormsg: "invalid compression level", }, { algorithm: "zlib", validLevels: []int{0, 1, 9}, errormsg: "invalid compression level", }, { algorithm: "zstd", validLevels: []int{1, 3, 7, 11}, errormsg: "invalid compression level", }, { algorithm: "identity", errormsg: "does not support options", }, } for _, tt := range tests { // Check default i.e. without specifying level t.Run(tt.algorithm+" default", func(t *testing.T) { enc, err := NewContentEncoder(tt.algorithm) require.NoError(t, err) require.NotNil(t, enc) }) // Check invalid level t.Run(tt.algorithm+" invalid", func(t *testing.T) { _, err := NewContentEncoder(tt.algorithm, WithCompressionLevel(12)) require.ErrorContains(t, err, tt.errormsg) }) // Check known levels 0..9 for level := 0; level < 10; level++ { name := fmt.Sprintf("%s level %d", tt.algorithm, level) t.Run(name, func(t *testing.T) { var valid bool for _, l := range tt.validLevels { if l == level { valid = true break } } enc, err := NewContentEncoder(tt.algorithm, WithCompressionLevel(level)) if valid { require.NoError(t, err) require.NotNil(t, enc) } else { require.ErrorContains(t, err, tt.errormsg) } }) } } } func BenchmarkGzipEncode(b *testing.B) { data := []byte(strings.Repeat("-howdy stranger-", 64)) dataLen := int64(len(data)) + 1 enc, err := NewGzipEncoder() require.NoError(b, err) dec := NewGzipDecoder(WithMaxDecompressionSize(dataLen)) payload, err := enc.Encode(data) require.NoError(b, err) actual, err := dec.Decode(payload) require.NoError(b, err) require.Equal(b, data, actual) for n := 0; n < b.N; n++ { _, err := enc.Encode(data) require.NoError(b, err) } } func BenchmarkGzipDecode(b *testing.B) { data := []byte(strings.Repeat("-howdy stranger-", 64)) dataLen := int64(len(data)) + 1 enc, err := NewGzipEncoder() require.NoError(b, err) dec := NewGzipDecoder(WithMaxDecompressionSize(dataLen)) payload, err := enc.Encode(data) require.NoError(b, err) actual, err := dec.Decode(payload) require.NoError(b, err) require.Equal(b, data, actual) for n := 0; n < b.N; n++ { _, err = dec.Decode(payload) require.NoError(b, err) } } func BenchmarkGzipEncodeDecode(b *testing.B) { data := []byte(strings.Repeat("-howdy stranger-", 64)) dataLen := int64(len(data)) + 1 enc, err := NewGzipEncoder() require.NoError(b, err) dec := NewGzipDecoder(WithMaxDecompressionSize(dataLen)) payload, err := enc.Encode(data) require.NoError(b, err) actual, err := dec.Decode(payload) require.NoError(b, err) require.Equal(b, data, actual) for n := 0; n < b.N; n++ { payload, err := enc.Encode(data) require.NoError(b, err) _, err = dec.Decode(payload) require.NoError(b, err) } } func BenchmarkGzipEncodeBig(b *testing.B) { data := []byte(strings.Repeat("-howdy stranger-", 1024*1024)) dataLen := int64(len(data)) + 1 enc, err := NewGzipEncoder() require.NoError(b, err) dec := NewGzipDecoder(WithMaxDecompressionSize(dataLen)) payload, err := enc.Encode(data) require.NoError(b, err) actual, err := dec.Decode(payload) require.NoError(b, err) require.Equal(b, data, actual) for n := 0; n < b.N; n++ { _, err := enc.Encode(data) require.NoError(b, err) } } func BenchmarkGzipDecodeBig(b *testing.B) { data := []byte(strings.Repeat("-howdy stranger-", 1024*1024)) dataLen := int64(len(data)) + 1 enc, err := NewGzipEncoder() require.NoError(b, err) dec := NewGzipDecoder(WithMaxDecompressionSize(dataLen)) payload, err := enc.Encode(data) require.NoError(b, err) actual, err := dec.Decode(payload) require.NoError(b, err) require.Equal(b, data, actual) for n := 0; n < b.N; n++ { _, err = dec.Decode(payload) require.NoError(b, err) } } func BenchmarkGzipEncodeDecodeBig(b *testing.B) { data := []byte(strings.Repeat("-howdy stranger-", 1024*1024)) dataLen := int64(len(data)) + 1 enc, err := NewGzipEncoder() require.NoError(b, err) dec := NewGzipDecoder(WithMaxDecompressionSize(dataLen)) payload, err := enc.Encode(data) require.NoError(b, err) actual, err := dec.Decode(payload) require.NoError(b, err) require.Equal(b, data, actual) for n := 0; n < b.N; n++ { payload, err := enc.Encode(data) require.NoError(b, err) _, err = dec.Decode(payload) require.NoError(b, err) } } func BenchmarkZstdEncode(b *testing.B) { data := []byte(strings.Repeat("-howdy stranger-", 64)) dataLen := int64(len(data)) + 1 enc, err := NewZstdEncoder() require.NoError(b, err) dec, err := NewZstdDecoder(WithMaxDecompressionSize(dataLen)) require.NoError(b, err) payload, err := enc.Encode(data) require.NoError(b, err) actual, err := dec.Decode(payload) require.NoError(b, err) require.Equal(b, data, actual) for n := 0; n < b.N; n++ { _, err := enc.Encode(data) require.NoError(b, err) } } func BenchmarkZstdDecode(b *testing.B) { data := []byte(strings.Repeat("-howdy stranger-", 64)) dataLen := int64(len(data)) + 1 enc, err := NewZstdEncoder() require.NoError(b, err) dec, err := NewZstdDecoder(WithMaxDecompressionSize(dataLen)) require.NoError(b, err) payload, err := enc.Encode(data) require.NoError(b, err) actual, err := dec.Decode(payload) require.NoError(b, err) require.Equal(b, data, actual) for n := 0; n < b.N; n++ { _, err = dec.Decode(payload) require.NoError(b, err) } } func BenchmarkZstdEncodeDecode(b *testing.B) { data := []byte(strings.Repeat("-howdy stranger-", 64)) dataLen := int64(len(data)) + 1 enc, err := NewZstdEncoder() require.NoError(b, err) dec, err := NewZstdDecoder(WithMaxDecompressionSize(dataLen)) require.NoError(b, err) payload, err := enc.Encode(data) require.NoError(b, err) actual, err := dec.Decode(payload) require.NoError(b, err) require.Equal(b, data, actual) for n := 0; n < b.N; n++ { payload, err := enc.Encode(data) require.NoError(b, err) _, err = dec.Decode(payload) require.NoError(b, err) } } func BenchmarkZstdEncodeBig(b *testing.B) { data := []byte(strings.Repeat("-howdy stranger-", 1024*1024)) dataLen := int64(len(data)) + 1 enc, err := NewZstdEncoder() require.NoError(b, err) dec, err := NewZstdDecoder(WithMaxDecompressionSize(dataLen)) require.NoError(b, err) payload, err := enc.Encode(data) require.NoError(b, err) actual, err := dec.Decode(payload) require.NoError(b, err) require.Equal(b, data, actual) for n := 0; n < b.N; n++ { _, err := enc.Encode(data) require.NoError(b, err) } } func BenchmarkZstdDecodeBig(b *testing.B) { data := []byte(strings.Repeat("-howdy stranger-", 1024*1024)) dataLen := int64(len(data)) + 1 enc, err := NewZstdEncoder() require.NoError(b, err) dec, err := NewZstdDecoder(WithMaxDecompressionSize(dataLen)) require.NoError(b, err) payload, err := enc.Encode(data) require.NoError(b, err) actual, err := dec.Decode(payload) require.NoError(b, err) require.Equal(b, data, actual) for n := 0; n < b.N; n++ { _, err = dec.Decode(payload) require.NoError(b, err) } } func BenchmarkZstdEncodeDecodeBig(b *testing.B) { data := []byte(strings.Repeat("-howdy stranger-", 1024*1024)) dataLen := int64(len(data)) + 1 enc, err := NewZstdEncoder() require.NoError(b, err) dec, err := NewZstdDecoder(WithMaxDecompressionSize(dataLen)) require.NoError(b, err) payload, err := enc.Encode(data) require.NoError(b, err) actual, err := dec.Decode(payload) require.NoError(b, err) require.Equal(b, data, actual) for n := 0; n < b.N; n++ { payload, err := enc.Encode(data) require.NoError(b, err) _, err = dec.Decode(payload) require.NoError(b, err) } } func BenchmarkZlibEncode(b *testing.B) { data := []byte(strings.Repeat("-howdy stranger-", 64)) dataLen := int64(len(data)) + 1 enc, err := NewZlibEncoder() require.NoError(b, err) dec := NewZlibDecoder(WithMaxDecompressionSize(dataLen)) payload, err := enc.Encode(data) require.NoError(b, err) actual, err := dec.Decode(payload) require.NoError(b, err) require.Equal(b, data, actual) for n := 0; n < b.N; n++ { _, err := enc.Encode(data) require.NoError(b, err) } } func BenchmarkZlibDecode(b *testing.B) { data := []byte(strings.Repeat("-howdy stranger-", 64)) dataLen := int64(len(data)) + 1 enc, err := NewZlibEncoder() require.NoError(b, err) dec := NewZlibDecoder(WithMaxDecompressionSize(dataLen)) payload, err := enc.Encode(data) require.NoError(b, err) actual, err := dec.Decode(payload) require.NoError(b, err) require.Equal(b, data, actual) for n := 0; n < b.N; n++ { _, err = dec.Decode(payload) require.NoError(b, err) } } func BenchmarkZlibEncodeDecode(b *testing.B) { data := []byte(strings.Repeat("-howdy stranger-", 64)) dataLen := int64(len(data)) + 1 enc, err := NewZlibEncoder() require.NoError(b, err) dec := NewZlibDecoder(WithMaxDecompressionSize(dataLen)) payload, err := enc.Encode(data) require.NoError(b, err) actual, err := dec.Decode(payload) require.NoError(b, err) require.Equal(b, data, actual) for n := 0; n < b.N; n++ { payload, err := enc.Encode(data) require.NoError(b, err) _, err = dec.Decode(payload) require.NoError(b, err) } } func BenchmarkIdentityEncodeDecode(b *testing.B) { data := []byte(strings.Repeat("-howdy stranger-", 64)) dataLen := int64(len(data)) + 1 dec := NewIdentityDecoder(WithMaxDecompressionSize(dataLen)) enc, err := NewIdentityEncoder() require.NoError(b, err) payload, err := enc.Encode(data) require.NoError(b, err) actual, err := dec.Decode(payload) require.NoError(b, err) require.Equal(b, data, actual) for n := 0; n < b.N; n++ { payload, err := enc.Encode(data) require.NoError(b, err) _, err = dec.Decode(payload) require.NoError(b, err) } } ================================================ FILE: internal/customized_no.go ================================================ //go:build !custom package internal const Customized = "" ================================================ FILE: internal/customized_yes.go ================================================ //go:build custom package internal const Customized = " (customized)" ================================================ FILE: internal/docker/docker.go ================================================ package docker import "strings" // ParseImage Adapts some of the logic from the actual Docker library's image parsing routines: // https://github.com/docker/distribution/blob/release/2.7/reference/normalize.go func ParseImage(image string) (imageName, imageVersion string) { domain := "" remainder := "" i := strings.IndexRune(image, '/') if i == -1 || (!strings.ContainsAny(image[:i], ".:") && image[:i] != "localhost") { remainder = image } else { domain, remainder = image[:i], image[i+1:] } imageVersion = "unknown" i = strings.LastIndex(remainder, ":") if i > -1 { imageVersion = remainder[i+1:] imageName = remainder[:i] } else { imageName = remainder } if domain != "" { imageName = domain + "/" + imageName } return imageName, imageVersion } ================================================ FILE: internal/docker/docker_test.go ================================================ package docker_test import ( "testing" "github.com/stretchr/testify/require" "github.com/influxdata/telegraf/internal/docker" ) func TestParseImage(t *testing.T) { tests := []struct { image string parsedName string parsedVersion string }{ { image: "postgres", parsedName: "postgres", parsedVersion: "unknown", }, { image: "postgres:latest", parsedName: "postgres", parsedVersion: "latest", }, { image: "coreos/etcd", parsedName: "coreos/etcd", parsedVersion: "unknown", }, { image: "coreos/etcd:latest", parsedName: "coreos/etcd", parsedVersion: "latest", }, { image: "quay.io/postgres", parsedName: "quay.io/postgres", parsedVersion: "unknown", }, { image: "quay.io:4443/coreos/etcd", parsedName: "quay.io:4443/coreos/etcd", parsedVersion: "unknown", }, { image: "quay.io:4443/coreos/etcd:latest", parsedName: "quay.io:4443/coreos/etcd", parsedVersion: "latest", }, } for _, tt := range tests { t.Run("parse name "+tt.image, func(t *testing.T) { imageName, imageVersion := docker.ParseImage(tt.image) require.Equal(t, tt.parsedName, imageName) require.Equal(t, tt.parsedVersion, imageVersion) }) } } ================================================ FILE: internal/env.go ================================================ package internal import "os" // GetProcPath returns the path stored in HOST_PROC env variable, or /proc if HOST_PROC has not been set. func GetProcPath() string { if hostProc := os.Getenv("HOST_PROC"); hostProc != "" { return hostProc } return "/proc" } // GetSysPath returns the path stored in HOST_SYS env variable, or /sys if HOST_SYS has not been set. func GetSysPath() string { if hostSys := os.Getenv("HOST_SYS"); hostSys != "" { return hostSys } return "/sys" } ================================================ FILE: internal/errors.go ================================================ package internal import "errors" var ( ErrNotConnected = errors.New("not connected") ErrSerialization = errors.New("serialization of metric(s) failed") ErrSizeLimitReached = errors.New("size limit reached") ) // StartupError indicates an error that occurred during startup of a plugin // e.g. due to connectivity issues or resources being not yet available. // In case the 'Retry' flag is set, the startup of the plugin might be retried // depending on the configured startup-error-behavior. The 'RemovePlugin' // flag denotes if the agent should remove the plugin from further processing. type StartupError struct { Err error Retry bool Partial bool } func (e *StartupError) Error() string { return e.Err.Error() } func (e *StartupError) Unwrap() error { return e.Err } // FatalError indicates a not-recoverable error in the plugin. The corresponding // plugin should be remove by the agent stopping any further processing for that // plugin instance. type FatalError struct { Err error } func (e *FatalError) Error() string { return e.Err.Error() } func (e *FatalError) Unwrap() error { return e.Err } // PartialWriteError indicate that only a subset of the metrics were written // successfully (i.e. accepted). The rejected metrics should be removed from // the buffer without being successfully written. Please note: the metrics // are specified as indices into the batch to be able to reference tracking // metrics correctly. type PartialWriteError struct { Err error MetricsAccept []int MetricsReject []int MetricsRejectErrors []error } func (e *PartialWriteError) Error() string { return e.Err.Error() } func (e *PartialWriteError) Unwrap() error { return e.Err } ================================================ FILE: internal/exec.go ================================================ package internal import ( "bytes" "os/exec" "time" ) // CombinedOutputTimeout runs the given command with the given timeout and // returns the combined output of stdout and stderr. // If the command times out, it attempts to kill the process. func CombinedOutputTimeout(c *exec.Cmd, timeout time.Duration) ([]byte, error) { var b bytes.Buffer c.Stdout = &b c.Stderr = &b if err := c.Start(); err != nil { return nil, err } err := WaitTimeout(c, timeout) return b.Bytes(), err } // StdOutputTimeout runs the given command with the given timeout and // returns the output of stdout. // If the command times out, it attempts to kill the process. func StdOutputTimeout(c *exec.Cmd, timeout time.Duration) ([]byte, error) { var b bytes.Buffer c.Stdout = &b c.Stderr = nil if err := c.Start(); err != nil { return nil, err } err := WaitTimeout(c, timeout) return b.Bytes(), err } // RunTimeout runs the given command with the given timeout. // If the command times out, it attempts to kill the process. func RunTimeout(c *exec.Cmd, timeout time.Duration) error { if err := c.Start(); err != nil { return err } return WaitTimeout(c, timeout) } ================================================ FILE: internal/exec_unix.go ================================================ //go:build !windows package internal import ( "log" "os/exec" "syscall" "time" ) // KillGrace is the amount of time we allow a process to shutdown before // sending a SIGKILL. const KillGrace = 5 * time.Second // WaitTimeout waits for the given command to finish with a timeout. // It assumes the command has already been started. // If the command times out, it attempts to kill the process. func WaitTimeout(c *exec.Cmd, timeout time.Duration) error { var kill *time.Timer term := time.AfterFunc(timeout, func() { err := syscall.Kill(-c.Process.Pid, syscall.SIGTERM) if err != nil { log.Printf("E! [agent] Error terminating process children: %s", err) } err = c.Process.Signal(syscall.SIGTERM) if err != nil { log.Printf("E! [agent] Error terminating process: %s", err) return } kill = time.AfterFunc(KillGrace, func() { err := syscall.Kill(-c.Process.Pid, syscall.SIGKILL) if err != nil { log.Printf("E! [agent] Error terminating process children: %s", err) } err = c.Process.Kill() if err != nil { log.Printf("E! [agent] Error killing process: %s", err) return } }) }) err := c.Wait() // Shutdown all timers if kill != nil { kill.Stop() } termSent := !term.Stop() // If the process exited without error treat it as success. This allows a // process to do a clean shutdown on signal. if err == nil { return nil } // If SIGTERM was sent then treat any process error as a timeout. if termSent { return ErrTimeout } // Otherwise there was an error unrelated to termination. return err } ================================================ FILE: internal/exec_windows.go ================================================ //go:build windows package internal import ( "log" "os/exec" "time" ) // WaitTimeout waits for the given command to finish with a timeout. // It assumes the command has already been started. // If the command times out, it attempts to kill the process. func WaitTimeout(c *exec.Cmd, timeout time.Duration) error { timer := time.AfterFunc(timeout, func() { err := c.Process.Kill() if err != nil { log.Printf("E! [agent] Error killing process: %s", err) return } }) err := c.Wait() // Shutdown all timers termSent := !timer.Stop() // If the process exited without error treat it as success. This allows a // process to do a clean shutdown on signal. if err == nil { return nil } // If SIGTERM was sent then treat any process error as a timeout. if termSent { return ErrTimeout } // Otherwise there was an error unrelated to termination. return err } ================================================ FILE: internal/fuzz/json.go ================================================ package fuzz // JSONDictionary from https://github.com/google/AFL/blob/master/dictionaries/json.dict var JSONDictionary = []string{ "0", ",0", ":0", "0:", "-1.2e+3", "true", "false", "null", "\"\"", ",\"\"", ":\"\"", "\"\":", "{}", ",{}", ":{}", "{\"\":0}", "{{}}", "[]", ",[]", ":[]", "[0]", "[[]]", "''", "\\", "\\b", "\\f", "\\n", "\\r", "\\t", "\\u0000", "\\x00", "\\0", "\\uD800\\uDC00", "\\uDBFF\\uDFFF", "\"\":0", "//", "/**/", } ================================================ FILE: internal/globpath/globpath.go ================================================ package globpath import ( "os" "path/filepath" "strings" "github.com/bmatcuk/doublestar/v3" "github.com/gobwas/glob" ) type GlobPath struct { path string hasMeta bool HasSuperMeta bool rootGlob string g glob.Glob } func Compile(path string) (*GlobPath, error) { out := GlobPath{ hasMeta: hasMeta(path), HasSuperMeta: hasSuperMeta(path), path: filepath.FromSlash(path), } // if there are no glob meta characters in the path, don't bother compiling // a glob object if !out.hasMeta || !out.HasSuperMeta { return &out, nil } // find the root elements of the object path, the entry point for recursion // when you have a super-meta in your path (which are : // glob(/your/expression/until/first/star/of/super-meta)) out.rootGlob = path[:strings.Index(path, "**")+1] var err error if out.g, err = glob.Compile(path, os.PathSeparator); err != nil { return nil, err } return &out, nil } // Match returns all files matching the expression. // If it's a static path, returns path. // All returned path will have the host platform separator. func (g *GlobPath) Match() []string { // This string replacement is for backwards compatibility support // The original implementation allowed **.txt but the double star package requires **/**.txt g.path = strings.ReplaceAll(g.path, "**/**", "**") g.path = strings.ReplaceAll(g.path, "**", "**/**") //nolint:errcheck // pattern is known files, _ := doublestar.Glob(g.path) return files } // MatchString tests the path string against the glob. The path should contain // the host platform separator. func (g *GlobPath) MatchString(path string) bool { if !g.HasSuperMeta { //nolint:errcheck // pattern is known res, _ := filepath.Match(g.path, path) return res } return g.g.Match(path) } // GetRoots returns a list of files and directories which should be optimal // prefixes of matching files when you have a super-meta in your expression : // - any directory under these roots may contain a matching file // - no file outside of these roots can match the pattern // Note that it returns both files and directories. // All returned path will have the host platform separator. func (g *GlobPath) GetRoots() []string { if !g.hasMeta { return []string{g.path} } if !g.HasSuperMeta { //nolint:errcheck // pattern is known matches, _ := filepath.Glob(g.path) return matches } //nolint:errcheck // pattern is known roots, _ := filepath.Glob(g.rootGlob) return roots } // hasMeta reports whether path contains any magic glob characters. func hasMeta(path string) bool { return strings.ContainsAny(path, "*?[") } // hasSuperMeta reports whether path contains any super magic glob characters (**). func hasSuperMeta(path string) bool { return strings.Contains(path, "**") } ================================================ FILE: internal/globpath/globpath_test.go ================================================ //go:build !windows // TODO: Windows - should be enabled for Windows when super asterisk is fixed on Windows // https://github.com/influxdata/telegraf/issues/6248 package globpath import ( "os" "path/filepath" "runtime" "testing" "github.com/stretchr/testify/require" ) var ( testdataDir = getTestdataDir() ) func TestCompileAndMatch(t *testing.T) { type test struct { path string matches int } tests := []test{ // test super asterisk {path: filepath.Join(testdataDir, "**"), matches: 7}, // test single asterisk {path: filepath.Join(testdataDir, "*.log"), matches: 3}, // test no meta characters (file exists) {path: filepath.Join(testdataDir, "log1.log"), matches: 1}, // test file that doesn't exist {path: filepath.Join(testdataDir, "i_dont_exist.log"), matches: 0}, // test super asterisk that doesn't exist {path: filepath.Join(testdataDir, "dir_doesnt_exist", "**"), matches: 0}, // test exclamation mark creates non-matching list with a range {path: filepath.Join(testdataDir, "log[!1-2]*"), matches: 1}, // test caret creates non-matching list {path: filepath.Join(testdataDir, "log[^1-2]*"), matches: 1}, // test exclamation mark creates non-matching list without a range {path: filepath.Join(testdataDir, "log[!2]*"), matches: 2}, // test exclamation mark creates non-matching list without a range //nolint:gocritic // filepathJoin - '\\' used to escape in glob, not path separator {path: filepath.Join(testdataDir, "log\\[!*"), matches: 1}, // test exclamation mark creates non-matching list without a range //nolint:gocritic // filepathJoin - '\\' used to escape in glob, not path separator {path: filepath.Join(testdataDir, "log\\[^*"), matches: 0}, } for _, tc := range tests { g, err := Compile(tc.path) require.NoError(t, err) matches := g.Match() require.Len(t, matches, tc.matches) } } func TestRootGlob(t *testing.T) { tests := []struct { input string output string }{ {filepath.Join(testdataDir, "**"), filepath.Join(testdataDir, "*")}, {filepath.Join(testdataDir, "nested?", "**"), filepath.Join(testdataDir, "nested?", "*")}, {filepath.Join(testdataDir, "ne**", "nest*"), filepath.Join(testdataDir, "ne*")}, {filepath.Join(testdataDir, "nested?", "*"), ""}, } for _, test := range tests { actual, err := Compile(test.input) require.NoError(t, err) require.Equal(t, actual.rootGlob, test.output) } } func TestFindNestedTextFile(t *testing.T) { // test super asterisk g1, err := Compile(filepath.Join(testdataDir, "**.txt")) require.NoError(t, err) matches := g1.Match() require.Len(t, matches, 1) } func TestMatch_ErrPermission(t *testing.T) { tests := []struct { input string expected []string }{ {"/root/foo", []string(nil)}, {"/root/f*", []string(nil)}, } for _, test := range tests { glob, err := Compile(test.input) require.NoError(t, err) actual := glob.Match() require.Equal(t, test.expected, actual) } } func TestWindowsSeparator(t *testing.T) { //nolint:staticcheck // Silence linter for now as we plan to reenable tests for Windows later if runtime.GOOS != "windows" { t.Skip("Skipping Windows only test") } glob, err := Compile("testdata/nested1") require.NoError(t, err) ok := glob.MatchString("testdata\\nested1") require.True(t, ok) } func getTestdataDir() string { dir, err := os.Getwd() if err != nil { // if we cannot even establish the test directory, further progress is meaningless panic(err) } return filepath.Join(dir, "testdata") } ================================================ FILE: internal/globpath/testdata/log1.log ================================================ ================================================ FILE: internal/globpath/testdata/log2.log ================================================ ================================================ FILE: internal/globpath/testdata/log[!.log ================================================ ================================================ FILE: internal/globpath/testdata/nested1/nested2/nested.txt ================================================ ================================================ FILE: internal/globpath/testdata/test.conf ================================================ # this is a fake testing config file # for testing the filestat plugin option1 = "foo" option2 = "bar" ================================================ FILE: internal/goplugin/noplugin.go ================================================ //go:build !goplugin package goplugin import "errors" func LoadExternalPlugins(_ string) error { return errors.New("go plugin support is not enabled") } ================================================ FILE: internal/goplugin/plugin.go ================================================ //go:build goplugin package goplugin import ( "fmt" "os" "path" "path/filepath" "plugin" "strings" ) // loadExternalPlugins loads external plugins from shared libraries (.so, .dll, etc.) // in the specified directory. func LoadExternalPlugins(rootDir string) error { return filepath.Walk(rootDir, func(pth string, info os.FileInfo, err error) error { // Stop if there was an error. if err != nil { return err } // Ignore directories. if info.IsDir() { return nil } // Ignore files that aren't shared libraries. ext := strings.ToLower(path.Ext(pth)) if ext != ".so" && ext != ".dll" { return nil } // Load plugin. _, err = plugin.Open(pth) if err != nil { return fmt.Errorf("error loading %s: %s", pth, err) } return nil }) } ================================================ FILE: internal/host_endianness_be.go ================================================ //go:build armbe || arm64be || mips || mips64 || mips64p32 || ppc || ppc64 || s390 || s390x || sparc || sparc64 package internal import "encoding/binary" var HostEndianness = binary.BigEndian ================================================ FILE: internal/host_endianness_le.go ================================================ //go:build 386 || amd64 || amd64p32 || arm || arm64 || loong64 || mipsle || mips64le || mips64p32le || ppc64le || riscv || riscv64 || wasm package internal import "encoding/binary" var HostEndianness = binary.LittleEndian ================================================ FILE: internal/http.go ================================================ package internal import ( "crypto/subtle" "errors" "fmt" "net" "net/http" "net/url" "strings" "github.com/golang-jwt/jwt/v5" ) type BasicAuthErrorFunc func(rw http.ResponseWriter) // JWTAuthHandler returns a http handler that requires the HTTP bearer auth // token to be valid and match the given user. func JWTAuthHandler(secret, username string, onError BasicAuthErrorFunc) func(h http.Handler) http.Handler { return func(h http.Handler) http.Handler { return &jwtAuthHandler{ secret: []byte(secret), username: []byte(username), onError: onError, next: h, } } } type jwtAuthHandler struct { secret []byte username []byte onError BasicAuthErrorFunc next http.Handler } func (h *jwtAuthHandler) ServeHTTP(rw http.ResponseWriter, req *http.Request) { authHeader := req.Header.Get("Authentication") if !strings.HasPrefix(authHeader, "Bearer ") { h.onError(rw) http.Error(rw, http.StatusText(http.StatusUnauthorized), http.StatusUnauthorized) return } bearer := strings.TrimPrefix(authHeader, "Bearer ") token, err := jwt.Parse(bearer, func(t *jwt.Token) (interface{}, error) { if _, ok := t.Method.(*jwt.SigningMethodHMAC); !ok { return nil, fmt.Errorf("unexpected signing method: %v", t.Method) } return h.secret, nil }) if err != nil || !token.Valid { h.onError(rw) if err != nil && errors.Is(err, jwt.ErrTokenExpired) { http.Error(rw, "token expired", http.StatusUnauthorized) } else if err != nil { http.Error(rw, "invalid token: "+err.Error(), http.StatusUnauthorized) } else { http.Error(rw, "invalid token", http.StatusUnauthorized) } return } claims, ok := token.Claims.(jwt.MapClaims) if !ok { h.onError(rw) http.Error(rw, "problem authenticating token", http.StatusInternalServerError) return } username, ok := claims["username"].(string) if !ok || username == "" { h.onError(rw) http.Error(rw, "token must contain a string username", http.StatusUnauthorized) return } if subtle.ConstantTimeCompare([]byte(username), h.username) != 1 { h.onError(rw) http.Error(rw, http.StatusText(http.StatusUnauthorized), http.StatusUnauthorized) return } h.next.ServeHTTP(rw, req) } // BasicAuthHandler returns a http handler that requires HTTP basic auth // credentials to match the given username and password. func BasicAuthHandler(username, password, realm string, onError BasicAuthErrorFunc) func(h http.Handler) http.Handler { return func(h http.Handler) http.Handler { return &basicAuthHandler{ username: username, password: password, realm: realm, onError: onError, next: h, } } } type basicAuthHandler struct { username string password string realm string onError BasicAuthErrorFunc next http.Handler } func (h *basicAuthHandler) ServeHTTP(rw http.ResponseWriter, req *http.Request) { if h.username == "" && h.password == "" { h.next.ServeHTTP(rw, req) return } var reqUsername, reqPassword string var ok bool authHeader := req.Header.Get("Authorization") if strings.HasPrefix(authHeader, "Token ") { token := strings.TrimPrefix(authHeader, "Token ") reqUsername, reqPassword, ok = strings.Cut(token, ":") } else { reqUsername, reqPassword, ok = req.BasicAuth() } if !ok || subtle.ConstantTimeCompare([]byte(reqUsername), []byte(h.username)) != 1 || subtle.ConstantTimeCompare([]byte(reqPassword), []byte(h.password)) != 1 { rw.Header().Set("WWW-Authenticate", "Basic realm=\""+h.realm+"\"") h.onError(rw) http.Error(rw, http.StatusText(http.StatusUnauthorized), http.StatusUnauthorized) return } h.next.ServeHTTP(rw, req) } type GenericAuthErrorFunc func(rw http.ResponseWriter) // GenericAuthHandler returns a http handler that requires `Authorization: ` func GenericAuthHandler(credentials string, onError GenericAuthErrorFunc) func(h http.Handler) http.Handler { return func(h http.Handler) http.Handler { return &genericAuthHandler{ credentials: credentials, onError: onError, next: h, } } } // Generic auth scheme handler - exact match on `Authorization: ` type genericAuthHandler struct { credentials string onError GenericAuthErrorFunc next http.Handler } func (h *genericAuthHandler) ServeHTTP(rw http.ResponseWriter, req *http.Request) { if h.credentials != "" { // Scheme checking authorization := req.Header.Get("Authorization") if subtle.ConstantTimeCompare([]byte(authorization), []byte(h.credentials)) != 1 { h.onError(rw) http.Error(rw, http.StatusText(http.StatusUnauthorized), http.StatusUnauthorized) return } } h.next.ServeHTTP(rw, req) } // ErrorFunc is a callback for writing an error response. type ErrorFunc func(rw http.ResponseWriter, code int) // IPRangeHandler returns a http handler that requires the remote address to be // in the specified network. func IPRangeHandler(networks []*net.IPNet, onError ErrorFunc) func(h http.Handler) http.Handler { return func(h http.Handler) http.Handler { return &ipRangeHandler{ networks: networks, onError: onError, next: h, } } } type ipRangeHandler struct { networks []*net.IPNet onError ErrorFunc next http.Handler } func (h *ipRangeHandler) ServeHTTP(rw http.ResponseWriter, req *http.Request) { if len(h.networks) == 0 { h.next.ServeHTTP(rw, req) return } remoteIPString, _, err := net.SplitHostPort(req.RemoteAddr) if err != nil { h.onError(rw, http.StatusForbidden) return } remoteIP := net.ParseIP(remoteIPString) if remoteIP == nil { h.onError(rw, http.StatusForbidden) return } for _, network := range h.networks { if network.Contains(remoteIP) { h.next.ServeHTTP(rw, req) return } } h.onError(rw, http.StatusForbidden) } func OnClientError(client *http.Client, err error) { // Close connection after a timeout error. If this is a HTTP2 // connection this ensures that next interval a new connection will be // used and name lookup will be performed. // https://github.com/golang/go/issues/36026 var urlErr *url.Error if errors.As(err, &urlErr) && urlErr.Timeout() { client.CloseIdleConnections() } } ================================================ FILE: internal/internal.go ================================================ package internal import ( "bufio" "compress/gzip" "context" crypto_rand "crypto/rand" "errors" "fmt" "io" "log" "math/big" "math/rand" "os" "os/exec" "regexp" "runtime" "strings" "sync" "syscall" "time" "unicode" "github.com/influxdata/telegraf/internal/choice" ) const alphanum string = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz" const NoMetricsCreatedMsg = "No metrics were created from a message. Verify your parser settings. This message is only printed once." var once sync.Once var ( ErrTimeout = errors.New("command timed out") ErrNotImplemented = errors.New("not implemented yet") // Regexp for extracting the go version from runtime information reGoVer = regexp.MustCompile(`go(\d+\.\d+\.\d+).*`) ) // Set via LDFLAGS -X var ( Version = "unknown" Branch = "" Commit = "" ) type ReadWaitCloser struct { pipeReader *io.PipeReader wg sync.WaitGroup } func FormatFullVersion() string { var parts = []string{"Telegraf"} if Version != "" { parts = append(parts, Version) } else { parts = append(parts, "unknown") } if Branch != "" || Commit != "" { if Branch == "" { Branch = "unknown" } if Commit == "" { Commit = "unknown" } git := fmt.Sprintf("(git: %s@%s)", Branch, Commit) parts = append(parts, git) } return strings.Join(parts, " ") } // ProductToken returns a tag for Telegraf that can be used in user agents. func ProductToken() string { gover := strings.TrimPrefix(runtime.Version(), "go") if g := reGoVer.FindStringSubmatch(runtime.Version()); len(g) == 2 { gover = g[1] } return fmt.Sprintf("Telegraf/%s Go/%s", Version, gover) } // ReadLines reads contents from a file and splits them by new lines. func ReadLines(filename string) ([]string, error) { f, err := os.Open(filename) if err != nil { return []string{""}, err } defer f.Close() var ret []string scanner := bufio.NewScanner(f) for scanner.Scan() { ret = append(ret, scanner.Text()) } return ret, nil } // RandomString returns a random string of alphanumeric characters func RandomString(n int) (string, error) { var bytes = make([]byte, n) _, err := crypto_rand.Read(bytes) if err != nil { return "", err } for i, b := range bytes { bytes[i] = alphanum[b%byte(len(alphanum))] } return string(bytes), nil } // SnakeCase converts the given string to snake case following the Golang format: // acronyms are converted to lower-case and preceded by an underscore. func SnakeCase(in string) string { runes := []rune(in) length := len(runes) var out []rune for i := 0; i < length; i++ { if i > 0 && unicode.IsUpper(runes[i]) { prevLower := unicode.IsLower(runes[i-1]) nextLower := i+1 < length && unicode.IsLower(runes[i+1]) // Special case for plural acronyms nextPlural := i+1 < length && runes[i+1] == 's' if prevLower || (nextLower && !nextPlural) { out = append(out, '_') } } out = append(out, unicode.ToLower(runes[i])) } return string(out) } // RandomSleep will sleep for a random amount of time up to max. // If the shutdown channel is closed, it will return before it has finished sleeping. func RandomSleep(limit time.Duration, shutdown chan struct{}) { sleepDuration := RandomDuration(limit) if sleepDuration == 0 { return } t := time.NewTimer(time.Nanosecond * sleepDuration) select { case <-t.C: return case <-shutdown: t.Stop() return } } // RandomDuration returns a random duration between 0 and max. func RandomDuration(limit time.Duration) time.Duration { if limit == 0 { return 0 } return time.Duration(rand.Int63n(limit.Nanoseconds())) //nolint:gosec // G404: not security critical } // SleepContext sleeps until the context is closed or the duration is reached. func SleepContext(ctx context.Context, duration time.Duration) error { if duration == 0 { return nil } t := time.NewTimer(duration) select { case <-t.C: return nil case <-ctx.Done(): t.Stop() return ctx.Err() } } // AlignDuration returns the duration until next aligned interval. // If the current time is aligned a 0 duration is returned. func AlignDuration(tm time.Time, interval time.Duration) time.Duration { return AlignTime(tm, interval).Sub(tm) } // AlignTime returns the time of the next aligned interval. // If the current time is aligned the current time is returned. func AlignTime(tm time.Time, interval time.Duration) time.Time { truncated := tm.Truncate(interval) if truncated.Equal(tm) { return tm } return truncated.Add(interval) } // ExitStatus takes the error from exec.Command // and returns the exit status and true // if error is not exit status, will return 0 and false func ExitStatus(err error) (int, bool) { var exitErr *exec.ExitError if errors.As(err, &exitErr) { if status, ok := exitErr.Sys().(syscall.WaitStatus); ok { return status.ExitStatus(), true } } return 0, false } func (r *ReadWaitCloser) Close() error { err := r.pipeReader.Close() r.wg.Wait() // wait for the gzip goroutine finish return err } // CompressWithGzip takes an io.Reader as input and pipes it through a // gzip.Writer returning an io.Reader containing the gzipped data. // Errors occurring during compression are returned to the instance reading // from the returned reader via through the corresponding read call // (e.g. io.Copy or io.ReadAll). func CompressWithGzip(data io.Reader) io.ReadCloser { pipeReader, pipeWriter := io.Pipe() gzipWriter := gzip.NewWriter(pipeWriter) // Start copying from the uncompressed reader to the output reader // in the background until the input reader is closed (or errors out). go func() { // This copy will block until "data" reached EOF or an error occurs _, err := io.Copy(gzipWriter, data) // Close the compression writer and make sure we do not overwrite // the copy error if any. gzipErr := gzipWriter.Close() if err == nil { err = gzipErr } // Subsequent reads from the output reader (connected to "pipeWriter" // via pipe) will return the copy (or closing) error if any to the // instance reading from the reader returned by the CompressWithGzip // function. If "err" is nil, the below function will correctly report // io.EOF. pipeWriter.CloseWithError(err) }() // Return a reader which then can be read by the caller to collect the // compressed stream. return pipeReader } // ParseTimestamp parses a Time according to the standard Telegraf options. // These are generally displayed in the toml similar to: // // json_time_key= "timestamp" // json_time_format = "2006-01-02T15:04:05Z07:00" // json_timezone = "America/Los_Angeles" // // The format can be one of "unix", "unix_ms", "unix_us", "unix_ns", or a Go // time layout suitable for time.Parse. // // When using the "unix" format, an optional fractional component is allowed. // Specific unix time precisions cannot have a fractional component. // // Unix times may be an int64, float64, or string. When using a Go format // string the timestamp must be a string. // // The location is a location string suitable for time.LoadLocation. Unix // times do not use the location string, a unix time is always return in the // UTC location. func ParseTimestamp(format string, timestamp interface{}, location *time.Location, separator ...string) (time.Time, error) { switch format { case "unix", "unix_ms", "unix_us", "unix_ns": sep := []string{",", "."} if len(separator) > 0 { sep = separator } return parseUnix(format, timestamp, sep) case "timestamp_tz", "timestamp_tz_ms", "timestamp_tz_us", "timestamp_tz_ns": fmtUnix := "unix" + strings.TrimPrefix(format, "timestamp_tz") t, err := ParseTimestamp(fmtUnix, timestamp, location, separator...) if err != nil { return t, err } _, offset := t.In(location).Zone() return t.Add(-time.Duration(offset) * time.Second), nil default: v, ok := timestamp.(string) if !ok { return time.Unix(0, 0), errors.New("unsupported type") } return parseTime(format, v, location) } } // parseTime parses a timestamp in unix format with different resolutions func parseUnix(format string, timestamp interface{}, separator []string) (time.Time, error) { // Extract the scaling factor to nanoseconds from "format" var factor int64 switch format { case "unix": factor = int64(time.Second) case "unix_ms": factor = int64(time.Millisecond) case "unix_us": factor = int64(time.Microsecond) case "unix_ns": factor = int64(time.Nanosecond) } zero := time.Unix(0, 0) // Convert the representation to time switch v := timestamp.(type) { case int, int8, int16, int32, int64, uint, uint8, uint16, uint32, uint64: t, err := ToInt64(v) if err != nil { return zero, err } return time.Unix(0, t*factor).UTC(), nil case float32, float64: ts, err := ToFloat64(v) if err != nil { return zero, err } // Parse the float as a precise fraction to avoid precision loss f := big.Rat{} if f.SetFloat64(ts) == nil { return zero, errors.New("invalid number") } return timeFromFraction(&f, factor), nil case string: // Sanitize the string to have no thousand separators and dot // as decimal separator to ease later parsing v = sanitizeTimestamp(v, separator) // Parse the string as a precise fraction to avoid precision loss f := big.Rat{} if _, ok := f.SetString(v); !ok { return zero, errors.New("invalid number") } return timeFromFraction(&f, factor), nil } return zero, errors.New("unsupported type") } func timeFromFraction(f *big.Rat, factor int64) time.Time { // Extract the numerator and denominator and scale to nanoseconds num := f.Num() denom := f.Denom() num.Mul(num, big.NewInt(factor)) // Get the integer (non-fractional part) of the timestamp and convert // it into time t := big.Int{} t.Div(num, denom) return time.Unix(0, t.Int64()).UTC() } // sanitizeTimestamp removes thousand separators and uses dot as // decimal separator. Returns also a boolean indicating success. func sanitizeTimestamp(timestamp string, decimalSeparator []string) string { // Remove thousand-separators that are not used for decimal separation sanitized := timestamp for _, s := range []string{" ", ",", "."} { if !choice.Contains(s, decimalSeparator) { sanitized = strings.ReplaceAll(sanitized, s, "") } } // Replace decimal separators by dot to have a standard, parsable format for _, s := range decimalSeparator { // Make sure we replace only the first occurrence of any separator. if strings.Contains(sanitized, s) { return strings.Replace(sanitized, s, ".", 1) } } return sanitized } // parseTime parses a string timestamp according to the format string. func parseTime(format, timestamp string, location *time.Location) (time.Time, error) { loc := location if loc == nil { loc = time.UTC } switch strings.ToLower(format) { case "ansic": format = time.ANSIC case "unixdate": format = time.UnixDate case "rubydate": format = time.RubyDate case "rfc822": format = time.RFC822 case "rfc822z": format = time.RFC822Z case "rfc850": format = time.RFC850 case "rfc1123": format = time.RFC1123 case "rfc1123z": format = time.RFC1123Z case "rfc3339": format = time.RFC3339 case "rfc3339nano": format = time.RFC3339Nano case "stamp": format = time.Stamp case "stampmilli": format = time.StampMilli case "stampmicro": format = time.StampMicro case "stampnano": format = time.StampNano } if !strings.Contains(format, "MST") { return time.ParseInLocation(format, timestamp, loc) } // Golang does not parse times with ambiguous timezone abbreviations, // but only parses the time-fields and the timezone NAME with a zero // offset (see https://groups.google.com/g/golang-nuts/c/hDMdnm_jUFQ/m/yeL9IHOsAQAJ). // To handle those timezones correctly we can use the timezone-name and // force parsing the time in that timezone. This way we get the correct // time for the "most probably" of the ambiguous timezone-abbreviations. ts, err := time.Parse(format, timestamp) if err != nil { return time.Time{}, err } zone, offset := ts.Zone() if zone == "UTC" || offset != 0 { return ts.In(loc), nil } once.Do(func() { const msg = `Your config is using abbreviated timezones and parsing was changed in v1.27.0! Please see the change log, remove any workarounds in place, and carefully check your data timestamps! If case you experience any problems, please file an issue on https://github.com/influxdata/telegraf/issues!` log.Print("W! " + msg) }) abbrevLoc, err := time.LoadLocation(zone) if err != nil { return time.Time{}, fmt.Errorf("cannot resolve timezone abbreviation %q: %w", zone, err) } ts, err = time.ParseInLocation(format, timestamp, abbrevLoc) if err != nil { return time.Time{}, err } return ts.In(loc), nil } ================================================ FILE: internal/internal_test.go ================================================ package internal import ( "bytes" "compress/gzip" "crypto/rand" "io" "log" "os/exec" "regexp" "sync" "testing" "time" "github.com/stretchr/testify/require" ) type SnakeTest struct { input string output string } var tests = []SnakeTest{ {"a", "a"}, {"snake", "snake"}, {"A", "a"}, {"ID", "id"}, {"MOTD", "motd"}, {"Snake", "snake"}, {"SnakeTest", "snake_test"}, {"APIResponse", "api_response"}, {"SnakeID", "snake_id"}, {"SnakeIDGoogle", "snake_id_google"}, {"LinuxMOTD", "linux_motd"}, {"OMGWTFBBQ", "omgwtfbbq"}, {"omg_wtf_bbq", "omg_wtf_bbq"}, {"ConsumedLCUs", "consumed_lcus"}, } func TestSnakeCase(t *testing.T) { for _, test := range tests { t.Run(test.input, func(t *testing.T) { require.Equal(t, test.output, SnakeCase(test.input)) }) } } func TestRunTimeout(t *testing.T) { t.Skip("Skipping test due to random failures & a data race when running test-all.") sleepbin, err := exec.LookPath("sleep") if err != nil || sleepbin == "" { t.Skip("'sleep' binary not available on OS, skipping.") } cmd := exec.Command(sleepbin, "10") start := time.Now() err = RunTimeout(cmd, time.Millisecond*20) elapsed := time.Since(start) require.Equal(t, ErrTimeout, err) // Verify that command gets killed in 20ms, with some breathing room require.Less(t, elapsed, time.Millisecond*75) } // Verifies behavior of a command that doesn't get killed. func TestRunTimeoutFastExit(t *testing.T) { if testing.Short() { t.Skip("Skipping test due to random failures.") } echobin, err := exec.LookPath("echo") if err != nil || echobin == "" { t.Skip("'echo' binary not available on OS, skipping.") } cmd := exec.Command(echobin) start := time.Now() err = RunTimeout(cmd, time.Millisecond*20) buf := &bytes.Buffer{} log.SetOutput(buf) elapsed := time.Since(start) require.NoError(t, err) // Verify that command gets killed in 20ms, with some breathing room require.Less(t, elapsed, time.Millisecond*75) // Verify "process already finished" log doesn't occur. time.Sleep(time.Millisecond * 75) require.Empty(t, buf.String()) } func TestCombinedOutputTimeout(t *testing.T) { // TODO: Fix this test t.Skip("Test failing too often, skip for now and revisit later.") sleepbin, err := exec.LookPath("sleep") if err != nil || sleepbin == "" { t.Skip("'sleep' binary not available on OS, skipping.") } cmd := exec.Command(sleepbin, "10") start := time.Now() _, err = CombinedOutputTimeout(cmd, time.Millisecond*20) elapsed := time.Since(start) require.Equal(t, ErrTimeout, err) // Verify that command gets killed in 20ms, with some breathing room require.Less(t, elapsed, time.Millisecond*75) } func TestCombinedOutput(t *testing.T) { echobin, err := exec.LookPath("echo") if err != nil || echobin == "" { t.Skip("'echo' binary not available on OS, skipping.") } cmd := exec.Command(echobin, "foo") out, err := CombinedOutputTimeout(cmd, time.Second) require.NoError(t, err) require.Equal(t, "foo\n", string(out)) } // test that CombinedOutputTimeout and exec.Cmd.CombinedOutput return // the same output from a failed command. func TestCombinedOutputError(t *testing.T) { shell, err := exec.LookPath("sh") if err != nil || shell == "" { t.Skip("'sh' binary not available on OS, skipping.") } cmd := exec.Command(shell, "-c", "false") expected, err := cmd.CombinedOutput() require.Error(t, err) cmd2 := exec.Command(shell, "-c", "false") actual, err := CombinedOutputTimeout(cmd2, time.Second) require.Error(t, err) require.Equal(t, expected, actual) } func TestRunError(t *testing.T) { shell, err := exec.LookPath("sh") if err != nil || shell == "" { t.Skip("'sh' binary not available on OS, skipping.") } cmd := exec.Command(shell, "-c", "false") err = RunTimeout(cmd, time.Second) require.Error(t, err) } func TestRandomSleep(t *testing.T) { // TODO: Fix this test t.Skip("Test failing too often, skip for now and revisit later.") // test that zero max returns immediately s := time.Now() RandomSleep(time.Duration(0), make(chan struct{})) elapsed := time.Since(s) require.Less(t, elapsed, time.Millisecond) // test that max sleep is respected s = time.Now() RandomSleep(time.Millisecond*50, make(chan struct{})) elapsed = time.Since(s) require.Less(t, elapsed, time.Millisecond*100) // test that shutdown is respected s = time.Now() shutdown := make(chan struct{}) go func() { time.Sleep(time.Millisecond * 100) close(shutdown) }() RandomSleep(time.Second, shutdown) elapsed = time.Since(s) require.Less(t, elapsed, time.Millisecond*150) } func TestCompressWithGzip(t *testing.T) { testData := "the quick brown fox jumps over the lazy dog" inputBuffer := bytes.NewBufferString(testData) outputBuffer := CompressWithGzip(inputBuffer) gzipReader, err := gzip.NewReader(outputBuffer) require.NoError(t, err) defer gzipReader.Close() output, err := io.ReadAll(gzipReader) require.NoError(t, err) require.Equal(t, testData, string(output)) } type mockReader struct { err error ncalls uint64 // record the number of calls to Read msg []byte } func (r *mockReader) Read(p []byte) (n int, err error) { r.ncalls++ if len(r.msg) > 0 { n, err = copy(p, r.msg), io.EOF } else { n, err = rand.Read(p) } if r.err == nil { return n, err } return n, r.err } func TestCompressWithGzipEarlyClose(t *testing.T) { mr := &mockReader{} rc := CompressWithGzip(mr) n, err := io.CopyN(io.Discard, rc, 10000) require.NoError(t, err) require.Equal(t, int64(10000), n) r1 := mr.ncalls require.NoError(t, rc.Close()) n, err = io.CopyN(io.Discard, rc, 10000) require.ErrorIs(t, err, io.ErrClosedPipe) require.Equal(t, int64(0), n) r2 := mr.ncalls // no more read to the source after closing require.Equal(t, r1, r2) } func TestCompressWithGzipErrorPropagationCopy(t *testing.T) { errs := []error{io.ErrClosedPipe, io.ErrNoProgress, io.ErrUnexpectedEOF} for _, expected := range errs { r := &mockReader{msg: []byte("this is a test"), err: expected} rc := CompressWithGzip(r) n, err := io.Copy(io.Discard, rc) require.Positive(t, n) require.ErrorIs(t, err, expected) require.NoError(t, rc.Close()) } } func TestCompressWithGzipErrorPropagationReadAll(t *testing.T) { errs := []error{io.ErrClosedPipe, io.ErrNoProgress, io.ErrUnexpectedEOF} for _, expected := range errs { r := &mockReader{msg: []byte("this is a test"), err: expected} rc := CompressWithGzip(r) buf, err := io.ReadAll(rc) require.NotEmpty(t, buf) require.ErrorIs(t, err, expected) require.NoError(t, rc.Close()) } } func TestAlignDuration(t *testing.T) { tests := []struct { name string now time.Time interval time.Duration expected time.Duration }{ { name: "aligned", now: time.Date(2018, 1, 1, 1, 1, 0, 0, time.UTC), interval: 10 * time.Second, expected: 0 * time.Second, }, { name: "standard interval", now: time.Date(2018, 1, 1, 1, 1, 1, 0, time.UTC), interval: 10 * time.Second, expected: 9 * time.Second, }, { name: "odd interval", now: time.Date(2018, 1, 1, 1, 1, 1, 0, time.UTC), interval: 3 * time.Second, expected: 2 * time.Second, }, { name: "sub second interval", now: time.Date(2018, 1, 1, 1, 1, 0, 5e8, time.UTC), interval: 1 * time.Second, expected: 500 * time.Millisecond, }, { name: "non divisible not aligned on minutes", now: time.Date(2018, 1, 1, 1, 0, 0, 0, time.UTC), interval: 1*time.Second + 100*time.Millisecond, expected: 400 * time.Millisecond, }, { name: "long interval", now: time.Date(2018, 1, 1, 1, 1, 0, 0, time.UTC), interval: 1 * time.Hour, expected: 59 * time.Minute, }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { actual := AlignDuration(tt.now, tt.interval) require.Equal(t, tt.expected, actual) }) } } func TestAlignTime(t *testing.T) { rfc3339 := func(value string) time.Time { tt, err := time.Parse(time.RFC3339, value) require.NoError(t, err) return tt } tests := []struct { name string now time.Time interval time.Duration expected time.Time }{ { name: "aligned", now: rfc3339("2018-01-01T01:01:00Z"), interval: 10 * time.Second, expected: rfc3339("2018-01-01T01:01:00Z"), }, { name: "aligned", now: rfc3339("2018-01-01T01:01:01Z"), interval: 10 * time.Second, expected: rfc3339("2018-01-01T01:01:10Z"), }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { actual := AlignTime(tt.now, tt.interval) require.Equal(t, tt.expected, actual) }) } } func TestParseTimestamp(t *testing.T) { rfc3339 := func(value string) time.Time { tm, err := time.Parse(time.RFC3339Nano, value) require.NoError(t, err) return tm } ansic := func(value string) time.Time { tm, err := time.Parse(time.ANSIC, value) require.NoError(t, err) return tm } rubydate := func(value string) time.Time { tm, err := time.Parse(time.RubyDate, value) require.NoError(t, err) return tm } rfc822z := func(value string) time.Time { tm, err := time.Parse(time.RFC822Z, value) require.NoError(t, err) return tm } rfc1123z := func(value string) time.Time { tm, err := time.Parse(time.RFC1123Z, value) require.NoError(t, err) return tm } rfc3339nano := func(value string) time.Time { tm, err := time.Parse(time.RFC3339Nano, value) require.NoError(t, err) return tm } stamp := func(value string) time.Time { tm, err := time.Parse(time.Stamp, value) require.NoError(t, err) return tm } stampmilli := func(value string) time.Time { tm, err := time.Parse(time.StampMilli, value) require.NoError(t, err) return tm } stampmicro := func(value string) time.Time { tm, err := time.Parse(time.StampMicro, value) require.NoError(t, err) return tm } stampnano := func(value string) time.Time { tm, err := time.Parse(time.StampNano, value) require.NoError(t, err) return tm } tests := []struct { name string format string timestamp interface{} location string separator []string expected time.Time }{ { name: "parse layout string in utc", format: "2006-01-02 15:04:05", timestamp: "2019-02-20 21:50:34", location: "UTC", expected: rfc3339("2019-02-20T21:50:34Z"), }, { name: "layout regression 6386", format: "02.01.2006 15:04:05", timestamp: "09.07.2019 00:11:00", expected: rfc3339("2019-07-09T00:11:00Z"), }, { name: "default location is utc", format: "2006-01-02 15:04:05", timestamp: "2019-02-20 21:50:34", expected: rfc3339("2019-02-20T21:50:34Z"), }, { name: "unix seconds without fractional", format: "unix", timestamp: "1568338208", expected: rfc3339("2019-09-13T01:30:08Z"), }, { name: "unix seconds with fractional", format: "unix", timestamp: "1568338208.500", expected: rfc3339("2019-09-13T01:30:08.500Z"), }, { name: "unix seconds with fractional and comma decimal point", format: "unix", timestamp: "1568338208,500", expected: rfc3339("2019-09-13T01:30:08.500Z"), }, { name: "unix seconds extra precision", format: "unix", timestamp: "1568338208.00000050042", expected: rfc3339("2019-09-13T01:30:08.000000500Z"), }, { name: "unix seconds with thousand separator only (dot)", format: "unix", timestamp: "1.568.338.208", separator: []string{","}, expected: rfc3339("2019-09-13T01:30:08Z"), }, { name: "unix seconds with thousand separator only (comma)", format: "unix", timestamp: "1,568,338,208", separator: []string{"."}, expected: rfc3339("2019-09-13T01:30:08Z"), }, { name: "unix seconds with thousand separator only (space)", format: "unix", timestamp: "1 568 338 208", separator: []string{"."}, expected: rfc3339("2019-09-13T01:30:08Z"), }, { name: "unix seconds with thousand separator only (underscore)", format: "unix", timestamp: "1_568_338_208", separator: []string{"."}, expected: rfc3339("2019-09-13T01:30:08Z"), }, { name: "unix seconds with thousand and decimal separator (US)", format: "unix", timestamp: "1,568,338,208.500", separator: []string{"."}, expected: rfc3339("2019-09-13T01:30:08.500Z"), }, { name: "unix seconds with thousand and decimal separator (EU)", format: "unix", timestamp: "1.568.338.208,500", separator: []string{","}, expected: rfc3339("2019-09-13T01:30:08.500Z"), }, { name: "unix seconds integer", format: "unix", timestamp: int64(1568338208), expected: rfc3339("2019-09-13T01:30:08Z"), }, { name: "unix seconds float", format: "unix", timestamp: float64(1568338208.500), expected: rfc3339("2019-09-13T01:30:08.500Z"), }, { name: "unix seconds float exponential", format: "unix", timestamp: float64(1.5683382085e+9), expected: rfc3339("2019-09-13T01:30:08.500Z"), }, { name: "unix milliseconds", format: "unix_ms", timestamp: "1568338208500", expected: rfc3339("2019-09-13T01:30:08.500Z"), }, { name: "unix milliseconds with fractional", format: "unix_ms", timestamp: "1568338208500.42", expected: rfc3339("2019-09-13T01:30:08.50042Z"), }, { name: "unix microseconds", format: "unix_us", timestamp: "1568338208000500", expected: rfc3339("2019-09-13T01:30:08.000500Z"), }, { name: "unix nanoseconds", format: "unix_ns", timestamp: "1568338208000000500", expected: rfc3339("2019-09-13T01:30:08.000000500Z"), }, { name: "unix nanoseconds exponential", format: "unix_ns", timestamp: "1.5683382080000005e+18", expected: rfc3339("2019-09-13T01:30:08.000000500Z"), }, { name: "timestamp with timezone seconds without fractional", format: "timestamp_tz", timestamp: "1568338208", location: "Pacific/Fiji", expected: rfc3339("2019-09-13T01:30:08+12:00"), }, { name: "timestamp with timezone seconds with fractional", format: "timestamp_tz", timestamp: "1568338208.500", location: "Pacific/Fiji", expected: rfc3339("2019-09-13T01:30:08.500+12:00"), }, { name: "timestamp with timezone seconds with fractional and comma decimal point", format: "timestamp_tz", timestamp: "1568338208,500", location: "Pacific/Fiji", expected: rfc3339("2019-09-13T01:30:08.500+12:00"), }, { name: "timestamp with timezone seconds extra precision", format: "timestamp_tz", timestamp: "1568338208.00000050042", location: "Pacific/Fiji", expected: rfc3339("2019-09-13T01:30:08.000000500+12:00"), }, { name: "timestamp with timezone seconds with thousand separator only (dot)", format: "timestamp_tz", timestamp: "1.568.338.208", separator: []string{","}, location: "Pacific/Fiji", expected: rfc3339("2019-09-13T01:30:08+12:00"), }, { name: "timestamp with timezone seconds with thousand separator only (comma)", format: "timestamp_tz", timestamp: "1,568,338,208", separator: []string{"."}, location: "Pacific/Fiji", expected: rfc3339("2019-09-13T01:30:08+12:00"), }, { name: "timestamp with timezone seconds with thousand separator only (space)", format: "timestamp_tz", timestamp: "1 568 338 208", separator: []string{"."}, location: "Pacific/Fiji", expected: rfc3339("2019-09-13T01:30:08+12:00"), }, { name: "timestamp with timezone seconds with thousand separator only (underscore)", format: "timestamp_tz", timestamp: "1_568_338_208", separator: []string{"."}, location: "Pacific/Fiji", expected: rfc3339("2019-09-13T01:30:08+12:00"), }, { name: "timestamp with timezone seconds with thousand and decimal separator (US)", format: "timestamp_tz", timestamp: "1,568,338,208.500", separator: []string{"."}, location: "Pacific/Fiji", expected: rfc3339("2019-09-13T01:30:08.500+12:00"), }, { name: "timestamp with timezone seconds with thousand and decimal separator (EU)", format: "timestamp_tz", timestamp: "1.568.338.208,500", separator: []string{","}, location: "Pacific/Fiji", expected: rfc3339("2019-09-13T01:30:08.500+12:00"), }, { name: "timestamp with timezone seconds integer", format: "timestamp_tz", timestamp: int64(1568338208), location: "Pacific/Fiji", expected: rfc3339("2019-09-13T01:30:08+12:00"), }, { name: "timestamp with timezone seconds float", format: "timestamp_tz", timestamp: float64(1568338208.500), location: "Pacific/Fiji", expected: rfc3339("2019-09-13T01:30:08.500+12:00"), }, { name: "timestamp with timezone seconds float exponential", format: "timestamp_tz", timestamp: float64(1.5683382085e+9), location: "Pacific/Fiji", expected: rfc3339("2019-09-13T01:30:08.500+12:00"), }, { name: "timestamp with timezone milliseconds", format: "timestamp_tz_ms", timestamp: "1568338208500", location: "Pacific/Fiji", expected: rfc3339("2019-09-13T01:30:08.500+12:00"), }, { name: "timestamp with timezone milliseconds with fractional", format: "timestamp_tz_ms", timestamp: "1568338208500.42", location: "Pacific/Fiji", expected: rfc3339("2019-09-13T01:30:08.50042+12:00"), }, { name: "timestamp with timezone microseconds", format: "timestamp_tz_us", timestamp: "1568338208000500", location: "Pacific/Fiji", expected: rfc3339("2019-09-13T01:30:08.000500+12:00"), }, { name: "timestamp with timezone nanoseconds", format: "timestamp_tz_ns", timestamp: "1568338208000000500", location: "Pacific/Fiji", expected: rfc3339("2019-09-13T01:30:08.000000500+12:00"), }, { name: "timestamp with timezone nanoseconds exponential", format: "timestamp_tz_ns", timestamp: "1.5683382080000005e+18", location: "Pacific/Fiji", expected: rfc3339("2019-09-13T01:30:08.000000500+12:00"), }, { name: "rfc339 test", format: "RFC3339", timestamp: "2018-10-26T13:30:33Z", expected: rfc3339("2018-10-26T13:30:33Z"), }, { name: "ANSIC", format: "ANSIC", timestamp: "Mon Jan 2 15:04:05 2006", expected: ansic("Mon Jan 2 15:04:05 2006"), }, { name: "UnixDate", format: "UnixDate", timestamp: "Mon Jan 2 15:04:05 MST 2006", expected: time.Unix(1136239445, 0), location: "Local", }, { name: "RubyDate", format: "RubyDate", timestamp: "Mon Jan 02 15:04:05 -0700 2006", expected: rubydate("Mon Jan 02 15:04:05 -0700 2006"), location: "Local", }, { name: "RFC822", format: "RFC822", timestamp: "02 Jan 06 15:04 MST", expected: time.Unix(1136239440, 0), location: "Local", }, { name: "RFC822Z", format: "RFC822Z", timestamp: "02 Jan 06 15:04 -0700", expected: rfc822z("02 Jan 06 15:04 -0700"), location: "Local", }, { name: "RFC850", format: "RFC850", timestamp: "Monday, 02-Jan-06 15:04:05 MST", expected: time.Unix(1136239445, 0), location: "Local", }, { name: "RFC1123", format: "RFC1123", timestamp: "Mon, 02 Jan 2006 15:04:05 MST", expected: time.Unix(1136239445, 0), location: "Local", }, { name: "RFC1123Z", format: "RFC1123Z", timestamp: "Mon, 02 Jan 2006 15:04:05 -0700", expected: rfc1123z("Mon, 02 Jan 2006 15:04:05 -0700"), location: "Local", }, { name: "RFC3339Nano", format: "RFC3339Nano", timestamp: "2006-01-02T15:04:05.999999999-07:00", expected: rfc3339nano("2006-01-02T15:04:05.999999999-07:00"), location: "Local", }, { name: "Stamp", format: "Stamp", timestamp: "Jan 2 15:04:05", expected: stamp("Jan 2 15:04:05"), }, { name: "StampMilli", format: "StampMilli", timestamp: "Jan 2 15:04:05.000", expected: stampmilli("Jan 2 15:04:05.000"), }, { name: "StampMicro", format: "StampMicro", timestamp: "Jan 2 15:04:05.000000", expected: stampmicro("Jan 2 15:04:05.000000"), }, { name: "StampNano", format: "StampNano", timestamp: "Jan 2 15:04:05.000000000", expected: stampnano("Jan 2 15:04:05.000000000"), }, { name: "RFC850", format: "RFC850", timestamp: "Monday, 02-Jan-06 15:04:05 MST", expected: time.Unix(1136239445, 0), }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { // Ensure any one-time warnings are printed for each test once = sync.Once{} // Ensure the warnings are captured and not to stdout var buf bytes.Buffer backup := log.Writer() log.SetOutput(&buf) defer log.SetOutput(backup) var loc *time.Location if tt.location != "" { var err error loc, err = time.LoadLocation(tt.location) require.NoError(t, err) } tm, err := ParseTimestamp(tt.format, tt.timestamp, loc, tt.separator...) require.NoError(t, err) require.Equal(t, tt.expected.Unix(), tm.Unix()) }) } } func TestParseTimestampInvalid(t *testing.T) { tests := []struct { name string format string timestamp interface{} expected string }{ { name: "too few digits", format: "2006-01-02 15:04:05", timestamp: "2019-02-20 21:50", expected: "cannot parse \"\" as \":\"", }, { name: "invalid layout", format: "rfc3399", timestamp: "09.07.2019 00:11:00", expected: "cannot parse \"09.07.2019 00:11:00\" as \"rfc\"", }, { name: "layout not matching time", format: "rfc3339", timestamp: "09.07.2019 00:11:00", expected: "parsing time \"09.07.2019 00:11:00\" as \"2006-01-02T15:04:05Z07:00\": cannot parse", }, { name: "unix wrong type", format: "unix", timestamp: true, expected: "unsupported type", }, { name: "unix multiple separators (dot)", format: "unix", timestamp: "1568338.208.500", expected: "invalid number", }, { name: "unix multiple separators (comma)", format: "unix", timestamp: "1568338,208,500", expected: "invalid number", }, { name: "unix multiple separators (mixed)", format: "unix", timestamp: "1,568,338,208.500", expected: "invalid number", }, { name: "invalid timezone abbreviation", format: "RFC850", timestamp: "Monday, 02-Jan-06 15:04:05 CDT", expected: "cannot resolve timezone abbreviation", }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { // Ensure any one-time warnings are printed for each test once = sync.Once{} // Ensure the warnings are captured and not to stdout var buf bytes.Buffer backup := log.Writer() log.SetOutput(&buf) defer log.SetOutput(backup) _, err := ParseTimestamp(tt.format, tt.timestamp, nil) require.ErrorContains(t, err, tt.expected) }) } } func TestTimestampAbbrevWarning(t *testing.T) { // Ensure any one-time warnings are printed for each test once = sync.Once{} // Ensure the warnings are captured and not to stdout var buf bytes.Buffer backup := log.Writer() log.SetOutput(&buf) defer log.SetOutput(backup) // Try multiple timestamps with abbreviated timezones in case a user // is actually in one of the timezones. ts, err := ParseTimestamp("RFC1123", "Mon, 02 Jan 2006 15:04:05 MST", nil) require.NoError(t, err) require.EqualValues(t, 1136239445, ts.Unix()) ts2, err := ParseTimestamp("RFC1123", "Mon, 02 Jan 2006 15:04:05 EST", nil) require.NoError(t, err) require.EqualValues(t, 1136232245, ts2.Unix()) require.Contains(t, buf.String(), "Your config is using abbreviated timezones and parsing was changed in v1.27.0") } func TestGoVersion(t *testing.T) { tests := []struct { version string expected string }{ { version: "go version go1.24.0 linux/amd64", expected: "1.24.0", }, { version: "go version go1.25.2 X:nodwarf5 linux/amd64", expected: "1.25.2", }, { version: "go version go1.26.1-X:nodwarf5 linux/amd64", expected: "1.26.1", }, } for _, tt := range tests { t.Run(tt.version, func(t *testing.T) { match := reGoVer.FindStringSubmatch(tt.version) require.Len(t, match, 2) require.Equal(t, tt.expected, match[1]) }) } } func TestProductToken(t *testing.T) { token := ProductToken() // Telegraf version depends on the call to SetVersion, it cannot be set // multiple times and is not thread-safe. re := regexp.MustCompile(`^Telegraf/[^\s]+ Go/\d+.\d+(.\d+)?$`) require.True(t, re.MatchString(token), token) } ================================================ FILE: internal/limiter/limiter.go ================================================ package limiter import ( "sync" "time" ) // NewRateLimiter returns a rate limiter that will emit from the C // channel only 'n' times every 'rate' seconds. func NewRateLimiter(n int, rate time.Duration) *rateLimiter { r := &rateLimiter{ C: make(chan bool), rate: rate, n: n, shutdown: make(chan bool), } r.wg.Add(1) go r.limiter() return r } type rateLimiter struct { C chan bool rate time.Duration n int shutdown chan bool wg sync.WaitGroup } func (r *rateLimiter) Stop() { close(r.shutdown) r.wg.Wait() close(r.C) } func (r *rateLimiter) limiter() { defer r.wg.Done() ticker := time.NewTicker(r.rate) defer ticker.Stop() counter := 0 for { select { case <-r.shutdown: return case <-ticker.C: counter = 0 default: if counter < r.n { select { case r.C <- true: counter++ case <-r.shutdown: return } } } } } ================================================ FILE: internal/network.go ================================================ package internal import ( "fmt" "net" "strconv" "strings" ) func ResolveLocalTCPAddress(addr string) (*net.TCPAddr, error) { // Resolve the local address into IP address and the given port if any host, port, err := net.SplitHostPort(addr) if err != nil { if !strings.Contains(err.Error(), "missing port") { return nil, fmt.Errorf("invalid local address: %w", err) } host = addr } local, err := net.ResolveIPAddr("ip", host) if err != nil { return nil, fmt.Errorf("cannot resolve local address: %w", err) } var portNo int if port != "" { p, err := strconv.ParseUint(port, 10, 16) if err != nil { return nil, fmt.Errorf("invalid port: %w", err) } portNo = int(p) } return &net.TCPAddr{IP: local.IP, Port: portNo, Zone: local.Zone}, nil } ================================================ FILE: internal/process/process.go ================================================ package process import ( "context" "errors" "fmt" "io" "os" "os/exec" "sync" "sync/atomic" "time" "github.com/influxdata/telegraf" ) // Process is a long-running process manager that will restart processes if they stop. type Process struct { Cmd *exec.Cmd Stdin io.WriteCloser Stdout io.ReadCloser Stderr io.ReadCloser ReadStdoutFn func(io.Reader) ReadStderrFn func(io.Reader) RestartDelay time.Duration StopOnError bool Log telegraf.Logger name string args []string envs []string pid int32 cancel context.CancelFunc mainLoopWg sync.WaitGroup sync.Mutex } // New creates a new process wrapper func New(command, envs []string) (*Process, error) { if len(command) == 0 { return nil, errors.New("no command") } p := &Process{ RestartDelay: 5 * time.Second, name: command[0], args: make([]string, 0), envs: envs, } if len(command) > 1 { p.args = command[1:] } return p, nil } // Start the process. A &Process can only be started once. It will restart itself // as necessary. func (p *Process) Start() error { ctx, cancel := context.WithCancel(context.Background()) p.cancel = cancel if err := p.cmdStart(); err != nil { return err } p.mainLoopWg.Add(1) go func() { defer p.mainLoopWg.Done() if err := p.cmdLoop(ctx); err != nil { p.Log.Errorf("Process quit with message: %v", err) } }() return nil } // Stop is called when the process isn't needed anymore func (p *Process) Stop() { if p.cancel != nil { // signal our intent to shut down and not restart the process p.cancel() } // close stdin so the app can shut down gracefully. if err := p.Stdin.Close(); err != nil && !errors.Is(err, os.ErrClosed) { p.Log.Errorf("Stdin closed with message: %v", err) } p.mainLoopWg.Wait() } func (p *Process) Pid() int { pid := atomic.LoadInt32(&p.pid) return int(pid) } func (p *Process) State() (state *os.ProcessState, running bool) { p.Lock() defer p.Unlock() return p.Cmd.ProcessState, p.Cmd.ProcessState.ExitCode() == -1 } func (p *Process) cmdStart() error { p.Cmd = exec.Command(p.name, p.args...) if len(p.envs) > 0 { p.Cmd.Env = append(os.Environ(), p.envs...) } var err error p.Stdin, err = p.Cmd.StdinPipe() if err != nil { return fmt.Errorf("error opening stdin pipe: %w", err) } p.Stdout, err = p.Cmd.StdoutPipe() if err != nil { return fmt.Errorf("error opening stdout pipe: %w", err) } p.Stderr, err = p.Cmd.StderrPipe() if err != nil { return fmt.Errorf("error opening stderr pipe: %w", err) } p.Log.Infof("Starting process: %s %s", p.name, p.args) if err := p.Cmd.Start(); err != nil { return fmt.Errorf("error starting process: %w", err) } atomic.StoreInt32(&p.pid, int32(p.Cmd.Process.Pid)) return nil } // cmdLoop watches an already running process, restarting it when appropriate. func (p *Process) cmdLoop(ctx context.Context) error { for { err := p.cmdWait(ctx) if err != nil && p.StopOnError { return err } if isQuitting(ctx) { p.Log.Infof("Process %s shut down", p.Cmd.Path) return nil } p.Log.Errorf("Process %s exited: %v", p.Cmd.Path, err) p.Log.Infof("Restarting in %s...", p.RestartDelay) select { case <-ctx.Done(): return nil case <-time.After(p.RestartDelay): // Continue the loop and restart the process if err := p.cmdStart(); err != nil { return err } } } } // cmdWait waits for the process to finish. func (p *Process) cmdWait(ctx context.Context) error { var wg sync.WaitGroup if p.ReadStdoutFn == nil { p.ReadStdoutFn = defaultReadPipe } if p.ReadStderrFn == nil { p.ReadStderrFn = defaultReadPipe } processCtx, processCancel := context.WithCancel(context.Background()) defer processCancel() wg.Add(1) go func() { p.ReadStdoutFn(p.Stdout) wg.Done() }() wg.Add(1) go func() { p.ReadStderrFn(p.Stderr) wg.Done() }() wg.Add(1) go func() { select { case <-ctx.Done(): p.gracefulStop(processCtx, p.Cmd, 5*time.Second) case <-processCtx.Done(): } wg.Done() }() p.Lock() err := p.Cmd.Wait() p.Unlock() processCancel() wg.Wait() return err } func isQuitting(ctx context.Context) bool { return ctx.Err() != nil } func defaultReadPipe(r io.Reader) { //nolint:errcheck // Discarding the data, no need to handle an error io.Copy(io.Discard, r) } ================================================ FILE: internal/process/process_posix.go ================================================ //go:build !windows package process import ( "context" "os/exec" "syscall" "time" ) func (p *Process) gracefulStop(ctx context.Context, cmd *exec.Cmd, timeout time.Duration) { select { case <-time.After(timeout): if err := cmd.Process.Signal(syscall.SIGTERM); err != nil { p.Log.Errorf("Error after sending SIGTERM signal to process: %v", err) } case <-ctx.Done(): } select { case <-time.After(timeout): if err := cmd.Process.Kill(); err != nil { p.Log.Errorf("Error after killing process: %v", err) } case <-ctx.Done(): } } ================================================ FILE: internal/process/process_test.go ================================================ //go:build !windows package process import ( "bufio" "flag" "fmt" "io" "os" "sync/atomic" "syscall" "testing" "time" "github.com/stretchr/testify/require" "github.com/influxdata/telegraf/testutil" ) // test that a restarting process resets pipes properly func TestRestartingRebindsPipes(t *testing.T) { if testing.Short() { t.Skip("Skipping long running test in short mode") } exe, err := os.Executable() require.NoError(t, err) p, err := New([]string{exe, "-external"}, []string{"INTERNAL_PROCESS_MODE=application"}) p.RestartDelay = 100 * time.Nanosecond p.Log = testutil.Logger{} require.NoError(t, err) linesRead := int64(0) p.ReadStdoutFn = func(r io.Reader) { scanner := bufio.NewScanner(r) for scanner.Scan() { atomic.AddInt64(&linesRead, 1) } } require.NoError(t, p.Start()) for atomic.LoadInt64(&linesRead) < 1 { time.Sleep(1 * time.Millisecond) } require.NoError(t, syscall.Kill(p.Pid(), syscall.SIGKILL)) for atomic.LoadInt64(&linesRead) < 2 { time.Sleep(1 * time.Millisecond) } // the mainLoopWg.Wait() call p.Stop() makes takes multiple seconds to complete p.Stop() } var external = flag.Bool("external", false, "if true, run externalProcess instead of tests") func TestMain(m *testing.M) { flag.Parse() runMode := os.Getenv("INTERNAL_PROCESS_MODE") if *external && runMode == "application" { externalProcess() os.Exit(0) } code := m.Run() os.Exit(code) } // externalProcess is an external "misbehaving" process that won't exit // cleanly. func externalProcess() { wait := make(chan int) fmt.Fprintln(os.Stdout, "started") <-wait os.Exit(2) //nolint:revive // os.Exit called intentionally } ================================================ FILE: internal/process/process_windows.go ================================================ //go:build windows package process import ( "context" "os/exec" "time" ) func (p *Process) gracefulStop(ctx context.Context, cmd *exec.Cmd, timeout time.Duration) { select { case <-time.After(timeout): if err := cmd.Process.Kill(); err != nil { p.Log.Errorf("Error after killing process: %v", err) } case <-ctx.Done(): } } ================================================ FILE: internal/rotate/file_writer.go ================================================ package rotate // Rotating things import ( "fmt" "io" "os" "path/filepath" "sort" "strconv" "strings" "sync" "time" ) // FilePerm defines the permissions that Writer will use for all // the files it creates. const ( FilePerm = os.FileMode(0644) DateFormat = "2006-01-02" ) // FileWriter implements the io.Writer interface and writes to the // filename specified. // Will rotate at the specified interval and/or when the current file size exceeds maxSizeInBytes // At rotation time, current file is renamed and a new file is created. // If the number of archives exceeds maxArchives, older files are deleted. type FileWriter struct { filename string filenameRotationTemplate string current *os.File interval time.Duration maxSizeInBytes int64 maxArchives int expireTime time.Time bytesWritten int64 sync.Mutex } // NewFileWriter creates a new file writer. func NewFileWriter(filename string, interval time.Duration, maxSizeInBytes int64, maxArchives int) (io.WriteCloser, error) { if interval == 0 && maxSizeInBytes <= 0 { // No rotation needed so a basic io.Writer will do the trick return openFile(filename) } w := &FileWriter{ filename: filename, interval: interval, maxSizeInBytes: maxSizeInBytes, maxArchives: maxArchives, filenameRotationTemplate: getFilenameRotationTemplate(filename), } if err := w.openCurrent(); err != nil { return nil, err } return w, nil } func openFile(filename string) (*os.File, error) { return os.OpenFile(filename, os.O_RDWR|os.O_CREATE|os.O_APPEND, FilePerm) } func getFilenameRotationTemplate(filename string) string { // Extract the file extension fileExt := filepath.Ext(filename) // Remove the file extension from the filename (if any) stem := strings.TrimSuffix(filename, fileExt) return stem + ".%s-%s" + fileExt } // Write writes p to the current file, then checks to see if // rotation is necessary. func (w *FileWriter) Write(p []byte) (n int, err error) { w.Lock() defer w.Unlock() if n, err = w.current.Write(p); err != nil { return 0, err } w.bytesWritten += int64(n) if err := w.rotateIfNeeded(); err != nil { return 0, err } return n, nil } // Close closes the current file. Writer is unusable after this // is called. func (w *FileWriter) Close() (err error) { w.Lock() defer w.Unlock() // Rotate before closing if err := w.rotateIfNeeded(); err != nil { return err } // Close the file if we did not rotate if err := w.current.Close(); err != nil { return err } w.current = nil return nil } func (w *FileWriter) openCurrent() (err error) { // In case ModTime() fails, we use time.Now() w.expireTime = time.Now().Add(w.interval) w.bytesWritten = 0 w.current, err = openFile(w.filename) if err != nil { return err } // Goal here is to rotate old pre-existing files. // For that we use fileInfo.ModTime, instead of time.Now(). // Example: telegraf is restarted every 23 hours and // the rotation interval is set to 24 hours. // With time.now() as a reference we'd never rotate the file. if fileInfo, err := w.current.Stat(); err == nil { w.expireTime = fileInfo.ModTime().Add(w.interval) w.bytesWritten = fileInfo.Size() } return w.rotateIfNeeded() } func (w *FileWriter) rotateIfNeeded() error { if (w.interval > 0 && time.Now().After(w.expireTime)) || (w.maxSizeInBytes > 0 && w.bytesWritten >= w.maxSizeInBytes) { if err := w.rotate(); err != nil { // Ignore rotation errors and keep the log open fmt.Printf("unable to rotate the file %q, %s", w.filename, err.Error()) } return w.openCurrent() } return nil } func (w *FileWriter) rotate() (err error) { if err := w.current.Close(); err != nil { return err } // Use year-month-date for readability, unix time to make the file name unique with second precision now := time.Now() rotatedFilename := fmt.Sprintf(w.filenameRotationTemplate, now.Format(DateFormat), strconv.FormatInt(now.Unix(), 10)) if err := os.Rename(w.filename, rotatedFilename); err != nil { return err } return w.purgeArchivesIfNeeded() } func (w *FileWriter) purgeArchivesIfNeeded() (err error) { if w.maxArchives == -1 { // Skip archiving return nil } var matches []string if matches, err = filepath.Glob(fmt.Sprintf(w.filenameRotationTemplate, "*", "*")); err != nil { return err } // if there are more archives than the configured maximum, then purge older files if len(matches) > w.maxArchives { // sort files alphanumerically to delete older files first sort.Strings(matches) for _, filename := range matches[:len(matches)-w.maxArchives] { if err := os.Remove(filename); err != nil { return err } } } return nil } ================================================ FILE: internal/rotate/file_writer_test.go ================================================ package rotate import ( "os" "path/filepath" "testing" "time" "github.com/stretchr/testify/require" ) func TestFileWriter_NoRotation(t *testing.T) { tempDir := t.TempDir() writer, err := NewFileWriter(filepath.Join(tempDir, "test"), 0, 0, 0) require.NoError(t, err) t.Cleanup(func() { require.NoError(t, writer.Close()) }) _, err = writer.Write([]byte("Hello World")) require.NoError(t, err) _, err = writer.Write([]byte("Hello World 2")) require.NoError(t, err) files, err := os.ReadDir(tempDir) require.NoError(t, err) require.Len(t, files, 1) } func TestFileWriter_TimeRotation(t *testing.T) { tempDir := t.TempDir() interval, err := time.ParseDuration("10ms") require.NoError(t, err) writer, err := NewFileWriter(filepath.Join(tempDir, "test"), interval, 0, -1) require.NoError(t, err) t.Cleanup(func() { require.NoError(t, writer.Close()) }) _, err = writer.Write([]byte("Hello World")) require.NoError(t, err) time.Sleep(interval) _, err = writer.Write([]byte("Hello World 2")) require.NoError(t, err) files, err := os.ReadDir(tempDir) require.NoError(t, err) require.Len(t, files, 2) } func TestFileWriter_ReopenTimeRotation(t *testing.T) { tempDir := t.TempDir() interval, err := time.ParseDuration("10ms") require.NoError(t, err) filePath := filepath.Join(tempDir, "test.log") err = os.WriteFile(filePath, []byte("Hello World"), 0640) time.Sleep(interval) require.NoError(t, err) writer, err := NewFileWriter(filepath.Join(tempDir, "test.log"), interval, 0, -1) require.NoError(t, err) t.Cleanup(func() { require.NoError(t, writer.Close()) }) files, err := os.ReadDir(tempDir) require.NoError(t, err) require.Len(t, files, 2) } func TestFileWriter_SizeRotation(t *testing.T) { tempDir := t.TempDir() maxSize := int64(9) writer, err := NewFileWriter(filepath.Join(tempDir, "test.log"), 0, maxSize, -1) require.NoError(t, err) t.Cleanup(func() { require.NoError(t, writer.Close()) }) _, err = writer.Write([]byte("Hello World")) require.NoError(t, err) _, err = writer.Write([]byte("World 2")) require.NoError(t, err) files, err := os.ReadDir(tempDir) require.NoError(t, err) require.Len(t, files, 2) } func TestFileWriter_ReopenSizeRotation(t *testing.T) { tempDir := t.TempDir() maxSize := int64(12) filePath := filepath.Join(tempDir, "test.log") err := os.WriteFile(filePath, []byte("Hello World"), 0640) require.NoError(t, err) writer, err := NewFileWriter(filepath.Join(tempDir, "test.log"), 0, maxSize, -1) require.NoError(t, err) t.Cleanup(func() { require.NoError(t, writer.Close()) }) _, err = writer.Write([]byte("Hello World Again")) require.NoError(t, err) files, err := os.ReadDir(tempDir) require.NoError(t, err) require.Len(t, files, 2) } func TestFileWriter_DeleteArchives(t *testing.T) { if testing.Short() { t.Skip("Skipping long test in short mode") } tempDir := t.TempDir() maxSize := int64(5) writer, err := NewFileWriter(filepath.Join(tempDir, "test.log"), 0, maxSize, 2) require.NoError(t, err) t.Cleanup(func() { require.NoError(t, writer.Close()) }) _, err = writer.Write([]byte("First file")) require.NoError(t, err) // File names include the date with second precision // So, to force rotation with different file names // we need to wait time.Sleep(1 * time.Second) _, err = writer.Write([]byte("Second file")) require.NoError(t, err) time.Sleep(1 * time.Second) _, err = writer.Write([]byte("Third file")) require.NoError(t, err) files, err := os.ReadDir(tempDir) require.NoError(t, err) require.Len(t, files, 3) for _, tempFile := range files { var bytes []byte var err error path := filepath.Join(tempDir, tempFile.Name()) if bytes, err = os.ReadFile(path); err != nil { t.Error(err.Error()) return } contents := string(bytes) if contents != "" && contents != "Second file" && contents != "Third file" { t.Error("Should have deleted the eldest log file") return } } } func TestFileWriter_CloseDoesNotRotate(t *testing.T) { tempDir := t.TempDir() maxSize := int64(9) writer, err := NewFileWriter(filepath.Join(tempDir, "test.log"), 0, maxSize, -1) require.NoError(t, err) require.NoError(t, writer.Close()) files, err := os.ReadDir(tempDir) require.NoError(t, err) require.Len(t, files, 1) require.Regexp(t, "^test.log$", files[0].Name()) } ================================================ FILE: internal/templating/engine.go ================================================ package templating import ( "sort" "strings" ) const ( // DefaultSeparator is the default separation character to use when separating template parts. DefaultSeparator = "." ) // Engine uses a Matcher to retrieve the appropriate template and applies the template // to the input string type Engine struct { joiner string matcher *matcher } // Apply extracts the template fields from the given line and returns the measurement // name, tags and field name // //nolint:revive //function-result-limit conditionally 4 return results allowed func (e *Engine) Apply(line string) (measurementName string, tags map[string]string, field string, err error) { return e.matcher.match(line).Apply(line, e.joiner) } // NewEngine creates a new templating engine func NewEngine(joiner string, defaultTemplate *Template, templates []string) (*Engine, error) { engine := Engine{ joiner: joiner, matcher: newMatcher(defaultTemplate), } templateSpecs := parseTemplateSpecs(templates) for _, templateSpec := range templateSpecs { if err := engine.matcher.addSpec(templateSpec); err != nil { return nil, err } } return &engine, nil } func parseTemplateSpecs(templates []string) templateSpecs { tmplts := make(templateSpecs, 0, len(templates)) for _, pattern := range templates { tmplt := templateSpec{ separator: DefaultSeparator, } // Format is [separator] [filter]