#  Licensed to the Apache Software Foundation (ASF) under one
#  or more contributor license agreements.  See the NOTICE file
#  distributed with this work for additional information
#  regarding copyright ownership.  The ASF licenses this file
#  to you 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.

########### These all have default values as shown

# We would specify the unique sink-id first
sinks:
  - file-sink
  - tmaster-sink
  - metricscache-sink

########### Now we would specify the detailed configuration for every unique sink
########### Syntax: sink-id: - option(s)

########### option class is required as we need to instantiate a new instance by reflection
########### option flush-frequency-ms is required to invoke flush() at interval
########### option sink-restart-attempts, representsing # of times to restart a sink when it throws exceptions and dies.
###########   If this option is missed, default value 0 would be supplied; negative value represents to restart it forever.

########### Other options would be constructed as an immutable map passed to IMetricsSink's init(Map conf) as argument,
########### We would be able to fetch value by conf.get(options), for instance:
########### We could get "org.apache.heron.metricsmgr.sink.FileSink" if conf.get("class") is called inside file-sink's instance

### Config for file-sink
file-sink:
  class: "org.apache.heron.metricsmgr.sink.FileSink"
  flush-frequency-ms: 60000 # 1 min
  sink-restart-attempts: -1 # Forever
  filename-output: "metrics.json" # File for metrics to write to
  file-maximum: 5 # maximum number of file saved in disk

### Config for tmaster-sink
tmaster-sink:
  class: "org.apache.heron.metricsmgr.sink.tmaster.TMasterSink"
  flush-frequency-ms: 60000
  sink-restart-attempts: -1 # Forever
  tmaster-location-check-interval-sec: 5
  tmaster-client:
    reconnect-interval-second: 5 # The re-connect interval to TMaster from TMasterClient
    # The size of packets written to TMaster will be determined by the minimal of: (a) time based (b) size based
    network-write-batch-size-bytes: 32768 # Size based, the maximum batch size in bytes to write to TMaster
    network-write-batch-time-ms: 16 # Time based, the maximum batch time in ms for Metrics Manager to write to TMaster per attempt
    network-read-batch-size-bytes: 32768 # Size based, the maximum batch size in bytes to write to TMaster
    network-read-batch-time-ms: 16 # Time based, the maximum batch time in ms for Metrics Manager to write to TMaster per attempt
    socket-send-buffer-size-bytes: 6553600 # The maximum socket's send buffer size in bytes
    socket-received-buffer-size-bytes: 8738000 # The maximum socket's received buffer size in bytes
  tmaster-metrics-type:
    "__emit-count": SUM
    "__execute-count": SUM
    "__fail-count": SUM
    "__ack-count": SUM
    "__complete-latency": AVG
    "__execute-latency": AVG
    "__process-latency": AVG
    "__jvm-uptime-secs": LAST
    "__jvm-process-cpu-load": LAST
    "__jvm-memory-used-mb": LAST
    "__jvm-memory-mb-total": LAST
    "__jvm-gc-collection-time-ms": LAST
    "__server/__time_spent_back_pressure_initiated": SUM
    "__time_spent_back_pressure_by_compid": SUM

### Config for metricscache-sink
metricscache-sink:
  class: "org.apache.heron.metricsmgr.sink.metricscache.MetricsCacheSink"
  flush-frequency-ms: 60000
  sink-restart-attempts: -1 # Forever
  metricscache-location-check-interval-sec: 5
  metricscache-client:
    reconnect-interval-second: 5 # The re-connect interval to TMaster from TMasterClient
    # The size of packets written to TMaster will be determined by the minimal of: (a) time based (b) size based
    network-write-batch-size-bytes: 32768 # Size based, the maximum batch size in bytes to write to TMaster
    network-write-batch-time-ms: 16 # Time based, the maximum batch time in ms for Metrics Manager to write to TMaster per attempt
    network-read-batch-size-bytes: 32768 # Size based, the maximum batch size in bytes to write to TMaster
    network-read-batch-time-ms: 16 # Time based, the maximum batch time in ms for Metrics Manager to write to TMaster per attempt
    socket-send-buffer-size-bytes: 6553600 # The maximum socket's send buffer size in bytes
    socket-received-buffer-size-bytes: 8738000 # The maximum socket's received buffer size in bytes
  metricscache-metrics-type:
    "__emit-count": SUM
    "__execute-count": SUM
    "__fail-count": SUM
    "__ack-count": SUM
    "__complete-latency": AVG
    "__execute-latency": AVG
    "__process-latency": AVG
    "__jvm-uptime-secs": LAST
    "__jvm-process-cpu-load": LAST
    "__jvm-memory-used-mb": LAST
    "__jvm-memory-mb-total": LAST
    "__jvm-gc-collection-time-ms": LAST
    "__server/__time_spent_back_pressure_initiated": SUM
    "__time_spent_back_pressure_by_compid": SUM

### Config for prometheus-sink
# prometheus-sink:
#   class: "org.apache.heron.metricsmgr.sink.PrometheusSink"
#   port: 8080 # The port on which to run (either port or port-file are mandatory)
#   path: /metrics # The path on which to publish the metrics (mandatory)
#   flat-metrics: true # By default the web-sink will publish a flat "name -> value" json map
#   include-topology-name: true # Include topology name in metric name (default false)
#   metrics-cache-max-size: 1000000 # Max number of metrics cached and published (default 1000000)
#   metrics-cache-ttl-sec: 600 # Time in seconds after which a metric that was collected will stopped being published (default 600)

### Config for graphite-sink
### Currently the graphite-sink is disabled
# graphite-sink:
#   class: "org.apache.heron.metricsmgr.sink.GraphiteSink"
#   flush-frequency-ms: 60000
#   graphite_host: "127.0.0.1" # The host of graphite to be exported metrics to
#   graphite_port: 2004 # The port of graphite to be exported metrics to
#   metrics_prefix: "heron" # The prefix of every metrics
#   server_max_reconnect-attempts: 20 # The max reconnect attempts when failing to connect to graphite server
