apiVersion: influxdata.com/v2alpha1
kind: Label
metadata:
    name: cranky-ramanujan-708001
spec:
    color: '#326BBA'
    name: mysql
---
apiVersion: influxdata.com/v2alpha1
kind: Bucket
metadata:
    name: modest-elgamal-708005
spec:
    associations:
      - kind: Label
        name: cranky-ramanujan-708001
    name: mariadb
---
apiVersion: influxdata.com/v2alpha1
kind: Label
metadata:
    name: mysql-template
spec:
    name: Mysql Template
    color: '#7A65F2'
---
apiVersion: influxdata.com/v2alpha1
kind: Variable
metadata:
    name: bucket
spec:
    name: bucket
    associations:
      - kind: Label
        name: mysql-template
    language: flux
    query: |-
        buckets()
          |> filter(fn: (r) => r.name !~ /^_/)
          |> rename(columns: {name: "_value"})
          |> keep(columns: ["_value"])
    type: query
---
apiVersion: influxdata.com/v2alpha1
kind: Variable
metadata:
    name:  mysql-host
spec:
    name:  mysql_host
    associations:
      - kind: Label
        name: mysql-template
    language: flux
    query: |-
        import "influxdata/influxdb/v1"
        v1.measurementTagValues(bucket: v.bucket, measurement: "cpu", tag: "host")
    type: query
---
apiVersion: influxdata.com/v2alpha1
kind: Dashboard
metadata:
    name: quizzical-swartz-308001
