apiVersion: v1
kind: ConfigMap
metadata:
  name: trickster-conf
  labels:
    name: trickster-conf

data:
  trickster-conf: |-
    #
    # Trickster 1.1 Example Configuration File - Exhaustive
    #
    # To use this, run: trickster -config /path/to/example.conf
    #
    # This file contains descriptions and examples for all
    # Trickster configuration options. More documentation is
    # available at https://github.com/tricksterproxy/trickster/docs/
    #
    # Optional configs are commented out, required configs are uncommented
    # and set to common values that let you try it out with Prometheus
    #
    # Copyright 2018 Comcast Cable Communications Management, LLC
    #

    # [main]

    ## instance_id allows you to run multiple Trickster processes on the same host and log to separate files
    ## Useful for baremetal, not so much for elastic deployments, so only uncomment if you really need it
    ## default is 0, which means ignored
    #instance_id = 0

    ## config_handler_path provides the HTTP path to view a read-only printout of the running configuration
    ## which can be reached at http://your-trickster-endpoint:port/$config_handler_path
    ## default is '/trickster/config'
    # config_handler_path = '/trickster/config'

    ## ping_handler_path provides the HTTP path you will use to perform an uptime health check against Trickster
    ## which can be reached at http://your-trickster-endpoint:port/$ping_handler_path
    ## default is '/trickster/ping'
    # ping_handler_path = '/trickster/ping'

    ## health_handler_path provides the HTTP path prefix you will use to perform an uptime health check against
    ## configured Trickster origins via http://trickster/$health_handler_path/$origin_name
    ## default is '/trickster/health'. Set to empty string to fully disable upstream health checking
    # health_handler_path = '/trickster/health'

    ## pprof_server provides the name of the http listener that will host the pprof debugging routes
    ## Options are: "metrics", "reload", "both", or "off"; default is both
    # pprof_server = 'both'

    ## server_name provides the name of this server instance, used to self-identfy in Via and other Forwarding headers
    ## server_name defaults to os.Hostname() when left blank
    # server_name = ''

    # Configuration options for the Trickster Frontend
    [frontend]

    # listen_port defines the port on which Trickster's Front-end HTTP Proxy server listens.
    listen_port = 8480

    ## listen_address defines the ip on which Trickster's Front-end HTTP Proxy server listens.
    ## empty by default, listening on all interfaces
    # listen_address = ''

    ## tls_listen_address defines the ip on which Trickster's Front-end TLS Proxy server listens.
    ## empty by default, listening on all interfaces
    # tls_listen_address = ''

    ## tls_listen_port defines the port on which Trickster's Front-end TLS Proxy server listens.
    ## The default is 0, which means TLS is not used, even if certificates are configured below.
    # tls_listen_port = 0

    ## connections_limit defines the maximum number of concurrent connections
    ## Trickster's Proxy server may handle at any time.
    ## 0 by default, unlimited.
    # connections_limit = 0

    # [caches]

        # [caches.default]
        ## cache_type defines what kind of cache Trickster uses
        ## options are 'bbolt', 'badger', 'filesystem', 'memory', and 'redis'
        ## The default is 'memory'.
        # cache_type = 'memory'

            ### Configuration options for the Cache Index
            ## The Cache Index handles key management and retention for bbolt, filesystem and memory
            ## Redis and BadgerDB handle those functions natively and does not use the Trickster's Cache Index
            # [caches.default.index]

            ## reap_interval_secs defines how long the Cache Index reaper sleeps between reap cycles. Default is 3 (3s)
            # reap_interval_secs = 3

            ## flush_interval_secs sets how often the Cache Index saves its metadata to the cache from application memory. Default is 5 (5s)
            # flush_interval_secs = 5

            ## max_size_bytes indicates how large the cache can grow in bytes before the Index evicts least-recently-accessed items. default is 512MB
            # max_size_bytes = 536870912

            ## max_size_backoff_bytes indicates how far below max_size_bytes the cache size must be to complete a byte-size-based eviction exercise. default is 16MB
            # max_size_backoff_bytes = 16777216

            ## max_size_objects indicates how large the cache can grow in objects before the Index evicts least-recently-accessed items. default is 0 (infinite)
            # max_size_objects = 0

            ## max_size_backoff_objects indicates how far under max_size_objects the cache size must be to complete object-size-based eviction exercise. default is 100
            # max_size_backoff_objects = 100

            ### Configuration options when using a Redis Cache
            # [caches.default.redis]

            ## client_type indicates which kind of Redis client to use. Options are: 'standard', 'cluster' and 'sentinel'
            ## default is 'standard'
            # client_type = 'standard'

            ### Supported by Redis (standard) #####################################
            ### These configurations are ignored by Redis Sentinel and Redis Cluster
            ###

            ## endpoint defines the fqdn+port or path to a unix socket file for connecting to redis
            ## default is 'redis:6379'
            # endpoint = 'redis:6379'
            #

            ### Supported by Redis Cluster and Redis Sentinel #####################
            ### These conigurations are ignored by Redis (standard)
            ###

            ## endpoints is used for Redis Cluster and Redis Sentinel to define a list of endpoints
            ## default is ['redis:6379']
            # endpoints = ['redis:6379']
            #

            ### Supported by Redis Sentinel #######################################
            ### These conigurations are ignored by Redis (standard) and Redis Cluster
            ###
            ## sentinel_master should be set when using Redis Sentinel to indicate the Master Node
            ## sentinel_master = ''
            #

            ### Supported by all Redis Client Types ###############################
            ### See the go-redis documentation at https://github.com/go-redis/redis/blob/master/options.go
            ### for more information on tuning these settings

            ## protocol defines the protocol for connecting to redis ('unix' or 'tcp'). 'tcp' is default
            # protocol = 'tcp'

            ## password provides the redis password. default is empty string ''
            # password = ''

            ## db is the Database to be selected after connecting to the server. default is 0
            # db = 0

            ## max_retries is the maximum number of retries before giving up on the command
            # max_retries = 0

            ## min_retry_backoff_ms is the minimum backoff time between each retry
            # min_retry_backoff_ms = 8

            ## max_retry_backoff_ms is the maximum backoff time between each retry
            # max_retry_backoff_ms = 512

            ## dial_timeout_ms is the timeout for establishing new connections
            # dial_timeout_ms = 5000

            ## read_timeout_ms is the timeout for socket reads. If reached, commands will fail with a timeout instead of blocking.
            # read_timeout_ms = 3000

            ## write_timeout_ms is the timeout for socket writes. If reached, commands will fail with a timeout instead of blocking.
            # write_timeout_ms = 3000

            ## pool_size is the maximum number of socket connections.
            # pool_size = 20

            ## min_idle_conns is the minimum number of idle connections which is useful when establishing new connection is slow.
            # min_idle_conns = 0

            ## max_conn_age_ms is the connection age at which client retires (closes) the connection.
            # max_conn_age_ms = 0

            ## pool_timeout_ms is the amount of time client waits for connection if all connections are busy before returning an error.
            # pool_timeout_ms = 4000

            ## idle_timeout_ms is the amount of time after which client closes idle connections.
            # idle_timeout_ms = 300000

            ## idle_check_frequency_ms is the frequency of idle checks made by idle connections reaper.
            # idle_check_frequency_ms = 60000


            ### Configuration options when using a Filesystem Cache ###############
            # [caches.default.filesystem]
            ## cache_path defines the directory location under which the Trickster cache will be maintained
            ## default is '/tmp/trickster'
            # cache_path = '/tmp/trickster'

            ### Configuration options when using a bbolt Cache ####################
            # [caches.default.bbolt]

            ## filename defines the file where the Trickster cache will be maintained
            ## default is 'trickster.db'
            # filename = 'trickster.db'

            ## bucket defines the name of the bbolt bucket (similar to a namespace) under which our key value store lives
            ## default is 'trickster'
            # bucket = 'trickster'

            ### Configuration options when using a Badger cache ###################
            # [caches.default.badger]
            ## directory defines the directory location under which the Badger data will be maintained
            ## default is '/tmp/trickster'
            # directory = '/tmp/trickster'
            ## value_directory defines the directory location under which the Badger value log will be maintained
            ## default is '/tmp/trickster'
            # value_directory = '/tmp/trickster'

        ## Example of a second cache, sans comments, that origin configs below could use with: cache_name = 'bbolt_example'
        #
        # [caches.bbolt_example]
        # cache_type = 'bbolt'

            # [caches.bbolt_example.bbolt]
            # filename = 'trickster.db'
            # bucket = 'trickster'

            # [caches.bbolt_example.index]
            # reap_interval_secs = 3
            # flush_interval_secs = 5
            # max_size_bytes = 536870912
            # size_backoff_bytes = 16777216

    ## Negative Caching Configurations
    ## A Negative Cache is a map of HTTP Status Codes that are cached for the specified duration,
    ## used for temporarily caching failures (e.g., 404's for 10 seconds)
    ##
    ## By default, each Origin Configuration maps to the 'default' negative cache which you can
    ## configure below, or can define your own negative caches, and specify them in your origin configs.
    ## See /docs/negative-caching.md for more info.
    ##

    # [negative_caches]
    #   [negative_caches.default]
    #   # The 'default' negative cache config, mapped by all origins by default,
    #   # is empty unless you populate it. Update it by adding entries here in the format of:
    #   # code = ttl_secs

    ##  Here's a pre-populated negative cache config ready to be uncommented and used in an origin config
    ##  The 'general' negative cache config will cache common failure response codes for 3 seconds
    #   [negative_caches.general]
    #   400 = 3
    #   404 = 3
    #   500 = 3
    #   502 = 3

    # Configuration options for mapping Origin(s)
    [origins]

        # example origin named default. default is always created with these settings unless a different origin is defined here.
        # access this origin via http[s]://trickster-fqdn/default/ unless path_routing_disabled is true
        [origins.default]

        # origin_type identifies the origin type.
        # Valid options are: 'prometheus', 'influxdb', 'clickhouse', 'irondb', 'reverseproxycache' (or just 'rpc')
        # origin_type is a required configuration value
        origin_type = 'prometheus'

        # origin_url provides the base upstream URL for all proxied requests to this origin.
        # it can be as simple as http://example.com or as complex as https://example.com:8443/path/prefix
        # origin_url is a required configuration value
        origin_url = 'http://prometheus:9090'

        ## is_default describes whether this origin is the default origin considered when routing http requests
        ## it is false, by default; but if you only have a single origin configured, is_default will be true unless explicitly set to false
        # is_default = true

        ## hosts indicates which FQDNs requested by the client should route to this Origin (in addition to path-based routing)
        ## if you are using TLS, all FQDNs should be included in the certfiicate common names to avoid insecure warnings to clients
        ## default setting is empty list. List format is: hosts = [ '1.example.com', '2.example.com' ]
        # hosts = []

        ## cache_name identifies the name of the cache (configured above) that you want to use with this origin proxy. default is 'default'
        # cache_name = 'default'

        ## forwarded_headers indicates whether Trickster should use 'Forwarded', 'X-Forwarded-*'
        ## or no forwarded headers when communicating with origins. A Via header is always sent,
        ## regardless of this value's setting.
        ## Options are 'standard', 'x', 'both', or 'none'; default is 'standard'
        # forwarded_headers = 'standard'

        ## cache_key_prefix defines the prefix this origin appends to cache keys. When using a shared cache like Redis,
        ## this can help partition multiple trickster instances that may have the same same hostname or ip address (the default prefix)
        # cache_key_prefix = 'example'

        ## negative_cache_name identifies the name of the negative cache (configured above) to be used with this origin. default is 'default'
        # negative_cache_name = 'default'

        ## path_routing_disabled will prevent the origin from being accessible via /origin_name/ path to Trickster. Disabling this requires
        ## the origin to have hosts configured (see below) or be the target of a rule origin, or it will be unreachable.
        ## default is false
        # path_routing_disabled = false

        ## rule_name provides the name of the rule config to be used by this origin.
        ## This is only effective if the origin_type is 'rule'
        # rule_name = 'example-rule'

        ## req_rewriter_name is the name of a configured rewriter (in [request_rewriters]) that will modify the request prior to
        ## processing by the origin client
        # req_rewriter_name = 'example-rewriter'

        ## tracing_name selects the distributed tracing configuration (crafted below) to be used with this origin. default is 'default'
        # tracing_name = 'default'

        ## dearticulate_upstream_ranges, when true, instructs Trickster to make multiple parallel requests to the origin for each
        ## range needed to fulfill the client request, rather than making a multipart range request. default is false
        # dearticulate_upstream_ranges = false

        ## multipart_ranges_disabled, when true, instructs Trickster to return the full object when the client provides
        ## a multipart range request. The default is false.
        # multipart_ranges_disabled = false

        ## compressable_types defines the Content Types that will be compressed when stored in the Trickster cache
        ## reasonable defaults are set, so use this with care. To disable compression, set compressable_types = []
        ## Default list is provided here:
        # compressable_types = [ 'text/javascript', 'text/css', 'text/plain', 'text/xml', 'text/json', 'application/json', 'application/javascript', 'application/xml' ]

        ## timeout_secs defines how many seconds Trickster will wait before aborting and upstream http request. Default: 180s
        # timeout_secs = 180

        ## keep_alive_timeout_secs defines how long Trickster will wait before closing a keep-alive connection due to inactivity
        ## if the origin's keep-alive timeout is shorter than Trickster's, the connect will be closed sooner. Default: 300
        # keep_alive_timeout_secs = 300

        ## max_idle_conns set the maximum concurrent keep-alive connections Trickster may have opened to this origin
        ## additional requests will be queued. Default: 20
        # max_idle_conns = 20

        ## backfill_tolerance_secs prevents new datapoints that fall within the tolerance window (relative to time.Now) from being cached
        ## Think of it as "never cache the newest N seconds of real-time data, because it may be preliminary and subject to updates"
        ## default is 0
        # backfill_tolerance_secs = 0

        ## timeseries_retention_factor defines the maximum number of recent timestamps to cache for a given query. Default is 1024
        # timeseries_retention_factor = 1024

        ## timeseries_ttl_secs defines the relative expiration of cached timeseries. default is 6 hours (21600 seconds)
        # timeseries_ttl_secs = 21600

        ## timeseries_eviction_method selects the metholodogy used to determine which timestamps are removed once
        ## the timeseries_retention_factor limit is reached. options are 'oldest' and 'lru'. Default is 'oldest'
        # timeseries_eviction_method = 'oldest'

        ## fast_forward_disable, when set to true, will turn off the 'fast forward' feature for any requests proxied to this origin
        # fast_forward_disable = false

        ## fastforward_ttl_secs defines the relative expiration of cached fast forward data. default is 15s
        # fastforward_ttl_secs = 15

        ## max_ttl_secs defines the maximum allowed TTL for any object cached for this origin. default is 86400
        # max_ttl_secs = 86400

        ## revalidation_factor is the multiplier for object lifetime expiration to determine cache object TTL; default is 2
        ## for example, if a revalidatable object has Cache-Control: max-age=300, we will cache for 10 minutes (300s * 2)
        ## so there is an opportunity to revalidate
        # revalidation_factor = 2

        ## max_object_size_bytes defines the largest byte size an object may be before it is uncacheable due to size. default is 524288 (512k)
        # max_object_size_bytes = 524288

        ##
        ## Each origin type implements their own defaults for health_check_upstream_url, health_check_verb and health_check_query,
        ## which can be overridden per origin. See /docs/health.md for more information
        
        ## health_check_upstream_url is the URL Trickster will request against this origin to
        ## when a health check request is received by Trickster via http://<trickster-endpoint>/trickster/<origin_name>/health 
        ## this is the default value for prometheus:
        # health_check_upstream_url = '/api/v1/query'

        ## health_check_verb is the HTTP Method Trickster will when performing an upstream health check for this origin
        ## default is 'GET' for all origin types unless overridden per-origin here.
        # health_check_verb = 'GET'

        ## health_check_query is the query string Trickster will append the when performing an upstream health check for this origin
        ## This value is the default for prometheus (again, see /docs/health.md)
        # health_check_query = 'query=up'

            ## health_check_headers provides a list of HTTP Headers to add to Health Check HTTP Requests to this origin
            # [origins.default.health_check_headers]
            # Authorization = 'Basic SomeHash'

            ## [origins.ORIGIN_NAME.paths] section customizes the behavior of Trickster for specific paths. See /docs/paths.md for more info.
            # [origins.default.paths]
                # [origins.default.paths.example1]
                # path = '/api/v1/admin/'
                # methods = [ '*' ]                                 # HTTP methods to be routed with this path config. '*' for all methods.
                # match_type = 'prefix'                             # match $path* (using 'exact' will match just $path)
                # handler = 'localresponse'                         # don't actually proxy this request, respond immediately
                # response_code = 401
                # response_body = 'No soup for you!'
                # no_metrics = true                                 # do not record metrics for requests to this path
                    # [origins.default.paths.example1.response_headers] 
                    # 'Cache-Control' = 'no-cache'                  # attach these headers to the response down to the client
                    # 'Content-Type' = 'text/plain'
                # [origins.default.paths.example2]
                # path = '/example/'
                # methods = [ 'GET', 'POST' ]
                # collapsed_forwarding = 'progressive'    # see /docs/collapsed_forwarding.md
                # match_type = 'prefix'                   # this path is routed using prefix matching
                # handler = 'proxycache'                  # this path is routed through the cache
                # req_rewriter_name = 'example-rewriter'  # name of a rewriter to modify the request prior to handling


                # cache_key_params = [ 'ex_param1', 'ex_param2' ]       # the cache key will be hashed with these query parameters (GET)
                # cache_key_form_fields = [ 'ex_param1', 'ex_param2' ]  # or these form fields (POST)
                # cache_key_headers = [ 'X-Example-Header' ]            # and these request headers, when present in the incoming request
                    # [origins.default.paths.example1.request_headers]
                    # 'Authorization' = 'custom proxy client auth header'
                    # '-Cookie' = ''                                # attach these request headers when proxying. the '+' in the header name
                    # '+Accept-Encoding' = 'gzip'                   # means append the value if the header exists, rather than replace
                                                                    ## while the '-' will remove the header
                    # [origins.default.paths.example1.request_params]
                    # '+authToken' = 'SomeTokenHere'                 # manipulate request query parameters in the same way

            ## the [origins.ORIGIN_NAME.tls] section configures the frontend and backend TLS operation for the origin
            # [origins.default.tls]

            ## TLS Frontend Configs
            ## You can configure which certificate and key to use when this endpoint serves downstream clients over TLS
            ## Trickster will fail out at startup if the provided files do not exist, are unreadable, or in an invalid format
            ## These settings by default are '' (empty string), which disables this origin from being routed over the TLS port
            # full_chain_cert_path = '/path/to/your/cert.pem'
            # private_key_path = '/path/to/your/key.pem'

            ## TLS Backend Configs
            ## These settings configure how Trickster will behave as a client when communicating with
            ## this origin over TLS
            
            ## if insecure_skip_verify is true, Trickster will trust the origins certificate without any verification
            ## default is false
            # insecure_skip_verify = false
            
            ## certificate_authority_paths provides a list of additional certificate authorities to be used to trust an upstream origin
            ## in addition to Operating System CA's.  default is an empty list, which insructs the Trickster to use only the OS List
            # certificate_authority_paths = [ '../../testdata/test.rootca.pem' ]
            
            ## client_cert_path provides the path to a client certificate for Trickster to use when authenticating with an upstream server
            ## empty string '' by default
            # client_cert_path = '/path/to/my/client/cert.pem'
            
            ## client_key_path provides the path to a client key for Trickster to use when authenticating with an upstream server
            ## empty string '' by default
            # client_key_path = '/path/to/my/client/key.pem'

        ## For multi-origin support, origins are named, and the name is the second word of the configuration section name.
        ## In this example, an origin is named "foo".
        ## Clients can indicate this origin in their path (http://trickster.example.com:8480/foo/api/v1/query_range?.....)
        ## there are other ways for clients to indicate which origin to use in a multi-origin setup. See the documentation for more information

        ## use quotes around FQDNs for host-based routing (see /docs/multi-origin.md).
        # [origins.'foo.example.com']
        # is_default = false
        # origin_type = 'influxdb'
        # origin_url = 'http://influx-origin:8086'
        # cache_name = 'bbolt_example'
        # negative_cache_name = 'general'
        # timeseries_retention_factor = 1024
        # timeseries_eviction_method = 'oldest'
        # timeout_secs = 180
        # backfill_tolerance_secs = 180
        # tracing_name = 'example'

    ## Configuration Options for Request Routing Rules - see /docs/rule.md for more information
    #
    # [rules]
    ## This example rule will route a request to the reader or writer origin based on the Username header
    #
    #   [rules.example]
    #   input_source = 'header'       # path, host, param
    #   input_key = 'Authorization'   # Authorization: Basic SomeBase64EncodedString
    #   input_type = 'string'
    #   input_encoding = 'base64'
    #   input_index = 1               # split the header value into zero-indexed parts at spaces, use part 1
    #   input_delimiter = ' '
    #   operation = 'prefix'              # check the input value matches any of the defined cases:
    #   next_route = 'reader-cluster' # by default, route to reader-cluster origin (would need to be defined)
    #     [rules.example.cases]
    #       [rules.example.cases.1]
    #       matches = ['johndoe:', 'janedoe:']  # if the Authorization header has user johndoe or janedoe,
    #       next_route = 'writer-cluster'       # route the request to hypothetical writer-cluster origin
    ##
    ##    Other available case configs that are not pertinent to this example:
    #     req_rewriter_name = ''      # name of a rewriter to process the request if it matches this case
    #                                 # case rewrites are executed prior to giving control back to the rule
    #     redirect_url = ''  # provides a URL to redirect the request if it matches this case
    ##
    ##  Other available rule configs that are not pertinent to this example:
    #   ingress_req_rewriter_name = '' # name of a rewriter to process the request before evaluating the rule
    #   egress_req_rewriter_name = ''  # name of a rewriter to process the request after evaluating the rule
    ##                                 # and handing off to the new route
    #   nomatch_req_rewriter_name = '' # name of a rewriter to run the request through when there are no matching cases
    #   operation_arg = '' # an argument to pass to the operation.
    #   redirect_url = '' # provides a URL to redirect the request in the default case, rather than handing to next_route
    #   max_rule_executions = 16        # limits the max number of per-Request rule-based hops to avoid execution loops.

    ## Configuration Options for Request Rewriter Instructions - see /docs/request_rewriters.md for more info
    #
    # [request_rewriters]
    #   [request_rewriters.example-set-upstream-user]
    #   instructions = [
    #     ['header', 'set', 'Authorization', 'Basic SomeBase64EncodedCredentials'],
    #   ]

    ## Configuration Options for Tracing Instrumentation. see /docs/tracing.md for more information
    # [tracing]

        ## This is the default tracing config with it's default options, which you can change here.
        ## you can also add additional tracing configs here. user-defined tracing configs are mapped
        ## to origins by the 'tracing_name' value in origin configs, which, by default, use 'default'
        # [tracing.default]

        ## tracer_type specifies the type of backend tracing system where traces are sent (in that format)
        ## options are: jaeger, zipkin, stdout or none.  none is the default
        # tracer_type = 'none'

        ## service_name specifies the service name under which the traces are registered by this tracer
        ## default is 'trickster'
        # service_name = 'trickster'

        ## collector_url is the URL of the tracing backend
        ## required for zipkin and jaeger, unused for stdout
        # collector_url = 'http://jaeger:14268/api/traces'

        ## collector_user is the username credential for authenticating with the tracing backend
        ## optional jaeger; unused for zipkin and stdout
        # collector_user = ''

        ## collector_pass is the username credential for authenticating with the tracing backend
        ## optional jaeger; unused for zipkin and stdout
        # collector_pass = ''

        ## sample_rate sets the probability that a span will be recorded.
        ## A floating point value of 0.0 to 1.0 (inclusive) is permitted
        ## default is 1.0 (meaning 100% of requests are recorded)
        # sample_rate = 1.0

        ## omit_tags is a list of tag names that, while normally added by Trickster to various spans,
        ## are omitted for spans produced by this tracer. The default setting is empty list.
        # omit_tags = []
        
        ## tags will append these tags/attributes to each trace that is recorded
        ## only string key/value tags are supported. numeric values, etc are not.
        ## For Jaeger, these key/values are added to the "Process" section
        ## default tags list is empty
        # [tracing.default.tags]
        # key1 = "value1"
        # key2 = "value2"

        ## configurations for this tracer, specific to jaeger
        # [tracing.default.jaeger]
        ## endpoint_type indicates whether the jaeger tracing backend is a 'collector' or 'agent'
        ## default is 'collector'
        # endpoint_type = 'collector'

        ## configurations for this tracer, specific to stdout
        # [tracing.default.stdout]
        ## pretty_print indicates whether the output to stdout is formatted better human readability
        ## default is false
        # pretty_print = false

        ## another example tracing config named 'example' using jaeger agent backend and a 50% sample rate
        # [tracing.example]
        # tracer_type = 'jaeger'
        # collector_url = 'jaeger:6831'
        # sample_rate = .5
        #   [tracing.example.jaeger]
        #   endpoint_type = 'agent'

        ## another example tracing config named 'zipkin-example' using zipkin backend and a 10% sample rate
        # [tracing.zipkin-example]
        # tracer_type = 'zipkin'
        # collector_url = 'https://zipkin.example.com:9411/api/v2/spans'
        # sample_rate = .1


    ## Configuration Options for Metrics Instrumentation
    # [metrics]
    ## listen_port defines the port that Trickster's metrics server listens on at /metrics
    ## 8481 is the default
    # listen_port = 8481
    ## listen_address defines the ip that Trickster's metrics server listens on at /metrics
    ## empty by default, listening on all interfaces
    # listen_address = ''

    ## Configuration Options for Config Reloading
    # [reloading]
    ## listen_port defines the port where Trickster's config reload server listens
    ## 8484 is the default 
    # listen_port = 8484
    ## listen_address defines the ip where Trickster's config reload server listens
    ## empty by default, listening on all interfaces
    # listen_address = ''
    ## handler_path defines the HTTP path where the Reload interface is available.
    ## by default, this is '/trickster/config/reload'
    # handler_path = '/trickster/config/reload'
    ## drain_timeout_secs defines how long old HTTP listeners will live to allow
    ## outstanding connection to close organically, before the listener is forcefully closed
    ## the default is 30
    # drain_timeout_secs = 30
    ## rate_limit_secs specifies the rate limit timeout duration to apply to the HTTP reload interface.
    ## The reload interface is disabled for this duration of time whenever a config reload request is
    ## made that fails because the underlying config file is unmodified. default is 3
    # rate_limit_secs = 3

    ## Configuration Options for Logging Instrumentation
    # [logging]
    ## log_level defines the verbosity of the logger. Possible values are 'debug', 'info', 'warn', 'error'
    ## default is 'info'
    # log_level = 'info'

    ## log_file defines the file location to store logs. These will be auto-rolled and maintained for you.
    ## not specifying a log_file (this is the default behavior) will print logs to STDOUT
    # log_file = '/some/path/to/trickster.log'
