vagrant-g5k 0.0.15 → 0.0.16
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +5 -0
- data/README.md +19 -0
- data/Vagrantfile +18 -31
- data/Vagrantfile.multisite +37 -0
- data/lib/vagrant-g5k/errors.rb +8 -3
- data/lib/vagrant-g5k/util/g5k_utils.rb +21 -13
- data/lib/vagrant-g5k/version.rb +1 -1
- data/locales/en.yml +5 -1
- data/results/.gitignore +2 -0
- data/results/README.md +43 -0
- data/results/Vagrantfile +126 -0
- data/results/ansible.cfg +2 -0
- data/results/boilerplate.retry +1 -0
- data/results/boilerplate.yml +248 -0
- data/results/files/grafana/dashboard.json +4572 -0
- data/results/files/grafana/dedicated.json +5486 -0
- data/results/files/grafana/haproxy.json +2632 -0
- data/results/files/heka/config.json +47 -0
- data/results/files/heka/heka-globals.toml +2 -0
- data/results/files/heka/lua_decoders/haproxy_log.lua +162 -0
- data/results/files/heka/lua_decoders/os_keystone_apache_log.lua +78 -0
- data/results/files/heka/lua_decoders/os_mysql_log.lua +56 -0
- data/results/files/heka/lua_decoders/os_openstack_log.lua +146 -0
- data/results/files/heka/lua_decoders/os_rabbitmq_log.lua +79 -0
- data/results/files/kibana/all_objects.json +81 -0
- data/results/files/nginx.conf +34 -0
- data/results/templates/heka-elasticsearch.toml.j2 +18 -0
- data/results/templates/heka-haproxy.toml.j2 +10 -0
- data/results/templates/heka-keystone.toml.j2 +14 -0
- data/results/templates/heka-mariadb.toml.j2 +14 -0
- data/results/templates/heka-openstack.toml.j2 +15 -0
- data/results/templates/heka-rabbitmq.toml.j2 +21 -0
- data/results/test.rb +32 -0
- metadata +28 -2
@@ -0,0 +1,47 @@
|
|
1
|
+
{
|
2
|
+
"command": "/usr/bin/hekad -config=/etc/heka/",
|
3
|
+
"config_files": [
|
4
|
+
{
|
5
|
+
"source": "/var/lib/kolla/config_files/heka-elasticsearch.toml",
|
6
|
+
"dest": "/etc/heka/heka-elasticsearch.toml",
|
7
|
+
"owner": "heka",
|
8
|
+
"perm": "0600",
|
9
|
+
"optional": true
|
10
|
+
},
|
11
|
+
{
|
12
|
+
"source": "/var/lib/kolla/config_files/heka-openstack.toml",
|
13
|
+
"dest": "/etc/heka/heka-openstack.toml",
|
14
|
+
"owner": "heka",
|
15
|
+
"perm": "0600",
|
16
|
+
"optional": true
|
17
|
+
},
|
18
|
+
{
|
19
|
+
"source": "/var/lib/kolla/config_files/heka-keystone.toml",
|
20
|
+
"dest": "/etc/heka/heka-keystone.toml",
|
21
|
+
"owner": "heka",
|
22
|
+
"perm": "0600",
|
23
|
+
"optional": true
|
24
|
+
},
|
25
|
+
{
|
26
|
+
"source": "/var/lib/kolla/config_files/heka-mariadb.toml",
|
27
|
+
"dest": "/etc/heka/heka-mariadb.toml",
|
28
|
+
"owner": "heka",
|
29
|
+
"perm": "0600",
|
30
|
+
"optional": true
|
31
|
+
},
|
32
|
+
{
|
33
|
+
"source": "/var/lib/kolla/config_files/heka-rabbitmq.toml",
|
34
|
+
"dest": "/etc/heka/heka-rabbitmq.toml",
|
35
|
+
"owner": "heka",
|
36
|
+
"perm": "0600",
|
37
|
+
"optional": true
|
38
|
+
},
|
39
|
+
{
|
40
|
+
"source": "/var/lib/kolla/config_files/heka-globals.toml",
|
41
|
+
"dest": "/etc/heka/heka-globals.toml",
|
42
|
+
"owner": "heka",
|
43
|
+
"perm": "0600",
|
44
|
+
"optional": true
|
45
|
+
}
|
46
|
+
]
|
47
|
+
}
|
@@ -0,0 +1,162 @@
|
|
1
|
+
--[[
|
2
|
+
|
3
|
+
This is a decoder for custom haproxy logs.
|
4
|
+
e.g.
|
5
|
+
Jun 13 15:29:06 localhost.localdomain haproxy[33168]: 10.10.10.10 - - [13/Jun/2016:07:29:05 +0000] "POST /graph/pie HTTP/1.1" 200 848 "" "" 52591 218 "111.111.111.111_80" "my_app-demo.server.com_http_rr" "inst_13.136" 2 0 2 938 942 ---- 0 0 0 0 0 0 0 "" "" ""lb-node.server.com""
|
6
|
+
|
7
|
+
Config:
|
8
|
+
log_type = "haproxy.run.decoded", default value is "haproxy.run.default"
|
9
|
+
|
10
|
+
--]]
|
11
|
+
|
12
|
+
local dt = require "date_time"
|
13
|
+
local ip = require "ip_address"
|
14
|
+
local l = require 'lpeg'
|
15
|
+
|
16
|
+
l.locale(l)
|
17
|
+
|
18
|
+
local syslog = require "syslog"
|
19
|
+
|
20
|
+
require "cjson"
|
21
|
+
|
22
|
+
|
23
|
+
--[ grammar ]
|
24
|
+
local sp = l.space
|
25
|
+
local timestamp = "[" * l.Cg(dt.build_strftime_grammar("%d/%b/%Y:%H:%M:%S %z") * dt.time_secfrac / dt.time_to_ns, "Timestamp") * "]"
|
26
|
+
local log_date = l.Cg(dt.build_strftime_grammar("%b %d %H:%M:%S"), "LogDate")
|
27
|
+
local host = (l.alnum^1 + l.S("-_"))^1
|
28
|
+
local fqdn = (l.alnum^1 + l.S("-_."))^1
|
29
|
+
local slash = l.P"/"
|
30
|
+
local integer = (l.S("+-")^-1) * (l.digit^1)
|
31
|
+
local printusascii = l.R"!~"
|
32
|
+
local nilvalue = l.P"-"
|
33
|
+
|
34
|
+
local http_post = l.P"POST"
|
35
|
+
local http_get = l.P"GET"
|
36
|
+
local http_delete = l.P"DELETE"
|
37
|
+
local http_update = l.P"UPDATE"
|
38
|
+
local url = l.P"/"^1 * l.alnum^0
|
39
|
+
local http_method = l.Cg((http_post + http_get + http_delete + http_update)^1, "http_method")
|
40
|
+
local request_url = l.Cg(url^1, "request_url")
|
41
|
+
local http_version = l.Cg((l.P("HTTP") + l.P("HTTPS"))^1 * "/" * l.digit * "." * l.digit, "http_version")
|
42
|
+
|
43
|
+
local client_ip = l.Cg(ip.v4, "client_ip")
|
44
|
+
local gmt_date_time = "[" * l.Cg(dt.build_strftime_grammar("%d/%b/%Y:%H:%M:%S %z") / dt.time_to_ns, "gmt_date_time") * "]"
|
45
|
+
local http_request = l.Cg("\"" * l.Cg(http_method * sp * request_url * sp * http_version, "http_request") * "\"")
|
46
|
+
local status_code = l.Cg(l.digit * l.digit * l.digit, "status_code")
|
47
|
+
local bytes_read = l.Cg(l.digit^1 / tonumber, "bytes_read")
|
48
|
+
local client_port = l.Cg(l.digit^1, "client_port")
|
49
|
+
local accept_date_milliseconds = l.Cg(l.digit^1 / tonumber, "accept_date_milliseconds")
|
50
|
+
local frontend_name = "\"" * l.Cg(ip.v4 * "_" * l.digit^1, "frontend_name") * "\""
|
51
|
+
local backend_name = "\"" * l.Cg((l.alnum + l.S"-_.")^1, "backend_name") * "\""
|
52
|
+
local server_name = "\"" * l.Cg((l.alnum + l.S"-_.")^1, "server_name") * "\""
|
53
|
+
local Tq = l.Cg(integer / tonumber, "Tq")
|
54
|
+
local Tw = l.Cg(integer / tonumber, "Tw")
|
55
|
+
local Tc = l.Cg(integer / tonumber, "Tc")
|
56
|
+
local Tr = l.Cg(integer / tonumber, "Tr")
|
57
|
+
local Tt = l.Cg(integer / tonumber, "Tq")
|
58
|
+
local termination_state_with_cookie_status = l.Cg(( nilvalue + l.upper ) * ( nilvalue + l.upper ) * ( nilvalue + l.upper ) * ( nilvalue + l.upper ), "termination_state_with_cookie_status")
|
59
|
+
local actconn = l.Cg(integer / tonumber, "actconn")
|
60
|
+
local feconn = l.Cg(integer / tonumber, "feconn")
|
61
|
+
local beconn = l.Cg(integer / tonumber, "beconn")
|
62
|
+
local srv_conn = l.Cg(integer / tonumber, "srv_conn")
|
63
|
+
local retries = l.P"+"^-1 * l.Cg(l.digit^1 / tonumber, "retries")
|
64
|
+
local srv_queue = l.Cg(integer / tonumber, "srv_queue")
|
65
|
+
local backend_queue = l.Cg(integer / tonumber, "backend_queue")
|
66
|
+
local captured_request_cookie = l.Cg(printusascii^-255, "captured_request_cookie")
|
67
|
+
local captured_response_cookie = l.Cg(printusascii^-255, "captured_response_cookie")
|
68
|
+
local domain_name = "\"" * l.Cg((l.alnum + l.S"-_.")^1, "domain_name") * "\""
|
69
|
+
|
70
|
+
-- Returns an LPeg grammar based on the Haproxy log_format configuration string.
|
71
|
+
local function build_grammar()
|
72
|
+
local grm =
|
73
|
+
client_ip * sp * "- -" * sp
|
74
|
+
* gmt_date_time * sp
|
75
|
+
* "\"" * http_method * sp
|
76
|
+
* request_url * sp
|
77
|
+
* http_version * "\"" * sp
|
78
|
+
* status_code * sp
|
79
|
+
* bytes_read * sp
|
80
|
+
* "\"\"" * sp * "\"\"" * sp
|
81
|
+
* client_port * sp
|
82
|
+
* accept_date_milliseconds * sp
|
83
|
+
* frontend_name * sp
|
84
|
+
* backend_name * sp
|
85
|
+
* server_name * sp
|
86
|
+
* Tq * sp
|
87
|
+
* Tw * sp
|
88
|
+
* Tc * sp
|
89
|
+
* Tr * sp
|
90
|
+
* Tt * sp
|
91
|
+
* termination_state_with_cookie_status * sp
|
92
|
+
* actconn * sp
|
93
|
+
* feconn * sp
|
94
|
+
* beconn * sp
|
95
|
+
* srv_conn * sp
|
96
|
+
* retries * sp
|
97
|
+
* srv_queue * sp
|
98
|
+
* backend_queue * sp
|
99
|
+
* captured_request_cookie * sp
|
100
|
+
* captured_response_cookie * sp
|
101
|
+
|
102
|
+
return l.Ct(grm)
|
103
|
+
end
|
104
|
+
|
105
|
+
local msg = {
|
106
|
+
Timestamp = nil,
|
107
|
+
Hostname = nil,
|
108
|
+
Payload = nil,
|
109
|
+
Pid = nil,
|
110
|
+
Fields = nil
|
111
|
+
}
|
112
|
+
|
113
|
+
local default_log_type = "haproxy.run.default"
|
114
|
+
local default_syslog_format = "%TIMESTAMP% %HOSTNAME% %syslogtag%%msg:::sp-if-no-1st-sp%%msg:::drop-last-lf%\n"
|
115
|
+
|
116
|
+
--[ read config variables ]
|
117
|
+
local log_type = read_config("log_type") or default_log_type
|
118
|
+
local syslog_format = read_config("syslog_format") or default_syslog_format
|
119
|
+
|
120
|
+
local syslog_grammar = syslog.build_rsyslog_grammar(syslog_format)
|
121
|
+
local halog_grammar = build_grammar()
|
122
|
+
|
123
|
+
local msg = {
|
124
|
+
Timestamp = nil,
|
125
|
+
Type = nil,
|
126
|
+
Payload = nil,
|
127
|
+
Fields = nil
|
128
|
+
}
|
129
|
+
|
130
|
+
function process_message ()
|
131
|
+
local log = read_message("Payload")
|
132
|
+
local fields = syslog_grammar:match(log)
|
133
|
+
if not fields then return -1 end
|
134
|
+
|
135
|
+
msg.Timestamp = fields.timestamp
|
136
|
+
fields.timestamp = nil
|
137
|
+
|
138
|
+
msg.Type = log_type
|
139
|
+
msg.Payload = nil
|
140
|
+
|
141
|
+
msg.Pid = fields.syslogtag.pid or nil
|
142
|
+
fields.syslogtag = nil
|
143
|
+
|
144
|
+
msg.Hostname = fields.hostname
|
145
|
+
fields.hostname = nil
|
146
|
+
|
147
|
+
local m = halog_grammar:match(fields.msg)
|
148
|
+
if m then
|
149
|
+
-- fill all fields
|
150
|
+
for k,v in pairs(m) do
|
151
|
+
fields[k] = v
|
152
|
+
end
|
153
|
+
else
|
154
|
+
-- not matched, break
|
155
|
+
return -1
|
156
|
+
end
|
157
|
+
|
158
|
+
fields.msg = nil
|
159
|
+
msg.Fields = fields
|
160
|
+
inject_message(msg)
|
161
|
+
return 0
|
162
|
+
end
|
@@ -0,0 +1,78 @@
|
|
1
|
+
-- Copyright 2015 Mirantis, Inc.
|
2
|
+
--
|
3
|
+
-- Licensed under the Apache License, Version 2.0 (the "License");
|
4
|
+
-- you may not use this file except in compliance with the License.
|
5
|
+
-- You may obtain a copy of the License at
|
6
|
+
--
|
7
|
+
-- http://www.apache.org/licenses/LICENSE-2.0
|
8
|
+
--
|
9
|
+
-- Unless required by applicable law or agreed to in writing, software
|
10
|
+
-- distributed under the License is distributed on an "AS IS" BASIS,
|
11
|
+
-- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
12
|
+
-- See the License for the specific language governing permissions and
|
13
|
+
-- limitations under the License.
|
14
|
+
|
15
|
+
local l = require 'lpeg'
|
16
|
+
l.locale(l)
|
17
|
+
|
18
|
+
local common_log_format = require 'common_log_format'
|
19
|
+
local patt = require 'os_patterns'
|
20
|
+
local utils = require 'os_utils'
|
21
|
+
|
22
|
+
-- Allow custom type
|
23
|
+
t = read_config('type')
|
24
|
+
if t == nil or t == '' then
|
25
|
+
t = 'log'
|
26
|
+
end
|
27
|
+
|
28
|
+
local msg = {
|
29
|
+
Timestamp = nil,
|
30
|
+
Type = t,
|
31
|
+
Hostname = nil,
|
32
|
+
Payload = nil,
|
33
|
+
Pid = nil,
|
34
|
+
Fields = nil,
|
35
|
+
Severity = 6,
|
36
|
+
}
|
37
|
+
|
38
|
+
local severity_label = utils.severity_to_label_map[msg.Severity]
|
39
|
+
|
40
|
+
local apache_log_pattern = read_config("apache_log_pattern") or error(
|
41
|
+
"apache_log_pattern configuration must be specificed")
|
42
|
+
local apache_grammar = common_log_format.build_apache_grammar(apache_log_pattern)
|
43
|
+
local request_grammar = l.Ct(patt.http_request)
|
44
|
+
|
45
|
+
function process_message ()
|
46
|
+
|
47
|
+
-- logger is either "keystone-apache-public" or "keystone-apache-admin"
|
48
|
+
local logger = read_message("Logger")
|
49
|
+
|
50
|
+
local log = read_message("Payload")
|
51
|
+
|
52
|
+
local m
|
53
|
+
|
54
|
+
m = apache_grammar:match(log)
|
55
|
+
if m then
|
56
|
+
msg.Logger = 'openstack.keystone'
|
57
|
+
msg.Payload = log
|
58
|
+
msg.Timestamp = m.time
|
59
|
+
|
60
|
+
msg.Fields = {}
|
61
|
+
msg.Fields.http_status = m.status
|
62
|
+
msg.Fields.http_response_time = m.request_time.value / 1e6 -- us to sec
|
63
|
+
msg.Fields.programname = logger
|
64
|
+
msg.Fields.severity_label = severity_label
|
65
|
+
|
66
|
+
local request = m.request
|
67
|
+
m = request_grammar:match(request)
|
68
|
+
if m then
|
69
|
+
msg.Fields.http_method = m.http_method
|
70
|
+
msg.Fields.http_url = m.http_url
|
71
|
+
msg.Fields.http_version = m.http_version
|
72
|
+
end
|
73
|
+
|
74
|
+
return utils.safe_inject_message(msg)
|
75
|
+
end
|
76
|
+
|
77
|
+
return -1, string.format("Failed to parse %s log: %s", logger, string.sub(log, 1, 64))
|
78
|
+
end
|
@@ -0,0 +1,56 @@
|
|
1
|
+
-- Copyright 2015-2016 Mirantis, Inc.
|
2
|
+
--
|
3
|
+
-- Licensed under the Apache License, Version 2.0 (the "License");
|
4
|
+
-- you may not use this file except in compliance with the License.
|
5
|
+
-- You may obtain a copy of the License at
|
6
|
+
--
|
7
|
+
-- http://www.apache.org/licenses/LICENSE-2.0
|
8
|
+
--
|
9
|
+
-- Unless required by applicable law or agreed to in writing, software
|
10
|
+
-- distributed under the License is distributed on an "AS IS" BASIS,
|
11
|
+
-- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
12
|
+
-- See the License for the specific language governing permissions and
|
13
|
+
-- limitations under the License.
|
14
|
+
require "string"
|
15
|
+
local l = require 'lpeg'
|
16
|
+
l.locale(l)
|
17
|
+
|
18
|
+
local patt = require 'os_patterns'
|
19
|
+
local utils = require 'os_utils'
|
20
|
+
|
21
|
+
-- Allow custom type
|
22
|
+
t = read_config('type')
|
23
|
+
if t == nil or t == '' then
|
24
|
+
t = 'log'
|
25
|
+
end
|
26
|
+
|
27
|
+
local msg = {
|
28
|
+
Timestamp = nil,
|
29
|
+
Type = t,
|
30
|
+
Hostname = nil,
|
31
|
+
Payload = nil,
|
32
|
+
Pid = nil,
|
33
|
+
Fields = {},
|
34
|
+
Severity = nil,
|
35
|
+
}
|
36
|
+
|
37
|
+
local sp = patt.sp
|
38
|
+
local colon = patt.colon
|
39
|
+
|
40
|
+
-- mysqld logs are cranky,the date is YYMMMDD, the hours have no leading zero and the "real" severity level is enclosed by square brackets...
|
41
|
+
local mysql_grammar = l.Ct(l.digit^-6 * sp^1 * l.digit^-2 * colon * l.digit^-2 * colon * l.digit^-2 * sp^1 * l.P"[" * l.Cg(l.R("az", "AZ")^0 / string.upper, "SeverityLabel") * l.P"]" * sp^1 * l.Cg(patt.Message, "Message"))
|
42
|
+
|
43
|
+
|
44
|
+
function process_message ()
|
45
|
+
local log = read_message("Payload")
|
46
|
+
local logger = read_message("Logger")
|
47
|
+
|
48
|
+
local m = mysql_grammar:match(log)
|
49
|
+
if not m then return -1 end
|
50
|
+
|
51
|
+
msg.Logger = logger
|
52
|
+
msg.Payload = m.Message
|
53
|
+
msg.Fields.severity_label = m.SeverityLabel
|
54
|
+
|
55
|
+
return utils.safe_inject_message(msg)
|
56
|
+
end
|
@@ -0,0 +1,146 @@
|
|
1
|
+
-- Copyright 2015-2016 Mirantis, Inc.
|
2
|
+
--
|
3
|
+
-- Licensed under the Apache License, Version 2.0 (the "License");
|
4
|
+
-- you may not use this file except in compliance with the License.
|
5
|
+
-- You may obtain a copy of the License at
|
6
|
+
--
|
7
|
+
-- http://www.apache.org/licenses/LICENSE-2.0
|
8
|
+
--
|
9
|
+
-- Unless required by applicable law or agreed to in writing, software
|
10
|
+
-- distributed under the License is distributed on an "AS IS" BASIS,
|
11
|
+
-- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
12
|
+
-- See the License for the specific language governing permissions and
|
13
|
+
-- limitations under the License.
|
14
|
+
require "string"
|
15
|
+
require "table"
|
16
|
+
local l = require 'lpeg'
|
17
|
+
l.locale(l)
|
18
|
+
|
19
|
+
local patt = require 'os_patterns'
|
20
|
+
local utils = require 'os_utils'
|
21
|
+
|
22
|
+
-- Allow custom type
|
23
|
+
t = read_config('type')
|
24
|
+
if t == nil or t == '' then
|
25
|
+
t = 'log'
|
26
|
+
end
|
27
|
+
|
28
|
+
local msg = {
|
29
|
+
Timestamp = nil,
|
30
|
+
Type = t,
|
31
|
+
Hostname = nil,
|
32
|
+
Payload = nil,
|
33
|
+
Pid = nil,
|
34
|
+
Fields = nil,
|
35
|
+
Severity = nil,
|
36
|
+
}
|
37
|
+
|
38
|
+
-- traceback_lines is a reference to a table used to accumulate lines of
|
39
|
+
-- a Traceback. traceback_key represent the key of the Traceback lines
|
40
|
+
-- being accumulated in traceback_lines. This is used to know when to
|
41
|
+
-- stop accumulating and inject the Heka message.
|
42
|
+
local traceback_key = nil
|
43
|
+
local traceback_lines = nil
|
44
|
+
|
45
|
+
function prepare_message (service, timestamp, pid, severity_label,
|
46
|
+
python_module, programname, payload)
|
47
|
+
msg.Logger = 'openstack.' .. service
|
48
|
+
msg.Timestamp = timestamp
|
49
|
+
msg.Payload = payload
|
50
|
+
msg.Pid = pid
|
51
|
+
msg.Severity = utils.label_to_severity_map[severity_label] or 7
|
52
|
+
msg.Fields = {}
|
53
|
+
msg.Fields.severity_label = severity_label
|
54
|
+
msg.Fields.python_module = python_module
|
55
|
+
msg.Fields.programname = programname
|
56
|
+
msg.Payload = payload
|
57
|
+
end
|
58
|
+
|
59
|
+
-- OpenStack log messages are of this form:
|
60
|
+
-- 2015-11-30 08:38:59.306 3434 INFO oslo_service.periodic_task [-] Blabla...
|
61
|
+
--
|
62
|
+
-- [-] is the "request" part, it can take multiple forms.
|
63
|
+
|
64
|
+
function process_message ()
|
65
|
+
|
66
|
+
-- Logger is of form "<service>_<program>" (e.g. "nova_nova-api",
|
67
|
+
-- "neutron_l3-agent").
|
68
|
+
local logger = read_message("Logger")
|
69
|
+
local service, program = string.match(logger, '([^_]+)_(.+)')
|
70
|
+
|
71
|
+
local log = read_message("Payload")
|
72
|
+
local m
|
73
|
+
|
74
|
+
m = patt.openstack:match(log)
|
75
|
+
if not m then
|
76
|
+
return -1, string.format("Failed to parse %s log: %s", logger, string.sub(log, 1, 64))
|
77
|
+
end
|
78
|
+
|
79
|
+
local key = {
|
80
|
+
Timestamp = m.Timestamp,
|
81
|
+
Pid = m.Pid,
|
82
|
+
SeverityLabel = m.SeverityLabel,
|
83
|
+
PythonModule = m.PythonModule,
|
84
|
+
service = service,
|
85
|
+
program = program,
|
86
|
+
}
|
87
|
+
|
88
|
+
if traceback_key ~= nil then
|
89
|
+
-- If traceback_key is not nil then it means we've started accumulated
|
90
|
+
-- lines of a Python traceback. We keep accumulating the traceback
|
91
|
+
-- lines util we get a different log key.
|
92
|
+
if utils.table_equal(traceback_key, key) then
|
93
|
+
table.insert(traceback_lines, m.Message)
|
94
|
+
return 0
|
95
|
+
else
|
96
|
+
prepare_message(traceback_key.service, traceback_key.Timestamp,
|
97
|
+
traceback_key.Pid, traceback_key.SeverityLabel,
|
98
|
+
traceback_key.PythonModule, traceback_key.program,
|
99
|
+
table.concat(traceback_lines, ''))
|
100
|
+
traceback_key = nil
|
101
|
+
traceback_lines = nil
|
102
|
+
-- Ignore safe_inject_message status code here to still get a
|
103
|
+
-- chance to inject the current log message.
|
104
|
+
utils.safe_inject_message(msg)
|
105
|
+
end
|
106
|
+
end
|
107
|
+
|
108
|
+
if patt.traceback:match(m.Message) then
|
109
|
+
-- Python traceback detected, begin accumulating the lines making
|
110
|
+
-- up the traceback.
|
111
|
+
traceback_key = key
|
112
|
+
traceback_lines = {}
|
113
|
+
table.insert(traceback_lines, m.Message)
|
114
|
+
return 0
|
115
|
+
end
|
116
|
+
|
117
|
+
prepare_message(service, m.Timestamp, m.Pid, m.SeverityLabel, m.PythonModule,
|
118
|
+
program, m.Message)
|
119
|
+
|
120
|
+
m = patt.openstack_request_context:match(msg.Payload)
|
121
|
+
if m then
|
122
|
+
msg.Fields.request_id = m.RequestId
|
123
|
+
if m.UserId then
|
124
|
+
msg.Fields.user_id = m.UserId
|
125
|
+
end
|
126
|
+
if m.TenantId then
|
127
|
+
msg.Fields.tenant_id = m.TenantId
|
128
|
+
end
|
129
|
+
end
|
130
|
+
|
131
|
+
m = patt.openstack_http:match(msg.Payload)
|
132
|
+
if m then
|
133
|
+
msg.Fields.http_method = m.http_method
|
134
|
+
msg.Fields.http_status = m.http_status
|
135
|
+
msg.Fields.http_url = m.http_url
|
136
|
+
msg.Fields.http_version = m.http_version
|
137
|
+
msg.Fields.http_response_size = m.http_response_size
|
138
|
+
msg.Fields.http_response_time = m.http_response_time
|
139
|
+
m = patt.ip_address:match(msg.Payload)
|
140
|
+
if m then
|
141
|
+
msg.Fields.http_client_ip_address = m.ip_address
|
142
|
+
end
|
143
|
+
end
|
144
|
+
|
145
|
+
return utils.safe_inject_message(msg)
|
146
|
+
end
|