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