Externalized Metrics - Smile CDR Documentation
Externalized Metrics
Prior to the 2023.08 release, metrics appeared in Smile CDR. Metrics have now been externalized using Prometheus (to pull metrics from Smile CDR) and Grafana (to visualize the metrics). As of 2024.11, the builtin metrics within Smile CDR have been removed. Either externalized metrics or OpenTelemetry Integration is now required to view such information. In order to externalize metrics in Smile CDR, the following 4 steps must be completed in order.
Step 1 - Install Prometheus
First, install Prometheus by referring to: https://prometheus.io/docs/introduction/first_steps/
Prometheus is configured using a YAML file. The Prometheus download comes with a sample configuration in a file called prometheus.yml. Modify this file to allow Prometheus to scrape the metrics from SmileCDR.
Setup Prometheus with a configuration file:
- In the global config:
- Ensure external_labels > monitor is set to
smilecdr-monitoring
- Ensure external_labels > monitor is set to
- In the scrape_configs:
- Add a job with job_name:
smilecdrto the scrape_configs - Ensure metrics path for the
smilecdrjob is:/metrics/local/metrics - If using basic auth, ensure that username and password are set correctly
- Ensure targets URL points to your SmileCDR admin_json module URL and port number (default is port 9000)
- Ensure params.format is
['PROMETHEUS_V2']
- Add a job with job_name:
Additional options for the configuration file are available here: https://prometheus.io/docs/prometheus/latest/configuration/configuration/
A sample prometheus.yml configuration file is attached below that uses basic auth to authenticate the smile server. If testing locally using Docker, ensure the target for the smilecdr job is host.docker.internal:9000 instead.
global:
scrape_interval: 15s # Set the scrape interval to every 15 seconds. Default is every 1 minute.
evaluation_interval: 15s # Evaluate rules every 15 seconds. The default is every 1 minute.
external_labels:
monitor: 'smilecdr-monitoring'
rule_files:
# - "first.rules"
# - "second.rules"
scrape_configs:
- job_name: prometheus
static_configs:
- targets: ['localhost:9090']
- job_name: smilecdr
metrics_path: '/metrics/local/metrics'
static_configs:
- targets: ['localhost:9000']
basic_auth:
username: admin
password: password
params:
format: ['PROMETHEUS_V2']
Copy
Deploy Prometheus to Kubernetes:
A sample YAML file for deployment to Kubernetes. Ensure that the 'hostname:port' value provided in the targets array points to your smilecdr instance.
---
apiVersion: v1
kind: ConfigMap
metadata:
name: prometheus-config
data:
prometheus.yml: |
global:
scrape_interval: 15s
evaluation_interval: 15s
external_labels:
monitor: 'smilecdr-monitoring'
scrape_configs:
- job_name: 'prometheus'
static_configs:
- targets: ['localhost:9090']
- job_name: smilecdr
metrics_path: '/json-admin/metrics/local/metrics'
scheme: https
static_configs:
- targets: ['smilecdr.example.com']
basic_auth:
username: admin
password: password
params:
format: ['PROMETHEUS_V2']
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: prometheus-deployment
spec:
replicas: 1
selector:
matchLabels:
app: prometheus
template:
metadata:
labels:
app: prometheus
spec:
containers:
- name: prometheus
image: "quay.io/prometheus/prometheus:v2.49.1"
args:
- "--config.file=/etc/prometheus/prometheus.yml"
- "--storage.tsdb.path=/prometheus/"
ports:
- containerPort: 9090
volumeMounts:
- name: config-volume
mountPath: /etc/prometheus
- name: prometheus-storage
mountPath: /prometheus
volumes:
- name: config-volume
configMap:
name: prometheus-config
- name: prometheus-storage
persistentVolumeClaim:
claimName: prometheus-server-pvc
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
labels:
app.kubernetes.io/component: server
app.kubernetes.io/name: prometheus
app.kubernetes.io/part-of: prometheus
name: prometheus-server-pvc
spec:
accessModes:
- ReadWriteOnce
storageClassName: "gp2"
resources:
requests:
storage: "8Gi"
Copy
Note that: Above persistentVolumeCliam is used for Amazon Web Services' Elastic Block Store (EBS). The corresponding storageClassName should be defined based on your cloud environment.
Step 2 - Install Grafana
Install Grafana using the instructions found here: https://grafana.com/docs/grafana/latest/setup-grafana/installation/.
Step 3 - Creating a Prometheus data source on Grafana
These instructions were adopted from: https://prometheus.io/docs/visualization/grafana/
To create a Prometheus data source in Grafana:
- Click on the "cogwheel" in the sidebar to open the Configuration menu.
- Click on "Data Sources".
- Click on "Add data source".
- Select "Prometheus" as the type.
- Set the appropriate Prometheus server URL (for example,
http://localhost:9090/). If running Prometheus in docker locally for testing purposes, use:http://host.docker.internal:9090. - Adjust other data source settings as desired (for example, choosing the right Access method).
- Click "Save & Test" to save the new data source.
Step 4 - Configure Smile CDR
In Grafana, each datasource has a unique ID. For the Prometheus datasource that you just created, obtain the ID by editing the datasource, and copying everything after the final "/":
For the following URL: http://localhost:3000/datasources/edit/z0tPZ2-Vz
The datasource ID is: z0tPZ2-Vz
Copy this value, and in SmileCDR in the admin_web console, populate the Prometheus Datasource ID with that value. Save and restart the module.
Select the module you want a dashboard for and click "Download Grafana JSON". Unzip the .zip file, you will be uploading the JSON file contained within the zip file to Grafana to create the dashboard in Step 5. Do this for each module.
Step 5 - Creating a Grafana Dashboard
In the left sidebar, go to the explore tab, and click on "Dashboards"
When in dashboards, click "New" button, then "Import"
Click the "Upload JSON file" button and upload the JSON file downloaded from Smile CDR.
Dashboard for the module should now be created and will appear in dashboards.
Externalized Metrics
Operating
Monitoring Basics Externalized Metrics Smile CDR Observability Performance Tuning Troubleshooting