Add Collectd Monitoring Support for RHOSO Controlplane

Change-Id: Id6057c27e18c691f0174552d5d958ce67bea0463
This commit is contained in:
rajeshP524 2024-07-04 16:52:50 +05:30
parent 3a967cb347
commit e21d0d668c
7 changed files with 573 additions and 0 deletions

View File

@ -0,0 +1,8 @@
- hosts: localhost
gather_facts: true
vars:
ansible_user: "{{ browbeat_user }}"
ansible_python_interpreter: "{{ python_interpreter }}"
roles:
- { role: collectd-rhoso }
environment: "{{proxy_env}}"

View File

@ -1,6 +1,7 @@
---
- name: set fact collectd_container
import_playbook: pre-collectd.yml
when: not is_rhoso_deployment
- name: Run containerized collectd (Stein and greater recommended)
import_playbook: collectd-container.yml
@ -9,3 +10,7 @@
- name: Run collectd installed through RPMs
import_playbook: collectd-baremetal.yml
when: not hostvars['undercloud']['collectd_container']
- name: Run collectd rhoso
import_playbook: collectd-rhoso.yaml
when: is_rhoso_deployment

View File

@ -11,6 +11,10 @@ local_remote_user: stack
# Login user for the Overcloud hosts
host_remote_user: heat-admin
is_rhoso_deployment: true
python_interpreter: /usr/bin/python3.6
kubeconfig_path: /home/kni/clusterconfigs/auth/kubeconfig
# OpenStack Installer
# Tripleo is the only installer supported currently
tripleo: true

View File

@ -0,0 +1,119 @@
apiVersion: security.openshift.io/v1
kind: SecurityContextConstraints
metadata:
name: collectd-scc
allowHostNetwork: true
allowHostPID: true
allowPrivilegedContainer: true
allowPrivilegeEscalation: true
runAsUser:
type: RunAsAny
seLinuxContext:
type: RunAsAny
fsGroup:
type: RunAsAny
supplementalGroups:
type: RunAsAny
users:
- system:serviceaccount:ospperf:collectd-sa
---
apiVersion: v1
kind: ServiceAccount
metadata:
name: collectd-sa
namespace: ospperf
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: pod-exec
rules:
- apiGroups: [""]
resources: ["pods"]
verbs: ["get", "list"]
- apiGroups: [""]
resources: ["pods/exec"]
verbs: ["create"]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: pod-exec-binding
subjects:
- kind: ServiceAccount
name: collectd-sa
namespace: ospperf
roleRef:
kind: ClusterRole
name: pod-exec
apiGroup: rbac.authorization.k8s.io
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: osp-controlplane-collectd
namespace: ospperf
labels:
app: ospcp-collectd
spec:
replicas: 3
selector:
matchLabels:
app: ospcp-collectd
template:
metadata:
labels:
app: ospcp-collectd
spec:
serviceAccountName: collectd-sa
hostNetwork: true
hostPID: true
containers:
- name: ospcp-collectd
image: quay.io/masco/collecd-rhoso-ocp
command:
- "/bin/bash"
- "/entrypoint.sh"
securityContext:
privileged: true
volumeMounts:
- name: config-files
mountPath: "/etc/config"
- name: entrypoint-script
mountPath: "/entrypoint.sh"
subPath: "entrypoint.sh"
env:
- name: POD_NAME
valueFrom:
fieldRef:
fieldPath: metadata.name
envFrom:
- configMapRef:
name: collectd-env-vars
volumes:
- name: config-files
configMap:
name: collectd-configs
- name: entrypoint-script
configMap:
name: collectd-entrypoint
nodeSelector:
node-role.kubernetes.io/worker: ""
affinity:
podAntiAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
- labelSelector:
matchExpressions:
- key: app
operator: In
values:
- ospcp-collectd
topologyKey: "kubernetes.io/hostname"

View File

@ -0,0 +1,14 @@
#!/bin/bash
# Get the last segment of the pod name (assuming the pod name is stored in POD_NAME environment variable)
POD_NAME_SUFFIX=$(echo $POD_NAME | awk -F '-' '{print $NF}')
# Determine the configuration file based on the pod name suffix
if [ "$POD_NAME_SUFFIX" = "0" ]; then
CONFIG_FILE="/etc/config/collectd-db.conf"
else
CONFIG_FILE="/etc/config/collectd.conf"
fi
# Start the main process with the selected configuration file
exec collectd -f -C $CONFIG_FILE

