package inputs import ( "errors" "reflect" "testing" "github.com/influxdata/influxdb/v2/telegraf/plugins" ) // local plugin type telegrafPluginConfig interface { TOML() string Type() plugins.Type PluginName() string UnmarshalTOML(data interface{}) error } func TestType(t *testing.T) { b := baseInput(0) if b.Type() != plugins.Input { t.Fatalf("input plugins type should be input, got %s", b.Type()) } } func TestEncodeTOML(t *testing.T) { cases := []struct { name string plugins map[telegrafPluginConfig]string }{ { name: "test empty plugins", plugins: map[telegrafPluginConfig]string{ &CPUStats{}: `[[inputs.cpu]] ## Whether to report per-cpu stats or not percpu = true ## Whether to report total system cpu stats or not totalcpu = true ## If true, collect raw CPU time metrics collect_cpu_time = false ## If true, compute and report the sum of all non-idle CPU states report_active = false `, &DiskStats{}: `[[inputs.disk]] ## By default stats will be gathered for all mount points. ## Set mount_points will restrict the stats to only the specified mount points. # mount_points = ["/"] ## Ignore mount points by filesystem type. ignore_fs = ["tmpfs", "devtmpfs", "devfs", "iso9660", "overlay", "aufs", "squashfs"] `, &DiskIO{}: `[[inputs.diskio]] ## By default, telegraf will gather stats for all devices including ## disk partitions. ## Setting devices will restrict the stats to the specified devices. # devices = ["sda", "sdb", "vd*"] ## Uncomment the following line if you need disk serial numbers. # skip_serial_number = false # ## On systems which support it, device metadata can be added in the form of ## tags. ## Currently only Linux is supported via udev properties. You can view ## available properties for a device by running: ## 'udevadm info -q property -n /dev/sda' ## Note: Most, but not all, udev properties can be accessed this way. Properties ## that are currently inaccessible include DEVTYPE, DEVNAME, and DEVPATH. # device_tags = ["ID_FS_TYPE", "ID_FS_USAGE"] # ## Using the same metadata source as device_tags, you can also customize the ## name of the device via templates. ## The 'name_templates' parameter is a list of templates to try and apply to ## the device. The template may contain variables in the form of '$PROPERTY' or ## '${PROPERTY}'. The first template which does not contain any variables not ## present for the device is used as the device name tag. ## The typical use case is for LVM volumes, to get the VG/LV name instead of ## the near-meaningless DM-0 name. # name_templates = ["$ID_FS_LABEL","$DM_VG_NAME/$DM_LV_NAME"] `, &Docker{}: `[[inputs.docker]] ## Docker Endpoint ## To use TCP, set endpoint = "tcp://[ip]:[port]" ## To use environment variables (ie, docker-machine), set endpoint = "ENV" endpoint = "" # ## Set to true to collect Swarm metrics(desired_replicas, running_replicas) gather_services = false # ## Only collect metrics for these containers, collect all if empty container_names = [] # ## Set the source tag for the metrics to the container ID hostname, eg first 12 chars source_tag = false # ## Containers to include and exclude. Globs accepted. ## Note that an empty array for both will include all containers container_name_include = [] container_name_exclude = [] # ## Container states to include and exclude. Globs accepted. ## When empty only containers in the "running" state will be captured. ## example: container_state_include = ["created", "restarting", "running", "removing", "paused", "exited", "dead"] ## example: container_state_exclude = ["created", "restarting", "running", "removing", "paused", "exited", "dead"] # container_state_include = [] # container_state_exclude = [] # ## Timeout for docker list, info, and stats commands timeout = "5s" # ## Whether to report for each container per-device blkio (8:0, 8:1...), ## network (eth0, eth1, ...) and cpu (cpu0, cpu1, ...) stats or not. ## Usage of this setting is discouraged since it will be deprecated in favor of 'perdevice_include'. ## Default value is 'true' for backwards compatibility, please set it to 'false' so that 'perdevice_include' setting ## is honored. perdevice = true # ## Specifies for which classes a per-device metric should be issued ## Possible values are 'cpu' (cpu0, cpu1, ...), 'blkio' (8:0, 8:1, ...) and 'network' (eth0, eth1, ...) ## Please note that this setting has no effect if 'perdevice' is set to 'true' # perdevice_include = ["cpu"] # ## Whether to report for each container total blkio and network stats or not. ## Usage of this setting is discouraged since it will be deprecated in favor of 'total_include'. ## Default value is 'false' for backwards compatibility, please set it to 'true' so that 'total_include' setting ## is honored. total = false # ## Specifies for which classes a total metric should be issued. Total is an aggregated of the 'perdevice' values. ## Possible values are 'cpu', 'blkio' and 'network' ## Total 'cpu' is reported directly by Docker daemon, and 'network' and 'blkio' totals are aggregated by this plugin. ## Please note that this setting has no effect if 'total' is set to 'false' # total_include = ["cpu", "blkio", "network"] # ## Which environment variables should we use as a tag ##tag_env = ["JAVA_HOME", "HEAP_SIZE"] # ## docker labels to include and exclude as tags. Globs accepted. ## Note that an empty array for both will include all labels as tags docker_label_include = [] docker_label_exclude = [] # ## Optional TLS Config # tls_ca = "/etc/telegraf/ca.pem" # tls_cert = "/etc/telegraf/cert.pem" # tls_key = "/etc/telegraf/key.pem" ## Use TLS but skip chain & host verification # insecure_skip_verify = false `, &File{}: `[[inputs.file]] ## Files to parse each interval. Accept standard unix glob matching rules, ## as well as ** to match recursive files and directories. files = [] ## Name a tag containing the name of the file the data was parsed from. Leave empty ## to disable. # file_tag = "" ## Character encoding to use when interpreting the file contents. Invalid ## characters are replaced using the unicode replacement character. When set ## to the empty string the data is not decoded to text. ## ex: character_encoding = "utf-8" ## character_encoding = "utf-16le" ## character_encoding = "utf-16be" ## character_encoding = "" # character_encoding = "" ## The dataformat to be read from files ## 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" `, &Kernel{}: `[[inputs.kernel]] # no configuration `, &Kubernetes{}: `[[inputs.kubernetes]] ## URL for the kubelet url = "" ## Use bearer token for authorization. ('bearer_token' takes priority) ## If both of these are empty, we'll use the default serviceaccount: ## at: /run/secrets/kubernetes.io/serviceaccount/token # bearer_token = "/path/to/bearer/token" ## OR # bearer_token_string = "abc_123" ## Pod labels to be added as tags. An empty array for both include and ## exclude will include all labels. # label_include = [] # label_exclude = ["*"] ## Set response_timeout (default 5 seconds) # response_timeout = "5s" ## Optional TLS Config # tls_ca = /path/to/cafile # tls_cert = /path/to/certfile # tls_key = /path/to/keyfile ## Use TLS but skip chain & host verification # insecure_skip_verify = false `, &LogParserPlugin{}: `[[inputs.logparser]] ## Log files to parse. ## These accept standard unix glob matching rules, but with the addition of ## ** as a "super asterisk". ie: ## /var/log/**.log -> recursively find all .log files in /var/log ## /var/log/*/*.log -> find all .log files with a parent dir in /var/log ## /var/log/apache.log -> only tail the apache log file files = [] ## Read files that currently exist from the beginning. Files that are created ## while telegraf is running (and that match the "files" globs) will always ## be read from the beginning. from_beginning = false ## Method used to watch for file updates. Can be either "inotify" or "poll". # watch_method = "inotify" ## Parse logstash-style "grok" patterns: [inputs.logparser.grok] ## This is a list of patterns to check the given log file(s) for. ## Note that adding patterns here increases processing time. The most ## efficient configuration is to have one pattern per logparser. ## Other common built-in patterns are: ## %{COMMON_LOG_FORMAT} (plain apache & nginx access logs) ## %{COMBINED_LOG_FORMAT} (access logs + referrer & agent) patterns = ["%{COMBINED_LOG_FORMAT}"] ## Name of the outputted measurement name. measurement = "apache_access_log" ## Full path(s) to custom pattern files. custom_pattern_files = [] ## Custom patterns can also be defined here. Put one pattern per line. custom_patterns = ''' ''' ## Timezone allows you to provide an override for timestamps that ## don't already include an offset ## e.g. 04/06/2016 12:41:45 data one two 5.43µs ## ## Default: "" which renders UTC ## Options are as follows: ## 1. Local -- interpret based on machine localtime ## 2. "Canada/Eastern" -- Unix TZ values like those found in https://en.wikipedia.org/wiki/List_of_tz_database_time_zones ## 3. UTC -- or blank/unspecified, will return timestamp in UTC # timezone = "Canada/Eastern" ## When set to "disable", timestamp will not incremented if there is a ## duplicate. # unique_timestamp = "auto" `, &MemStats{}: `[[inputs.mem]] # no configuration `, &NetIOStats{}: `[[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"] ## ## On linux systems telegraf also collects protocol stats. ## Setting ignore_protocol_stats to true will skip reporting of protocol metrics. ## # ignore_protocol_stats = false ## `, &NetResponse{}: `[[inputs.net_response]] ## Protocol, must be "tcp" or "udp" ## NOTE: because the "udp" protocol does not respond to requests, it requires ## a send/expect string pair (see below). protocol = "tcp" ## Server address (default localhost) address = "localhost:80" ## Set timeout # timeout = "1s" ## Set read timeout (only used if expecting a response) # read_timeout = "1s" ## The following options are required for UDP checks. For TCP, they are ## optional. The plugin will send the given string to the server and then ## expect to receive the given 'expect' string back. ## string sent to the server # send = "ssh" ## expected string in answer # expect = "ssh" ## Uncomment to remove deprecated fields # fielddrop = ["result_type", "string_found"] `, &Nginx{}: `[[inputs.nginx]] # An array of Nginx stub_status URI to gather stats. urls = [] ## Optional TLS Config tls_ca = "/etc/telegraf/ca.pem" tls_cert = "/etc/telegraf/cert.cer" tls_key = "/etc/telegraf/key.key" ## Use TLS but skip chain & host verification insecure_skip_verify = false # HTTP response timeout (default: 5s) response_timeout = "5s" `, &Processes{}: `[[inputs.processes]] # no configuration `, &Procstat{}: `[[inputs.procstat]] ## PID file to monitor process pid_file = "/var/run/nginx.pid" ## executable name (ie, pgrep ) # exe = "" ## pattern as argument for pgrep (ie, pgrep -f ) # pattern = "nginx" ## user as argument for pgrep (ie, pgrep -u ) # user = "nginx" ## Systemd unit name # systemd_unit = "nginx.service" ## CGroup name or path # cgroup = "systemd/system.slice/nginx.service" ## Windows service name # win_service = "" ## override for process_name ## This is optional; default is sourced from /proc//status # process_name = "bar" ## Field name prefix # prefix = "" ## When true add the full cmdline as a tag. # cmdline_tag = false ## Mode to use when calculating CPU usage. Can be one of 'solaris' or 'irix'. # mode = "irix" ## Add the PID as a tag instead of as a field. When collecting multiple ## processes with otherwise matching tags this setting should be enabled to ## ensure each process has a unique identity. ## ## Enabling this option may result in a large number of series, especially ## when processes have a short lifetime. # pid_tag = false ## Method to use when finding process IDs. Can be one of 'pgrep', or ## 'native'. The pgrep finder calls the pgrep executable in the PATH while ## the native finder performs the search directly in a manor dependent on the ## platform. Default is 'pgrep' # pid_finder = "pgrep" `, &Prometheus{}: `[[inputs.prometheus]] ## An array of urls to scrape metrics from. urls = [] ## Metric version controls the mapping from Prometheus metrics into ## Telegraf metrics. When using the prometheus_client output, use the same ## value in both plugins to ensure metrics are round-tripped without ## modification. ## ## example: metric_version = 1; ## metric_version = 2; recommended version # metric_version = 1 ## Url tag name (tag containing scrapped url. optional, default is "url") # url_tag = "url" ## An array of Kubernetes services to scrape metrics from. # kubernetes_services = ["http://my-service-dns.my-namespace:9100/metrics"] ## Kubernetes config file to create client from. # kube_config = "/path/to/kubernetes.config" ## Scrape Kubernetes pods for the following prometheus annotations: ## - prometheus.io/scrape: Enable scraping for this pod ## - prometheus.io/scheme: If the metrics endpoint is secured then you will need to ## set this to 'https' & most likely set the tls config. ## - prometheus.io/path: If the metrics path is not /metrics, define it with this annotation. ## - prometheus.io/port: If port is not 9102 use this annotation # monitor_kubernetes_pods = true ## Get the list of pods to scrape with either the scope of ## - cluster: the kubernetes watch api (default, no need to specify) ## - node: the local cadvisor api; for scalability. Note that the config node_ip or the environment variable NODE_IP must be set to the host IP. # pod_scrape_scope = "cluster" ## Only for node scrape scope: node IP of the node that telegraf is running on. ## Either this config or the environment variable NODE_IP must be set. # node_ip = "10.180.1.1" # ## Only for node scrape scope: interval in seconds for how often to get updated pod list for scraping. # ## Default is 60 seconds. # # pod_scrape_interval = 60 ## Restricts Kubernetes monitoring to a single namespace ## ex: monitor_kubernetes_pods_namespace = "default" # monitor_kubernetes_pods_namespace = "" # label selector to target pods which have the label # kubernetes_label_selector = "env=dev,app=nginx" # field selector to target pods # eg. To scrape pods on a specific node # kubernetes_field_selector = "spec.nodeName=$HOSTNAME" ## Use bearer token for authorization. ('bearer_token' takes priority) # bearer_token = "/path/to/bearer/token" ## OR # bearer_token_string = "abc_123" ## HTTP Basic Authentication username and password. ('bearer_token' and ## 'bearer_token_string' take priority) # username = "" # password = "" ## Specify timeout duration for slower prometheus clients (default is 3s) # response_timeout = "3s" ## Optional TLS Config # tls_ca = /path/to/cafile # tls_cert = /path/to/certfile # tls_key = /path/to/keyfile ## Use TLS but skip chain & host verification # insecure_skip_verify = false `, &Redis{}: `[[inputs.redis]] ## specify servers via a url matching: ## [protocol://][:password]@address[:port] ## e.g. ## tcp://localhost:6379 ## tcp://:password@192.168.99.100 ## unix:///var/run/redis.sock ## ## If no servers are specified, then localhost is used as the host. ## If no port is specified, 6379 is used servers = [] ## Optional. Specify redis commands to retrieve values # [[inputs.redis.commands]] # # The command to run where each argument is a separate element # command = ["get", "sample-key"] # # The field to store the result in # field = "sample-key-value" # # The type of the result # # Can be "string", "integer", or "float" # type = "string" ## specify server password # password = "" ## Optional TLS Config # tls_ca = "/etc/telegraf/ca.pem" # tls_cert = "/etc/telegraf/cert.pem" # tls_key = "/etc/telegraf/key.pem" ## Use TLS but skip chain & host verification # insecure_skip_verify = true `, &SwapStats{}: `[[inputs.swap]] # no configuration `, &Syslog{}: `[[inputs.syslog]] ## Specify an ip or hostname with port - eg., tcp://localhost:6514, tcp://10.0.0.1:6514 ## Protocol, address and port to host the syslog receiver. ## If no host is specified, then localhost is used. ## If no port is specified, 6514 is used (RFC5425#section-4.1). server = "" ## TLS Config # tls_allowed_cacerts = ["/etc/telegraf/ca.pem"] # tls_cert = "/etc/telegraf/cert.pem" # tls_key = "/etc/telegraf/key.pem" ## Period between keep alive probes. ## 0 disables keep alive probes. ## Defaults to the OS configuration. ## Only applies to stream sockets (e.g. TCP). # keep_alive_period = "5m" ## Maximum number of concurrent connections (default = 0). ## 0 means unlimited. ## Only applies to stream sockets (e.g. TCP). # max_connections = 1024 ## Read timeout is the maximum time allowed for reading a single message (default = 5s). ## 0 means unlimited. # read_timeout = "5s" ## The framing technique with which it is expected that messages are transported (default = "octet-counting"). ## Whether the messages come using the octect-counting (RFC5425#section-4.3.1, RFC6587#section-3.4.1), ## or the non-transparent framing technique (RFC6587#section-3.4.2). ## Must be one of "octet-counting", "non-transparent". # framing = "octet-counting" ## The trailer to be expected in case of non-transparent framing (default = "LF"). ## Must be one of "LF", or "NUL". # trailer = "LF" ## Whether to parse in best effort mode or not (default = false). ## By default best effort parsing is off. # best_effort = false ## Character to prepend to SD-PARAMs (default = "_"). ## A syslog message can contain multiple parameters and multiple identifiers within structured data section. ## Eg., [id1 name1="val1" name2="val2"][id2 name1="val1" nameA="valA"] ## For each combination a field is created. ## Its name is created concatenating identifier, sdparam_separator, and parameter name. # sdparam_separator = "_" `, &SystemStats{}: `[[inputs.system]] ## Uncomment to remove deprecated metrics. # fielddrop = ["uptime_format"] `, &Tail{}: `[[inputs.tail]] ## File names or a pattern to tail. ## These accept standard unix glob matching rules, but with the addition of ## ** as a "super asterisk". ie: ## "/var/log/**.log" -> recursively find all .log files in /var/log ## "/var/log/*/*.log" -> find all .log files with a parent dir in /var/log ## "/var/log/apache.log" -> just tail the apache log file ## "/var/log/log[!1-2]* -> tail files without 1-2 ## "/var/log/log[^1-2]* -> identical behavior as above ## See https://github.com/gobwas/glob for more examples ## files = [] ## Read file from beginning. # from_beginning = false ## Whether file is a named pipe # pipe = false ## Method used to watch for file updates. Can be either "inotify" or "poll". # watch_method = "inotify" ## Maximum lines of the file to process that have not yet be written by the ## output. For best throughput set based on the number of metrics on each ## line and the size of the output's metric_batch_size. # max_undelivered_lines = 1000 ## Character encoding to use when interpreting the file contents. Invalid ## characters are replaced using the unicode replacement character. When set ## to the empty string the data is not decoded to text. ## ex: character_encoding = "utf-8" ## character_encoding = "utf-16le" ## character_encoding = "utf-16be" ## character_encoding = "" # character_encoding = "" ## 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" ## Set the tag that will contain the path of the tailed file. If you don't want this tag, set it to an empty string. # path_tag = "path" ## multiline parser/codec ## https://www.elastic.co/guide/en/logstash/2.4/plugins-filters-multiline.html #[inputs.tail.multiline] ## The pattern should be a regexp which matches what you believe to be an ## indicator that the field is part of an event consisting of multiple lines of log data. #pattern = "^\s" ## This field must be either "previous" or "next". ## If a line matches the pattern, "previous" indicates that it belongs to the previous line, ## whereas "next" indicates that the line belongs to the next one. #match_which_line = "previous" ## The invert_match field can be true or false (defaults to false). ## If true, a message not matching the pattern will constitute a match of the multiline ## filter and the what will be applied. (vice-versa is also true) #invert_match = false ## After the specified timeout, this plugin sends a multiline event even if no new pattern ## is found to start a new event. The default timeout is 5s. #timeout = 5s `, }, }, { name: "standard testing", plugins: map[telegrafPluginConfig]string{ &Docker{ Endpoint: "unix:///var/run/docker.sock", }: `[[inputs.docker]] ## Docker Endpoint ## To use TCP, set endpoint = "tcp://[ip]:[port]" ## To use environment variables (ie, docker-machine), set endpoint = "ENV" endpoint = "unix:///var/run/docker.sock" # ## Set to true to collect Swarm metrics(desired_replicas, running_replicas) gather_services = false # ## Only collect metrics for these containers, collect all if empty container_names = [] # ## Set the source tag for the metrics to the container ID hostname, eg first 12 chars source_tag = false # ## Containers to include and exclude. Globs accepted. ## Note that an empty array for both will include all containers container_name_include = [] container_name_exclude = [] # ## Container states to include and exclude. Globs accepted. ## When empty only containers in the "running" state will be captured. ## example: container_state_include = ["created", "restarting", "running", "removing", "paused", "exited", "dead"] ## example: container_state_exclude = ["created", "restarting", "running", "removing", "paused", "exited", "dead"] # container_state_include = [] # container_state_exclude = [] # ## Timeout for docker list, info, and stats commands timeout = "5s" # ## Whether to report for each container per-device blkio (8:0, 8:1...), ## network (eth0, eth1, ...) and cpu (cpu0, cpu1, ...) stats or not. ## Usage of this setting is discouraged since it will be deprecated in favor of 'perdevice_include'. ## Default value is 'true' for backwards compatibility, please set it to 'false' so that 'perdevice_include' setting ## is honored. perdevice = true # ## Specifies for which classes a per-device metric should be issued ## Possible values are 'cpu' (cpu0, cpu1, ...), 'blkio' (8:0, 8:1, ...) and 'network' (eth0, eth1, ...) ## Please note that this setting has no effect if 'perdevice' is set to 'true' # perdevice_include = ["cpu"] # ## Whether to report for each container total blkio and network stats or not. ## Usage of this setting is discouraged since it will be deprecated in favor of 'total_include'. ## Default value is 'false' for backwards compatibility, please set it to 'true' so that 'total_include' setting ## is honored. total = false # ## Specifies for which classes a total metric should be issued. Total is an aggregated of the 'perdevice' values. ## Possible values are 'cpu', 'blkio' and 'network' ## Total 'cpu' is reported directly by Docker daemon, and 'network' and 'blkio' totals are aggregated by this plugin. ## Please note that this setting has no effect if 'total' is set to 'false' # total_include = ["cpu", "blkio", "network"] # ## Which environment variables should we use as a tag ##tag_env = ["JAVA_HOME", "HEAP_SIZE"] # ## docker labels to include and exclude as tags. Globs accepted. ## Note that an empty array for both will include all labels as tags docker_label_include = [] docker_label_exclude = [] # ## Optional TLS Config # tls_ca = "/etc/telegraf/ca.pem" # tls_cert = "/etc/telegraf/cert.pem" # tls_key = "/etc/telegraf/key.pem" ## Use TLS but skip chain & host verification # insecure_skip_verify = false `, &File{ Files: []string{ "/var/log/**.log", "/var/log/apache.log", }, }: `[[inputs.file]] ## Files to parse each interval. Accept standard unix glob matching rules, ## as well as ** to match recursive files and directories. files = ["/var/log/**.log", "/var/log/apache.log"] ## Name a tag containing the name of the file the data was parsed from. Leave empty ## to disable. # file_tag = "" ## Character encoding to use when interpreting the file contents. Invalid ## characters are replaced using the unicode replacement character. When set ## to the empty string the data is not decoded to text. ## ex: character_encoding = "utf-8" ## character_encoding = "utf-16le" ## character_encoding = "utf-16be" ## character_encoding = "" # character_encoding = "" ## The dataformat to be read from files ## 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" `, &Kubernetes{URL: "http://1.1.1.1:10255"}: `[[inputs.kubernetes]] ## URL for the kubelet url = "http://1.1.1.1:10255" ## Use bearer token for authorization. ('bearer_token' takes priority) ## If both of these are empty, we'll use the default serviceaccount: ## at: /run/secrets/kubernetes.io/serviceaccount/token # bearer_token = "/path/to/bearer/token" ## OR # bearer_token_string = "abc_123" ## Pod labels to be added as tags. An empty array for both include and ## exclude will include all labels. # label_include = [] # label_exclude = ["*"] ## Set response_timeout (default 5 seconds) # response_timeout = "5s" ## Optional TLS Config # tls_ca = /path/to/cafile # tls_cert = /path/to/certfile # tls_key = /path/to/keyfile ## Use TLS but skip chain & host verification # insecure_skip_verify = false `, &LogParserPlugin{ Files: []string{ "/var/log/**.log", "/var/log/apache.log", }, }: `[[inputs.logparser]] ## Log files to parse. ## These accept standard unix glob matching rules, but with the addition of ## ** as a "super asterisk". ie: ## /var/log/**.log -> recursively find all .log files in /var/log ## /var/log/*/*.log -> find all .log files with a parent dir in /var/log ## /var/log/apache.log -> only tail the apache log file files = ["/var/log/**.log", "/var/log/apache.log"] ## Read files that currently exist from the beginning. Files that are created ## while telegraf is running (and that match the "files" globs) will always ## be read from the beginning. from_beginning = false ## Method used to watch for file updates. Can be either "inotify" or "poll". # watch_method = "inotify" ## Parse logstash-style "grok" patterns: [inputs.logparser.grok] ## This is a list of patterns to check the given log file(s) for. ## Note that adding patterns here increases processing time. The most ## efficient configuration is to have one pattern per logparser. ## Other common built-in patterns are: ## %{COMMON_LOG_FORMAT} (plain apache & nginx access logs) ## %{COMBINED_LOG_FORMAT} (access logs + referrer & agent) patterns = ["%{COMBINED_LOG_FORMAT}"] ## Name of the outputted measurement name. measurement = "apache_access_log" ## Full path(s) to custom pattern files. custom_pattern_files = [] ## Custom patterns can also be defined here. Put one pattern per line. custom_patterns = ''' ''' ## Timezone allows you to provide an override for timestamps that ## don't already include an offset ## e.g. 04/06/2016 12:41:45 data one two 5.43µs ## ## Default: "" which renders UTC ## Options are as follows: ## 1. Local -- interpret based on machine localtime ## 2. "Canada/Eastern" -- Unix TZ values like those found in https://en.wikipedia.org/wiki/List_of_tz_database_time_zones ## 3. UTC -- or blank/unspecified, will return timestamp in UTC # timezone = "Canada/Eastern" ## When set to "disable", timestamp will not incremented if there is a ## duplicate. # unique_timestamp = "auto" `, &Nginx{ URLs: []string{ "http://localhost/server_status", "http://192.168.1.1/server_status", }, }: `[[inputs.nginx]] # An array of Nginx stub_status URI to gather stats. urls = ["http://localhost/server_status", "http://192.168.1.1/server_status"] ## Optional TLS Config tls_ca = "/etc/telegraf/ca.pem" tls_cert = "/etc/telegraf/cert.cer" tls_key = "/etc/telegraf/key.key" ## Use TLS but skip chain & host verification insecure_skip_verify = false # HTTP response timeout (default: 5s) response_timeout = "5s" `, &Procstat{ Exe: "finder", }: `[[inputs.procstat]] ## PID file to monitor process pid_file = "/var/run/nginx.pid" ## executable name (ie, pgrep ) # exe = "finder" ## pattern as argument for pgrep (ie, pgrep -f ) # pattern = "nginx" ## user as argument for pgrep (ie, pgrep -u ) # user = "nginx" ## Systemd unit name # systemd_unit = "nginx.service" ## CGroup name or path # cgroup = "systemd/system.slice/nginx.service" ## Windows service name # win_service = "" ## override for process_name ## This is optional; default is sourced from /proc//status # process_name = "bar" ## Field name prefix # prefix = "" ## When true add the full cmdline as a tag. # cmdline_tag = false ## Mode to use when calculating CPU usage. Can be one of 'solaris' or 'irix'. # mode = "irix" ## Add the PID as a tag instead of as a field. When collecting multiple ## processes with otherwise matching tags this setting should be enabled to ## ensure each process has a unique identity. ## ## Enabling this option may result in a large number of series, especially ## when processes have a short lifetime. # pid_tag = false ## Method to use when finding process IDs. Can be one of 'pgrep', or ## 'native'. The pgrep finder calls the pgrep executable in the PATH while ## the native finder performs the search directly in a manor dependent on the ## platform. Default is 'pgrep' # pid_finder = "pgrep" `, &Prometheus{ URLs: []string{ "http://192.168.2.1:9090", "http://192.168.2.2:9090", }, }: `[[inputs.prometheus]] ## An array of urls to scrape metrics from. urls = ["http://192.168.2.1:9090", "http://192.168.2.2:9090"] ## Metric version controls the mapping from Prometheus metrics into ## Telegraf metrics. When using the prometheus_client output, use the same ## value in both plugins to ensure metrics are round-tripped without ## modification. ## ## example: metric_version = 1; ## metric_version = 2; recommended version # metric_version = 1 ## Url tag name (tag containing scrapped url. optional, default is "url") # url_tag = "url" ## An array of Kubernetes services to scrape metrics from. # kubernetes_services = ["http://my-service-dns.my-namespace:9100/metrics"] ## Kubernetes config file to create client from. # kube_config = "/path/to/kubernetes.config" ## Scrape Kubernetes pods for the following prometheus annotations: ## - prometheus.io/scrape: Enable scraping for this pod ## - prometheus.io/scheme: If the metrics endpoint is secured then you will need to ## set this to 'https' & most likely set the tls config. ## - prometheus.io/path: If the metrics path is not /metrics, define it with this annotation. ## - prometheus.io/port: If port is not 9102 use this annotation # monitor_kubernetes_pods = true ## Get the list of pods to scrape with either the scope of ## - cluster: the kubernetes watch api (default, no need to specify) ## - node: the local cadvisor api; for scalability. Note that the config node_ip or the environment variable NODE_IP must be set to the host IP. # pod_scrape_scope = "cluster" ## Only for node scrape scope: node IP of the node that telegraf is running on. ## Either this config or the environment variable NODE_IP must be set. # node_ip = "10.180.1.1" # ## Only for node scrape scope: interval in seconds for how often to get updated pod list for scraping. # ## Default is 60 seconds. # # pod_scrape_interval = 60 ## Restricts Kubernetes monitoring to a single namespace ## ex: monitor_kubernetes_pods_namespace = "default" # monitor_kubernetes_pods_namespace = "" # label selector to target pods which have the label # kubernetes_label_selector = "env=dev,app=nginx" # field selector to target pods # eg. To scrape pods on a specific node # kubernetes_field_selector = "spec.nodeName=$HOSTNAME" ## Use bearer token for authorization. ('bearer_token' takes priority) # bearer_token = "/path/to/bearer/token" ## OR # bearer_token_string = "abc_123" ## HTTP Basic Authentication username and password. ('bearer_token' and ## 'bearer_token_string' take priority) # username = "" # password = "" ## Specify timeout duration for slower prometheus clients (default is 3s) # response_timeout = "3s" ## Optional TLS Config # tls_ca = /path/to/cafile # tls_cert = /path/to/certfile # tls_key = /path/to/keyfile ## Use TLS but skip chain & host verification # insecure_skip_verify = false `, &Redis{ Servers: []string{ "tcp://localhost:6379", "unix:///var/run/redis.sock", }, Password: "somepassword123", }: `[[inputs.redis]] ## specify servers via a url matching: ## [protocol://][:password]@address[:port] ## e.g. ## tcp://localhost:6379 ## tcp://:password@192.168.99.100 ## unix:///var/run/redis.sock ## ## If no servers are specified, then localhost is used as the host. ## If no port is specified, 6379 is used servers = ["tcp://localhost:6379", "unix:///var/run/redis.sock"] ## Optional. Specify redis commands to retrieve values # [[inputs.redis.commands]] # # The command to run where each argument is a separate element # command = ["get", "sample-key"] # # The field to store the result in # field = "sample-key-value" # # The type of the result # # Can be "string", "integer", or "float" # type = "string" ## specify server password # password = "somepassword123" ## Optional TLS Config # tls_ca = "/etc/telegraf/ca.pem" # tls_cert = "/etc/telegraf/cert.pem" # tls_key = "/etc/telegraf/key.pem" ## Use TLS but skip chain & host verification # insecure_skip_verify = true `, &Syslog{ Address: "tcp://10.0.0.1:6514", }: `[[inputs.syslog]] ## Specify an ip or hostname with port - eg., tcp://localhost:6514, tcp://10.0.0.1:6514 ## Protocol, address and port to host the syslog receiver. ## If no host is specified, then localhost is used. ## If no port is specified, 6514 is used (RFC5425#section-4.1). server = "tcp://10.0.0.1:6514" ## TLS Config # tls_allowed_cacerts = ["/etc/telegraf/ca.pem"] # tls_cert = "/etc/telegraf/cert.pem" # tls_key = "/etc/telegraf/key.pem" ## Period between keep alive probes. ## 0 disables keep alive probes. ## Defaults to the OS configuration. ## Only applies to stream sockets (e.g. TCP). # keep_alive_period = "5m" ## Maximum number of concurrent connections (default = 0). ## 0 means unlimited. ## Only applies to stream sockets (e.g. TCP). # max_connections = 1024 ## Read timeout is the maximum time allowed for reading a single message (default = 5s). ## 0 means unlimited. # read_timeout = "5s" ## The framing technique with which it is expected that messages are transported (default = "octet-counting"). ## Whether the messages come using the octect-counting (RFC5425#section-4.3.1, RFC6587#section-3.4.1), ## or the non-transparent framing technique (RFC6587#section-3.4.2). ## Must be one of "octet-counting", "non-transparent". # framing = "octet-counting" ## The trailer to be expected in case of non-transparent framing (default = "LF"). ## Must be one of "LF", or "NUL". # trailer = "LF" ## Whether to parse in best effort mode or not (default = false). ## By default best effort parsing is off. # best_effort = false ## Character to prepend to SD-PARAMs (default = "_"). ## A syslog message can contain multiple parameters and multiple identifiers within structured data section. ## Eg., [id1 name1="val1" name2="val2"][id2 name1="val1" nameA="valA"] ## For each combination a field is created. ## Its name is created concatenating identifier, sdparam_separator, and parameter name. # sdparam_separator = "_" `, &Tail{ Files: []string{"/var/log/**.log", "/var/log/apache.log"}, }: `[[inputs.tail]] ## File names or a pattern to tail. ## These accept standard unix glob matching rules, but with the addition of ## ** as a "super asterisk". ie: ## "/var/log/**.log" -> recursively find all .log files in /var/log ## "/var/log/*/*.log" -> find all .log files with a parent dir in /var/log ## "/var/log/apache.log" -> just tail the apache log file ## "/var/log/log[!1-2]* -> tail files without 1-2 ## "/var/log/log[^1-2]* -> identical behavior as above ## See https://github.com/gobwas/glob for more examples ## files = ["/var/log/**.log", "/var/log/apache.log"] ## Read file from beginning. # from_beginning = false ## Whether file is a named pipe # pipe = false ## Method used to watch for file updates. Can be either "inotify" or "poll". # watch_method = "inotify" ## Maximum lines of the file to process that have not yet be written by the ## output. For best throughput set based on the number of metrics on each ## line and the size of the output's metric_batch_size. # max_undelivered_lines = 1000 ## Character encoding to use when interpreting the file contents. Invalid ## characters are replaced using the unicode replacement character. When set ## to the empty string the data is not decoded to text. ## ex: character_encoding = "utf-8" ## character_encoding = "utf-16le" ## character_encoding = "utf-16be" ## character_encoding = "" # character_encoding = "" ## 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" ## Set the tag that will contain the path of the tailed file. If you don't want this tag, set it to an empty string. # path_tag = "path" ## multiline parser/codec ## https://www.elastic.co/guide/en/logstash/2.4/plugins-filters-multiline.html #[inputs.tail.multiline] ## The pattern should be a regexp which matches what you believe to be an ## indicator that the field is part of an event consisting of multiple lines of log data. #pattern = "^\s" ## This field must be either "previous" or "next". ## If a line matches the pattern, "previous" indicates that it belongs to the previous line, ## whereas "next" indicates that the line belongs to the next one. #match_which_line = "previous" ## The invert_match field can be true or false (defaults to false). ## If true, a message not matching the pattern will constitute a match of the multiline ## filter and the what will be applied. (vice-versa is also true) #invert_match = false ## After the specified timeout, this plugin sends a multiline event even if no new pattern ## is found to start a new event. The default timeout is 5s. #timeout = 5s `, }, }, } for _, c := range cases { for input, toml := range c.plugins { if toml != input.TOML() { t.Fatalf("%s failed want %s, got %v", c.name, toml, input.TOML()) } } } } func TestDecodeTOML(t *testing.T) { cases := []struct { name string want telegrafPluginConfig wantErr error input telegrafPluginConfig data interface{} }{ { name: "cpu", want: &CPUStats{}, input: &CPUStats{}, }, { name: "disk", want: &DiskStats{}, input: &DiskStats{}, }, { name: "diskio", want: &DiskIO{}, input: &DiskIO{}, }, { name: "docker bad data", want: &Docker{}, wantErr: errors.New("bad endpoint for docker input plugin"), input: &Docker{}, data: map[string]int{}, }, { name: "docker", want: &Docker{ Endpoint: "unix:///var/run/docker.sock", }, input: &Docker{}, data: map[string]interface{}{ "endpoint": "unix:///var/run/docker.sock", }, }, { name: "file empty", want: &File{}, wantErr: errors.New("bad files for file input plugin"), input: &File{}, }, { name: "file bad data not array", want: &File{}, wantErr: errors.New("not an array for file input plugin"), input: &File{}, data: map[string]interface{}{ "files": "", }, }, { name: "file", want: &File{ Files: []string{ "/var/log/**.log", "/var/log/apache.log", }, }, input: &File{}, data: map[string]interface{}{ "files": []interface{}{ "/var/log/**.log", "/var/log/apache.log", }, }, }, { name: "kernel", want: &Kernel{}, input: &Kernel{}, }, { name: "kubernetes empty", want: &Kubernetes{}, wantErr: errors.New("bad url for kubernetes input plugin"), input: &Kubernetes{}, }, { name: "kubernetes", want: &Kubernetes{ URL: "http://1.1.1.1:10255", }, input: &Kubernetes{}, data: map[string]interface{}{ "url": "http://1.1.1.1:10255", }, }, { name: "logparser empty", want: &LogParserPlugin{}, wantErr: errors.New("bad files for logparser input plugin"), input: &LogParserPlugin{}, }, { name: "logparser file not array", want: &LogParserPlugin{}, wantErr: errors.New("files is not an array for logparser input plugin"), input: &LogParserPlugin{}, data: map[string]interface{}{ "files": "ok", }, }, { name: "logparser", want: &LogParserPlugin{ Files: []string{ "/var/log/**.log", "/var/log/apache.log", }, }, input: &LogParserPlugin{}, data: map[string]interface{}{ "files": []interface{}{ "/var/log/**.log", "/var/log/apache.log", }, }, }, { name: "mem", want: &MemStats{}, input: &MemStats{}, }, { name: "net_response", want: &NetResponse{}, input: &NetResponse{}, }, { name: "net", want: &NetIOStats{}, input: &NetIOStats{}, }, { name: "nginx empty", want: &Nginx{}, wantErr: errors.New("bad urls for nginx input plugin"), input: &Nginx{}, }, { name: "nginx bad data not array", want: &Nginx{}, wantErr: errors.New("urls is not an array for nginx input plugin"), input: &Nginx{}, data: map[string]interface{}{ "urls": "", }, }, { name: "nginx", want: &Nginx{ URLs: []string{ "http://localhost/server_status", "http://192.168.1.1/server_status", }, }, input: &Nginx{}, data: map[string]interface{}{ "urls": []interface{}{ "http://localhost/server_status", "http://192.168.1.1/server_status", }, }, }, { name: "processes", want: &Processes{}, input: &Processes{}, }, { name: "procstat empty", want: &Procstat{}, wantErr: errors.New("bad exe for procstat input plugin"), input: &Procstat{}, }, { name: "procstat", want: &Procstat{ Exe: "finder", }, input: &Procstat{}, data: map[string]interface{}{ "exe": "finder", }, }, { name: "prometheus empty", want: &Prometheus{}, wantErr: errors.New("bad urls for prometheus input plugin"), input: &Prometheus{}, }, { name: "prometheus bad data not array", want: &Prometheus{}, wantErr: errors.New("urls is not an array for prometheus input plugin"), input: &Prometheus{}, data: map[string]interface{}{ "urls": "", }, }, { name: "prometheus", want: &Prometheus{ URLs: []string{ "http://192.168.2.1:9090", "http://192.168.2.2:9090", }, }, input: &Prometheus{}, data: map[string]interface{}{ "urls": []interface{}{ "http://192.168.2.1:9090", "http://192.168.2.2:9090", }, }, }, { name: "redis empty", want: &Redis{}, wantErr: errors.New("bad servers for redis input plugin"), input: &Redis{}, }, { name: "redis bad data not array", want: &Redis{}, wantErr: errors.New("servers is not an array for redis input plugin"), input: &Redis{}, data: map[string]interface{}{ "servers": "", }, }, { name: "redis without password", want: &Redis{ Servers: []string{ "http://192.168.2.1:9090", "http://192.168.2.2:9090", }, }, input: &Redis{}, data: map[string]interface{}{ "servers": []interface{}{ "http://192.168.2.1:9090", "http://192.168.2.2:9090", }, }, }, { name: "redis with password", want: &Redis{ Servers: []string{ "http://192.168.2.1:9090", "http://192.168.2.2:9090", }, Password: "pass1", }, input: &Redis{}, data: map[string]interface{}{ "servers": []interface{}{ "http://192.168.2.1:9090", "http://192.168.2.2:9090", }, "password": "pass1", }, }, { name: "swap", want: &SwapStats{}, input: &SwapStats{}, }, { name: "syslog empty", want: &Syslog{}, wantErr: errors.New("bad server for syslog input plugin"), input: &Syslog{}, }, { name: "syslog", want: &Syslog{ Address: "http://1.1.1.1:10255", }, input: &Syslog{}, data: map[string]interface{}{ "server": "http://1.1.1.1:10255", }, }, { name: "system", want: &SystemStats{}, input: &SystemStats{}, }, { name: "tail empty", want: &Tail{}, wantErr: errors.New("bad files for tail input plugin"), input: &Tail{}, }, { name: "tail bad data not array", want: &Tail{}, wantErr: errors.New("not an array for tail input plugin"), input: &Tail{}, data: map[string]interface{}{ "files": "", }, }, { name: "tail", want: &Tail{ Files: []string{ "http://192.168.2.1:9090", "http://192.168.2.2:9090", }, }, input: &Tail{}, data: map[string]interface{}{ "files": []interface{}{ "http://192.168.2.1:9090", "http://192.168.2.2:9090", }, }, }, } for _, c := range cases { err := c.input.UnmarshalTOML(c.data) if c.wantErr != nil && (err == nil || err.Error() != c.wantErr.Error()) { t.Fatalf("%s failed want err %s, got %v", c.name, c.wantErr.Error(), err) } if c.wantErr == nil && err != nil { t.Fatalf("%s failed want err nil, got %v", c.name, err) } if !reflect.DeepEqual(c.input, c.want) { t.Fatalf("%s failed want %v, got %v", c.name, c.want, c.input) } } }