COMAC-18: Grafana-via-Prometheus for M-CORD CDN monitoring
Change-Id: I230a8bbfd866ca4e784dbd24f28943596cc70239
diff --git a/mcord/mcord-cdn-monitoring/.helmignore b/mcord/mcord-cdn-monitoring/.helmignore
new file mode 100644
index 0000000..50af031
--- /dev/null
+++ b/mcord/mcord-cdn-monitoring/.helmignore
@@ -0,0 +1,22 @@
+# Patterns to ignore when building packages.
+# This supports shell glob matching, relative path matching, and
+# negation (prefixed with !). Only one pattern per line.
+.DS_Store
+# Common VCS dirs
+.git/
+.gitignore
+.bzr/
+.bzrignore
+.hg/
+.hgignore
+.svn/
+# Common backup files
+*.swp
+*.bak
+*.tmp
+*~
+# Various IDEs
+.project
+.idea/
+*.tmproj
+.vscode/
diff --git a/mcord/mcord-cdn-monitoring/Chart.yaml b/mcord/mcord-cdn-monitoring/Chart.yaml
new file mode 100644
index 0000000..c8babb2
--- /dev/null
+++ b/mcord/mcord-cdn-monitoring/Chart.yaml
@@ -0,0 +1,20 @@
+---
+# Copyright 2018-present Open Networking Foundation
+#
+# 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.
+
+apiVersion: v1
+appVersion: "1.0"
+description: A Helm chart for Time Series Storage and Dashboard for CDN monitoring
+name: mcord-cdn-monitoring
+version: 0.1.0
diff --git a/mcord/mcord-cdn-monitoring/configs/cdn-metrics.json b/mcord/mcord-cdn-monitoring/configs/cdn-metrics.json
new file mode 100755
index 0000000..e24b6d6
--- /dev/null
+++ b/mcord/mcord-cdn-monitoring/configs/cdn-metrics.json
@@ -0,0 +1,269 @@
+{
+ "annotations": {
+ "list": [
+ {
+ "builtIn": 1,
+ "datasource": "-- Grafana --",
+ "enable": true,
+ "hide": true,
+ "iconColor": "rgba(0, 211, 255, 1)",
+ "name": "Annotations & Alerts",
+ "type": "dashboard"
+ }
+ ]
+ },
+ "editable": true,
+ "gnetId": null,
+ "graphTooltip": 0,
+ "id": 3,
+ "links": [],
+ "panels": [
+ {
+ "aliasColors": {},
+ "bars": false,
+ "dashLength": 10,
+ "dashes": false,
+ "datasource": "prom",
+ "fill": 1,
+ "gridPos": {
+ "h": 9,
+ "w": 12,
+ "x": 0,
+ "y": 0
+ },
+ "id": 2,
+ "legend": {
+ "alignAsTable": true,
+ "avg": true,
+ "current": true,
+ "max": true,
+ "min": true,
+ "show": true,
+ "sort": "max",
+ "sortDesc": true,
+ "total": false,
+ "values": true
+ },
+ "lines": true,
+ "linewidth": 1,
+ "links": [],
+ "nullPointMode": "null",
+ "percentage": false,
+ "pointradius": 5,
+ "points": false,
+ "renderer": "flot",
+ "seriesOverrides": [],
+ "spaceLength": 10,
+ "stack": false,
+ "steppedLine": false,
+ "targets": [
+ {
+ "expr": "sum(irate(container_network_transmit_bytes_total{container_label_io_kubernetes_pod_name=\"wowza-0\"}[5m])) by (interface)",
+ "format": "time_series",
+ "hide": false,
+ "intervalFactor": 1,
+ "legendFormat": "tx: {{interface}}",
+ "refId": "A"
+ },
+ {
+ "expr": "-sum(irate(container_network_receive_bytes_total{container_label_io_kubernetes_pod_name=\"wowza-0\"}[5m])) by (interface)",
+ "format": "time_series",
+ "hide": false,
+ "intervalFactor": 1,
+ "legendFormat": "rx: {{interface}}",
+ "refId": "B"
+ },
+ {
+ "expr": "",
+ "format": "time_series",
+ "intervalFactor": 1,
+ "refId": "C"
+ }
+ ],
+ "thresholds": [],
+ "timeFrom": null,
+ "timeRegions": [],
+ "timeShift": null,
+ "title": "Remote",
+ "tooltip": {
+ "shared": true,
+ "sort": 0,
+ "value_type": "individual"
+ },
+ "type": "graph",
+ "xaxis": {
+ "buckets": null,
+ "mode": "time",
+ "name": null,
+ "show": true,
+ "values": []
+ },
+ "yaxes": [
+ {
+ "format": "Bps",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": null,
+ "show": true
+ },
+ {
+ "format": "short",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": null,
+ "show": true
+ }
+ ],
+ "yaxis": {
+ "align": false,
+ "alignLevel": null
+ }
+ },
+ {
+ "aliasColors": {},
+ "bars": false,
+ "dashLength": 10,
+ "dashes": false,
+ "datasource": "prom",
+ "fill": 1,
+ "gridPos": {
+ "h": 9,
+ "w": 12,
+ "x": 12,
+ "y": 0
+ },
+ "id": 3,
+ "legend": {
+ "alignAsTable": true,
+ "avg": true,
+ "current": true,
+ "max": true,
+ "min": true,
+ "show": true,
+ "sort": "max",
+ "sortDesc": true,
+ "total": false,
+ "values": true
+ },
+ "lines": true,
+ "linewidth": 1,
+ "links": [],
+ "nullPointMode": "null",
+ "percentage": false,
+ "pointradius": 5,
+ "points": false,
+ "renderer": "flot",
+ "seriesOverrides": [],
+ "spaceLength": 10,
+ "stack": false,
+ "steppedLine": false,
+ "targets": [
+ {
+ "expr": "sum(irate(container_network_transmit_bytes_total{container_label_io_kubernetes_pod_name=\"nginx-rtmp-0\"}[5m])) by (interface)",
+ "format": "time_series",
+ "hide": false,
+ "intervalFactor": 1,
+ "legendFormat": "tx: {{interface}}",
+ "refId": "A"
+ },
+ {
+ "expr": "-sum(irate(container_network_receive_bytes_total{container_label_io_kubernetes_pod_name=\"nginx-rtmp-0\"}[5m])) by (interface)",
+ "format": "time_series",
+ "hide": false,
+ "intervalFactor": 1,
+ "legendFormat": "rx: {{interface}}",
+ "refId": "B"
+ },
+ {
+ "expr": "",
+ "format": "time_series",
+ "intervalFactor": 1,
+ "refId": "C"
+ }
+ ],
+ "thresholds": [],
+ "timeFrom": null,
+ "timeRegions": [],
+ "timeShift": null,
+ "title": "Local",
+ "tooltip": {
+ "shared": true,
+ "sort": 0,
+ "value_type": "individual"
+ },
+ "type": "graph",
+ "xaxis": {
+ "buckets": null,
+ "mode": "time",
+ "name": null,
+ "show": true,
+ "values": []
+ },
+ "yaxes": [
+ {
+ "format": "Bps",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": null,
+ "show": true
+ },
+ {
+ "format": "short",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": null,
+ "show": true
+ }
+ ],
+ "yaxis": {
+ "align": false,
+ "alignLevel": null
+ }
+ }
+ ],
+ "refresh": "1m",
+ "schemaVersion": 16,
+ "style": "dark",
+ "tags": [],
+ "templating": {
+ "list": []
+ },
+ "time": {
+ "from": "now-15m",
+ "to": "now"
+ },
+ "timepicker": {
+ "refresh_intervals": [
+ "1s",
+ "5s",
+ "10s",
+ "30s",
+ "1m",
+ "5m",
+ "15m",
+ "30m",
+ "1h",
+ "2h",
+ "1d"
+ ],
+ "time_options": [
+ "5m",
+ "15m",
+ "1h",
+ "6h",
+ "12h",
+ "24h",
+ "2d",
+ "7d",
+ "30d"
+ ]
+ },
+ "timezone": "",
+ "title": "CDN Data",
+ "uid": "fMw-J9Xiz",
+ "version": 2
+}
diff --git a/mcord/mcord-cdn-monitoring/configs/grafana.ini b/mcord/mcord-cdn-monitoring/configs/grafana.ini
new file mode 100755
index 0000000..5e793f8
--- /dev/null
+++ b/mcord/mcord-cdn-monitoring/configs/grafana.ini
@@ -0,0 +1,461 @@
+##################### Grafana Configuration Example #####################
+#
+# Everything has defaults so you only need to uncomment things you want to
+# change
+
+# possible values : production, development
+;app_mode = production
+
+# instance name, defaults to HOSTNAME environment variable value or hostname if HOSTNAME var is empty
+;instance_name = ${HOSTNAME}
+
+#################################### Paths ####################################
+[paths]
+# Path to where grafana can store temp files, sessions, and the sqlite3 db (if that is used)
+;data = /var/lib/grafana
+
+# Directory where grafana can store logs
+;logs = /var/log/grafana
+
+# Directory where grafana will automatically scan and look for plugins
+;plugins = /var/lib/grafana/plugins
+
+# folder that contains provisioning config files that grafana will apply on startup and while running.
+;provisioning = conf/provisioning
+
+#################################### Server ####################################
+[server]
+# Protocol (http, https, socket)
+;protocol = http
+
+# The ip address to bind to, empty will bind to all interfaces
+;http_addr =
+
+# The http port to use
+;http_port = 3000
+
+# The public facing domain name used to access grafana from a browser
+;domain = localhost
+
+# Redirect to correct domain if host header does not match domain
+# Prevents DNS rebinding attacks
+;enforce_domain = false
+
+# The full public facing url you use in browser, used for redirects and emails
+# If you use reverse proxy and sub path specify full url (with sub path)
+;root_url = http://localhost:3000
+
+# Log web requests
+;router_logging = false
+
+# the path relative working path
+;static_root_path = public
+
+# enable gzip
+;enable_gzip = false
+
+# https certs & key file
+;cert_file =
+;cert_key =
+
+# Unix socket path
+;socket =
+
+#################################### Database ####################################
+[database]
+# You can configure the database connection by specifying type, host, name, user and password
+# as separate properties or as on string using the url properties.
+
+# Either "mysql", "postgres" or "sqlite3", it's your choice
+;type = sqlite3
+;host = 127.0.0.1:3306
+;name = grafana
+;user = root
+# If the password contains # or ; you have to wrap it with triple quotes. Ex """#password;"""
+;password =
+
+# Use either URL or the previous fields to configure the database
+# Example: mysql://user:secret@host:port/database
+;url =
+
+# For "postgres" only, either "disable", "require" or "verify-full"
+;ssl_mode = disable
+
+# For "sqlite3" only, path relative to data_path setting
+;path = grafana.db
+
+# Max idle conn setting default is 2
+;max_idle_conn = 2
+
+# Max conn setting default is 0 (mean not set)
+;max_open_conn =
+
+# Connection Max Lifetime default is 14400 (means 14400 seconds or 4 hours)
+;conn_max_lifetime = 14400
+
+# Set to true to log the sql calls and execution times.
+log_queries =
+
+#################################### Session ####################################
+[session]
+# Either "memory", "file", "redis", "mysql", "postgres", default is "file"
+;provider = file
+
+# Provider config options
+# memory: not have any config yet
+# file: session dir path, is relative to grafana data_path
+# redis: config like redis server e.g. `addr=127.0.0.1:6379,pool_size=100,db=grafana`
+# mysql: go-sql-driver/mysql dsn config string, e.g. `user:password@tcp(127.0.0.1:3306)/database_name`
+# postgres: user=a password=b host=localhost port=5432 dbname=c sslmode=disable
+;provider_config = sessions
+
+# Session cookie name
+;cookie_name = grafana_sess
+
+# If you use session in https only, default is false
+;cookie_secure = false
+
+# Session life time, default is 86400
+;session_life_time = 86400
+
+#################################### Data proxy ###########################
+[dataproxy]
+
+# This enables data proxy logging, default is false
+;logging = false
+
+#################################### Analytics ####################################
+[analytics]
+# Server reporting, sends usage counters to stats.grafana.org every 24 hours.
+# No ip addresses are being tracked, only simple counters to track
+# running instances, dashboard and error counts. It is very helpful to us.
+# Change this option to false to disable reporting.
+;reporting_enabled = true
+
+# Set to false to disable all checks to https://grafana.net
+# for new vesions (grafana itself and plugins), check is used
+# in some UI views to notify that grafana or plugin update exists
+# This option does not cause any auto updates, nor send any information
+# only a GET request to http://grafana.com to get latest versions
+;check_for_updates = true
+
+# Google Analytics universal tracking code, only enabled if you specify an id here
+;google_analytics_ua_id =
+
+#################################### Security ####################################
+[security]
+# default admin user, created on startup
+;admin_user = admin
+
+# default admin password, can be changed before first start of grafana, or in profile settings
+;admin_password = admin
+
+# used for signing
+;secret_key = SW2YcwTIb9zpOOhoPsMm
+
+# Auto-login remember days
+;login_remember_days = 7
+;cookie_username = grafana_user
+;cookie_remember_name = grafana_remember
+
+# disable gravatar profile images
+;disable_gravatar = false
+
+# data source proxy whitelist (ip_or_domain:port separated by spaces)
+;data_source_proxy_whitelist =
+
+# disable protection against brute force login attempts
+;disable_brute_force_login_protection = false
+
+#################################### Snapshots ###########################
+[snapshots]
+# snapshot sharing options
+;external_enabled = true
+;external_snapshot_url = https://snapshots-origin.raintank.io
+;external_snapshot_name = Publish to snapshot.raintank.io
+
+# remove expired snapshot
+;snapshot_remove_expired = true
+
+#################################### Dashboards History ##################
+[dashboards]
+# Number dashboard versions to keep (per dashboard). Default: 20, Minimum: 1
+;versions_to_keep = 20
+
+;#################################### Dashboard JSON files ##########################
+[dashboards.json]
+enabled = true
+path = /etc/grafana/provisioning/dashboards
+
+#################################### Users ###############################
+[users]
+# disable user signup / registration
+;allow_sign_up = true
+
+# Allow non admin users to create organizations
+;allow_org_create = true
+
+# Set to true to automatically assign new users to the default organization (id 1)
+;auto_assign_org = true
+
+# Default role new users will be automatically assigned (if disabled above is set to true)
+;auto_assign_org_role = Viewer
+
+# Background text for the user field on the login page
+;login_hint = email or username
+
+# Default UI theme ("dark" or "light")
+;default_theme = dark
+
+# External user management, these options affect the organization users view
+;external_manage_link_url =
+;external_manage_link_name =
+;external_manage_info =
+
+# Viewers can edit/inspect dashboard settings in the browser. But not save the dashboard.
+;viewers_can_edit = false
+
+[auth]
+# Set to true to disable (hide) the login form, useful if you use OAuth, defaults to false
+;disable_login_form = false
+
+# Set to true to disable the signout link in the side menu. useful if you use auth.proxy, defaults to false
+;disable_signout_menu = false
+
+# URL to redirect the user to after sign out
+;signout_redirect_url =
+
+#################################### Anonymous Auth ##########################
+[auth.anonymous]
+# enable anonymous access
+;enabled = false
+
+# specify organization name that should be used for unauthenticated users
+;org_name = Main Org.
+
+# specify role for unauthenticated users
+;org_role = Viewer
+
+#################################### Github Auth ##########################
+[auth.github]
+;enabled = false
+;allow_sign_up = true
+;client_id = some_id
+;client_secret = some_secret
+;scopes = user:email,read:org
+;auth_url = https://github.com/login/oauth/authorize
+;token_url = https://github.com/login/oauth/access_token
+;api_url = https://api.github.com/user
+;team_ids =
+;allowed_organizations =
+
+#################################### Google Auth ##########################
+[auth.google]
+;enabled = false
+;allow_sign_up = true
+;client_id = some_client_id
+;client_secret = some_client_secret
+;scopes = https://www.googleapis.com/auth/userinfo.profile https://www.googleapis.com/auth/userinfo.email
+;auth_url = https://accounts.google.com/o/oauth2/auth
+;token_url = https://accounts.google.com/o/oauth2/token
+;api_url = https://www.googleapis.com/oauth2/v1/userinfo
+;allowed_domains =
+
+#################################### Generic OAuth ##########################
+[auth.generic_oauth]
+;enabled = false
+;name = OAuth
+;allow_sign_up = true
+;client_id = some_id
+;client_secret = some_secret
+;scopes = user:email,read:org
+;auth_url = https://foo.bar/login/oauth/authorize
+;token_url = https://foo.bar/login/oauth/access_token
+;api_url = https://foo.bar/user
+;team_ids =
+;allowed_organizations =
+
+#################################### Grafana.com Auth ####################
+[auth.grafana_com]
+;enabled = false
+;allow_sign_up = true
+;client_id = some_id
+;client_secret = some_secret
+;scopes = user:email
+;allowed_organizations =
+
+#################################### Auth Proxy ##########################
+[auth.proxy]
+;enabled = false
+;header_name = X-WEBAUTH-USER
+;header_property = username
+;auto_sign_up = true
+;ldap_sync_ttl = 60
+;whitelist = 192.168.1.1, 192.168.2.1
+
+#################################### Basic Auth ##########################
+[auth.basic]
+;enabled = true
+
+#################################### Auth LDAP ##########################
+[auth.ldap]
+;enabled = false
+;config_file = /etc/grafana/ldap.toml
+;allow_sign_up = true
+
+#################################### SMTP / Emailing ##########################
+[smtp]
+;enabled = false
+;host = localhost:25
+;user =
+# If the password contains # or ; you have to wrap it with trippel quotes. Ex """#password;"""
+;password =
+;cert_file =
+;key_file =
+;skip_verify = false
+;from_address = admin@grafana.localhost
+;from_name = Grafana
+# EHLO identity in SMTP dialog (defaults to instance_name)
+;ehlo_identity = dashboard.example.com
+
+[emails]
+;welcome_email_on_sign_up = false
+
+#################################### Logging ##########################
+[log]
+# Either "console", "file", "syslog". Default is console and file
+# Use space to separate multiple modes, e.g. "console file"
+;mode = console file
+
+# Either "debug", "info", "warn", "error", "critical", default is "info"
+;level = info
+
+# optional settings to set different levels for specific loggers. Ex filters = sqlstore:debug
+;filters =
+
+# For "console" mode only
+[log.console]
+;level =
+
+# log line format, valid options are text, console and json
+;format = console
+
+# For "file" mode only
+[log.file]
+;level =
+
+# log line format, valid options are text, console and json
+;format = text
+
+# This enables automated log rotate(switch of following options), default is true
+;log_rotate = true
+
+# Max line number of single file, default is 1000000
+;max_lines = 1000000
+
+# Max size shift of single file, default is 28 means 1 << 28, 256MB
+;max_size_shift = 28
+
+# Segment log daily, default is true
+;daily_rotate = true
+
+# Expired days of log file(delete after max days), default is 7
+;max_days = 7
+
+[log.syslog]
+;level =
+
+# log line format, valid options are text, console and json
+;format = text
+
+# Syslog network type and address. This can be udp, tcp, or unix. If left blank, the default unix endpoints will be used.
+;network =
+;address =
+
+# Syslog facility. user, daemon and local0 through local7 are valid.
+;facility =
+
+# Syslog tag. By default, the process' argv[0] is used.
+;tag =
+
+#################################### Alerting ############################
+[alerting]
+# Disable alerting engine & UI features
+;enabled = true
+# Makes it possible to turn off alert rule execution but alerting UI is visible
+;execute_alerts = true
+
+#################################### Explore #############################
+[explore]
+# Enable the Explore section
+;enabled = false
+
+#################################### Internal Grafana Metrics ##########################
+# Metrics available at HTTP API Url /metrics
+[metrics]
+# Disable / Enable internal metrics
+;enabled = true
+
+# Publish interval
+;interval_seconds = 10
+
+# Send internal metrics to Graphite
+[metrics.graphite]
+# Enable by setting the address setting (ex localhost:2003)
+;address =
+;prefix = prod.grafana.%(instance_name)s.
+
+#################################### Distributed tracing ############
+[tracing.jaeger]
+# Enable by setting the address sending traces to jaeger (ex localhost:6831)
+;address = localhost:6831
+# Tag that will always be included in when creating new spans. ex (tag1:value1,tag2:value2)
+;always_included_tag = tag1:value1
+# Type specifies the type of the sampler: const, probabilistic, rateLimiting, or remote
+;sampler_type = const
+# jaeger samplerconfig param
+# for "const" sampler, 0 or 1 for always false/true respectively
+# for "probabilistic" sampler, a probability between 0 and 1
+# for "rateLimiting" sampler, the number of spans per second
+# for "remote" sampler, param is the same as for "probabilistic"
+# and indicates the initial sampling rate before the actual one
+# is received from the mothership
+;sampler_param = 1
+
+#################################### Grafana.com integration ##########################
+# Url used to to import dashboards directly from Grafana.com
+[grafana_com]
+;url = https://grafana.com
+
+#################################### External image storage ##########################
+[external_image_storage]
+# Used for uploading images to public servers so they can be included in slack/email messages.
+# you can choose between (s3, webdav, gcs, azure_blob, local)
+;provider =
+
+[external_image_storage.s3]
+;bucket =
+;region =
+;path =
+;access_key =
+;secret_key =
+
+[external_image_storage.webdav]
+;url =
+;public_url =
+;username =
+;password =
+
+[external_image_storage.gcs]
+;key_file =
+;bucket =
+;path =
+
+[external_image_storage.azure_blob]
+;account_name =
+;account_key =
+;container_name =
+
+[external_image_storage.local]
+# does not require any configuration
+
diff --git a/mcord/mcord-cdn-monitoring/configs/ldap.toml b/mcord/mcord-cdn-monitoring/configs/ldap.toml
new file mode 100755
index 0000000..0dec502
--- /dev/null
+++ b/mcord/mcord-cdn-monitoring/configs/ldap.toml
@@ -0,0 +1,86 @@
+# To troubleshoot and get more log info enable ldap debug logging in grafana.ini
+# [log]
+# filters = ldap:debug
+
+[[servers]]
+# Ldap server host (specify multiple hosts space separated)
+host = "127.0.0.1"
+# Default port is 389 or 636 if use_ssl = true
+port = 389
+# Set to true if ldap server supports TLS
+use_ssl = false
+# Set to true if connect ldap server with STARTTLS pattern (create connection in insecure, then upgrade to secure connection with TLS)
+start_tls = false
+# set to true if you want to skip ssl cert validation
+ssl_skip_verify = false
+# set to the path to your root CA certificate or leave unset to use system defaults
+# root_ca_cert = "/path/to/certificate.crt"
+
+# Search user bind dn
+bind_dn = "cn=admin,dc=grafana,dc=org"
+# Search user bind password
+# If the password contains # or ; you have to wrap it with triple quotes. Ex """#password;"""
+bind_password = 'grafana'
+
+# User search filter, for example "(cn=%s)" or "(sAMAccountName=%s)" or "(uid=%s)"
+search_filter = "(cn=%s)"
+
+# An array of base dns to search through
+search_base_dns = ["dc=grafana,dc=org"]
+
+# In POSIX LDAP schemas, without memberOf attribute a secondary query must be made for groups.
+# This is done by enabling group_search_filter below. You must also set member_of= "cn"
+# in [servers.attributes] below.
+
+# Users with nested/recursive group membership and an LDAP server that supports LDAP_MATCHING_RULE_IN_CHAIN
+# can set group_search_filter, group_search_filter_user_attribute, group_search_base_dns and member_of
+# below in such a way that the user's recursive group membership is considered.
+#
+# Nested Groups + Active Directory (AD) Example:
+#
+# AD groups store the Distinguished Names (DNs) of members, so your filter must
+# recursively search your groups for the authenticating user's DN. For example:
+#
+# group_search_filter = "(member:1.2.840.113556.1.4.1941:=%s)"
+# group_search_filter_user_attribute = "distinguishedName"
+# group_search_base_dns = ["ou=groups,dc=grafana,dc=org"]
+#
+# [servers.attributes]
+# ...
+# member_of = "distinguishedName"
+
+## Group search filter, to retrieve the groups of which the user is a member (only set if memberOf attribute is not available)
+# group_search_filter = "(&(objectClass=posixGroup)(memberUid=%s))"
+## Group search filter user attribute defines what user attribute gets substituted for %s in group_search_filter.
+## Defaults to the value of username in [server.attributes]
+## Valid options are any of your values in [servers.attributes]
+## If you are using nested groups you probably want to set this and member_of in
+## [servers.attributes] to "distinguishedName"
+# group_search_filter_user_attribute = "distinguishedName"
+## An array of the base DNs to search through for groups. Typically uses ou=groups
+# group_search_base_dns = ["ou=groups,dc=grafana,dc=org"]
+
+# Specify names of the ldap attributes your ldap uses
+[servers.attributes]
+name = "givenName"
+surname = "sn"
+username = "cn"
+member_of = "memberOf"
+email = "email"
+
+# Map ldap groups to grafana org roles
+[[servers.group_mappings]]
+group_dn = "cn=admins,dc=grafana,dc=org"
+org_role = "Admin"
+# The Grafana organization database id, optional, if left out the default org (id 1) will be used
+# org_id = 1
+
+[[servers.group_mappings]]
+group_dn = "cn=users,dc=grafana,dc=org"
+org_role = "Editor"
+
+[[servers.group_mappings]]
+# If you want to match all (or no ldap groups) then you can use wildcard
+group_dn = "*"
+org_role = "Viewer"
+
diff --git a/mcord/mcord-cdn-monitoring/templates/NOTES.txt b/mcord/mcord-cdn-monitoring/templates/NOTES.txt
new file mode 100644
index 0000000..ae4cf08
--- /dev/null
+++ b/mcord/mcord-cdn-monitoring/templates/NOTES.txt
@@ -0,0 +1,47 @@
+Thank you for installing {{ .Chart.Name }}.
+
+This chart is for CDN monitoring in M-CORD demo scenarios.
+To show CDN traffic of CDN server, this chart deploys cAdvisor, Grafana, and Prometheus.
+
+You can determine which components will be installed by values.yaml.
+
+{{- if .Values.cadvisor.enabled }}
+
+
+- cAdvisor
+
+You can now access cAdvisor at: <node-ip>:{{ .Values.cadvisor.nodePort }}
+Prometheus will collect data through this cAdvisor at: <node-ip>:{{ .Values.cadvisor.nodePort }}/metrics
+
+
+{{- end }}
+
+
+{{- if .Values.grafana.enabled }}
+
+
+- Grafana
+
+You can now access Grafana at: <{{ .Values.grafana.node_selector }}-ip>:{{ .Values.grafana.nodePort }}
+using:
+
+username: {{ .Values.grafana.adminUser}}
+password: {{ .Values.grafana.adminPassword}}
+
+We use configs/cdn_metrics.json in default to create dashboards.
+If you want to monitor other CDN servers which have different container names, you should modify the json file or create your own json files.
+
+
+{{- end}}
+
+
+{{- if .Values.prometheus.enabled }}
+
+
+- Prometheus
+
+You can now access Prometheus at: <{{ .Values.prometheus.node_selector }}-ip>:{{ .Values.prometheus.nodePort }}
+If you want to show CDN traffics by Grafana, Grafana should select this Prometheus as data source.
+
+
+{{- end }}
diff --git a/mcord/mcord-cdn-monitoring/templates/cadvisor-ds.yaml b/mcord/mcord-cdn-monitoring/templates/cadvisor-ds.yaml
new file mode 100644
index 0000000..5ebe2e8
--- /dev/null
+++ b/mcord/mcord-cdn-monitoring/templates/cadvisor-ds.yaml
@@ -0,0 +1,74 @@
+---
+# Copyright 2018-present Open Networking Foundation
+#
+# 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.
+
+{{- if .Values.cadvisor.enabled }}
+
+apiVersion: apps/v1
+kind: DaemonSet
+metadata:
+ name: cadvisor-ds
+ annotations:
+ seccomp.security.alpha.kubernetes.io/pod: 'docker/default'
+spec:
+ selector:
+ matchLabels:
+ name: cadvisor
+ template:
+ metadata:
+ labels:
+ name: cadvisor
+ spec:
+ hostNetwork: true
+ containers:
+ - name: cadvisor
+ image: {{ .Values.cadvisor.image }}
+ args:
+ - --port={{ .Values.cadvisor.nodePort }}
+ volumeMounts:
+ - name: rootfs
+ mountPath: /rootfs
+ readOnly: true
+ - name: var-run
+ mountPath: /var/run
+ readOnly: true
+ - name: sys
+ mountPath: /sys
+ readOnly: true
+ - name: docker
+ mountPath: /var/lib/docker
+ readOnly: true
+ - name: disk
+ mountPath: /dev/disk
+ readOnly: true
+ automountServiceAccountToken: false
+ terminationGracePeriodSeconds: 30
+ volumes:
+ - name: rootfs
+ hostPath:
+ path: /
+ - name: var-run
+ hostPath:
+ path: /var/run
+ - name: sys
+ hostPath:
+ path: /sys
+ - name: docker
+ hostPath:
+ path: /var/lib/docker
+ - name: disk
+ hostPath:
+ path: /dev/disk
+
+{{- end }}
diff --git a/mcord/mcord-cdn-monitoring/templates/grafana-cfg.yaml b/mcord/mcord-cdn-monitoring/templates/grafana-cfg.yaml
new file mode 100644
index 0000000..dc76aef
--- /dev/null
+++ b/mcord/mcord-cdn-monitoring/templates/grafana-cfg.yaml
@@ -0,0 +1,78 @@
+---
+# Copyright 2018-present Open Networking Foundation
+#
+# 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.
+
+{{- if .Values.grafana.enabled }}
+
+apiVersion: v1
+kind: ConfigMap
+metadata:
+ name: grafana-config
+data:
+ grafana.ini: |
+{{ .Files.Get "configs/grafana.ini" | indent 4 }}
+ ldap.toml: |
+{{ .Files.Get "configs/ldap.toml" | indent 4 }}
+
+---
+
+apiVersion: v1
+kind: ConfigMap
+metadata:
+ name: grafana-dashs
+ labels:
+ grafana_dashboard: "1"
+data:
+ cdn_metrics.json: |
+{{ .Files.Get "configs/cdn-metrics.json" | indent 4 }}
+
+---
+
+apiVersion: v1
+kind: ConfigMap
+metadata:
+ name: grafana-dash-provider
+ labels:
+ grafana_dashboard: "1"
+data:
+ dashboard.yaml: |
+ apiVersion: 1
+
+ providers:
+ - name: 'default'
+ orgId: 1
+ folder: ''
+ type: file
+ disableDeletion: false
+ updateIntervalSeconds: 3
+ options:
+ path: /etc/grafana/dashboards
+---
+
+apiVersion: v1
+kind: ConfigMap
+metadata:
+ name: grafana-datasources-provider
+data:
+ prometheus-datasource.yaml: |
+ datasources:
+ - access: 'proxy'
+ editable: true
+ is_default: true
+ name: 'prom'
+ org_id: 1
+ type: 'prometheus'
+ url: http://{{ .Values.prometheus_host }}:{{ .Values.prometheus.nodePort }}
+
+{{- end }}
\ No newline at end of file
diff --git a/mcord/mcord-cdn-monitoring/templates/grafana-rc.yaml b/mcord/mcord-cdn-monitoring/templates/grafana-rc.yaml
new file mode 100644
index 0000000..ef9c5b7
--- /dev/null
+++ b/mcord/mcord-cdn-monitoring/templates/grafana-rc.yaml
@@ -0,0 +1,67 @@
+---
+# Copyright 2018-present Open Networking Foundation
+#
+# 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.
+
+{{- if .Values.grafana.enabled }}
+
+apiVersion: v1
+kind: ReplicationController
+metadata:
+ name: grafana-cdn-rc
+spec:
+ replicas: 1
+ selector:
+ app: grafana-cdn
+ template:
+ metadata:
+ name: grafana-cdn
+ labels:
+ app: grafana-cdn
+ spec:
+ nodeSelector:
+ kubernetes.io/hostname: {{ .Values.grafana.node_selector }}
+ containers:
+ - name: grafana
+ image: {{ .Values.grafana.image }}
+ env:
+ - name: ADMIN_USER
+ value: {{ .Values.grafana.adminUser }}
+ - name: ADMIN_PASS
+ value: {{ .Values.grafana.adminPassword }}
+ ports:
+ - containerPort: 3000
+ volumeMounts:
+ - mountPath: /etc/grafana/
+ name: grafana-volume
+ - mountPath: /etc/grafana/dashboards
+ name: grafana-dashboards
+ - mountPath: /etc/grafana/provisioning/dashboards
+ name: dashboards-provider
+ - mountPath: /etc/grafana/provisioning/datasources
+ name: datasources-provider
+ volumes:
+ - name: grafana-volume
+ configMap:
+ name: grafana-config
+ - name: grafana-dashboards
+ configMap:
+ name: grafana-dashs
+ - name: dashboards-provider
+ configMap:
+ name: grafana-dash-provider
+ - name: datasources-provider
+ configMap:
+ name: grafana-datasources-provider
+
+{{- end }}
diff --git a/mcord/mcord-cdn-monitoring/templates/grafana-svc.yaml b/mcord/mcord-cdn-monitoring/templates/grafana-svc.yaml
new file mode 100644
index 0000000..3f09093
--- /dev/null
+++ b/mcord/mcord-cdn-monitoring/templates/grafana-svc.yaml
@@ -0,0 +1,33 @@
+---
+# Copyright 2018-present Open Networking Foundation
+#
+# 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.
+
+{{- if .Values.grafana.enabled }}
+
+apiVersion: v1
+kind: Service
+metadata:
+ name: grafana-cdn-service
+spec:
+ selector:
+ app: grafana-cdn
+ type: NodePort
+ ports:
+ - name: grafana
+ port: 3000
+ protocol: TCP
+ targetPort: 3000
+ nodePort: {{ .Values.grafana.nodePort }}
+
+{{- end }}
\ No newline at end of file
diff --git a/mcord/mcord-cdn-monitoring/templates/prometheus-cfg.yaml b/mcord/mcord-cdn-monitoring/templates/prometheus-cfg.yaml
new file mode 100644
index 0000000..158fce1
--- /dev/null
+++ b/mcord/mcord-cdn-monitoring/templates/prometheus-cfg.yaml
@@ -0,0 +1,40 @@
+---
+# Copyright 2018-present Open Networking Foundation
+#
+# 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.
+
+{{- if .Values.prometheus.enabled }}
+
+apiVersion: v1
+kind: ConfigMap
+metadata:
+ name: prometheus-config
+data:
+ prometheus.yml: |
+ global:
+ scrape_interval: {{ .Values.prometheus.interval }} # By default, scrape targets every 15 seconds.
+ evaluation_interval: {{ .Values.prometheus.interval }} # By default, scrape targets every 15 seconds.
+ # scrape_timeout is set to the global default (10s).
+
+ external_labels:
+ monitor: 'monitoring'
+
+ scrape_configs:
+ - job_name: 'prometheus'
+ static_configs:
+ - targets: ['{{ .Values.prometheus_host }}:{{ .Values.prometheus.nodePort }}']
+ - job_name: 'kube-metrics'
+ static_configs:
+ - targets: ['{{ .Values.cdn_remote_host }}:{{ .Values.cadvisor.nodePort }}', '{{ .Values.cdn_local_host }}:{{ .Values.cadvisor.nodePort }}']
+
+{{- end }}
\ No newline at end of file
diff --git a/mcord/mcord-cdn-monitoring/templates/prometheus-rc.yaml b/mcord/mcord-cdn-monitoring/templates/prometheus-rc.yaml
new file mode 100644
index 0000000..818c582
--- /dev/null
+++ b/mcord/mcord-cdn-monitoring/templates/prometheus-rc.yaml
@@ -0,0 +1,49 @@
+---
+# Copyright 2018-present Open Networking Foundation
+#
+# 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.
+
+{{- if .Values.prometheus.enabled }}
+
+apiVersion: v1
+kind: ReplicationController
+metadata:
+ name: prometheus-cdn-rc
+spec:
+ replicas: 1
+ selector:
+ app: prometheus-cdn
+ template:
+ metadata:
+ name: prometheus-cdn
+ labels:
+ app: prometheus-cdn
+ spec:
+ nodeSelector:
+ kubernetes.io/hostname: {{ .Values.prometheus.node_selector }}
+ containers:
+ - args:
+ - --config.file=/etc/prometheus/config_out/prometheus.yml
+ name: prometheus
+ image: {{ .Values.prometheus.image }}
+ ports:
+ - containerPort: 9090
+ volumeMounts:
+ - mountPath: /etc/prometheus/config_out
+ name: prometheus-volume
+ volumes:
+ - name: prometheus-volume
+ configMap:
+ name: prometheus-config
+
+{{- end }}
\ No newline at end of file
diff --git a/mcord/mcord-cdn-monitoring/templates/prometheus-svc.yaml b/mcord/mcord-cdn-monitoring/templates/prometheus-svc.yaml
new file mode 100644
index 0000000..b9ebf6c
--- /dev/null
+++ b/mcord/mcord-cdn-monitoring/templates/prometheus-svc.yaml
@@ -0,0 +1,33 @@
+---
+# Copyright 2018-present Open Networking Foundation
+#
+# 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.
+
+{{- if .Values.prometheus.enabled }}
+
+apiVersion: v1
+kind: Service
+metadata:
+ name: prometheus-cdn-service
+spec:
+ selector:
+ app: prometheus-cdn
+ type: NodePort
+ ports:
+ - name: prometheus
+ nodePort: {{ .Values.prometheus.nodePort }}
+ port: 9090
+ protocol: TCP
+ targetPort: 9090
+
+{{- end }}
\ No newline at end of file
diff --git a/mcord/mcord-cdn-monitoring/values.yaml b/mcord/mcord-cdn-monitoring/values.yaml
new file mode 100644
index 0000000..3e95055
--- /dev/null
+++ b/mcord/mcord-cdn-monitoring/values.yaml
@@ -0,0 +1,38 @@
+---
+# Copyright 2018-present Open Networking Foundation
+#
+# 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.
+
+cdn_remote_host: 10.90.0.141
+cdn_local_host: 10.90.0.153
+prometheus_host: 10.90.0.152
+
+cadvisor:
+ image: google/cadvisor:latest
+ nodePort: 8888
+ enabled: true
+
+prometheus:
+ image: prom/prometheus:v2.3.1
+ node_selector: node2
+ nodePort: 31000
+ interval: 10s
+ enabled: true
+
+grafana:
+ image: grafana/grafana:5.2.2
+ node_selector: node2
+ nodePort: 30000
+ adminUser: admin
+ adminPassword: admin
+ enabled: true