Menu

Grafana Configure

module.exports = (service) ->
  options = service.options

Access

  options.iptables ?= !!service.deps.iptables and service.deps.iptables?.options?.action is 'start'

Identities

  # Group
  options.group ?= {}
  options.group = name: options.group if typeof options.group is 'string'
  options.group.name ?= 'grafana'
  options.group.system ?= true
  # User
  options.user ?= {}
  options.user = name: options.user if typeof options.user is 'string'
  options.user.name ?= 'grafana'
  options.user.home ?= "/var/lib/#{options.user.name}"
  options.user.system ?= true
  options.user.comment ?= 'Grafana User'
  options.user.groups ?= 'hadoop'
  options.user.gid ?= options.group.name
  options.user.limits ?= {}
  options.user.limits.nofile ?= 64000
  options.user.limits.nproc ?= true

Configure Database

Note, at the moment, only MariaDB, PostgreSQL and MySQL are supported.

  options.db ?= {}
  options.db.engine ?= service.deps.db_admin.options.engine
  options.db = merge {}, service.deps.db_admin.options[options.db.engine], options.db
  options.db.database ?= 'grafana'
  options.db.username ?= 'grafana'
  throw Error "Required Option: db.password" unless options.db.password

Configuration

  # options.source ?= 'https://s3-us-west-2.amazonaws.com/grafana-releases/release/grafana-4.5.2-1.x86_64.rpm'
  # options.download ?= service.deps.grafana_webui[0].node.fqdn is service.node.fqdn
  options.log_dir ?= '/var/log/grafana'
  options.conf_dir ?= '/etc/grafana/conf'
  options.run_dir ?= '/var/run/grafana'
  # Misc
  options.fqdn ?= service.node.fqdn

Environment

  options.env ?= {}
  options.env['GRAFANA_USER'] ?= options.user.name
  options.env['GRAFANA_GROUP'] ?= options.group.name
  options.env['GRAFANA_HOME'] ?= options.user.home
  options.env['LOG_DIR'] ?= options.log_dir
  options.env['PID_FILE_DIR'] ?= options.run_dir
  options.env['DATA_DIR'] ?= "#{options.user.home}/data"
  options.env['CONF_DIR'] ?= options.conf_dir
  options.env['CONF_FILE'] ?= "#{options.conf_dir}/grafana.ini"
  options.env['MAX_OPEN_FILES'] ?= options.user.limits.nofile
  options.env['PLUGINS_DIR'] ?= "#{options.user.home}/plugins"
  options.env['RESTART_ON_UPGRADE'] ?= 'true'

SSL

  options.ssl = merge {}, service.deps.ssl?.options, options.ssl
  options.ssl.enabled ?= !!service.deps.ssl
  if options.ssl.enabled
    throw Error "Required Option: ssl.cert" if  not options.ssl.cert
    throw Error "Required Option: ssl.key" if not options.ssl.key

Server Properties

  options.ini ?= {}
  #webui
  options.ini['server'] ?= {}
  options.ini['server']['protocol'] ?= if options.ssl.enabled then 'https' else 'http'
  options.ini['server']['http_port'] ?= '3000'
  options.ini['server']['domain'] ?= service.node.fqdn
  options.ini['server']['cert_file'] ?= "#{options.conf_dir}/cert.pem"
  options.ini['server']['cert_key'] ?= "#{options.conf_dir}/key.pem"
  #database
  options.ini['database'] ?= {}
  options.ini['database']['type'] ?= 'mysql' if options.db.engine in ['mysql','mariadb']
  options.ini['database']['host'] ?= "#{options.db.host}:#{options.db.port}"
  options.ini['database']['name'] ?= options.db.database
  options.ini['database']['user'] ?= options.db.username
  options.ini['database']['password'] ?= options.db.password
  #security
  options.ini['security'] ?= {}
  options.ini['security']['admin_user'] ?= 'admin'
  options.ini['security']['admin_password'] ?= 'admin'
  throw Error 'Missing Grafana webui password options.ini.security.admin_password' unless options.ini['security']['admin_password']?

URLs

  options.url ?= "#{options.ini['server']['protocol']}://#{service.node.fqdn}:#{options.ini['server']['http_port']}"
  if service.deps.hdfs_jn
    protocol = if service.deps.hdfs_jn[0].options.hdfs_site['dfs.http.policy'] is 'HTTP_ONLY' then 'http' else 'https'
    port = service.deps.hdfs_jn[0].options.hdfs_site["dfs.journalnode.#{protocol}-address"].split(':')[1]
    options.jn_url ?= "#{protocol}://#{service.deps.hdfs_jn[0].node.fqdn}:#{port}"

Datasources

  options.datasource ?= 'prometheus' if service.deps.prometheus_monitor
  options.datasources ?= {}
  if options.datasource is 'prometheus'
    options.datasources['prometheus'] ?=
      datasource_url: "http://#{service.deps.prometheus_monitor[0].node.fqdn}:#{service.deps.prometheus_monitor[0].options.port}"
      name: 'prometheus'
      datasource: 'prometheus'

Dashboards

