blob: 98d3443767c692be493b7fb141f20a923e3378ba [file] [log] [blame]
# Class: datadog_agent
#
# This class contains the agent installation mechanism for the Datadog module
#
# Parameters:
# $dd_url:
# The host of the Datadog intake server to send agent data to.
# Defaults to https://app.datadoghq.com.
# $host:
# $api_key:
# Your DataDog API Key. Please replace with your key value.
# $collect_ec2_tags
# Collect AWS EC2 custom tags as agent tags.
# Boolean. Default: false
# $collect_instance_metadata
# The Agent will try to collect instance metadata for EC2 and GCE instances.
# Boolean. Default: true
# $tags
# Optional array of tags.
# $hiera_tags
# Boolean to grab tags from hiera to allow merging
# $facts_to_tags
# Optional array of facts' names that you can use to define tags following
# the scheme: "fact_name:fact_value".
# $puppet_run_reports
# Will send results from your puppet agent runs back to the datadog service.
# $puppetmaster_user
# Will chown the api key used by the report processor to this user.
# Defaults to the user the puppetmaster is configured to run as.
# $non_local_traffic
# Enable you to use the agent as a proxy. Defaults to false.
# See https://github.com/DataDog/dd-agent/wiki/Proxy-Configuration
# $dogstreams
# Optional array of logs to parse and custom parsers to use.
# See https://github.com/DataDog/dd-agent/blob/ed5e698/datadog.conf.example#L149-L178
# $log_level
# Set value of 'log_level' variable. Default is 'info' as in dd-agent.
# Valid values here are: critical, debug, error, fatal, info, warn and warning.
# $hostname_extraction_regex
# Completely optional.
# Instead of reporting the puppet nodename, use this regex to extract the named
# 'hostname' captured group to report the run in Datadog.
# ex.: '^(?<hostname>.*\.datadoghq\.com)(\.i-\w{8}\..*)?$'
# $log_to_syslog
# Set value of 'log_to_syslog' variable. Default is true -> yes as in dd-agent.
# Valid values here are: true or false.
# $dogstatsd_port
# Set value of the 'dogstatsd_port' variable. Defaultis 8125.
# $statsd_forward_host
# Set the value of the statsd_forward_host varable. Used to forward all
# statsd metrics to another host.
# $statsd_forward_port
# Set the value of the statsd_forward_port varable. Used to forward all
# statsd metrics to another host.
# $manage_repo
# Boolean to indicate whether this module should attempt to manage
# the package repo. Default true.
# $proxy_host
# Set value of 'proxy_host' variable. Default is blank.
# $proxy_port
# Set value of 'proxy_port' variable. Default is blank.
# $proxy_user
# Set value of 'proxy_user' variable. Default is blank.
# $proxy_password
# Set value of 'proxy_password' variable. Default is blank.
# $graphite_listen_port
# Set graphite listener port
# $extra_template
# Optional, append this extra template file at the end of
# the default datadog.conf template
# $skip_apt_key_trusting
# Skip trusting the apt key. Default is false. Useful if you have a
# separate way of adding keys.
# $skip_ssl_validation
# Skip SSL validation.
# $use_curl_http_client
# Uses the curl HTTP client for the forwarder
# $recent_point_threshold
# Sets the threshold for accepting points.
# String. Default: empty (30 second intervals)
# $listen_port
# Change the port that the agent listens on
# String. Default: empty (port 17123 in dd-agent)
# $additional_checksd
# Additional directory to look for datadog checks in
# String. Default: empty
# $bind_host
# The loopback address the forwarder and Dogstatsd will bind.
# String. Default: empty
# $use_pup
# Enables the local pup dashboard
# Boolean. Default: false
# $pup_port
# Specifies the port to be used by pup. Must have use_pup set
# String. Default: empty
# $pup_interface
# Specifies which interface pup will use. Must have use_pup set
# String. Default: empty
# $pup_url
# Specifies the URL used to access pup. Must have use_pup set
# String. Default: empty
# $use_dogstatsd
# Enables the dogstatsd server
# Boolean. Default: true
# $dogstatsd_socket
# Specifies the socket file to be used by dogstatsd. Must have use_dogstatsd set
# String. Default: empty
# $dogstatsd_port
# Specifies the port to be used by dogstatsd. Must have use_dogstatsd set
# String. Default: empty
# $dogstatsd_target
# Change the target to be used by dogstatsd. Must have use_dogstatsd set
# set
# String. Default: empty
# $dogstatsd_interval
# Change the dogstatsd flush period. Must have use_dogstatsd set
# String. Default: empty ( 10 second interval)
# $dogstatsd_normalize
# Enables 1 second nomralization. Must have use_dogstatsd set
# Boolean. Default: true
# $statsd_forward_host
# Enables forwarding of statsd packetsto host. Must have use_dogstatsd set
# String. Default: empty
# $statsd_forward_port
# Specifis port for $statsd_forward_host. Must have use_dogstatsd set
# String. Default: empty
# $device_blacklist_re
# Specifies pattern for device blacklisting.
# String. Default: empty
# $ganglia_host
# Specifies host where gmetad is running
# String. Default: empty
# $ganglia_port
# Specifies port for $ganglia_host
# String. Default: empty
# $dogstreams
# Specifies port for list of logstreams/modules to be used.
# String. Default: empty
# $custom_emitters
# Specifies a comma seperated list of non standard emitters to be used
# String. Default: empty
# $custom_emitters
# Specifies a comma seperated list of non standard emitters to be used
# String. Default: empty
# $agent6_log_file
# Specifies the log file location for the agent6
# String. Default: empty
# $collector_log_file
# Specifies the log file location for the collector system
# String. Default: empty
# $forwarder_log_file
# Specifies the log file location for the forwarder system
# String. Default: empty
# $dogstatsd
# Specifies the log file location for the dogstatsd system
# String. Default: empty
# $pup_log_file
# Specifies the log file location for the pup system
# String. Default: empty
# $apm_enabled
# Boolean to enable or disable the trace agent
# Boolean. Default: false
# $apm_env
# String defining the environment for the APM traces
# String. Default: empty
# $process_enabled
# String to enable the process/container agent
# Boolean. Default: false
# $scrub_args
# Boolean to enable or disable the process cmdline scrubbing by the process-agent
# Boolean. Default: true
# $custom_sensitive_words
# Array to add more words to be used on the process cdmline scrubbing by the process-agent
# Array. Default: []
#
# Actions:
#
# Requires:
#
# Sample Usage:
#
# include datadog_agent
#
# OR
#
# class { 'datadog_agent':
# api_key => 'your key',
# tags => ['env:production', 'linux'],
# puppet_run_reports => false,
# puppetmaster_user => puppet,
# }
#
#
class datadog_agent(
$dd_url = 'https://app.datadoghq.com',
$host = '',
$api_key = 'your_API_key',
$collect_ec2_tags = false,
$collect_instance_metadata = true,
$tags = [],
$integrations = {},
$hiera_integrations = false,
$hiera_tags = false,
$facts_to_tags = [],
$puppet_run_reports = false,
$puppetmaster_user = $settings::user,
$non_local_traffic = false,
$dogstreams = [],
$log_level = 'info',
$log_to_syslog = true,
$service_ensure = 'running',
$service_enable = true,
$manage_repo = true,
$hostname_extraction_regex = nil,
$dogstatsd_port = 8125,
$dogstatsd_socket = '',
$statsd_forward_host = '',
$statsd_forward_port = '',
$statsd_histogram_percentiles = '0.95',
$proxy_host = '',
$proxy_port = '',
$proxy_user = '',
$proxy_password = '',
$graphite_listen_port = '',
$extra_template = '',
$ganglia_host = '',
$ganglia_port = 8651,
$skip_ssl_validation = false,
$skip_apt_key_trusting = false,
$use_curl_http_client = false,
$recent_point_threshold = '',
$listen_port = '',
$additional_checksd = '',
$bind_host = '',
$use_pup = false,
$pup_port = '',
$pup_interface = '',
$pup_url = '',
$use_dogstatsd = true,
$dogstatsd_target = '',
$dogstatsd_interval = '',
$dogstatsd_normalize = true,
$device_blacklist_re = '',
$custom_emitters = '',
$agent6_log_file = '/var/log/datadog/agent.log',
$collector_log_file = '',
$forwarder_log_file = '',
$dogstatsd_log_file = '',
$pup_log_file = '',
$syslog_host = '',
$syslog_port = '',
$service_discovery_backend = '',
$sd_config_backend = '',
$sd_backend_host = '',
$sd_backend_port = 0,
$sd_template_dir = '',
$sd_jmx_enable = false,
$consul_token = '',
$agent5_enable = $datadog_agent::params::agent5_enable,
$conf_dir = $datadog_agent::params::conf_dir,
$conf6_dir = $datadog_agent::params::conf6_dir,
$conf_dir_purge = $datadog_agent::params::conf_dir_purge,
$service_name = $datadog_agent::params::service_name,
$package_name = $datadog_agent::params::package_name,
$dd_user = $datadog_agent::params::dd_user,
$dd_group = $datadog_agent::params::dd_group,
$dd_groups = $datadog_agent::params::dd_groups,
$apm_enabled = $datadog_agent::params::apm_default_enabled,
$apm_env = '',
$process_enabled = $datadog_agent::params::process_default_enabled,
$scrub_args = $datadog_agent::params::process_default_scrub_args,
$custom_sensitive_words = $datadog_agent::params::process_default_custom_words,
Hash[String[1], Data] $agent6_extra_options = {},
$agent5_repo_uri = $datadog_agent::params::agent5_default_repo,
$agent6_repo_uri = $datadog_agent::params::agent6_default_repo,
$apt_release = $datadog_agent::params::apt_default_release,
) inherits datadog_agent::params {
# Allow ports to be passed as integers or strings.
# lint:ignore:only_variable_string
$_dogstatsd_port = "${dogstatsd_port}"
$_statsd_forward_port = "${statsd_forward_port}"
$_proxy_port = "${proxy_port}"
$_graphite_listen_port = "${graphite_listen_port}"
$_listen_port = "${listen_port}"
$_pup_port = "${pup_port}"
$_syslog_port = "${syslog_port}"
# lint:endignore
validate_legacy(String, 'validate_string', $dd_url)
validate_legacy(String, 'validate_string', $host)
validate_legacy(String, 'validate_string', $api_key)
validate_legacy(Array, 'validate_array', $tags)
validate_legacy(Boolean, 'validate_bool', $hiera_tags)
validate_legacy(Array, 'validate_array', $dogstreams)
validate_legacy(Array, 'validate_array', $facts_to_tags)
validate_legacy(Boolean, 'validate_bool', $puppet_run_reports)
validate_legacy(String, 'validate_string', $puppetmaster_user)
validate_legacy(Boolean, 'validate_bool', $non_local_traffic)
validate_legacy(Boolean, 'validate_bool', $log_to_syslog)
validate_legacy(Boolean, 'validate_bool', $manage_repo)
validate_legacy(String, 'validate_string', $log_level)
validate_legacy(String, 'validate_re', $_dogstatsd_port, '^\d*$')
validate_legacy(String, 'validate_string', $statsd_histogram_percentiles)
validate_legacy(String, 'validate_re', $_statsd_forward_port, '^\d*$')
validate_legacy(String, 'validate_string', $proxy_host)
validate_legacy(String, 'validate_re', $_proxy_port, '^\d*$')
validate_legacy(String, 'validate_string', $proxy_user)
validate_legacy(String, 'validate_string', $proxy_password)
validate_legacy(String, 'validate_re', $_graphite_listen_port, '^\d*$')
validate_legacy(String, 'validate_string', $extra_template)
validate_legacy(String, 'validate_string', $ganglia_host)
validate_legacy(Integer, 'validate_integer', $ganglia_port)
validate_legacy(Boolean, 'validate_bool', $skip_ssl_validation)
validate_legacy(Boolean, 'validate_bool', $skip_apt_key_trusting)
validate_legacy(Boolean, 'validate_bool', $use_curl_http_client)
validate_legacy(Boolean, 'validate_bool', $collect_ec2_tags)
validate_legacy(Boolean, 'validate_bool', $collect_instance_metadata)
validate_legacy(String, 'validate_string', $recent_point_threshold)
validate_legacy(String, 'validate_re', $_listen_port, '^\d*$')
validate_legacy(String, 'validate_string', $additional_checksd)
validate_legacy(String, 'validate_string', $bind_host)
validate_legacy(Boolean, 'validate_bool', $use_pup)
validate_legacy(String, 'validate_re', $_pup_port, '^\d*$')
validate_legacy(String, 'validate_string', $pup_interface)
validate_legacy(String, 'validate_string', $pup_url)
validate_legacy(Boolean, 'validate_bool', $use_dogstatsd)
validate_legacy(String, 'validate_string', $dogstatsd_target)
validate_legacy(String, 'validate_string', $dogstatsd_interval)
validate_legacy(Boolean, 'validate_bool', $dogstatsd_normalize)
validate_legacy(String, 'validate_string', $statsd_forward_host)
validate_legacy(String, 'validate_string', $device_blacklist_re)
validate_legacy(String, 'validate_string', $custom_emitters)
validate_legacy(String, 'validate_string', $agent6_log_file)
validate_legacy(String, 'validate_string', $collector_log_file)
validate_legacy(String, 'validate_string', $forwarder_log_file)
validate_legacy(String, 'validate_string', $dogstatsd_log_file)
validate_legacy(String, 'validate_string', $pup_log_file)
validate_legacy(String, 'validate_string', $syslog_host)
validate_legacy(String, 'validate_re', $_syslog_port, '^\d*$')
validate_legacy(String, 'validate_string', $service_discovery_backend)
validate_legacy(String, 'validate_string', $sd_config_backend)
validate_legacy(String, 'validate_string', $sd_backend_host)
validate_legacy(Integer, 'validate_integer', $sd_backend_port)
validate_legacy(String, 'validate_string', $sd_template_dir)
validate_legacy(Boolean, 'validate_bool', $sd_jmx_enable)
validate_legacy(String, 'validate_string', $consul_token)
validate_legacy(Boolean, 'validate_bool', $apm_enabled)
validate_legacy(Boolean, 'validate_bool', $agent5_enable)
validate_legacy(String, 'validate_string', $apm_env)
validate_legacy(Boolean, 'validate_bool', $process_enabled)
validate_legacy(Boolean, 'validate_bool', $scrub_args)
validate_legacy(Array, 'validate_array', $custom_sensitive_words)
validate_legacy(String, 'validate_string', $agent5_repo_uri)
validate_legacy(String, 'validate_string', $agent6_repo_uri)
validate_legacy(String, 'validate_string', $apt_release)
if $hiera_tags {
$local_tags = lookup({ 'name' => 'datadog_agent::tags', 'default_value' => []})
} else {
$local_tags = $tags
}
if $hiera_integrations {
$local_integrations = lookup({ 'name' => 'datadog_agent::integrations', 'default_value' => {}})
} else {
$local_integrations = $integrations
}
include datadog_agent::params
case upcase($log_level) {
'CRITICAL': { $_loglevel = 'CRITICAL' }
'DEBUG': { $_loglevel = 'DEBUG' }
'ERROR': { $_loglevel = 'ERROR' }
'FATAL': { $_loglevel = 'FATAL' }
'INFO': { $_loglevel = 'INFO' }
'WARN': { $_loglevel = 'WARN' }
'WARNING': { $_loglevel = 'WARNING' }
default: { $_loglevel = 'INFO' }
}
case $::operatingsystem {
'Ubuntu','Debian' : {
if $agent5_enable {
class { 'datadog_agent::ubuntu::agent5':
service_ensure => $service_ensure,
service_enable => $service_enable,
location => $agent5_repo_uri,
release => $apt_release,
skip_apt_key_trusting => $skip_apt_key_trusting,
}
} else {
class { 'datadog_agent::ubuntu::agent6':
service_ensure => $service_ensure,
service_enable => $service_enable,
location => $agent6_repo_uri,
release => $apt_release,
skip_apt_key_trusting => $skip_apt_key_trusting,
}
}
}
'RedHat','CentOS','Fedora','Amazon','Scientific' : {
if $agent5_enable {
class { 'datadog_agent::redhat::agent5':
baseurl => $agent5_repo_uri,
manage_repo => $manage_repo,
service_ensure => $service_ensure,
service_enable => $service_enable,
}
} else {
class { 'datadog_agent::redhat::agent6':
baseurl => $agent6_repo_uri,
manage_repo => $manage_repo,
service_ensure => $service_ensure,
service_enable => $service_enable,
}
}
}
default: { fail("Class[datadog_agent]: Unsupported operatingsystem: ${::operatingsystem}") }
}
if ($dd_groups) {
user { $dd_user:
groups => $dd_groups,
notify => Service[$datadog_agent::params::service_name],
}
}
# required by reports even in agent5 scenario
file { '/etc/datadog-agent':
ensure => directory,
owner => $dd_user,
group => $dd_group,
mode => '0755',
require => Package[$datadog_agent::params::package_name],
}
if $agent5_enable {
file { '/etc/dd-agent':
ensure => directory,
owner => $dd_user,
group => $dd_group,
mode => '0755',
require => Package[$datadog_agent::params::package_name],
}
file { $conf_dir:
ensure => directory,
purge => $conf_dir_purge,
recurse => true,
force => $conf_dir_purge,
owner => $dd_user,
group => $dd_group,
notify => Service[$datadog_agent::params::service_name]
}
concat {'/etc/dd-agent/datadog.conf':
owner => $datadog_agent::params::dd_user,
group => $datadog_agent::params::dd_group,
mode => '0640',
notify => Service[$datadog_agent::params::service_name],
require => File['/etc/dd-agent'],
}
concat::fragment{ 'datadog header':
target => '/etc/dd-agent/datadog.conf',
content => template('datadog_agent/datadog_header.conf.erb'),
order => '01',
}
concat::fragment{ 'datadog tags':
target => '/etc/dd-agent/datadog.conf',
content => 'tags: ',
order => '02',
}
datadog_agent::tag5{$local_tags: }
datadog_agent::tag5{$facts_to_tags:
lookup_fact => true,
}
concat::fragment{ 'datadog footer':
target => '/etc/dd-agent/datadog.conf',
content => template('datadog_agent/datadog_footer.conf.erb'),
order => '05',
}
if ($extra_template != '') {
concat::fragment{ 'datadog extra_template footer':
target => '/etc/dd-agent/datadog.conf',
content => template($extra_template),
order => '06',
}
}
if ($apm_enabled == true) and ($apm_env != '') {
concat::fragment{ 'datadog apm footer':
target => '/etc/dd-agent/datadog.conf',
content => template('datadog_agent/datadog_apm_footer.conf.erb'),
order => '07',
}
}
if ($process_enabled == true) {
concat::fragment{ 'datadog process agent footer':
target => '/etc/dd-agent/datadog.conf',
content => template('datadog_agent/datadog_process_footer.conf.erb'),
order => '08',
}
}
} else {
# lint:ignore:quoted_booleans
$process_enabled_str = $process_enabled ? { true => 'true' , default => 'disabled' }
# lint:endignore
$base_extra_config = {
'apm_config' => { 'apm_enabled' => $apm_enabled },
'process_config' => {
'enabled' => $process_enabled_str,
'scrub_args' => $scrub_args,
'custom_sensitive_words' => $custom_sensitive_words,
},
}
$extra_config = deep_merge($base_extra_config, $agent6_extra_options)
file { $conf6_dir:
ensure => directory,
purge => $conf_dir_purge,
recurse => true,
force => $conf_dir_purge,
owner => $dd_user,
group => $dd_group,
notify => Service[$datadog_agent::params::service_name]
}
$_local_tags = datadog_agent::tag6($local_tags, false)
$_facts_tags = datadog_agent::tag6($facts_to_tags, true)
$_agent_config = {
'api_key' => $api_key,
'dd_url' => $dd_url,
'cmd_port' => 5001,
'conf_path' => $datadog_agent::params::conf6_dir,
'enable_metadata_collection' => $collect_instance_metadata,
'dogstatsd_port' => $dogstatsd_port,
'dogstatsd_socket' => $dogstatsd_socket,
'dogstatsd_non_local_traffic' => $non_local_traffic,
'log_file' => $agent6_log_file,
'log_level' => $log_level,
'tags' => unique(flatten(union($_local_tags, $_facts_tags))),
}
$agent_config = deep_merge($_agent_config, $extra_config)
file { '/etc/datadog-agent/datadog.yaml':
owner => 'dd-agent',
group => 'dd-agent',
mode => '0640',
content => template('datadog_agent/datadog6.yaml.erb'),
notify => Service[$datadog_agent::params::service_name],
require => File['/etc/datadog-agent'],
}
}
if $puppet_run_reports {
class { 'datadog_agent::reports':
api_key => $api_key,
dogapi_version => $datadog_agent::params::dogapi_version,
puppetmaster_user => $puppetmaster_user,
hostname_extraction_regex => $hostname_extraction_regex,
}
}
create_resources('datadog_agent::integration', $local_integrations)
}