spec:
    associations:
      - kind: Label
        name: cranky-ramanujan-708001
    charts:
      - axes:
          - base: "10"
            name: x
            scale: linear
          - base: "10"
            name: y
            scale: linear
        colors:
          - hex: '#31C0F6'
            name: Nineteen Eighty Four
            type: scale
          - hex: '#A500A5'
            name: Nineteen Eighty Four
            type: scale
          - hex: '#FF7E27'
            name: Nineteen Eighty Four
            type: scale
        geom: line
        height: 2
        kind: Xy
        name: MySQL Connections
        position: overlaid
        queries:
          - query: |-
                from(bucket: v.bucket)
                  |> range(start: v.timeRangeStart, stop: v.timeRangeStop)
                  |> filter(fn: (r) => r["_measurement"] == "mysql")
                  |> filter(fn: (r) => r["_field"] == "connections" or r["_field"] == "max_used_connections")
                  |> filter(fn: (r) => r.host == v.mysql_host)
                  |> derivative(unit: v.windowPeriod, nonNegative: false)
                  |> yield(name: "derivative")
        width: 4
        xCol: _time
        yCol: _value
      - axes:
          - base: "10"
            name: x
            scale: linear
          - base: "10"
            name: y
            scale: linear
        colors:
          - hex: '#31C0F6'
            name: Nineteen Eighty Four
            type: scale
          - hex: '#A500A5'
            name: Nineteen Eighty Four
            type: scale
          - hex: '#FF7E27'
            name: Nineteen Eighty Four
            type: scale
        geom: line
        height: 2
        kind: Xy
        name: MySQL Network Traffic
        position: overlaid
        queries:
          - query: |-
                from(bucket: v.bucket)
                  |> range(start: v.timeRangeStart, stop: v.timeRangeStop)
                  |> filter(fn: (r) => r["_measurement"] == "mysql")
                  |> filter(fn: (r) => r["_field"] == "bytes_sent" or r["_field"] == "bytes_received")
                  |> filter(fn: (r) => r.host == v.mysql_host)
                  |> derivative(unit: v.windowPeriod, nonNegative: false)
                  |> yield(name: "derivative")
        width: 6
        xCol: _time
        yCol: _value
        yPos: 2
      - axes:
          - base: "10"
            name: x
            scale: linear
          - base: "10"
            name: y
            scale: linear
            suffix: ' ops'
        colors:
          - hex: '#31C0F6'
            name: Nineteen Eighty Four
            type: scale
          - hex: '#A500A5'
            name: Nineteen Eighty Four
            type: scale
          - hex: '#FF7E27'
            name: Nineteen Eighty Four
            type: scale
        geom: line
        height: 2
        kind: Xy
        name: (Stacked) MySQL Select Types
        position: overlaid
        queries:
          - query: |-
                from(bucket: v.bucket)
                  |> range(start: v.timeRangeStart, stop: v.timeRangeStop)
                  |> filter(fn: (r) => r["_measurement"] == "mysql")
                  |> filter(fn: (r) => r["_field"] == "select_full_join" or r["_field"] == "select_full_range_join" or r["_field"] == "select_range" or r["_field"] == "select_range_check" or r["_field"] == "select_scan")
                  |> filter(fn: (r) => r.host == v.mysql_host)
                  |> derivative(unit: v.windowPeriod, nonNegative: false)
                  |> yield(name: "derivative")
        width: 5
        xCol: _time
        yCol: _value
        yPos: 4
      - axes:
          - base: "10"
            name: x
            scale: linear
          - base: "10"
            name: y
            scale: linear
            suffix: ' ops'
        colors:
          - hex: '#31C0F6'
            name: Nineteen Eighty Four
            type: scale
          - hex: '#A500A5'
            name: Nineteen Eighty Four
            type: scale
          - hex: '#FF7E27'
            name: Nineteen Eighty Four
            type: scale
        geom: line
        height: 2
        kind: Xy
        name: (Stacked) MySQL Handler
        position: overlaid
        queries:
          - query: |-
                from(bucket: v.bucket)
                  |> range(start: v.timeRangeStart, stop: v.timeRangeStop)
                  |> filter(fn: (r) => r["_measurement"] == "mysql")
                  |> filter(fn: (r) => r["_field"] == "handler_commit" or r["_field"] == "handler_delete" or r["_field"] == "handler_discover" or r["_field"] == "handler_read_key" or r["_field"] == "handler_read_rnd_next" or r["_field"] == "handler_write" or r["_field"] == "handler_update")
                  |> filter(fn: (r) => r.host == v.mysql_host)
                  |> derivative(unit: v.windowPeriod, nonNegative: false)
                  |> yield(name: "derivative")
        width: 6
        xCol: _time
        yCol: _value
        yPos: 6
      - axes:
          - base: "10"
            name: x
            scale: linear
          - base: "10"
            name: y
            scale: linear
        colors:
          - hex: '#31C0F6'
            name: Nineteen Eighty Four
            type: scale
          - hex: '#A500A5'
            name: Nineteen Eighty Four
            type: scale
          - hex: '#FF7E27'
            name: Nineteen Eighty Four
            type: scale
        geom: line
        height: 2
        kind: Xy
        name: MySQL Query Cache Memory
        position: overlaid
        queries:
          - query: |-
                from(bucket: v.bucket)
                  |> range(start: v.timeRangeStart, stop: v.timeRangeStop)
                  |> filter(fn: (r) => r["_measurement"] == "mysql")
                  |> filter(fn: (r) => r["_field"] == "qcache_free_memory")
                  |> filter(fn: (r) => r.host == v.mysql_host)
        width: 6
        xCol: _time
        yCol: _value
        yPos: 8
      - axes:
          - base: "10"
            name: x
            scale: linear
          - base: "10"
            name: y
            scale: linear
        colors:
          - hex: '#31C0F6'
            name: Nineteen Eighty Four
            type: scale
          - hex: '#A500A5'
            name: Nineteen Eighty Four
            type: scale
          - hex: '#FF7E27'
            name: Nineteen Eighty Four
            type: scale
        geom: line
        height: 2
        kind: Xy
        name: MySQL Active Threads
        position: overlaid
        queries:
          - query: |-
                from(bucket: v.bucket)
                  |> range(start: v.timeRangeStart, stop: v.timeRangeStop)
                  |> filter(fn: (r) => r["_measurement"] == "mysql")
                  |> filter(fn: (r) => r["_field"] == "threads_running" or r["_field"] == "threads_connected")
                  |> filter(fn: (r) => r.host == v.mysql_host)
        width: 5
        xCol: _time
        xPos: 4
        yCol: _value
      - axes:
          - base: "10"
            name: x
            scale: linear
          - base: "10"
            name: y
            scale: linear
            suffix: ' ops'
        colors:
          - hex: '#31C0F6'
            name: Nineteen Eighty Four
            type: scale
          - hex: '#A500A5'
            name: Nineteen Eighty Four
            type: scale
          - hex: '#FF7E27'
            name: Nineteen Eighty Four
            type: scale
        geom: line
        height: 2
        kind: Xy
        name: MySQL Temporary Objects
        position: overlaid
        queries:
          - query: |-
                from(bucket: v.bucket)
                  |> range(start: v.timeRangeStart, stop: v.timeRangeStop)
                  |> filter(fn: (r) => r["_measurement"] == "mysql")
                  |> filter(fn: (r) => r["_field"] == "created_tmp_tables" or r["_field"] == "created_tmp_disk_tables" or r["_field"] == "created_tmp_files")
                  |> filter(fn: (r) => r.host == v.mysql_host)
                  |> derivative(unit: v.windowPeriod, nonNegative: false)
                  |> yield(name: "derivative")
        width: 5
        xCol: _time
        xPos: 5
        yCol: _value
        yPos: 4
      - axes:
          - base: "10"
            name: x
            scale: linear
          - base: "10"
            name: y
            scale: linear
            suffix: ' ops'
        colors:
          - hex: '#31C0F6'
            name: Nineteen Eighty Four
            type: scale
          - hex: '#A500A5'
            name: Nineteen Eighty Four
            type: scale
          - hex: '#FF7E27'
            name: Nineteen Eighty Four
            type: scale
        geom: line
        height: 2
        kind: Xy
        name: MySQL Table Locks
        position: overlaid
        queries:
          - query: |-
                from(bucket: v.bucket)
                  |> range(start: v.timeRangeStart, stop: v.timeRangeStop)
                  |> filter(fn: (r) => r["_measurement"] == "mysql")
                  |> filter(fn: (r) => r["_field"] == "table_locks_waited" or r["_field"] == "table_locks_immediate")
                  |> filter(fn: (r) => r.host == v.mysql_host)
        width: 6
        xCol: _time
        xPos: 6
        yCol: _value
        yPos: 2
      - axes:
          - base: "10"
            name: x
            scale: linear
          - base: "10"
            name: y
            scale: linear
            suffix: ' ops'
        colors:
          - hex: '#31C0F6'
            name: Nineteen Eighty Four
            type: scale
          - hex: '#A500A5'
            name: Nineteen Eighty Four
            type: scale
          - hex: '#FF7E27'
            name: Nineteen Eighty Four
            type: scale
        geom: line
        height: 2
        kind: Xy
        name: Top Command Counters 24 Hours
        position: overlaid
        queries:
          - query: |-
                from(bucket: v.bucket)
                  |> range(start: v.timeRangeStart, stop: v.timeRangeStop)
                  |> filter(fn: (r) => r["_measurement"] == "mysql")
                  |> filter(fn: (r) => r["_field"] == "com_insert" or r["_field"] == "com_update" or r["_field"] == "com_commit" or r["_field"] == "com_begin" or r["_field"] == "com_admin_commands" or r["_field"] == "com_show_status" or r["_field"] == "com_show_variables" or r["_field"] == "com_set_option")
                  |> filter(fn: (r) => r.host == v.mysql_host)
                  |> derivative(unit: v.windowPeriod, nonNegative: false)
                  |> yield(name: "derivative")
        width: 6
        xCol: _time
        xPos: 6
        yCol: _value
        yPos: 6
      - axes:
          - base: "10"
            name: x
            scale: linear
          - base: "10"
            name: y
            scale: linear
            suffix: ' ops'
        colors:
          - hex: '#31C0F6'
            name: Nineteen Eighty Four
            type: scale
          - hex: '#A500A5'
            name: Nineteen Eighty Four
            type: scale
          - hex: '#FF7E27'
            name: Nineteen Eighty Four
            type: scale
        geom: line
        height: 2
        kind: Xy
        name: MySQL Query Cache Activity
        position: overlaid
        queries:
          - query: |-
                from(bucket: v.bucket)
                  |> range(start: v.timeRangeStart, stop: v.timeRangeStop)
                  |> filter(fn: (r) => r["_measurement"] == "mysql")
                  |> filter(fn: (r) => r["_field"] == "qcache_hits" or r["_field"] == "qcache_inserts" or r["_field"] == "qcache_not_cached" or r["_field"] == "qcache_lowmem_prunes" or r["_field"] == "qcache_queries_in_cache")
                  |> filter(fn: (r) => r.host == v.mysql_host)
        width: 6
        xCol: _time
        xPos: 6
        yCol: _value
        yPos: 8
      - colors:
          - hex: '#00C9FF'
            name: laser
            type: text
        decimalPlaces: 2
        height: 1
        kind: Single_Stat
        name: Current MySQL Uptime
        queries:
          - query: |-
                from(bucket: v.bucket)
                  |> range(start: v.timeRangeStart, stop: v.timeRangeStop)
                  |> filter(fn: (r) => r["_measurement"] == "mysql")
                  |> filter(fn: (r) => r["_field"] == "uptime")
                  |> filter(fn: (r) => r.host == v.mysql_host)
                  |> map(fn: (r) => ({ _time: r._time, _value: float(v: r._value) / 86400.00, _field: r._field, _measurement: r._measurement, host: r.host }))
        suffix: ' Days'
        width: 3
        xPos: 9
      - colors:
          - hex: '#00C9FF'
            name: laser
            type: text
        decimalPlaces: 2
        height: 1
        kind: Single_Stat
        name: Current Queries
        queries:
          - query: |-
                from(bucket: v.bucket)
                  |> range(start: v.timeRangeStart, stop: v.timeRangeStop)
                  |> filter(fn: (r) => r["_measurement"] == "mysql")
                  |> filter(fn: (r) => r["_field"] == "queries")
                  |> filter(fn: (r) => r.host == v.mysql_host)
        width: 3
        xPos: 9
        yPos: 1
      - axes:
          - base: "10"
            name: x
            scale: linear
          - base: "10"
            name: y
            scale: linear
            suffix: ' ops'
        colors:
          - hex: '#31C0F6'
            name: Nineteen Eighty Four
            type: scale
          - hex: '#A500A5'
            name: Nineteen Eighty Four
            type: scale
          - hex: '#FF7E27'
            name: Nineteen Eighty Four
            type: scale
        geom: line
        height: 2
        kind: Xy
        name: MySQL Slow Queries
        position: overlaid
        queries:
          - query: |-
                from(bucket: v.bucket)
                  |> range(start: v.timeRangeStart, stop: v.timeRangeStop)
                  |> filter(fn: (r) => r["_measurement"] == "mysql")
                  |> filter(fn: (r) => r["_field"] == "slow_queries")
                  |> filter(fn: (r) => r.host == v.mysql_host)
        width: 2
        xCol: _time
        xPos: 10
        yCol: _value
        yPos: 4
    name: MySQL - MariaDB

