Initial commit
diff --git a/CHANGELOG.rst b/CHANGELOG.rst
new file mode 100644
index 0000000..0f3c749
--- /dev/null
+++ b/CHANGELOG.rst
@@ -0,0 +1,7 @@
+
+collectd-formula
+================
+
+0.0.1 (2015-08-03)
+
+- Initial formula setup
\ No newline at end of file
diff --git a/LICENSE b/LICENSE
new file mode 100644
index 0000000..6f2b42f
--- /dev/null
+++ b/LICENSE
@@ -0,0 +1,13 @@
+Copyright (c) 2014-2015 tcp cloud a.s.
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
\ No newline at end of file
diff --git a/README.rst b/README.rst
new file mode 100644
index 0000000..eaf9273
--- /dev/null
+++ b/README.rst
@@ -0,0 +1,84 @@
+========
+Collectd
+========
+
+Collectd is a daemon which collects system performance statistics periodically and provides mechanisms to store the values in a variety of ways, for example in RRD files.
+
+Sample pillars
+==============
+
+Send data over TCP to Graphite Carbon (old way plugins)
+
+.. code-block:: yaml
+
+ collectd:
+ client:
+ enabled: true
+ read_interval: 60
+ plugins:
+ - name: cpu
+ - name: df
+ - name: disk
+ - name: entropy
+ - name: interface
+ - name: load
+ - name: memory
+ - name: processes
+ - name: swap
+ - name: uptime
+ - name: users
+ - name: write_graphite
+ host: carbon1.comain.com
+ port: 2003
+
+Gather libvirt data from local KVM
+
+.. code-block:: yaml
+
+ collectd:
+ client:
+ enabled: true
+ read_interval: 60
+ plugins:
+ - name: cpu
+ - name: libvirt
+ connection: 'qemu:///system'
+
+Send data over AMQP
+
+.. code-block:: yaml
+
+ collectd:
+ client:
+ enabled: true
+ read_interval: 60
+ plugins:
+ - name: cpu
+ - name: users
+ - name: amqp
+ host: broker1.comain.com
+ port: 5672
+ user: monitor
+ password: amqp-pwd
+ virtual_host: '/monitor'
+
+Send data over carbon
+
+.. code-block:: yaml
+
+ collectd:
+ client:
+ enabled: true
+ backend:
+ carbon:
+ engine: carbon
+ host: metrics.domain.com
+ port: 2003
+
+Read more
+=========
+
+* http://collectd.org/documentation.shtml
+* http://www.canopsis.org/2013/02/collectd-graphite/
+* http://collectd.org/documentation/manpages/collectd.conf.5.shtml#plugin_libvirt
+* http://libvirt.org/uri.html#URI_qemu
diff --git a/VERSION b/VERSION
new file mode 100644
index 0000000..3b04cfb
--- /dev/null
+++ b/VERSION
@@ -0,0 +1 @@
+0.2
diff --git a/collectd/client.sls b/collectd/client.sls
new file mode 100644
index 0000000..aed79fa
--- /dev/null
+++ b/collectd/client.sls
@@ -0,0 +1,149 @@
+{%- from "collectd/map.jinja" import client with context %}
+{%- if client.enabled %}
+
+{% if grains.os == 'Ubuntu' and (grains.osrelease in ['10.04', '12.04']) %}
+
+collectd_repo:
+ pkgrepo.managed:
+ - human_name: Collectd
+ - ppa: nikicat/collectd
+ - file: /etc/apt/sources.list.d/collectd.list
+ - require_in:
+ - pkg: collectd_packages
+
+collectd_amqp_packages:
+ pkg.installed:
+ - names:
+ - librabbitmq0
+
+{% endif %}
+
+collectd_packages:
+ pkg.installed:
+ - names: {{ client.pkgs }}
+
+/etc/collectd:
+ file.directory:
+ - user: root
+ - mode: 750
+ - makedirs: true
+ - require:
+ - pkg: collectd_packages
+
+{{ client.config_dir }}:
+ file.directory:
+ - user: root
+ - mode: 750
+ - makedirs: true
+ - require:
+ - pkg: collectd_packages
+
+{%- for plugin in client.get('plugins', []) %}
+
+{{ client.config_dir }}/{{ plugin.name }}.conf:
+ file.managed:
+ - source: salt://collectd/files/conf.d/{{ plugin.name }}.conf
+ - template: jinja
+ - user: root
+ - mode: 660
+ - require:
+ - file: {{ client.config_dir }}
+ - watch_in:
+ - service: collectd_service
+ - defaults:
+ plugin_name: "{{ plugin.name }}"
+
+{%- if plugin.name == 'network' %}
+/etc/collectd/passwd:
+ file.managed:
+ - source: salt://collectd/files/passwd
+ - template: jinja
+ - require:
+ - file: {{ client.config_dir }}
+{%- endif %}
+
+{%- endfor %}
+
+{%- for service in client.supported_services %}
+{%- if service in grains.roles %}
+
+{%- for service_group in service.split('.') %}
+{%- if loop.first %}
+{{ client.config_dir }}/{{ service|replace('.', '_') }}.conf:
+ file.managed:
+ - source: salt://{{ service_group }}/files/collectd.conf
+ - template: jinja
+ - user: root
+ - mode: 660
+ - require:
+ - file: {{ client.config_dir }}
+ - watch_in:
+ - service: collectd_service
+{%- endif %}
+{%- endfor %}
+
+{%- endif %}
+{%- endfor %}
+
+/etc/collectd/filters.conf:
+ file.managed:
+ - source: salt://collectd/files/filters.conf
+ - template: jinja
+ - user: root
+ - group: root
+ - mode: 660
+ - watch_in:
+ - service: collectd_service
+ - require:
+ - file: {{ client.config_dir }}
+
+/etc/collectd/thresholds.conf:
+ file.managed:
+ - source: salt://collectd/files/thresholds.conf
+ - template: jinja
+ - user: root
+ - group: root
+ - mode: 660
+ - watch_in:
+ - service: collectd_service
+ - require:
+ - file: {{ client.config_dir }}
+
+{{ client.config_file }}:
+ file.managed:
+ - source: salt://collectd/files/collectd.conf
+ - template: jinja
+ - user: root
+ - group: root
+ - mode: 660
+ - require:
+ - file: {{ client.config_dir }}
+ - watch_in:
+ - service: collectd_service
+
+{%- for backend_name, backend in client.backend.iteritems() %}
+
+{{ client.config_dir }}/{{ backend_name }}.conf:
+ file.managed:
+ - source: salt://collectd/files/backend/{{ backend.engine }}.conf
+ - template: jinja
+ - user: root
+ - group: root
+ - mode: 660
+ - defaults:
+ backend_name: "{{ backend_name }}"
+ - require:
+ - file: {{ client.config_dir }}
+ - watch_in:
+ - service: collectd_service
+
+{%- endfor %}
+
+collectd_service:
+ service.running:
+ - name: collectd
+ - enable: true
+ - require:
+ - pkg: collectd_packages
+
+{%- endif %}
diff --git a/collectd/files/backend/amqp.conf b/collectd/files/backend/amqp.conf
new file mode 100644
index 0000000..e93026e
--- /dev/null
+++ b/collectd/files/backend/amqp.conf
@@ -0,0 +1,19 @@
+
+LoadPlugin amqp
+
+<Plugin "amqp">
+ <Publish "graphite">
+ Host "{{ plugin.host }}"
+ Port "{{ plugin.port }}"
+ VHost "{{ plugin.virtual_host }}"
+ User "{{ plugin.user }}"
+ Password "{{ plugin.password }}"
+ Exchange "metrics"
+ ExchangeType "amq.topic"
+# RoutingKey "metrics"
+ Persistent true
+ Format "Graphite"
+ GraphitePrefix "{{ pillar.system.system }}_{{ pillar.system.environment }}."
+ StoreRates false
+ </Publish>
+</Plugin>
diff --git a/collectd/files/backend/carbon.conf b/collectd/files/backend/carbon.conf
new file mode 100644
index 0000000..f0843d7
--- /dev/null
+++ b/collectd/files/backend/carbon.conf
@@ -0,0 +1,18 @@
+{%- from "linux/map.jinja" import system with context %}
+{%- set backend = salt['pillar.get']('collectd:client:backend:'+backend_name) %}
+
+LoadPlugin write_graphite
+
+<Plugin write_graphite>
+ <Carbon>
+ Host "{{ backend.host }}"
+ Port "{{ backend.port }}"
+ Prefix "{{ system.get('cluster', 'prd') }}_{{ system.get('environment', 'prd') }}."
+ Postfix ""
+ StoreRates false
+ AlwaysAppendDS false
+ EscapeCharacter "_"
+ SeparateInstances true
+ Protocol "{{ backend.get('protocol', 'tcp') }}"
+ </Carbon>
+</Plugin>
diff --git a/collectd/files/backend/collectd.conf b/collectd/files/backend/collectd.conf
new file mode 100644
index 0000000..aed68c3
--- /dev/null
+++ b/collectd/files/backend/collectd.conf
@@ -0,0 +1,34 @@
+LoadPlugin network
+{%- for plugin in pillar.collectd.client.plugins %}
+{%- if plugin_name == plugin.name %}
+<Plugin "network">
+ {% if plugin.mode == 'client' %}
+ Server "{{ plugin.host }}" "{{ plugin.port }}"
+# <Server "{{ plugin.host }}" "{{ plugin.port }}">
+# SecurityLevel Encrypt
+# Username "{{ plugin.user }}"
+# Password "{{ plugin.password }}"
+# </Server>
+ TimeToLive 128
+ {% endif %}
+ {% if plugin.mode == 'server' %}
+ Listen "{{ plugin.host }}" "{{ plugin.port }}"
+# <Listen "{{ plugin.host }}" "{{ plugin.port }}">
+# SecurityLevel Sign
+# AuthFile "/etc/collectd/passwd"
+# Interface "{{ plugin.interface }}"
+# </Listen>
+ MaxPacketSize 1024
+ {% endif %}
+
+# # proxy setup (client and server as above):
+# Forward true
+#
+# # statistics about the network plugin itself
+# ReportStats false
+#
+# # "garbage collection"
+# CacheFlush 1800
+</Plugin>
+{%- endif %}
+{%- endfor %}
diff --git a/collectd/files/collectd.conf b/collectd/files/collectd.conf
new file mode 100644
index 0000000..cae53fe
--- /dev/null
+++ b/collectd/files/collectd.conf
@@ -0,0 +1,897 @@
+{%- from "collectd/map.jinja" import client with context %}
+{%- from "linux/map.jinja" import system with context %}
+
+# Config file for collectd(1).
+#
+# Some plugins need additional configuration and are disabled by default.
+# Please read collectd.conf(5) for details.
+#
+# You should also read /usr/share/doc/collectd-core/README.Debian.plugins
+# before enabling any more plugins.
+
+##############################################################################
+# Global #
+#----------------------------------------------------------------------------#
+# Global settings for the daemon. #
+##############################################################################
+
+Hostname "{{ system.name }}.{{ system.domain }}"
+FQDNLookup false
+
+#BaseDir "/var/lib/collectd"
+#PluginDir "/usr/lib/collectd"
+#TypesDB "/usr/share/collectd/types.db" "/etc/collectd/my_types.db"
+
+#----------------------------------------------------------------------------#
+# Interval at which to query values. This may be overwritten on a per-plugin #
+# base by using the 'Interval' option of the LoadPlugin block: #
+# <LoadPlugin foo> #
+# Interval 60 #
+# </LoadPlugin> #
+#----------------------------------------------------------------------------#
+Interval {{ client.read_interval }}
+
+#Timeout 2
+#ReadThreads 5
+
+##############################################################################
+# Logging #
+#----------------------------------------------------------------------------#
+# Plugins which provide logging functions should be loaded first, so log #
+# messages generated when loading or configuring other plugins can be #
+# accessed. #
+##############################################################################
+
+LoadPlugin syslog
+<Plugin syslog>
+ LogLevel info
+</Plugin>
+
+##############################################################################
+# LoadPlugin section #
+#----------------------------------------------------------------------------#
+# Specify what features to activate. #
+##############################################################################
+
+#LoadPlugin aggregation
+#LoadPlugin amqp
+#LoadPlugin apache
+#LoadPlugin apcups
+#LoadPlugin ascent
+##LoadPlugin battery
+#LoadPlugin bind
+#LoadPlugin conntrack
+#LoadPlugin contextswitch
+#LoadPlugin cpu
+#LoadPlugin cpufreq
+#LoadPlugin csv
+#LoadPlugin curl
+#LoadPlugin curl_json
+#LoadPlugin curl_xml
+#LoadPlugin dbi
+#LoadPlugin df
+##LoadPlugin disk
+#LoadPlugin dns
+#LoadPlugin email
+##LoadPlugin entropy
+#LoadPlugin ethstat
+#LoadPlugin exec
+#LoadPlugin filecount
+#LoadPlugin fscache
+#LoadPlugin gmond
+#LoadPlugin hddtemp
+##LoadPlugin interface
+#LoadPlugin ipmi
+#LoadPlugin iptables
+#LoadPlugin ipvs
+##LoadPlugin irq
+#LoadPlugin java
+#LoadPlugin libvirt
+#LoadPlugin load
+#LoadPlugin madwifi
+#LoadPlugin mbmon
+#LoadPlugin md
+#LoadPlugin memcachec
+#LoadPlugin memcached
+#LoadPlugin memory
+#LoadPlugin modbus
+#LoadPlugin multimeter
+#LoadPlugin mysql
+#LoadPlugin netlink
+#LoadPlugin network
+#LoadPlugin nfs
+#LoadPlugin nginx
+#LoadPlugin notify_desktop
+#LoadPlugin notify_email
+#LoadPlugin ntpd
+#LoadPlugin numa
+#LoadPlugin nut
+#LoadPlugin olsrd
+#LoadPlugin openvpn
+#<LoadPlugin perl>
+# Globals true
+#</LoadPlugin>
+#LoadPlugin pinba
+#LoadPlugin ping
+#LoadPlugin postgresql
+#LoadPlugin powerdns
+#LoadPlugin processes
+#LoadPlugin protocols
+#<LoadPlugin python>
+# Globals true
+#</LoadPlugin>
+#LoadPlugin rrdcached
+#LoadPlugin rrdtool
+#LoadPlugin sensors
+#LoadPlugin serial
+#LoadPlugin snmp
+#LoadPlugin swap
+#LoadPlugin table
+#LoadPlugin tail
+#LoadPlugin tcpconns
+#LoadPlugin teamspeak2
+#LoadPlugin ted
+#LoadPlugin thermal
+#LoadPlugin tokyotyrant
+#LoadPlugin unixsock
+#LoadPlugin uptime
+#LoadPlugin users
+#LoadPlugin uuid
+#LoadPlugin varnish
+#LoadPlugin vmem
+#LoadPlugin vserver
+#LoadPlugin wireless
+#LoadPlugin write_graphite
+#LoadPlugin write_http
+#LoadPlugin write_mongodb
+
+##############################################################################
+# Plugin configuration #
+#----------------------------------------------------------------------------#
+# In this section configuration stubs for each plugin are provided. A desc- #
+# ription of those options is available in the collectd.conf(5) manual page. #
+##############################################################################
+
+#<Plugin "aggregation">
+# <Aggregation>
+# #Host "unspecified"
+# Plugin "cpu"
+# #PluginInstance "unspecified"
+# Type "cpu"
+# #TypeInstance "unspecified"
+#
+# GroupBy "Host"
+# GroupBy "TypeInstance"
+#
+# CalculateNum false
+# CalculateSum false
+# CalculateAverage true
+# CalculateMinimum false
+# CalculateMaximum false
+# CalculateStddev false
+# </Aggregation>
+#</Plugin>
+
+#<Plugin amqp>
+# <Publish "name">
+# Host "localhost"
+# Port "5672"
+# VHost "/"
+# User "guest"
+# Password "guest"
+# Exchange "amq.fanout"
+# RoutingKey "collectd"
+# Persistent false
+# StoreRates false
+# </Publish>
+#</Plugin>
+
+#<Plugin apache>
+# <Instance "foo">
+# URL "http://localhost/server-status?auto"
+# User "www-user"
+# Password "secret"
+# VerifyPeer false
+# VerifyHost false
+# CACert "/etc/ssl/ca.crt"
+# Server "apache"
+# </Instance>
+#
+# <Instance "bar">
+# URL "http://some.domain.tld/status?auto"
+# Host "some.domain.tld"
+# Server "lighttpd"
+# </Instance>
+#</Plugin>
+
+#<Plugin apcups>
+# Host "localhost"
+# Port "3551"
+#</Plugin>
+
+#<Plugin ascent>
+# URL "http://localhost/ascent/status/"
+# User "www-user"
+# Password "secret"
+# VerifyPeer false
+# VerifyHost false
+# CACert "/etc/ssl/ca.crt"
+#</Plugin>
+
+#<Plugin "bind">
+# URL "http://localhost:8053/"
+#
+# ParseTime false
+#
+# OpCodes true
+# QTypes true
+# ServerStats true
+# ZoneMaintStats true
+# ResolverStats false
+# MemoryStats true
+#
+# <View "_default">
+# QTypes true
+# ResolverStats true
+# CacheRRSets true
+#
+# Zone "127.in-addr.arpa/IN"
+# </View>
+#</Plugin>
+
+#<Plugin csv>
+# DataDir "/var/lib/collectd/csv"
+# StoreRates false
+#</Plugin>
+
+#<Plugin curl>
+# <Page "stock_quotes">
+# URL "http://finance.google.com/finance?q=NYSE%3AAMD"
+# User "foo"
+# Password "bar"
+# VerifyPeer false
+# VerifyHost false
+# CACert "/etc/ssl/ca.crt"
+# MeasureResponseTime false
+# <Match>
+# Regex "<span +class=\"pr\"[^>]*> *([0-9]*\\.[0-9]+) *</span>"
+# DSType "GaugeAverage"
+# Type "stock_value"
+# Instance "AMD"
+# </Match>
+# </Page>
+#</Plugin>
+
+#<Plugin curl_json>
+## See: http://wiki.apache.org/couchdb/Runtime_Statistics
+# <URL "http://localhost:5984/_stats">
+# Instance "httpd"
+# <Key "httpd/requests/count">
+# Type "http_requests"
+# </Key>
+#
+# <Key "httpd_request_methods/*/count">
+# Type "http_request_methods"
+# </Key>
+#
+# <Key "httpd_status_codes/*/count">
+# Type "http_response_codes"
+# </Key>
+# </URL>
+## Database status metrics:
+# <URL "http://localhost:5984/_all_dbs">
+# Instance "dbs"
+# <Key "*/doc_count">
+# Type "gauge"
+# </Key>
+# <Key "*/doc_del_count">
+# Type "counter"
+# </Key>
+# <Key "*/disk_size">
+# Type "bytes"
+# </Key>
+# </URL>
+#</Plugin>
+
+#<Plugin "curl_xml">
+# <URL "http://localhost/stats.xml">
+# Host "my_host"
+# Instance "some_instance"
+# User "collectd"
+# Password "thaiNg0I"
+# VerifyPeer true
+# VerifyHost true
+# CACert "/path/to/ca.crt"
+#
+# <XPath "table[@id=\"magic_level\"]/tr">
+# Type "magic_level"
+# InstancePrefix "prefix-"
+# InstanceFrom "td[1]"
+# ValuesFrom "td[2]/span[@class=\"level\"]"
+# </XPath>
+# </URL>
+#</Plugin>
+
+#<Plugin dbi>
+# <Query "num_of_customers">
+# Statement "SELECT 'customers' AS c_key, COUNT(*) AS c_value \
+# FROM customers_tbl"
+# MinVersion 40102
+# MaxVersion 50042
+# <Result>
+# Type "gauge"
+# InstancePrefix "customer"
+# InstancesFrom "c_key"
+# ValuesFrom "c_value"
+# </Result>
+# </Query>
+#
+# <Database "customers_db">
+# Driver "mysql"
+# DriverOption "host" "localhost"
+# DriverOption "username" "collectd"
+# DriverOption "password" "secret"
+# DriverOption "dbname" "custdb0"
+# SelectDB "custdb0"
+# Query "num_of_customers"
+# Query "..."
+# </Database>
+#</Plugin>
+
+#<Plugin dns>
+# Interface "eth0"
+# IgnoreSource "192.168.0.1"
+# SelectNumericQueryTypes false
+#</Plugin>
+
+#<Plugin email>
+# SocketFile "/var/run/collectd-email"
+# SocketGroup "collectd"
+# SocketPerms "0770"
+# MaxConns 5
+#</Plugin>
+
+#<Plugin ethstat>
+# Interface "eth0"
+# Map "rx_csum_offload_errors" "if_rx_errors" "checksum_offload"
+# Map "multicast" "if_multicast"
+# MappedOnly false
+#</Plugin>
+
+#<Plugin exec>
+# Exec user "/path/to/exec"
+# Exec "user:group" "/path/to/exec"
+# NotificationExec user "/path/to/exec"
+#</Plugin>
+
+#<Plugin filecount>
+# <Directory "/path/to/dir">
+# Instance "foodir"
+# Name "*.conf"
+# MTime "-5m"
+# Size "+10k"
+# Recursive true
+# IncludeHidden false
+# </Directory>
+#</Plugin>
+
+#<Plugin gmond>
+# MCReceiveFrom "239.2.11.71" "8649"
+#
+# <Metric "swap_total">
+# Type "swap"
+# TypeInstance "total"
+# DataSource "value"
+# </Metric>
+#
+# <Metric "swap_free">
+# Type "swap"
+# TypeInstance "free"
+# DataSource "value"
+# </Metric>
+#</Plugin>
+
+#<Plugin hddtemp>
+# Host "127.0.0.1"
+# Port 7634
+#</Plugin>
+
+#<Plugin interface>
+# Interface "eth0"
+# IgnoreSelected false
+#</Plugin>
+
+#<Plugin ipmi>
+# Sensor "some_sensor"
+# Sensor "another_one"
+# IgnoreSelected false
+# NotifySensorAdd false
+# NotifySensorRemove true
+# NotifySensorNotPresent false
+#</Plugin>
+
+#<Plugin iptables>
+# Chain "table" "chain"
+#</Plugin>
+
+#<Plugin irq>
+# Irq 7
+# Irq 8
+# Irq 9
+# IgnoreSelected true
+#</Plugin>
+
+#<Plugin java>
+# JVMArg "-verbose:jni"
+# JVMArg "-Djava.class.path=/usr/share/collectd/java/collectd-api.jar"
+#
+# LoadPlugin "org.collectd.java.GenericJMX"
+# <Plugin "GenericJMX">
+# # See /usr/share/doc/collectd/examples/GenericJMX.conf
+# # for an example config.
+# </Plugin>
+#</Plugin>
+
+#<Plugin libvirt>
+# Connection "xen:///"
+# RefreshInterval 60
+# Domain "name"
+# BlockDevice "name:device"
+# InterfaceDevice "name:device"
+# IgnoreSelected false
+# HostnameFormat name
+# InterfaceFormat name
+#</Plugin>
+
+#<Plugin madwifi>
+# Interface "wlan0"
+# IgnoreSelected false
+# Source "SysFS"
+# WatchSet "None"
+# WatchAdd "node_octets"
+# WatchAdd "node_rssi"
+# WatchAdd "is_rx_acl"
+# WatchAdd "is_scan_active"
+#</Plugin>
+
+#<Plugin mbmon>
+# Host "127.0.0.1"
+# Port 411
+#</Plugin>
+
+#<Plugin md>
+# Device "/dev/md0"
+# IgnoreSelected false
+#</Plugin>
+
+#<Plugin memcachec>
+# <Page "plugin_instance">
+# Server "localhost"
+# Key "page_key"
+# <Match>
+# Regex "(\\d+) bytes sent"
+# ExcludeRegex "<lines to be excluded>"
+# DSType CounterAdd
+# Type "ipt_octets"
+# Instance "type_instance"
+# </Match>
+# </Page>
+#</Plugin>
+
+#<Plugin modbus>
+# <Data "data_name">
+# RegisterBase 1234
+# RegisterType float
+# Type gauge
+# Instance "..."
+# </Data>
+#
+# <Host "name">
+# Address "addr"
+# Port "1234"
+# Interval 60
+#
+# <Slave 1>
+# Instance "foobar" # optional
+# Collect "data_name"
+# </Slave>
+# </Host>
+#</Plugin>
+
+#<Plugin netlink>
+# Interface "All"
+# VerboseInterface "All"
+# QDisc "eth0" "pfifo_fast-1:0"
+# Class "ppp0" "htb-1:10"
+# Filter "ppp0" "u32-1:0"
+# IgnoreSelected false
+#</Plugin>
+
+#<Plugin network>
+# # client setup:
+# Server "ff18::efc0:4a42" "25826"
+# <Server "239.192.74.66" "25826">
+# SecurityLevel Encrypt
+# Username "user"
+# Password "secret"
+# Interface "eth0"
+# </Server>
+# TimeToLive "128"
+#
+# # server setup:
+# Listen "ff18::efc0:4a42" "25826"
+# <Listen "239.192.74.66" "25826">
+# SecurityLevel Sign
+# AuthFile "/etc/collectd/passwd"
+# Interface "eth0"
+# </Listen>
+# MaxPacketSize 1024
+#
+# # proxy setup (client and server as above):
+# Forward true
+#
+# # statistics about the network plugin itself
+# ReportStats false
+#
+# # "garbage collection"
+# CacheFlush 1800
+#</Plugin>
+
+#<Plugin notify_desktop>
+# OkayTimeout 1000
+# WarningTimeout 5000
+# FailureTimeout 0
+#</Plugin>
+
+#<Plugin notify_email>
+# SMTPServer "localhost"
+# SMTPPort 25
+# SMTPUser "my-username"
+# SMTPPassword "my-password"
+# From "collectd@main0server.com"
+# # <WARNING/FAILURE/OK> on <hostname>.
+# # Beware! Do not use not more than two placeholders (%)!
+# Subject "[collectd] %s on %s!"
+# Recipient "email1@domain1.net"
+# Recipient "email2@domain2.com"
+#</Plugin>
+
+#<Plugin ntpd>
+# Host "localhost"
+# Port 123
+# ReverseLookups false
+# IncludeUnitID true
+#</Plugin>
+
+#<Plugin nut>
+# UPS "upsname@hostname:port"
+#</Plugin>
+
+#<Plugin olsrd>
+# Host "127.0.0.1"
+# Port "2006"
+# CollectLinks "Summary"
+# CollectRoutes "Summary"
+# CollectTopology "Summary"
+#</Plugin>
+
+#<Plugin openvpn>
+# StatusFile "/etc/openvpn/openvpn-status.log"
+# ImprovedNamingSchema false
+# CollectCompression true
+# CollectIndividualUsers true
+# CollectUserCount false
+#</Plugin>
+
+#<Plugin perl>
+# IncludeDir "/my/include/path"
+# BaseName "Collectd::Plugins"
+# EnableDebugger ""
+# LoadPlugin Monitorus
+# LoadPlugin OpenVZ
+#
+# <Plugin foo>
+# Foo "Bar"
+# Qux "Baz"
+# </Plugin>
+#</Plugin>
+
+#<Plugin pinba>
+# Address "::0"
+# Port "30002"
+# <View "name">
+# Host "host name"
+# Server "server name"
+# Script "script name"
+# <View>
+#</Plugin>
+
+#<Plugin ping>
+# Host "host.foo.bar"
+# Host "host.baz.qux"
+# Interval 1.0
+# Timeout 0.9
+# TTL 255
+# SourceAddress "1.2.3.4"
+# Device "eth0"
+# MaxMissed -1
+#</Plugin>
+
+#<Plugin powerdns>
+# <Server "server_name">
+# Collect "latency"
+# Collect "udp-answers" "udp-queries"
+# Socket "/var/run/pdns.controlsocket"
+# </Server>
+# <Recursor "recursor_name">
+# Collect "questions"
+# Collect "cache-hits" "cache-misses"
+# Socket "/var/run/pdns_recursor.controlsocket"
+# </Recursor>
+# LocalSocket "/opt/collectd/var/run/collectd-powerdns"
+#</Plugin>
+
+#<Plugin processes>
+# Process "name"
+# ProcessMatch "foobar" "/usr/bin/perl foobar\\.pl.*"
+#</Plugin>
+
+#<Plugin protocols>
+# Value "/^Tcp:/"
+# IgnoreSelected false
+#</Plugin>
+
+#<Plugin python>
+# ModulePath "/path/to/your/python/modules"
+# LogTraces true
+# Interactive true
+# Import "spam"
+#
+# <Module spam>
+# spam "wonderful" "lovely"
+# </Module>
+#</Plugin>
+
+#<Plugin rrdcached>
+# DaemonAddress "unix:/var/run/rrdcached.sock"
+# DataDir "/var/lib/rrdcached/db/collectd"
+# CreateFiles true
+# CollectStatistics true
+#
+# The following settings are rather advanced
+# and should usually not be touched:
+# StepSize 10
+# HeartBeat 20
+# RRARows 1200
+# RRATimespan 158112000
+# XFF 0.1
+#</Plugin>
+
+#<Plugin rrdtool>
+# DataDir "/var/lib/collectd/rrd"
+# CacheTimeout 120
+# CacheFlush 900
+# WritesPerSecond 30
+# RandomTimeout 0
+#
+# The following settings are rather advanced
+# and should usually not be touched:
+# StepSize 10
+# HeartBeat 20
+# RRARows 1200
+# RRATimespan 158112000
+# XFF 0.1
+#</Plugin>
+
+#<Plugin sensors>
+# SensorConfigFile "/etc/sensors3.conf"
+# Sensor "it8712-isa-0290/temperature-temp1"
+# Sensor "it8712-isa-0290/fanspeed-fan3"
+# Sensor "it8712-isa-0290/voltage-in8"
+# IgnoreSelected false
+#</Plugin>
+
+# See /usr/share/doc/collectd/examples/snmp-data.conf.gz for a
+# comprehensive sample configuration.
+#<Plugin snmp>
+# <Data "powerplus_voltge_input">
+# Type "voltage"
+# Table false
+# Instance "input_line1"
+# Scale 0.1
+# Values "SNMPv2-SMI::enterprises.6050.5.4.1.1.2.1"
+# </Data>
+# <Data "hr_users">
+# Type "users"
+# Table false
+# Instance ""
+# Shift -1
+# Values "HOST-RESOURCES-MIB::hrSystemNumUsers.0"
+# </Data>
+# <Data "std_traffic">
+# Type "if_octets"
+# Table true
+# InstancePrefix "traffic"
+# Instance "IF-MIB::ifDescr"
+# Values "IF-MIB::ifInOctets" "IF-MIB::ifOutOctets"
+# </Data>
+#
+# <Host "some.switch.mydomain.org">
+# Address "192.168.0.2"
+# Version 1
+# Community "community_string"
+# Collect "std_traffic"
+# Inverval 120
+# </Host>
+# <Host "some.server.mydomain.org">
+# Address "192.168.0.42"
+# Version 2
+# Community "another_string"
+# Collect "std_traffic" "hr_users"
+# </Host>
+# <Host "some.ups.mydomain.org">
+# Address "192.168.0.3"
+# Version 1
+# Community "more_communities"
+# Collect "powerplus_voltge_input"
+# Interval 300
+# </Host>
+#</Plugin>
+
+#<Plugin swap>
+# ReportByDevice false
+# ReportBytes true
+#</Plugin>
+
+#<Plugin table>
+# <Table "/proc/slabinfo">
+# Instance "slabinfo"
+# Separator " "
+# <Result>
+# Type gauge
+# InstancePrefix "active_objs"
+# InstancesFrom 0
+# ValuesFrom 1
+# </Result>
+# <Result>
+# Type gauge
+# InstancePrefix "objperslab"
+# InstancesFrom 0
+# ValuesFrom 4
+# </Result>
+# </Table>
+#</Plugin>
+
+#<Plugin "tail">
+# <File "/var/log/exim4/mainlog">
+# Instance "exim"
+# <Match>
+# Regex "S=([1-9][0-9]*)"
+# DSType "CounterAdd"
+# Type "ipt_bytes"
+# Instance "total"
+# </Match>
+# <Match>
+# Regex "\\<R=local_user\\>"
+# ExcludeRegex "\\<R=local_user\\>.*mail_spool defer"
+# DSType "CounterInc"
+# Type "counter"
+# Instance "local_user"
+# </Match>
+# </File>
+#</Plugin>
+
+#<Plugin tcpconns>
+# ListeningPorts false
+# LocalPort "25"
+# RemotePort "25"
+#</Plugin>
+
+#<Plugin teamspeak2>
+# Host "127.0.0.1"
+# Port "51234"
+# Server "8767"
+#</Plugin>
+
+#<Plugin ted>
+# Device "/dev/ttyUSB0"
+# Retries 0
+#</Plugin>
+
+#<Plugin thermal>
+# ForceUseProcfs false
+# Device "THRM"
+# IgnoreSelected false
+#</Plugin>
+
+#<Plugin tokyotyrant>
+# Host "localhost"
+# Port "1978"
+#</Plugin>
+
+#<Plugin unixsock>
+# SocketFile "/var/run/collectd-unixsock"
+# SocketGroup "collectd"
+# SocketPerms "0660"
+# DeleteSocket false
+#</Plugin>
+
+#<Plugin uuid>
+# UUIDFile "/etc/uuid"
+#</Plugin>
+
+#<Plugin varnish>
+# <Instance>
+# CollectCache true
+# CollectBackend true
+# CollectConnections true
+# CollectSHM true
+# CollectESI false
+# CollectFetch false
+# CollectHCB false
+# CollectSMA false
+# CollectSMS false
+# CollectSM false
+# CollectTotals false
+# CollectWorkers false
+# </Instance>
+#
+# <Instance "myinstance">
+# CollectCache true
+# </Instance>
+#</Plugin>
+
+#<Plugin vmem>
+# Verbose false
+#</Plugin>
+
+#<Plugin write_graphite>
+# <Carbon>
+# Host "localhost"
+# Port "2003"
+# Prefix "collectd"
+# Postfix "collectd"
+# StoreRates false
+# AlwaysAppendDS false
+# EscapeCharacter "_"
+# </Carbon>
+#</Plugin>
+
+#<Plugin write_http>
+# <URL "http://example.com/collectd-post">
+# User "collectd"
+# Password "secret"
+# VerifyPeer true
+# VerifyHost true
+# CACert "/etc/ssl/ca.crt"
+# Format "Command"
+# StoreRates false
+# </URL>
+#</Plugin>
+
+#<Plugin write_mongodb>
+# <Node "example">
+# Host "localhost"
+# Port "27017"
+# Timeout 1000
+# StoreRates false
+# <Node>
+#</Plugin>
+
+{%- for plugin in client.get('plugins', []) %}
+Include "{{ client.config_dir }}/{{ plugin.name }}.conf"
+{%- endfor %}
+
+{%- for service in client.supported_services %}
+{%- if service in grains.roles %}
+Include "{{ client.config_dir }}/{{ service|replace('.', '_') }}.conf"
+{%- endif %}
+{%- endfor %}
+
+{%- for backend_name, backend in client.backend.iteritems() %}
+Include "{{ client.config_dir }}/{{ backend_name }}.conf"
+{%- endfor %}
+
+Include "/etc/collectd/filters.conf"
+Include "/etc/collectd/thresholds.conf"
+
diff --git a/collectd/files/conf.d/amqp.conf b/collectd/files/conf.d/amqp.conf
new file mode 100644
index 0000000..4a9dc82
--- /dev/null
+++ b/collectd/files/conf.d/amqp.conf
@@ -0,0 +1,21 @@
+LoadPlugin amqp
+{%- for plugin in pillar.collectd.client.plugins %}
+{%- if plugin_name == plugin.name %}
+<Plugin "amqp">
+ <Publish "graphite">
+ Host "{{ plugin.host }}"
+ Port "{{ plugin.port }}"
+ VHost "{{ plugin.virtual_host }}"
+ User "{{ plugin.user }}"
+ Password "{{ plugin.password }}"
+ Exchange "metrics"
+ ExchangeType "amq.topic"
+# RoutingKey "metrics"
+ Persistent true
+ Format "Graphite"
+ GraphitePrefix "{{ pillar.system.system }}_{{ pillar.system.environment }}."
+ StoreRates false
+ </Publish>
+</Plugin>
+{%- endif %}
+{%- endfor %}
diff --git a/collectd/files/conf.d/apache.conf b/collectd/files/conf.d/apache.conf
new file mode 100644
index 0000000..023e744
--- /dev/null
+++ b/collectd/files/conf.d/apache.conf
@@ -0,0 +1,17 @@
+LoadPlugin apache
+<Plugin apache>
+ {%- if pillar.apache is defined %}
+ {%- if pillar.apache.enabled %}
+ <Instance "apache">
+ URL "http://localhost/server-status?auto"
+ </Instance>
+ {%- endif %}
+ {%- endif %}
+ {%- if pillar.lighttpd is defined %}
+ {%- if pillar.lighttpd.enabled %}
+ <Instance "lighttpd">
+ URL "http://localhost/server-status?auto"
+ </Instance>
+ {%- endif %}
+ {%- endif %}
+</Plugin>
diff --git a/collectd/files/conf.d/filecount.conf b/collectd/files/conf.d/filecount.conf
new file mode 100644
index 0000000..0525a48
--- /dev/null
+++ b/collectd/files/conf.d/filecount.conf
@@ -0,0 +1,12 @@
+LoadPlugin filecount
+<Plugin filecount>
+ {%- if pillar.webcms is defined %}
+ {%- if pillar.webcms.enabled %}
+ {%- for app in pillar.webcms.apps %}
+ <Directory "/srv/webcms/sites/{{ app.name }}/media/files">
+ Instance "webcms_{{ app.name }}"
+ </Directory>
+ {%- endfor %}
+ {%- endif %}
+ {%- endif %}
+</Plugin>
diff --git a/collectd/files/conf.d/libvirt.conf b/collectd/files/conf.d/libvirt.conf
new file mode 100644
index 0000000..2042ae1
--- /dev/null
+++ b/collectd/files/conf.d/libvirt.conf
@@ -0,0 +1,14 @@
+LoadPlugin libvirt
+{%- for plugin in pillar.collectd.client.plugins %}
+{%- if plugin_name == plugin.name %}
+<Plugin "libvirt">
+ Connection "{{ plugin.get("connection", "xen:///") }}"
+ RefreshInterval 60
+ #Domain "name"
+ #BlockDevice "name:device"
+ #InterfaceDevice "name:interface"
+ #IgnoreSelected false
+ HostnameFormat "{{ plugin.get('name_format', 'uuid') }}"
+</Plugin>
+{%- endif %}
+{%- endfor %}
diff --git a/collectd/files/conf.d/logfile.conf b/collectd/files/conf.d/logfile.conf
new file mode 100644
index 0000000..d6a7f40
--- /dev/null
+++ b/collectd/files/conf.d/logfile.conf
@@ -0,0 +1,7 @@
+LoadPlugin logfile
+<Plugin logfile>
+ LogLevel "info"
+ File "/tmp/collectd.log"
+ Timestamp true
+ PrintSeverity false
+</Plugin>
diff --git a/collectd/files/conf.d/memcached.conf b/collectd/files/conf.d/memcached.conf
new file mode 100644
index 0000000..1a02ea1
--- /dev/null
+++ b/collectd/files/conf.d/memcached.conf
@@ -0,0 +1,9 @@
+{%- if pillar.memcached is defined %}
+{%- if pillar.memcached.enabled %}
+LoadPlugin memcached
+<Plugin memcached>
+ Host "localhost"
+ Port "{{ pillar.memcached.bind_port }}"
+</Plugin>
+{%- endif %}
+{%- endif %}
diff --git a/collectd/files/conf.d/mysql.conf b/collectd/files/conf.d/mysql.conf
new file mode 100644
index 0000000..2c2257a
--- /dev/null
+++ b/collectd/files/conf.d/mysql.conf
@@ -0,0 +1,13 @@
+LoadPlugin mysql
+<Plugin mysql>
+ {%- for database in pillar.mysql.server.databases %}
+ <Database db_name>
+ Host "localhost"
+ Port "3306"
+ User "{{ database.user }}"
+ Password "{{ database.password }}"
+ Database "{{ database.name }}"
+ MasterStats true
+ </Database>
+ {%- endfor %}
+</Plugin>
diff --git a/collectd/files/conf.d/network.conf b/collectd/files/conf.d/network.conf
new file mode 100644
index 0000000..aed68c3
--- /dev/null
+++ b/collectd/files/conf.d/network.conf
@@ -0,0 +1,34 @@
+LoadPlugin network
+{%- for plugin in pillar.collectd.client.plugins %}
+{%- if plugin_name == plugin.name %}
+<Plugin "network">
+ {% if plugin.mode == 'client' %}
+ Server "{{ plugin.host }}" "{{ plugin.port }}"
+# <Server "{{ plugin.host }}" "{{ plugin.port }}">
+# SecurityLevel Encrypt
+# Username "{{ plugin.user }}"
+# Password "{{ plugin.password }}"
+# </Server>
+ TimeToLive 128
+ {% endif %}
+ {% if plugin.mode == 'server' %}
+ Listen "{{ plugin.host }}" "{{ plugin.port }}"
+# <Listen "{{ plugin.host }}" "{{ plugin.port }}">
+# SecurityLevel Sign
+# AuthFile "/etc/collectd/passwd"
+# Interface "{{ plugin.interface }}"
+# </Listen>
+ MaxPacketSize 1024
+ {% endif %}
+
+# # proxy setup (client and server as above):
+# Forward true
+#
+# # statistics about the network plugin itself
+# ReportStats false
+#
+# # "garbage collection"
+# CacheFlush 1800
+</Plugin>
+{%- endif %}
+{%- endfor %}
diff --git a/collectd/files/conf.d/nginx.conf b/collectd/files/conf.d/nginx.conf
new file mode 100644
index 0000000..6131b5b
--- /dev/null
+++ b/collectd/files/conf.d/nginx.conf
@@ -0,0 +1,4 @@
+LoadPlugin nginx
+<Plugin nginx>
+ URL "http://localhost/status?auto"
+</Plugin>
diff --git a/collectd/files/conf.d/postgresql.conf b/collectd/files/conf.d/postgresql.conf
new file mode 100644
index 0000000..db6fa66
--- /dev/null
+++ b/collectd/files/conf.d/postgresql.conf
@@ -0,0 +1,25 @@
+{%- if pillar.postgresql is defined %}
+{%- if pillar.postgresql.server.enabled %}
+LoadPlugin postgresql
+<Plugin postgresql>
+ <Query disk_usage>
+ Statement "SELECT pg_database_size($1) AS size;"
+ Param database
+ <Result>
+ Type pg_db_size
+ ValuesFrom "size"
+ </Result>
+ </Query>
+ {%- for database in pillar.postgresql.databases %}
+ <Database {{ database.name }}>
+ Host "localhost"
+ Port 5432
+ User "{{ database.user }}"
+ Password "{{ database.password }}"
+ Service "service_{{ database.name }}"
+ Query disk_usage
+ </Database>
+ {%- endfor %}
+</Plugin>
+{%- endif %}
+{%- endif %}
diff --git a/collectd/files/conf.d/statsd.conf b/collectd/files/conf.d/statsd.conf
new file mode 100644
index 0000000..fd1e58b
--- /dev/null
+++ b/collectd/files/conf.d/statsd.conf
@@ -0,0 +1,7 @@
+LoadPlugin statsd
+<Plugin statsd>
+ Host "::"
+ Port "8125"
+ DeleteSets true
+ TimerPercentile 90.0
+</Plugin>
diff --git a/collectd/files/conf.d/write_graphite.conf b/collectd/files/conf.d/write_graphite.conf
new file mode 100644
index 0000000..9d3e730
--- /dev/null
+++ b/collectd/files/conf.d/write_graphite.conf
@@ -0,0 +1,20 @@
+{%- from "linux/map.jinja" import system with context %}
+
+LoadPlugin write_graphite
+{%- for plugin in pillar.collectd.client.plugins %}
+{%- if plugin_name == plugin.name %}
+<Plugin write_graphite>
+ <Carbon>
+ Host "{{ plugin.host }}"
+ Port "{{ plugin.port }}"
+ Prefix "{{ system.cluster }}_{{ system.environment }}."
+ Postfix ""
+ StoreRates false
+ AlwaysAppendDS false
+ EscapeCharacter "_"
+ SeparateInstances true
+ Protocol "{{ plugin.get('protocol', 'tcp') }}"
+ </Carbon>
+</Plugin>
+{%- endif %}
+{%- endfor %}
diff --git a/collectd/files/filters.conf b/collectd/files/filters.conf
new file mode 100644
index 0000000..5dbf890
--- /dev/null
+++ b/collectd/files/filters.conf
@@ -0,0 +1,34 @@
+# Filter configuration for collectd(1).
+#
+# See the section "FILTER CONFIGURATION" in collectd.conf(5) for details.
+
+#PreCacheChain "PreCache"
+#PostCacheChain "PostCache"
+
+#LoadPlugin match_empty_counter
+#LoadPlugin match_hashed
+#LoadPlugin match_regex
+#LoadPlugin match_timediff
+#LoadPlugin match_value
+
+#LoadPlugin target_notification
+#LoadPlugin target_replace
+#LoadPlugin target_scale
+#LoadPlugin target_set
+#LoadPlugin target_v5upgrade
+
+#<Chain "PreCache">
+# <Rule "no_fqdn">
+# <Match "regex">
+# Host "^[^\.]*$"
+# Invert false
+# </Match>
+# Target "stop"
+# </Rule>
+#</Chain>
+
+# Default behavior:
+#<Chain "PostCache">
+# Target "write"
+#</Chain>
+
diff --git a/collectd/files/passwd b/collectd/files/passwd
new file mode 100644
index 0000000..aa2c4d1
--- /dev/null
+++ b/collectd/files/passwd
@@ -0,0 +1,6 @@
+LoadPlugin network
+{%- for plugin in pillar.collectd.client.plugins %}
+{%- if plugin.name == 'network' %}
+{{ plugin.user }}: {{ plugin.password }}
+{%- endif %}
+{%- endfor %}
diff --git a/collectd/files/thresholds.conf b/collectd/files/thresholds.conf
new file mode 100644
index 0000000..2bd4f2c
--- /dev/null
+++ b/collectd/files/thresholds.conf
@@ -0,0 +1,51 @@
+# Threshold configuration for collectd(1).
+#
+# See the collectd-threshold(5) manual page for details.
+
+#LoadPlugin "threshold"
+#<Plugin "threshold">
+# <Type "counter">
+# WarningMin 0.00
+# WarningMax 1000.00
+# FailureMin 0
+# FailureMax 1200.00
+# Invert false
+# Persist false
+# Instance "some_instance"
+# </Type>
+#
+# <Type "load">
+# DataSource "midterm"
+# WarningMax 1
+# Hysteresis 0.3
+# </Type>
+#
+# <Type "cpu">
+# Instance "user"
+# WarningMax 85
+# Hits 6
+# </Type>
+#
+# <Plugin "interface">
+# Instance "eth0"
+# <Type "if_octets">
+# DataSource "rx"
+# FailureMax 10000000
+# </Type>
+# </Plugin>
+#
+# <Host "hostname">
+# <Type "cpu">
+# Instance "idle"
+# FailureMin 10
+# </Type>
+#
+# <Plugin "memory">
+# <Type "memory">
+# Instance "cached"
+# WarningMin 100000000
+# </Type>
+# </Plugin>
+# </Host>
+#</Plugin>
+
diff --git a/collectd/init.sls b/collectd/init.sls
new file mode 100644
index 0000000..21ec9f4
--- /dev/null
+++ b/collectd/init.sls
@@ -0,0 +1,5 @@
+
+include:
+{% if pillar.collectd.client is defined %}
+- collectd.client
+{% endif %}
diff --git a/collectd/map.jinja b/collectd/map.jinja
new file mode 100644
index 0000000..7a84ba3
--- /dev/null
+++ b/collectd/map.jinja
@@ -0,0 +1,32 @@
+{% set supported_services = [
+ 'linux.system',
+ 'memcached.server',
+ 'mysql.server',
+ 'nginx.server',
+ 'nova.compute',
+ 'postgresql.server',
+] %}
+
+{% set client = salt['grains.filter_by']({
+ 'Arch': {
+ 'pkgs': ['collectd'],
+ 'service': 'collectd',
+ 'config_file': '/etc/collectd.conf',
+ 'config_dir': '/etc/collectd.d',
+ 'supported_services': supported_services
+ },
+ 'Debian': {
+ 'pkgs': ['collectd-core'],
+ 'service': 'collectd',
+ 'config_file': '/etc/collectd/collectd.conf',
+ 'config_dir': '/etc/collectd/conf.d',
+ 'supported_services': supported_services
+ },
+ 'RedHat': {
+ 'pkgs': ['collectd', 'collectd-virt', 'collectd-ping', ],
+ 'service': 'collectd',
+ 'config_file': '/etc/collectd.conf',
+ 'config_dir': '/etc/collectd.d',
+ 'supported_services': supported_services
+ },
+}, merge=salt['pillar.get']('collectd:client')) %}
diff --git a/debian/changelog b/debian/changelog
new file mode 100644
index 0000000..31be166
--- /dev/null
+++ b/debian/changelog
@@ -0,0 +1,11 @@
+salt-formula-collectd (0.2) trusty; urgency=medium
+
+ * First public release
+
+ -- Filip Pytloun <filip.pytloun@tcpcloud.eu> Tue, 06 Oct 2015 16:38:38 +0200
+
+salt-formula-collectd (0.1) trusty; urgency=medium
+
+ * Initial release
+
+ -- Ales Komarek <ales.komarek@tcpcloud.eu> Thu, 13 Aug 2015 23:23:41 +0200
diff --git a/debian/compat b/debian/compat
new file mode 100644
index 0000000..ec63514
--- /dev/null
+++ b/debian/compat
@@ -0,0 +1 @@
+9
diff --git a/debian/control b/debian/control
new file mode 100644
index 0000000..550f981
--- /dev/null
+++ b/debian/control
@@ -0,0 +1,15 @@
+Source: salt-formula-collectd
+Maintainer: Ales Komarek <ales.komarek@tcpcloud.eu>
+Section: admin
+Priority: optional
+Build-Depends: debhelper (>= 9)
+Standards-Version: 3.9.6
+Homepage: http://www.tcpcloud.eu
+Vcs-Browser: https://github.com/tcpcloud/salt-formula-collectd
+Vcs-Git: https://github.com/tcpcloud/salt-formula-collectd.git
+
+Package: salt-formula-collectd
+Architecture: all
+Depends: ${misc:Depends}, salt-master, reclass
+Description: Collectd salt formula
+ Install and configure Collectd service.
diff --git a/debian/copyright b/debian/copyright
new file mode 100644
index 0000000..f2e19b2
--- /dev/null
+++ b/debian/copyright
@@ -0,0 +1,15 @@
+Format: http://www.debian.org/doc/packaging-manuals/copyright-format/1.0/
+Upstream-Name: salt-formula-collectd
+Upstream-Contact: Ales Komarek <ales.komarek@tcpcloud.eu>
+Source: https://github.com/tcpcloud/salt-formula-collectd
+
+Files: *
+Copyright: 2014-2015 tcp cloud a.s.
+License: Apache-2.0
+ Copyright (C) 2014-2015 tcp cloud a.s.
+ .
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ .
+ On a Debian system you can find a copy of this license in
+ /usr/share/common-licenses/Apache-2.0.
diff --git a/debian/docs b/debian/docs
new file mode 100644
index 0000000..d585829
--- /dev/null
+++ b/debian/docs
@@ -0,0 +1,3 @@
+README.rst
+CHANGELOG.rst
+VERSION
diff --git a/debian/install b/debian/install
new file mode 100644
index 0000000..b85dde5
--- /dev/null
+++ b/debian/install
@@ -0,0 +1,2 @@
+collectd/* /usr/share/salt-formulas/env/collectd/
+metadata/service/* /usr/share/salt-formulas/reclass/service/collectd/
diff --git a/debian/rules b/debian/rules
new file mode 100755
index 0000000..abde6ef
--- /dev/null
+++ b/debian/rules
@@ -0,0 +1,5 @@
+#!/usr/bin/make -f
+
+%:
+ dh $@
+
diff --git a/debian/source/format b/debian/source/format
new file mode 100644
index 0000000..89ae9db
--- /dev/null
+++ b/debian/source/format
@@ -0,0 +1 @@
+3.0 (native)
diff --git a/metadata/service/client/init.yml b/metadata/service/client/init.yml
new file mode 100644
index 0000000..9a1b0f6
--- /dev/null
+++ b/metadata/service/client/init.yml
@@ -0,0 +1,7 @@
+applications:
+- collectd
+parameters:
+ collectd:
+ client:
+ enabled: true
+ read_interval: 60