blob: 6dabef4abea4463dcbc8770838f16b4b2e5ab106 [file] [log] [blame]
{%- 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 %}