#  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.

apiVersion: v1
kind: ConfigMap
metadata:
  name: fluentd-config
  namespace: trafficserver-test
data:
  fluent.conf: |
    <source>
      type tail
      path /var/log/trafficserver/squid.log
      pos_file /var/log/trafficserver/squid.log.pos
      <parse>
        @type regexp
        expression ^(?<timestamp>[^ ]*)\s(?<processing_time>[^ ]*)\s(?<client_ip>[^ ]*)\s(?<cache_result>[^ ]*)\s(?<response_length>[^ ]*)\s(?<request_method>[^ ]*)\s(?<url>[^ ]*)\s(?<username_authenticated_client>[^ ]*)\s(?<heirarchy_route>[^ ]*)\s(?<content_type>[^ ]*)$
      </parse>
      tag trafficserver.access
    </source>

    <source>
      type tail
      path /var/log/ingress/ingress_ats.err
      pos_file /var/log/ingress/ingress_ats.err.pos
      <parse>
        @type regexp
        expression ^(?<date>[^ ]*)\s(?<timestamp>[^ ]*)\s(?<log>.*)$
      </parse>
      tag ingress.log
    </source>

    <match **>
      @type stdout
    </match>

    <match fluent.**>
      @type null
    </match>