├── README.md ├── external-metrics-exporters ├── celery-exporter.yaml └── node-exporter.yaml └── epsagon_kubernetes_exporters_deploy.sh /README.md: -------------------------------------------------------------------------------- 1 | # epsagon-k8s-external-exporters -------------------------------------------------------------------------------- /external-metrics-exporters/celery-exporter.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: v1 2 | kind: Namespace 3 | metadata: 4 | name: epsagon-monitoring 5 | labels: 6 | name: epsagon-monitoring 7 | --- 8 | apiVersion: apps/v1 9 | kind: Deployment 10 | metadata: 11 | name: celery-exporter 12 | namespace: epsagon-monitoring 13 | spec: 14 | replicas: 1 15 | selector: 16 | matchLabels: 17 | exporter: celery-exporter 18 | app: taskQueue 19 | template: 20 | metadata: 21 | labels: 22 | exporter: celery-exporter 23 | app: taskQueue 24 | spec: 25 | containers: 26 | - name: celery-exporter 27 | image: ovalmoney/celery-exporter 28 | args: 29 | - "--broker-url=${CELERY_BROKER_URL}" 30 | - "--enable-events" 31 | ports: 32 | - containerPort: 9540 33 | -------------------------------------------------------------------------------- /external-metrics-exporters/node-exporter.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: v1 2 | kind: Namespace 3 | metadata: 4 | name: epsagon-monitoring 5 | labels: 6 | name: epsagon-monitoring 7 | --- 8 | apiVersion: apps/v1 9 | kind: DaemonSet 10 | metadata: 11 | name: node-exporter 12 | labels: 13 | app.kubernetes.io/name: node-exporter 14 | app.kubernetes.io/version: v0.18.1 15 | namespace: epsagon-monitoring 16 | spec: 17 | selector: 18 | matchLabels: 19 | app.kubernetes.io/name: node-exporter 20 | template: 21 | metadata: 22 | labels: 23 | app.kubernetes.io/name: node-exporter 24 | app.kubernetes.io/version: v0.18.1 25 | annotations: 26 | prometheus.io/scrape: "true" 27 | spec: 28 | hostPID: true 29 | hostIPC: true 30 | hostNetwork: true 31 | containers: 32 | - ports: 33 | - containerPort: 9100 34 | protocol: TCP 35 | resources: 36 | requests: 37 | cpu: 0.15 38 | securityContext: 39 | privileged: true 40 | image: prom/node-exporter 41 | args: 42 | - --path.procfs 43 | - /host/proc 44 | - --path.sysfs 45 | - /host/sys 46 | - --collector.filesystem.ignored-mount-points 47 | - '"^/(sys|proc|dev|host|etc)($|/)"' 48 | name: node-exporter 49 | volumeMounts: 50 | - name: dev 51 | mountPath: /host/dev 52 | - name: proc 53 | mountPath: /host/proc 54 | - name: sys 55 | mountPath: /host/sys 56 | - name: rootfs 57 | mountPath: /rootfs 58 | volumes: 59 | - name: proc 60 | hostPath: 61 | path: /proc 62 | - name: dev 63 | hostPath: 64 | path: /dev 65 | - name: sys 66 | hostPath: 67 | path: /sys 68 | - name: rootfs 69 | hostPath: 70 | path: / 71 | -------------------------------------------------------------------------------- /epsagon_kubernetes_exporters_deploy.sh: -------------------------------------------------------------------------------- 1 | #! /bin/bash 2 | function is_positive_answer { 3 | answer=$1 4 | if [ ${answer} == 'y' ] ; then 5 | answer='Y' 6 | fi 7 | if [ ${answer} == 'Y' ] ; then 8 | return 0; 9 | fi 10 | return 1; 11 | } 12 | 13 | 14 | function does_config_file_exist { 15 | if [ -f ~/.kube/config ]; then 16 | return 0 17 | fi 18 | for i in `echo $KUBECONFIG | tr ':' '\n'`; do 19 | if [ -f "$i" ]; then 20 | return 0 21 | fi 22 | done 23 | return 1 24 | } 25 | 26 | function fetch_exporter { 27 | EXPORTER_FILE=$1 28 | EXPORTER_URL=https://raw.githubusercontent.com/epsagon/epsagon-k8s-external-exporters/master/${EXPORTER_FILE} 29 | EXPORTER_DIR=$(dirname $EXPORTER_FILE) 30 | echo "Fetching ${EXPORTER_FILE}" 31 | if [ -f $EXPORTER_FILE ] ; then 32 | echo "${EXPORTER_FILE} already exists - using that file" 33 | return 0 34 | fi 35 | if [ ! -d $EXPORTER_DIR ] ; then 36 | mkdir $EXPORTER_DIR 37 | fi 38 | if [ `which wget` ] ; then 39 | wget -O ${EXPORTER_FILE} $EXPORTER_URL 40 | else 41 | if [ `which curl` ] ; then 42 | curl $EXPORTER_URL -o ${EXPORTER_FILE} 43 | else 44 | if [ -s ${EXPORTER_FILE} ] ; then 45 | echo "Could not get ${EXPORTER_FILE}" 46 | echo "Please download the exporter from:" 47 | echo $EXPORTER_URL 48 | exit 1 49 | fi 50 | fi 51 | fi 52 | } 53 | 54 | function install_exporter { 55 | CONTEXT=$1 56 | CONFIG=$2 57 | EXPORTER_FILENAME=$3 58 | KUBECTL="kubectl --context ${CONTEXT} --kubeconfig=${CONFIG}" 59 | ${KUBECTL} apply -f ${EXPORTER_FILENAME} 60 | rm -f ${EXPORTER_FILENAME} 61 | } 62 | 63 | function apply_celery_exporter { 64 | CONTEXT=$1 65 | CONFIG=$2 66 | echo 'Please insert the messaging broker url used by your Celery, for example:' 67 | echo "rabbitmq: amqp://guest:guest@rabbitmq-service.monitoring:5672//" 68 | echo "redis: redis://redis:6379/" 69 | echo "URL:" 70 | read broker_url 71 | exporter_file=external-metrics-exporters/celery-exporter.yaml 72 | fetch_exporter ${exporter_file} 73 | cat ${exporter_file} | sed -e "s|\${CELERY_BROKER_URL}|${broker_url}|g" > celery_exporter.yaml 74 | install_exporter $CONTEXT $CONFIG "celery_exporter.yaml" 75 | } 76 | 77 | function apply_node_exporter { 78 | CONTEXT=$1 79 | CONFIG=$2 80 | exporter_file=external-metrics-exporters/node-exporter.yaml 81 | fetch_exporter ${exporter_file} 82 | cp ${exporter_file} ./node_exporter.yaml 83 | install_exporter $CONTEXT $CONFIG "node_exporter.yaml" 84 | } 85 | 86 | function apply_exporters { 87 | CONTEXT=$1 88 | CONFIG=$2 89 | echo -n "Would you like to install celery exporter? [Y/N] " 90 | read answer 91 | is_positive_answer $answer 92 | if [ $? -eq 0 ] ; then 93 | apply_celery_exporter $CONTEXT $CONFIG 94 | fi 95 | echo -n "Would you like to install node exporter? [Y/N] " 96 | read answer 97 | is_positive_answer $answer 98 | if [ $? -eq 0 ] ; then 99 | apply_node_exporter $CONTEXT $CONFIG 100 | fi 101 | } 102 | 103 | function does_config_file_exist { 104 | if [ -f ~/.kube/config ]; then 105 | return 0 106 | fi 107 | for i in `echo $KUBECONFIG | tr ':' '\n'`; do 108 | if [ -f "$i" ]; then 109 | return 0 110 | fi 111 | done 112 | return 1 113 | } 114 | 115 | function install_exporters_on_all_contexts { 116 | echo "Welcome to Epsagon!" 117 | config_file_path="${HOME}/.kube/config" 118 | if [ ! does_config_file_exist ] ; then 119 | echo "Could not find any config file for kubectl" 120 | echo 'Please insert your kubectl config file path:' 121 | read config_file_path 122 | fi 123 | for context in `kubectl config get-contexts --no-headers --kubeconfig=${config_file_path} | awk {'gsub(/^\*/, ""); print $1'}`; do 124 | echo "" 125 | echo -n "Would you like to install any metrics exporters for: $context ? [Y/N] " 126 | read answer 127 | is_positive_answer $answer 128 | if [ $? -eq 0 ] ; then 129 | apply_exporters $context $config_file_path 130 | else 131 | echo "skipping this cluster" 132 | continue 133 | fi 134 | done 135 | } 136 | 137 | install_exporters_on_all_contexts 138 | --------------------------------------------------------------------------------