# Copyright (C) 2022-present MongoDB, Inc.
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the Server Side Public License, version 1,
# as published by MongoDB, Inc.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# Server Side Public License for more details.
#
# You should have received a copy of the Server Side Public License
# along with this program. If not, see
# <http://www.mongodb.com/licensing/server-side-public-license>.
#
# As a special exception, the copyright holders give permission to link the
# code of portions of this program with the OpenSSL library under certain
# conditions as described in each individual source file and distribute
# linked combinations including the program with the OpenSSL library. You
# must comply with the Server Side Public License in all respects for
# all of the code used other than as permitted herein. If you modify file(s)
# with this exception, you may extend this exception to your version of the
# file(s), but you are not obligated to do so. If you do not wish to do so,
# delete this exception statement from your version. If you delete this
# exception statement from all source files in the program, then also delete
# it in the license file.
#

global:
  cpp_namespace: "mongo::analyze_shard_key"
  cpp_includes:
    - "mongo/s/analyze_shard_key_common.h"

imports:
  - "mongo/db/basic_types.idl"

enums:
  QueryAnalyzerMode:
    description: "The query analysis mode for a collection."
    type: string
    values:
      kFull: "full"
      kOff: "off"

  SampledCommandName:
    description: "The command name of a sampled read and write query."
    type: string
    values:
      kFind: "find"
      kAggregate: "aggregate"
      kCount: "count"
      kDistinct: "distinct"
      kInsert: "insert"
      kUpdate: "update"
      kDelete: "delete"
      kFindAndModify: "findAndModify"
      kBulkWrite: "bulkWrite"

structs:
  QueryAnalyzerConfiguration:
    description: "The query analyzer configuration for a collection as configured via the
                  configureQueryAnalyzer command."
    strict: false
    fields:
      mode:
        type: QueryAnalyzerMode
        description: "The query analyzer mode."
      samplesPerSecond:
        type: safeDouble
        description: "The maximum number of queries to sample per second, in total across the
                      cluster (not per mongos or mongod)."
        optional: true

  CollectionQueryAnalyzerConfiguration:
    description: "The query analyzer configuration for a collection as returned by the
                  _refreshQueryAnalyzerConfiguration command."
    strict: false
    fields:
      ns:
          type: namespacestring
          description: "The namespace of the collection."
      collectionUuid:
          type: uuid
          description: "The UUID of the collection."
      samplesPerSecond:
        type: safeDouble
        description: "The maximum number of queries to sample per second."
      startTime:
        type: date
        description: "The time at which query sampling began."

  CollectionSampleCountersCurrentOp:
    description: "The per-collection report on number and size of sampled queries for the currentOp
                  command."
    strict: false
    fields:
      desc:
        type: string
        description: "The string identifier for the query sampling currentOp document."
        default: '"query analyzer"'
      ns:
        type: namespacestring
        description: "The namespace of the collection."
      collUuid:
        type: uuid
        description: "The UUID of the collection."
        optional: true
      samplesPerSecond:
        type: safeDouble
        description: "The maximum number of queries to sample per second. Only reported by mongos."
        optional: true
      startTime:
        type: date
        description: "The time at which query sampling began."
      sampledReadsCount:
        type: long
        description: "The number of read queries sampled."
      sampledReadsBytes:
        type: long
        description: "The number of bytes stored for sampled read queries. Only reported by mongod."
        optional: true
      sampledWritesCount:
        type: long
        description: "The number of write queries sampled."
      sampledWritesBytes:
        type: long
        description: "The number of bytes stored for sampled write queries. Only reported by mongod."
        optional: true
  QueryAnalysisServerStatus:
    description: "The server-wide report on the number of sampled queries for the serverStatus
                  command."
    strict: false
    fields:
      activeCollections:
        type: long
        description: "The number of collections that are actively being sampled."
      totalCollections:
        type: long
        description: "The total number of collections that have been sampled."
      totalSampledReadsCount:
        type: long
        description: "The total number of sampled read queries."
      totalSampledWritesCount:
        type: long
        description: "The total number of sampled write queries."
      totalSampledReadsBytes:
        type: long
        description: "The total number of bytes stored for sampled read queries."
        optional: true
      totalSampledWritesBytes:
        type: long
        description: "The total number of bytes stored for sampled write queries."
        optional: true