Load default template for Grafana with prometheus datasource. This templates, will work out of the box on every cluster deployed by Ryba. Nonetheless you can use it, just besure that in your jMX exporter the property toLowerCase is enabled, as metrics are in lowercase in grafana dashboard.

Dashboard and panels are based on prometheus queries and as a consequence, do not depend on cluster or host names.

  options.templates ?= {}
  #needed options when rendering templates
  throw Error 'missing cluster_name' unless options.cluster_name?
  if service.deps.zookeeper_server and options.datasource?
    options.templates['zookeeper-server'] ?=
      source: "#{__dirname}/../resources/prometheus-zookeeper.json.j2"
      local: true
      title: 'Zookeeper Server'
      slug: 'zookeeper-server'
      cluster_name: options.cluster_name
      datasource: options.datasource
  if service.deps.hdfs_dn  and options.datasource?
    options.templates['hdfs-datanodes'] ?=
      source: "#{__dirname}/../resources/prometheus-datanodes.json.j2"
      local: true
      title: 'HDFS Datanodes'
      slug: 'hdfs-datanodes'
      cluster_name: options.cluster_name
      datasource: options.datasource
      #TODO percentage of disks used
      # options.templates['hdfs-datadisks'] ?=
      #   source: "#{__dirname}/../resources/prometheus-hdfs-datadisks.json.j2"
      #   local: true
      #   title: 'HDFS Data Disks'
      #   slug: 'hdfs-datadisks'
      #   cluster_name: options.cluster_name
      #   datasource: options.datasource
  if service.deps.hdfs_jn  and options.datasource?
    options.templates['hdfs-journalnodes'] ?=
      source: "#{__dirname}/../resources/prometheus-journalnodes.json.j2"
      local: true
      title: 'HDFS Journalnodes'
      slug: 'hdfs-journalnodes'
      cluster_name: options.cluster_name
      datasource: options.datasource
  if service.deps.hdfs_nn and options.datasource?
    options.templates['hdfs-namenodes'] ?=
      source: "#{__dirname}/../resources/prometheus-namenodes.json.j2"
      local: true
      title: 'HDFS Namenodes'
      slug: 'hdfs-namenodes'
      cluster_name: options.cluster_name
      datasource: options.datasource
  if service.deps.yarn_nm and options.datasource?
    options.templates['yarn-nodemanagers'] ?=
      source: "#{__dirname}/../resources/prometheus-nodemanagers.json.j2"
      local: true
      title: 'YARN NodeManagers'
      slug: 'yarn-nodemanagers'
      cluster_name: options.cluster_name
      datasource: options.datasource
  if service.deps.yarn_rm and options.datasource?
    options.templates['yarn-resourcemanagers'] ?=
      source: "#{__dirname}/../resources/prometheus-resourcemanagers.json.j2"
      local: true
      title: 'YARN ResourceManagers'
      slug: 'yarn-resourcemanagers'
      cluster_name: options.cluster_name
      datasource: options.datasource
    options.templates['yarn-queues'] ?=
      source: "#{__dirname}/../resources/prometheus-queues.json.j2"
      local: true
      title: 'YARN Queues'
      slug: 'yarn-queues'
      cluster_name: options.cluster_name
      datasource: options.datasource
  if service.deps.collectd_exporter and options.datasource?
    options.templates['system-activity'] ?=
      source: "#{__dirname}/../resources/prometheus-system-activity.json.j2"
      local: true
      title: 'System Activity'
      slug: 'system-activity'
      datasource: options.datasource
  if service.deps.hbase_master and options.datasource?
    options.templates['hbase-home'] ?= 
      source: "#{__dirname}/../resources/prometheus-hbase-home.json.j2"
      local: true
      title: 'HBase Home'
      slug: 'hbase-home'
      cluster_name: options.cluster_name
      datasource: options.datasource
    options.templates['hbase-misc'] ?= 
      source: "#{__dirname}/../resources/prometheus-hbase-misc.json.j2"
      local: true
      title: 'HBase Misc'
      slug: 'hbase-misc'
      cluster_name: options.cluster_name
      datasource: options.datasource
    options.templates['hbase-regionservers'] ?= 
      source: "#{__dirname}/../resources/prometheus-hbase-regionservers.json.j2"
      local: true
      title: 'HBase RegionServers'
      slug: 'hbase-regionservers'
      cluster_name: options.cluster_name
      datasource: options.datasource
    options.templates['hbase-tables'] ?= 
      source: "#{__dirname}/../resources/prometheus-hbase-tables.json.j2"
      local: true
      title: 'HBase Tables'
      slug: 'hbase-tables'
      cluster_name: options.cluster_name
      datasource: options.datasource
    options.templates['hbase-users'] ?= 
      source: "#{__dirname}/../resources/prometheus-hbase-users.json.j2"
      local: true
      title: 'HBase Users'
      slug: 'hbase-users'
      cluster_name: options.cluster_name
      datasource: options.datasource

Wait

  options.wait_db_admin = service.deps.db_admin.options.wait
  options.wait ?= {}
  options.wait.http = for srv in service.deps.grafana_webui
    host: srv.node.fqdn
    port: srv.options.ini['server']['http_port'] or options.ini['server']['http_port'] or 3000

Dependencies

{merge} = require '@nikitajs/core/lib/misc'