# Copyright 2022 Google LLC
#
# 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.

public_url: "https://cloud.google.com/stackdriver/docs/solutions/agents/ops-agent/third-party/mariadb"
app_url: "http://www.mariadb.com/"
short_name: MariaDB
long_name: MariaDB
logo_path: /stackdriver/images/mariadb.png # supplied by google technical writer
description: |-
  The MariaDB integration collects performance metrics related to
  InnoDB, the buffer pool, and various other operations. It also collects general,
  error, and slow-query logs and parses them into a JSON payload. Error logs are
  parsed for their error code and subsystem. Slow-query logs are parsed into
  key-value pairs that describe the performance of a query, including query time
  and rows examined.
configure_integration: |-
  MariaDB is a community-developed, commercially supported fork of the MySQL
  relational database management system (RDBMS). To collect logs and metrics for
  MariaDB, use the `mysql` receivers.

  The `mysql` metrics receiver connects by default to a local MariaDB
  server using a Unix socket and Unix authentication as the `root` user.

  The `mysql_error` logging receiver collects logs from the default file paths
  shown in the following table. On some platforms, MariaDB logs to `journald`
  by default instead of to file. To configure MariaDB to log to a file instead,
  set the `log_error` option in the MariaDB configuration. For more information
  about `log_error` configuration, see [Writing the Error Log to a
  File](https://mariadb.com/kb/en/error-log/#writing-the-error-log-to-a-file).
minimum_supported_agent_version:
  metrics: 2.37.0
  logging: 2.37.0
supported_operating_systems: linux
platforms_to_skip:
  # TODO: Enable MariaDB testing on all supported platforms.
  - debian-cloud:debian-12 # Requires an update to handle HOSTNAME changes
  - centos-cloud:centos-7
  - rocky-linux-cloud:rocky-linux-8
  - rocky-linux-cloud:rocky-linux-8-optimized-gcp
  - rocky-linux-cloud:rocky-linux-8-optimized-gcp-arm64
  - rocky-linux-cloud:rocky-linux-9
  - rocky-linux-cloud:rocky-linux-9-optimized-gcp
  - rocky-linux-cloud:rocky-linux-9-arm64
  - rocky-linux-cloud:rocky-linux-9-optimized-gcp-arm64
  - suse-cloud:sles-12
  - suse-cloud:sles-15
  - suse-cloud:sles-15-arm64
supported_app_version: ["10.1.X through 10.7.X", ""] # Indicate multiple versions.
expected_metrics:
  - type: workload.googleapis.com/mysql.buffer_pool_data_pages
    value_type: INT64
    kind: GAUGE
    monitored_resources: [gce_instance]
    labels:
      - name: status
        value_regex: dirty|clean
  - type: workload.googleapis.com/mysql.buffer_pool_limit
    value_type: INT64
    kind: GAUGE
    monitored_resources: [gce_instance]
  - type: workload.googleapis.com/mysql.buffer_pool_operations
    value_type: INT64
    kind: CUMULATIVE
    monitored_resources: [gce_instance]
    labels:
      - name: operation
        value_regex: read_ahead|read_ahead_evicted|read_ahead_rnd|read_requests|reads|wait_free|write_requests
  - type: workload.googleapis.com/mysql.buffer_pool_page_flushes
    value_type: INT64
    kind: CUMULATIVE
    monitored_resources: [gce_instance]
  - type: workload.googleapis.com/mysql.buffer_pool_pages
    value_type: DOUBLE
    kind: GAUGE
    monitored_resources: [gce_instance]
    labels:
      - name: kind
        value_regex: data|free|misc
  - type: workload.googleapis.com/mysql.buffer_pool_size
    value_type: DOUBLE
    kind: GAUGE
    monitored_resources: [gce_instance]
    labels:
      - name: kind
        value_regex: clean|dirty
  - type: workload.googleapis.com/mysql.commands
    value_type: INT64
    kind: CUMULATIVE
    monitored_resources: [gce_instance]
    labels:
      - name: command
        value_regex: delete|insert|select|update
  - type: workload.googleapis.com/mysql.double_writes
    value_type: INT64
    kind: CUMULATIVE
    monitored_resources: [gce_instance]
    labels:
      - name: kind
        value_regex: writes|pages_written
  - type: workload.googleapis.com/mysql.handlers
    value_type: INT64
    kind: CUMULATIVE
    monitored_resources: [gce_instance]
    labels:
      - name: kind
        value_regex: commit|delete|discover|lock|mrr_init|prepare|read_first|read_key|read_last|read_next|read_prev|read_rnd|read_rnd_next|rollback|savepoint|savepoint_rollback|update|write
  - type: workload.googleapis.com/mysql.locks
    value_type: INT64
    kind: CUMULATIVE
    monitored_resources: [gce_instance]
    labels:
      - name: kind
        value_regex: immediate|waited
  - type: workload.googleapis.com/mysql.log_operations
    value_type: INT64
    kind: CUMULATIVE
    monitored_resources: [gce_instance]
    labels:
      - name: operation
        value_regex: requests|waits|writes
  - type: workload.googleapis.com/mysql.operations
    value_type: INT64
    kind: CUMULATIVE
    monitored_resources: [gce_instance]
    labels:
      - name: operation
        value_regex: fsyncs|reads|writes
  - type: workload.googleapis.com/mysql.page_operations
    value_type: INT64
    kind: CUMULATIVE
    monitored_resources: [gce_instance]
    labels:
      - name: operation
        value_regex: created|read|written
  - type: workload.googleapis.com/mysql.replica.time_behind_source
    value_type: INT64
    kind: GAUGE
    monitored_resources: [gce_instance]
  - type: workload.googleapis.com/mysql.replica.sql_delay
    value_type: INT64
    kind: GAUGE
    monitored_resources: [gce_instance]
  - type: workload.googleapis.com/mysql.row_locks
    value_type: INT64
    kind: CUMULATIVE
    monitored_resources: [gce_instance]
    labels:
      - name: kind
        value_regex: time|waits
  - type: workload.googleapis.com/mysql.row_operations
    value_type: INT64
    kind: CUMULATIVE
    monitored_resources: [gce_instance]
    labels:
      - name: operation
        value_regex: deleted|inserted|read|updated
    unavailable_on:
      - ubuntu-os-cloud:ubuntu-2404-lts-amd64
      - ubuntu-os-cloud:ubuntu-2404-lts-arm64
      - ubuntu-os-cloud:ubuntu-2410-amd64
      - ubuntu-os-cloud:ubuntu-minimal-2410-amd64
      - ubuntu-os-cloud:ubuntu-2410-arm64
      - ubuntu-os-cloud:ubuntu-minimal-2410-arm64
      - debian-cloud:debian-12-arm64
  - type: workload.googleapis.com/mysql.sorts
    value_type: INT64
    kind: CUMULATIVE
    monitored_resources: [gce_instance]
    labels:
      - name: kind
        value_regex: merge_passes|range|rows|scan
  - type: workload.googleapis.com/mysql.threads
    value_type: DOUBLE
    kind: GAUGE
    monitored_resources: [gce_instance]
    labels:
      - name: kind
        value_regex: cached|connected|created|running
    representative: true
expected_logs:
  - log_name: mysql_error
    fields:
      - name: jsonPayload.level
        value_regex: System|Note
        type: string
        description: 'Log entry level'
        optional: true
      - name: jsonPayload.message
        value_regex: .*InnoDB.*initialization.*
        type: string
        description: 'Log message'
      - name: jsonPayload.subsystem
        type: string
        description: 'MySQL subsystem where the log originated'
        optional: true
      - name: jsonPayload.tid
        type: number
        description: 'Thread ID where the log originated'
      - name: jsonPayload.errorCode
        type: string
        description: 'MySQL error code associated with the log'
        optional: true
      - name: severity
        type: string
        description: ''
  - log_name: mysql_general
    fields:
      - name: jsonPayload.message
        value_regex: .*select table_catalog, table_schema, table_name from information_schema.tables.*
        type: string
        description: 'Log of the database action'
      - name: jsonPayload.command
        value_regex: Query
        type: string
        description: 'Type of database action being logged'
      - name: jsonPayload.tid
        type: number
        description: 'Thread ID where the log originated'
      - name: severity
        type: string
        description: ''
  - log_name: mysql_slow
    fields:
      - name: jsonPayload.message
        value_regex: (?s).*select table_catalog, table_schema, table_name from information_schema.tables.* # The (?s) part will make the . match with newline as well. See https://github.com/google/re2/blob/main/doc/syntax.txt#L65,L68
        type: string
        description: 'Full text of the query'
      - name: jsonPayload.user
        value_regex: root
        type: string
        description: 'Authenticated user that executed the query'
      - name: jsonPayload.database
        value_regex: information_schema
        type: string
        description: 'Database where the query was executed'
      - name: jsonPayload.host
        value_regex: localhost
        type: string
        description: 'Host name the client connected from'
      - name: jsonPayload.ipAddress
        type: string
        description: 'IP address the client connected from'
        optional: true
      - name: jsonPayload.tid
        type: number
        description: 'Thread ID where the query was logged'
      - name: jsonPayload.queryTime
        type: number
        description: 'The statement execution time in seconds'
      - name: jsonPayload.lockTime
        type: number
        description: 'The time to acquire locks in seconds'
      - name: jsonPayload.queryCacheHit
        type: boolean
        description: 'The statement was served from the query cache'
      - name: jsonPayload.rowsSent
        type: number
        description: 'The number of rows sent to the client'
      - name: jsonPayload.rowsExamined
        type: number
        description: 'The number of rows examined by the server layer'
      - name: jsonPayload.rowsAffected
        type: integer
        description: 'The number of rows affected by the statement'
      - name: jsonPayload.bytesSent
        type: number
        description: 'The number of bytes sent to all clients'
      - name: jsonPayload.storedRoutine
        type: string
        description: 'The name of the stored routine currently being executed'
        optional: true

      # With log-slow-verbosity = query_plan
      - name: jsonPayload.sortMergePasses
        type: number
        description: 'The number of merge passes that the sort algorithm has had to do'
        notes:
          - &log_slow_verbosity_note These fields are only provided if the `log_slow_verbosity` system variable contains `'query_plan'`.
      - name: jsonPayload.createdTmpTables
        type: number
        description: 'The number of internal temporary tables created by the server'
        notes:
          - *log_slow_verbosity_note
      - name: jsonPayload.createdTmpDiskTables
        type: number
        description: 'The number of internal on-disk temporary tables created by the server'
        notes:
          - *log_slow_verbosity_note
      - name: jsonPayload.createdTmpTableSizes
        type: number
        description: 'The number of bytes used by internal temporary tables created by the server'
        notes:
          - *log_slow_verbosity_note
      - name: jsonPayload.fullScan
        type: boolean
        description: 'The statement used a full table scan'
        notes:
          - *log_slow_verbosity_note
      - name: jsonPayload.fullJoin
        type: boolean
        description: "The statement didn't use an index to join tables"
        notes:
          - *log_slow_verbosity_note
      - name: jsonPayload.filesort
        type: boolean
        description: 'The statement used filesort'
        notes:
          - *log_slow_verbosity_note
      - name: jsonPayload.filesortOnDisk
        type: boolean
        description: 'The statement used filesort that needed temporary tables on disk'
        notes:
          - *log_slow_verbosity_note
      - name: jsonPayload.priorityQueue
        type: boolean
        description: 'The statement used a priority queue filesort'
        notes:
          - *log_slow_verbosity_note
      - name: severity
        type: string
        description: ''
configuration_options:
  logs:
    - type: mysql_error
      fields:
        - name: type
          default: null
          description: This value must be `mysql_error`.
        - name: include_paths
          default: '[/var/log/mysqld.log, /var/log/mysql/mysqld.log, /var/log/mysql/error.log, /run/mysqld/mysqld.err, /var/lib/mysql/${HOSTNAME}.err]'
          description: A list of filesystem paths to read by tailing each file. A wild card (`*`) can be used in the paths; for example, `/var/log/mysql/*.log`.
        - name: exclude_paths
          default: null
          description: A list of filesystem path patterns to exclude from the set matched by `include_paths`.
        - name: record_log_file_path
          default: false
          description: If set to `true`, then the path to the specific file from which the log record was obtained appears in the output log entry as the value of the `agent.googleapis.com/log_file_path` label. When using a wildcard, only the path of the file from which the record was obtained is recorded.
        - name: wildcard_refresh_interval
          default: 60s
          description: The interval at which wildcard file paths in `include_paths` are refreshed. Given as a [time duration](https://pkg.go.dev/time#ParseDuration), for example `30s` or `2m`. This property might be useful under high logging throughputs where log files are rotated faster than the default interval.
    - type: mysql_general
      fields:
        - name: type
          default: null
          description: This value must be `mysql_general`.
        - name: include_paths
          default: '[/var/lib/mysql/${HOSTNAME}.log]'
          description: A list of filesystem paths to read by tailing each file. A wild card (`*`) can be used in the paths.
        - name: exclude_paths
          default: null
          description: A list of filesystem path patterns to exclude from the set matched by `include_paths`.
        - name: record_log_file_path
          default: false
          description: If set to `true`, then the path to the specific file from which the log record was obtained appears in the output log entry as the value of the `agent.googleapis.com/log_file_path` label. When using a wildcard, only the path of the file from which the record was obtained is recorded.
        - name: wildcard_refresh_interval
          default: 60s
          description: The interval at which wildcard file paths in `include_paths` are refreshed. Given as a [time duration](https://pkg.go.dev/time#ParseDuration), for example `30s` or `2m`. This property might be useful under high logging throughputs where log files are rotated faster than the default interval.
    - type: mysql_slow
      fields:
        - name: type
          default: null
          description: This value must be `mysql_slow`.
        - name: include_paths
          default: '[/var/lib/mysql/${HOSTNAME}-slow.log]'
          description: A list of filesystem paths to read by tailing each file. A wild card (`*`) can be used in the paths.
        - name: exclude_paths
          default: null
          description: A list of filesystem path patterns to exclude from the set matched by `include_paths`.
        - name: record_log_file_path
          default: false
          description: If set to `true`, then the path to the specific file from which the log record was obtained appears in the output log entry as the value of the `agent.googleapis.com/log_file_path` label. When using a wildcard, only the path of the file from which the record was obtained is recorded.
        - name: wildcard_refresh_interval
          default: 60s
          description: The interval at which wildcard file paths in `include_paths` are refreshed. Given as a [time duration](https://pkg.go.dev/time#ParseDuration), for example `30s` or `2m`. This property might be useful under high logging throughputs where log files are rotated faster than the default interval.
  metrics:
    - type: mysql
      fields:
        - name: type
          default: null
          description: This value must be `mysql`.
        - name: endpoint
          default: /var/run/mysqld/mysqld.sock
          description: The `hostname:port` or Unix socket path starting with `/` used to connect to the MariaDB server.
        - name: username
          default: root
          description: The username used to connect to the server.
        - name: password
          default: null
          description: The password used to connect to the server.
        - name: collection_interval
          default: 60s
          description: A [time duration](https://pkg.go.dev/time#ParseDuration) value, such as `30s` or `5m`.