View File

@ -0,0 +1,82 @@
---
- block:
- name: Fetch Cluster IP and Ports for openstack service
command: oc get svc openstack -n openstack -o jsonpath='{.spec.clusterIP} {.spec.ports[0].port}'
register: openstack_svc
- name: Fetch Cluster IP and Ports for ovsdbserver-nb-0 service
command: oc get svc ovsdbserver-nb-0 -n openstack -o jsonpath='{.spec.clusterIP} {.spec.ports[0].port}'
register: ovsdbserver_nb_0_svc
- name: Fetch Cluster IP and Ports for ovsdbserver-sb-0 service
command: oc get svc ovsdbserver-sb-0 -n openstack -o jsonpath='{.spec.clusterIP} {.spec.ports[0].port}'
register: ovsdbserver_sb_0_svc
environment:
KUBECONFIG: "{{ kubeconfig_path }}"
- name: Parse openstack service details
set_fact:
openstack_svc_ip: "{{ openstack_svc.stdout.split(' ')[0] }}"
openstack_svc_port: "{{ openstack_svc.stdout.split(' ')[1] }}"
- name: Parse ovsdbserver-nb-0 service details
set_fact:
ovsdbserver_nb_0_svc_ip: "{{ ovsdbserver_nb_0_svc.stdout.split(' ')[0] }}"
ovsdbserver_nb_0_svc_port: "{{ ovsdbserver_nb_0_svc.stdout.split(' ')[1] }}"
- name: Parse ovsdbserver-sb-0 service details
set_fact:
ovsdbserver_sb_0_svc_ip: "{{ ovsdbserver_sb_0_svc.stdout.split(' ')[0] }}"
ovsdbserver_sb_0_svc_port: "{{ ovsdbserver_sb_0_svc.stdout.split(' ')[1] }}"
- name: Create environment file with key-value pairs
copy:
dest: ~/env_file.env
content: |
COLLECTD_INTERVAL={{ collectd_interval }}
OVN_NBDB_IP={{ ovsdbserver_nb_0_svc_ip }}
OVN_NBDB_PORT={{ ovsdbserver_nb_0_svc_port }}
OVN_SBDB_IP={{ ovsdbserver_sb_0_svc_ip }}
OVN_SBDB_PORT={{ ovsdbserver_sb_0_svc_port }}
- name: Render collectd template with db_conf
template:
src: "controlplane.collectd.conf.j2"
dest: "{{ ansible_env.HOME }}/collectd-db.conf"
vars:
db_conf: true
- name: Render collectd template without db_conf
template:
src: "controlplane.collectd.conf.j2"
dest: "{{ ansible_env.HOME }}/collectd.conf"
vars:
db_conf: false
- name: Create ospperf namespace
shell:
cmd: oc new-project ospperf
register: create_ns
ignore_errors: yes
environment:
KUBECONFIG: "{{ kubeconfig_path }}"
- block:
- name: Create configmaps for collectd configs
shell: |
oc create configmap collectd-configs --from-file={{ ansible_env.HOME }}/collectd.conf --from-file={{ ansible_env.HOME }}/collectd-db.conf -n ospperf
- name: Create collectd entrypoint configmap
shell: |
oc create configmap collectd-entrypoint --from-file="{{ role_path }}/files/entrypoint.sh" -n ospperf
- name: Create collectd env configmap
shell: |
oc create configmap collectd-env-vars --from-env-file={{ ansible_env.HOME }}/env_file.env -n ospperf
- name: Apply collectd deployment yaml
shell: |
oc apply -f {{ role_path }}/files/collectd_deploy.yaml -n ospperf
when: create_ns.rc == 0
environment:
KUBECONFIG: "{{ kubeconfig_path }}"

View File

