| {%- if pillar.get('fluentd', {}).get('agent', {}).get('enabled', False) %} |
| {%- from "nova/map.jinja" import controller with context %} |
| {%- set positiondb = pillar.fluentd.agent.dir.positiondb %} |
| {%- set apache_wsgi = controller.get('enabled') and controller.version not in ('juno', 'kilo', 'liberty', 'mitaka', 'newton') %} |
| agent: |
| config: |
| label: |
| forward_input: |
| input: |
| generic_forward_input: |
| type: forward |
| bind: 0.0.0.0 |
| port: 24224 |
| match: |
| route_openstack_nova: |
| tag: openstack.nova.** |
| type: relabel |
| label: openstack_nova |
| {%- if apache_wsgi %} |
| openstack_nova_wsgi: |
| input: |
| nova_placement_api_wsgi_in_tail: |
| type: tail |
| path: /var/log/apache2/nova_placement_access.log |
| tag: openstack.nova |
| pos_file: {{ positiondb }}/nova_placement.wsgi.pos |
| parser: |
| type: regexp |
| time_key: Timestamp |
| time_format: '%d/%b/%Y %H:%M:%S.%N %z' |
| keep_time_key: true |
| # Apache access log custom format: https://regex101.com/r/WeCT7s/8 |
| format: '/(?<hostname>[\w\.\-]+)\:(?<port>\d+)\s(?<http_client_ip_address>[\d\.]+)\s\-\s\-\s\[(?<Timestamp>.*)\]\s(?<Payload>\"(?<http_method>[A-Z]+)\s(?<http_url>\S+)\s(?<http_version>[.\/\dHTFSP]+)\"\s(?<http_status>\d{3})\s(?<http_response_time>\d+)\s(?<http_response_size>\d+)\s\"(?<http_referer>.*)\"\s\"(?<user_agent>.*)\")/' |
| filter: |
| add_nova_palcement_wsgi_record_fields: |
| tag: openstack.nova |
| type: record_transformer |
| enable_ruby: true |
| record: |
| - name: Severity |
| value: 6 |
| - name: severity_label |
| value: INFO |
| - name: programname |
| value: nova-placement-wsgi |
| # Apache logs response time in microseconds |
| - name: http_response_time |
| value: ${ record['http_response_time'].to_i/10**6.to_f } |
| match: |
| send_to_default: |
| tag: openstack.nova |
| type: copy |
| store: |
| - type: relabel |
| label: default_output |
| - type: rewrite_tag_filter |
| rule: |
| - name: severity_label |
| regexp: '.' |
| result: metric.nova_log_messages |
| - type: rewrite_tag_filter |
| rule: |
| - name: http_status |
| regexp: '.' |
| result: metric.nova_openstack_http_response |
| push_to_metric: |
| tag: 'metric.**' |
| type: relabel |
| label: default_metric |
| {%- endif %} |
| openstack_nova: |
| filter: |
| set_nova_programname: |
| tag: openstack.nova.* |
| type: record_transformer |
| enable_ruby: true |
| record: |
| - name: programname |
| value: nova-${ tag_parts[2] } |
| set_nova_fields: |
| tag: openstack.nova |
| type: record_transformer |
| enable_ruby: true |
| record: |
| - name: Severity |
| value: ${ {'TRACE'=>7,'DEBUG'=>7,'INFO'=>6,'AUDIT'=>6,'WARNING'=>4,'ERROR'=>3,'CRITICAL'=>2}[record['level']].to_i } |
| - name: severity_label |
| value: ${ record['level'] } |
| - name: Payload |
| value: ${ record['message'] } |
| - name: python_module |
| value: ${ record['name'] } |
| - name: programname |
| value: '${ record["programname"] ? record["programname"] : "nova" }' |
| - name: Timestamp |
| value: ${ DateTime.parse(record['time']).strftime('%Y-%m-%dT%H:%M:%S.%N%z') } |
| parse_http_stats: |
| tag: openstack.nova |
| type: parser |
| key_name: Payload |
| reserve_data: true |
| emit_invalid_record_to_error: false |
| parser: |
| type: regexp |
| # Parse openstack http stats: https://regex101.com/r/Tf0XUK/1/ |
| format: '\"(?<http_method>GET|POST|OPTIONS|DELETE|PUT|HEAD|TRACE|CONNECT|PATCH)\s(?<http_url>\S+)\s(?<http_version>[.\/\dHTFSP]+)\"\sstatus:\s(?<http_status>\d{3})\slen:\s(?<http_response_size>\d+)\stime:\s(?<http_response_time>\d+\.\d+)' |
| types: http_response_time:float |
| match: |
| unify_tag: |
| tag: openstack.nova.* |
| type: rewrite_tag_filter |
| rule: |
| - name: level |
| regexp: '.*' |
| result: openstack.nova |
| send_to_default: |
| tag: openstack.nova |
| type: copy |
| store: |
| - type: relabel |
| label: default_output |
| - type: rewrite_tag_filter |
| rule: |
| - name: severity_label |
| regexp: '.' |
| result: metric.nova_log_messages |
| - type: rewrite_tag_filter |
| rule: |
| - name: http_status |
| regexp: '.' |
| result: metric.nova_openstack_http_response |
| push_to_metric: |
| tag: 'metric.**' |
| type: relabel |
| label: default_metric |
| default_metric: |
| filter: |
| nova_logs_per_severity: |
| tag: metric.nova_log_messages |
| require: |
| - add_general_fields |
| type: prometheus |
| metric: |
| - name: log_messages |
| type: counter |
| desc: Total number of log lines by severity |
| label: |
| - name: service |
| value: nova |
| - name: level |
| value: ${severity_label} |
| - name: host |
| value: ${Hostname} |
| nova_openstack_http_response_times: |
| tag: metric.nova_openstack_http_response |
| require: |
| - add_general_fields |
| type: prometheus |
| metric: |
| - name: openstack_http_response_times |
| type: summary |
| desc: Total number of requests per method and status |
| key: http_response_time |
| label: |
| - name: http_method |
| value: ${http_method} |
| - name: http_status |
| value: ${http_status} |
| - name: service |
| value: nova |
| - name: host |
| value: ${Hostname} |
| {% endif %} |