---

apiVersion: influxdata.com/v2alpha1
kind: Telegraf
metadata:
    name: mysql-mariadb
spec:
   config: |
        [[outputs.influxdb_v2]]
          ## The URLs of the InfluxDB cluster nodes.
          ##
          ## Multiple URLs can be specified for a single cluster, only ONE of the
          ## urls will be written to each interval.
          ## urls exp: http://127.0.0.1:9999
          urls = ["$INFLUX_HOST"]
          ## Token for authentication.
          token = "$INFLUX_TOKEN"
          ## Organization is the name of the organization you wish to write to; must exist.
          organization = "$INLFUX_ORG"
          ## Destination bucket to write into.
          bucket = "$INFLUX_BUCKET"
        [[inputs.mysql]]
          ## specify servers via a url matching:
          ##  [username[:password]@][protocol[(address)]]/[?tls=[true|false|skip-verify|custom]]
          ##  see https://github.com/go-sql-driver/mysql#dsn-data-source-name
          ##  e.g.
          ##    servers = ["user:passwd@tcp(127.0.0.1:3306)/?tls=false"]
          ##    servers = ["user@tcp(127.0.0.1:3306)/?tls=false"]
          #
          ## If no servers are specified, then localhost is used as the host.
          servers = ["$MYSQL_CONNECTION_STRING"]
          ## Selects the metric output format.
          ##
          ## This option exists to maintain backwards compatibility, if you have
          ## existing metrics do not set or change this value until you are ready to
          ## migrate to the new format.
          ##
          ## If you do not have existing metrics from this plugin set to the latest
          ## version.
          ##
          ## Telegraf >=1.6: metric_version = 2
          ##           <1.6: metric_version = 1 (or unset)
          metric_version = 2
          ## if the list is empty, then metrics are gathered from all databasee tables
          table_schema_databases = []
          ## gather metrics from INFORMATION_SCHEMA.TABLES for databases provided above list
          gather_table_schema = false
          ## gather thread state counts from INFORMATION_SCHEMA.PROCESSLIST
          gather_process_list = false
          ## gather user statistics from INFORMATION_SCHEMA.USER_STATISTICS
          gather_user_statistics = false
          ## gather auto_increment columns and max values from information schema
          gather_info_schema_auto_inc = false
          ## gather metrics from INFORMATION_SCHEMA.INNODB_METRICS
          gather_innodb_metrics = false
          ## gather metrics from SHOW SLAVE STATUS command output
          gather_slave_status = false
          ## gather metrics from SHOW BINARY LOGS command output
          gather_binary_logs = false
          ## gather metrics from SHOW GLOBAL VARIABLES command output
          gather_global_variables = true
          ## gather metrics from PERFORMANCE_SCHEMA.TABLE_IO_WAITS_SUMMARY_BY_TABLE
          gather_table_io_waits = false
          ## gather metrics from PERFORMANCE_SCHEMA.TABLE_LOCK_WAITS
          gather_table_lock_waits = false
          ## gather metrics from PERFORMANCE_SCHEMA.TABLE_IO_WAITS_SUMMARY_BY_INDEX_USAGE
          gather_index_io_waits = false
          ## gather metrics from PERFORMANCE_SCHEMA.EVENT_WAITS
          gather_event_waits = false
          ## gather metrics from PERFORMANCE_SCHEMA.FILE_SUMMARY_BY_EVENT_NAME
          gather_file_events_stats = false
          ## gather metrics from PERFORMANCE_SCHEMA.EVENTS_STATEMENTS_SUMMARY_BY_DIGEST
          gather_perf_events_statements = false
          ## the limits for metrics form perf_events_statements
          perf_events_statements_digest_text_limit = 120
          perf_events_statements_limit = 250
          perf_events_statements_time_limit = 86400
          ## Some queries we may want to run less often (such as SHOW GLOBAL VARIABLES)
          ##   example: interval_slow = "30m"
          interval_slow = ""
          ## Optional TLS Config (will be used if tls=custom parameter specified in server uri)
          # tls_ca = "/etc/telegraf/ca.pem"
          # tls_cert = "/etc/telegraf/cert.pem"
          # tls_key = "/etc/telegraf/key.pem"
          ## Use TLS but skip chain & host verification
          # insecure_skip_verify = false