@ -0,0 +1,341 @@
# Interval default is 10s
Interval {{collectd_interval}}
# Loaded Plugins:
LoadPlugin "logfile"
<Plugin "logfile">
File "/var/log/collectd.log"
LogLevel "info"
PrintSeverity true
Timestamp true
</Plugin>
LoadPlugin write_graphite
LoadPlugin cpu
LoadPlugin conntrack
{% if keystone_overcloud_collectd_plugin or osp_resources_collectd_plugin %}
{% if db_conf %}
LoadPlugin dbi
{% endif %}
{% endif %}
LoadPlugin df
LoadPlugin disk
LoadPlugin exec
LoadPlugin interface
LoadPlugin irq
LoadPlugin load
LoadPlugin match_regex
LoadPlugin memory
LoadPlugin mysql
LoadPlugin numa
LoadPlugin processes
<LoadPlugin python>
Globals true
</LoadPlugin>
LoadPlugin swap
LoadPlugin tail
LoadPlugin turbostat
LoadPlugin unixsock
LoadPlugin uptime
# Open unix domain socket for collectdctl
<Plugin unixsock>
SocketFile "/var/run/collectd-unixsock"
SocketGroup "collectd"
SocketPerms "0770"
DeleteSocket true
</Plugin>
PreCacheChain "PreCache"
<Chain "PreCache">
<Rule "ignore_tap">
<Match "regex">
Plugin "^interface$"
PluginInstance "^tap*"
</Match>
Target "stop"
</Rule>
<Rule "ignore_interfaces_q">
<Match "regex">
Plugin "^interface$"
PluginInstance "^q.*"
</Match>
Target "stop"
</Rule>
Target "return"
</Chain>
# Graphite Host Configuration
{% if collectd_graphite %}
<Plugin write_graphite>
<Carbon>
Host "{{graphite_host}}"
Port "{{collectd_write_graphite_port}}"
Prefix "{{graphite_prefix}}."
Protocol "tcp"
LogSendErrors true
StoreRates true
AlwaysAppendDS false
EscapeCharacter "_"
</Carbon>
</Plugin>
{% endif %}
{% if ovn_monitoring %}
{% if db_conf %}
<Plugin exec>
Instance "ovn_sbdb_Address_Set"
Exec stack "/usr/local/bin/ovn_monitoring.sh" "sb" "Address_Set"
</Plugin>
<Plugin exec>
Instance "ovn_sbdb_Port_Group"
Exec stack "/usr/local/bin/ovn_monitoring.sh" "sb" "Port_Group"
</Plugin>
<Plugin exec>
Instance "ovn_sbdb_Logical_Flow"
Exec stack "/usr/local/bin/ovn_monitoring.sh" "sb" "Logical_Flow"
</Plugin>
<Plugin exec>
Instance "ovn_sbdb_Multicast_Group"
Exec stack "/usr/local/bin/ovn_monitoring.sh" "sb" "Multicast_Group"
</Plugin>
<Plugin exec>
Instance "ovn_sbdb_Datapath_Binding"
Exec stack "/usr/local/bin/ovn_monitoring.sh" "sb" "Datapath_Binding"
</Plugin>
<Plugin exec>
Instance "ovn_sbdb_Port_Binding"
Exec stack "/usr/local/bin/ovn_monitoring.sh" "sb" "Port_Binding"
</Plugin>
<Plugin exec>
Instance "ovn_sbdb_MAC_Binding"
Exec stack "/usr/local/bin/ovn_monitoring.sh" "sb" "MAC_Binding"
</Plugin>
<Plugin exec>
Instance "ovn_nbdb_Logical_Switch"
Exec stack "/usr/local/bin/ovn_monitoring.sh" "nb" "Logical_Switch"
</Plugin>
<Plugin exec>
Instance "ovn_nbdb_Logical_Switch_Port"
Exec stack "/usr/local/bin/ovn_monitoring.sh" "nb" "Logical_Switch_Port"
</Plugin>
<Plugin exec>
Instance "ovn_nbdb_Address_Set"
Exec stack "/usr/local/bin/ovn_monitoring.sh" "nb" "Address_Set"
</Plugin>
<Plugin exec>
Instance "ovn_nbdb_Port_Group"
Exec stack "/usr/local/bin/ovn_monitoring.sh" "nb" "Port_Group"
</Plugin>
<Plugin exec>
Instance "ovn_nbdb_Load_Balancer"
Exec stack "/usr/local/bin/ovn_monitoring.sh" "nb" "Load_Balancer"
</Plugin>
<Plugin exec>
Instance "ovn_nbdb_ACL"
Exec stack "/usr/local/bin/ovn_monitoring.sh" "nb" "ACL"
</Plugin>
<Plugin exec>
Instance "ovn_nbdb_Logical_Router"
Exec stack "/usr/local/bin/ovn_monitoring.sh" "nb" "Logical_Router"
</Plugin>
<Plugin exec>
Instance "ovn_nbdb_Logical_Router_Port"
Exec stack "/usr/local/bin/ovn_monitoring.sh" "nb" "Logical_Router_Port"
</Plugin>
<Plugin exec>
Instance "ovn_nbdb_Logical_Router_Static_Route"
Exec stack "/usr/local/bin/ovn_monitoring.sh" "nb" "Logical_Router_Static_Route"
</Plugin>
{% endif %}
{% endif %}
{%if iostat_controller_collectd_plugin %}
<Plugin python>
ModulePath "/usr/local/bin/"
Import "collectd_iostat_python"
<Module collectd_iostat_python>
Path "/usr/bin/iostat"
Interval {{iostat_controller_collectd_interval}}
IostatInterval 2
Count 2
Verbose false
NiceNames false
PluginName collectd_iostat_python
</Module>
</Plugin>
{% endif %}
{%if ovn_raft_monitoring %}
{% if db_conf %}
<Plugin python>
ModulePath "/usr/local/bin/"
Import "collectd_ovn_raft_monitoring"
<Module collectd_ovn_raft_monitoring>
Interval {{ovn_raft_controller_collectd_interval}}
</Module>
</Plugin>
{% endif %}
{% endif %}
# Including the version of OpenStack that the process was verified as running after
# OpenStack Installation with a comment at the end of each Process/ProcessMatch statement.
# A Minus before the version means the process was not found in that version. (Ex -10)
<Plugin processes>
# Aodh (OpenStack Installed)
ProcessMatch "aodh-evaluator" "aodh-evaluator" # 10,11,12,13
ProcessMatch "aodh-listener" "aodh-listener" # 10,11,12,13
ProcessMatch "aodh-notifier" "aodh-notifier" # 10,11,12,13
ProcessMatch "aodh_wsgi" "aodh_wsgi.*-DFOREGROUND" # 11,12,13
# Barbican (OpenStack Installed)
ProcessMatch "barbican_wsgi" "barbican_wsgi.*-DFOREGROUND" # 13
ProcessMatch "barbican-keystone-listener" "python.+barbican-keystone-listener" # 13
ProcessMatch "barbican-worker" "python.+barbican-worker" # 13
# Ceilometer (OpenStack Installed)
ProcessMatch "ceilometer-agent-notification" "ceilometer-agent-notification" # 10,11,12,13
ProcessMatch "ceilometer-collector" "ceilometer-collector" # 10,11,-12,-13
ProcessMatch "ceilometer-polling" "ceilometer-polling" # 10,11,12,13
ProcessMatch "ceilometer_wsgi" "ceilometer_wsgi.*-DFOREGROUND" # 11,-12,-13
# Ceph (OpenStack Installed)
# When CephStorage nodes deployed
ProcessMatch "ceph-mon" "^/usr/bin/ceph-mon" # -10,-11,-12,-13
# Cinder (OpenStack Installed)
ProcessMatch "cinder-api" "python.+cinder-api" # 10,-11,-12
ProcessMatch "cinder-scheduler" "python.+cinder-scheduler" # 10,11,12,13
ProcessMatch "cinder-volume" "python.+cinder-volume" # 10,11,12,13
ProcessMatch "cinder_wsgi" "cinder_wsgi.*-DFOREGROUND" # 11,12,13
# Collectd (Browbeat Installed)
ProcessMatch "collectd" "/usr/sbin/collectd"
# Conmon (OpenStack Installed)
ProcessMatch "conmon" "/usr/bin/conmon" # 16
# Docker (OpenStack Installed)
ProcessMatch "dockerd-current" "dockerd-current" # 12,13
# Pacemaker / Corosync (OpenStack Installed)
ProcessMatch "attrd" "/usr/libexec/pacemaker/attrd" # 10,11,12,13
ProcessMatch "cib" "/usr/libexec/pacemaker/cib" # 10,11,12,13
Process "corosync" # 10,11,12,13
ProcessMatch "crmd" "/usr/libexec/pacemaker/crmd" # 10,11,12,13
ProcessMatch "lrmd" "/usr/libexec/pacemaker/lrmd" # 10,11,12,13
ProcessMatch "pacemakerd" "/usr/sbin/pacemakerd" # 10,11,12,13
ProcessMatch "pcsd" "^/usr/bin/ruby.+/usr/lib/pcsd" # 10,11,12,13
ProcessMatch "pengine" "/usr/libexec/pacemaker/pengine" # 10,11,12,13
ProcessMatch "stonithd" "/usr/libexec/pacemaker/stonithd" # 10,11,12,13
# Everything Else (OpenStack Installed)
# (Processes displayed under "Everything Else" on Grafana Dashboards)
ProcessMatch "dnsmasq" "^dnsmasq.+" # 10,11,12
ProcessMatch "haproxy" "/usr/sbin/haproxy.+/etc/haproxy/haproxy.cfg" # 10,11,12,13
Process "httpd" # 10,11,12,13
Process "keepalived" # 10,11,12
Process "memcached" # 10,11,12,13
Process "mongod" # 10,11,-12,-13
ProcessMatch "mysqld" "/usr/libexec/mysqld" # 10,11,12,13
ProcessMatch "rabbitmq" "/usr/lib64/erlang/erts-.+/bin/beam.smp" # 10,11,12,13
Process "redis-server" # 10,11,12,13
ProcessMatch "karaf" "java.+karaf" # ODL Specific
# Glance (OpenStack Installed)
ProcessMatch "glance-api" "python.+glance-api" # 10,11,12,13
ProcessMatch "glance-registry" "python.+glance-registry" # 10,-11,-12,-13
# Gnocchi (OpenStack Installed)
ProcessMatch "gnocchi-metricd-master" "gnocchi-metricd.*master" # 11,12,13
ProcessMatch "gnocchi-metricd-scheduler" "gnocchi-metricd.*scheduler" # 10,11,-12,-13
ProcessMatch "gnocchi-metricd-processing" "gnocchi-metricd.*processing" # 10,11,12,13
ProcessMatch "gnocchi-metricd-reporting" "gnocchi-metricd.*reporting" # 10,11,12,13
ProcessMatch "gnocchi-metricd-janitor" "gnocchi-metricd.*janitor" # 10,11,12,13
ProcessMatch "gnocchi-metricd" "gnocchi-metricd " # 10(Old proctitle)
ProcessMatch "gnocchi-statsd" "python.+gnocchi-statsd" # 10,11,12,13
ProcessMatch "gnocchi_wsgi" "gnocchi_wsgi.*-DFOREGROUND" # 11,12,13
# Heat (OpenStack Installed)
ProcessMatch "heat-api" "python.+heat-api --config-file" # 10,11,-12,-13
ProcessMatch "heat-api-cfn" "python.+heat-api-cfn" # 10,11,-12,-13
ProcessMatch "heat-api-cloudwatch" "python.+heat-api-cloudwatch" # 10,11,-12,-123
ProcessMatch "heat_api_cfn" "heat_api_cfn_ws" # 12,13
ProcessMatch "heat_api_cloudwatch" "heat_api_cloudw" # 12,-13
ProcessMatch "heat_api_wsgi" "heat_api_wsgi" # 12,13
ProcessMatch "heat-engine" "python.+heat-engine" # 10,11,12,13
# Horizon (OpenStack Installed)
ProcessMatch "horizon" "horizon" # 13
# Keystone (OpenStack Installed)
ProcessMatch "keystone-admin" "keystone-admin.*-DFOREGROUND" # 10,11,12,13
ProcessMatch "keystone-main" "keystone-main.*-DFOREGROUND" # 10,11,12,13
ProcessMatch "keystone" "keystone.*-DFOREGROUND" # 16
# Starting Pike, fernet tokens are default thus token_flush not needed
ProcessMatch "keystone-token-flush" "keystone-manage.*token_flush" # 10,11,-12,-13
# Neutron (OpenStack Installed)
ProcessMatch "neutron-dhcp-agent" "python.+neutron-dhcp-agent" # 10,11,12,13
ProcessMatch "neutron-l3-agent" "python.+neutron-l3-agent" # 10,11,12,13
ProcessMatch "neutron-metadata-agent" "python.+neutron-metadata-agent" # 10,11,12,13
ProcessMatch "neutron-ns-metadata-proxy" "python.+neutron-ns-metadata-proxy" # 10,11
ProcessMatch "neutron-openvswitch-agent" "python.+neutron-openvswitch-agent" # 10,11,12,13
ProcessMatch "neutron-rootwrap-daemon" "python.+neutron-rootwrap-daemon" # 10,11,12,13
ProcessMatch "neutron-server" "python.+neutron-server" # 10,11,12,13
ProcessMatch "neutron-keepalived-state-change" "python.+neutron-keepalived-state-change" #For HA router
# Nova (OpenStack Installed)
ProcessMatch "nova-api" "python.+nova-api$" # 10,11,-12,-13
ProcessMatch "nova-api-metadata" "python.+nova-api-metadata" # 12,13
ProcessMatch "nova_api_wsgi" "nova_api_wsgi" # 12,13
ProcessMatch "nova-conductor" "python.+nova-conductor" # 10,11,12,13
ProcessMatch "nova-consoleauth" "python.+nova-consoleauth" # 10,11,12,13
ProcessMatch "nova-novncproxy" "python.+nova-novncproxy" # 10,11,12,13
ProcessMatch "nova-scheduler" "python.+nova-scheduler" # 10,11,12,13
ProcessMatch "placement_wsgi" "placement_wsgi.*-DFOREGROUND" # 11,12,13
ProcessMatch "nova_metadata_w" "nova_metadata_w.*-DFOREGROUND" # 16
# Octavia (OpenStack Installed)
ProcessMatch "octavia-housekeeping" "python.+octavia-housekeeping" # 13
ProcessMatch "octavia-health-manager" "python.+octavia-health-manager" # 13
ProcessMatch "octavia-api" "python.+octavia-api" # 13
ProcessMatch "octavia-worker" "octavia-worker --config-file" # 13
ProcessMatch "octavia_wsgi" "octavia_wsgi.*-DFOREGROUND" # 16
# OVS (OpenStack Installed)
ProcessMatch "ovs-vswitchd" "ovs-vswitchd.+openvswitch" # 10,11,12,13
ProcessMatch "ovsdb-client" "ovsdb-client" # 10,11,12,13
ProcessMatch "ovsdb-server" "ovsdb-server.+openvswitch" # 10,11,12,13
ProcessMatch "ovsdb-server-nb" "ovsdb-server.+ovsdb-server-nb" # 16
ProcessMatch "ovsdb-server-sb" "ovsdb-server.+ovsdb-server-sb" # 16
ProcessMatch "ovn-northd" "ovn-northd.+ovnnb_db" # 16
ProcessMatch "ovn-controller" "ovn-controller.+openvswitch" # 9,10
ProcessMatch "ovn-controller-vtep" "ovn-controller-vtep.+openvswitch" # 9,10
# Panko (OpenStack Installed)
ProcessMatch "panko_wsgi" "panko_wsgi.*-DFOREGROUND" # 11,12,13
# Swift (OpenStack Installed)
ProcessMatch "swift-account-auditor" "python.+swift-account-auditor" # 10,11,12,13
ProcessMatch "swift-account-reaper" "python.+swift-account-reaper" # 10,11,12,13
ProcessMatch "swift-account-replicator" "python.+swift-account-replicator" # 10,11,12,13
ProcessMatch "swift-account-server" "python.+swift-account-server" # 10,11,12,13
ProcessMatch "swift-container-auditor" "python.+swift-container-auditor" # 10,11,12,13
ProcessMatch "swift-container-replicator" "python.+swift-container-replicator" # 10,11,12,13
ProcessMatch "swift-container-server" "python.+swift-container-server" # 10,11,12,13
ProcessMatch "swift-container-updater" "python.+swift-container-updater" # 10,11,12,13
ProcessMatch "swift-object-auditor" "python.+swift-object-auditor" # 10,11,12,13
ProcessMatch "swift-object-expirer" "python.+swift-object-expirer" # 11,12,13
ProcessMatch "swift-object-replicator" "python.+swift-object-replicator" # 10,11,12,13
ProcessMatch "swift-object-server" "python.+swift-object-server" # 10,11,12,13
ProcessMatch "swift-object-updater" "python.+swift-object-updater" # 10,11,12,13
ProcessMatch "swift-proxy-server" "python.+swift-proxy-server" # 10,11,12,13
</Plugin>
# Include other collectd configuration files
Include "/etc/collectd.d"