apptuit-fluent-plugin 0.1.1 → 0.1.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.travis.yml +7 -0
- data/Gemfile.lock +1 -1
- data/README.md +14 -2
- data/apptuit-fluent-plugin.gemspec +1 -1
- data/lib/fluent/plugin/{filter_Apptuit.rb → filter_apptuit.rb} +19 -19
- data/lib/fluent/plugin/fingerprinter.rb +33 -45
- data/test/plugin/{test_filter_Apptuit.rb → test_filter_apptuit.rb} +59 -19
- metadata +6 -5
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: a4f4ec20c78c76c4ed7e63a9dd3c9d1ea21f7b97a191bd9579a809d921033bf9
|
4
|
+
data.tar.gz: cf63ee09ba3dce61bd4552ced62436e981ae708768e01536b8097bce39b501cf
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 643bd6cea7b55195db893065266775fe5e5d25bf2411cbed21f907061560b2a314c946c5dc2815e0ace83c0b0f3bf06160118669f667334126bbb1864d61faec
|
7
|
+
data.tar.gz: 31c51647b43ac1f73b8d642a939b667a9654afb537d943722295c1829b0601a99ada667060ef992ad2d3086cd9022cdfbf14b770f44378f0c7c61b4064c737de
|
data/.travis.yml
CHANGED
@@ -15,6 +15,12 @@ script:
|
|
15
15
|
|
16
16
|
sudo: false
|
17
17
|
|
18
|
+
before_script:
|
19
|
+
- SEMVER_REGEX="^v(0|[1-9][0-9]*)\.(0|[1-9][0-9]*)\.(0|[1-9][0-9]*)(\-[0-9A-Za-z-]+(\.[0-9A-Za-z-]+)*)?(\+[0-9A-Za-z-]+(\.[0-9A-Za-z-]+)*)?$"
|
20
|
+
- if [[ "$TRAVIS_TAG" =~ $SEMVER_REGEX ]]; then export PACKAGE_VERSION=${TRAVIS_TAG#v};
|
21
|
+
fi
|
22
|
+
|
23
|
+
|
18
24
|
deploy:
|
19
25
|
provider: rubygems
|
20
26
|
api_key:
|
@@ -22,4 +28,5 @@ deploy:
|
|
22
28
|
gem: apptuit-fluent-plugin
|
23
29
|
on:
|
24
30
|
tags: true
|
31
|
+
condition: $PACKAGE_VERSION != ""
|
25
32
|
repo: hari9973/apptuit-fluent-plugin
|
data/Gemfile.lock
CHANGED
data/README.md
CHANGED
@@ -25,10 +25,12 @@ $ sudo td-agent-gem install apptuit-fluent-plugin
|
|
25
25
|
## Usage
|
26
26
|
```
|
27
27
|
<filter>
|
28
|
-
@type
|
28
|
+
@type apptuit
|
29
29
|
lang python
|
30
30
|
syslog true
|
31
31
|
error_msg_tag error_message
|
32
|
+
fingerprint_name fingerprint
|
33
|
+
exception_name error_exception
|
32
34
|
</filter>
|
33
35
|
```
|
34
36
|
|
@@ -56,11 +58,21 @@ $ sudo td-agent-gem install apptuit-fluent-plugin
|
|
56
58
|
* This config parameter is used to give the tag name of the error message.
|
57
59
|
|
58
60
|
Default value: `message`.
|
61
|
+
|
62
|
+
* **fingerprint_name (string) (optional)**
|
63
|
+
* This config parameter is used to give a custom name to he fingerprint tag.
|
64
|
+
|
65
|
+
Default value: `error_fingerprint`.
|
66
|
+
|
67
|
+
* **exception_name (string) (optional)**
|
68
|
+
* This config parameter is used to give a custom name to he exception tag.
|
69
|
+
|
70
|
+
Default value: `exception`.
|
59
71
|
|
60
72
|
## Result
|
61
73
|
If the provided message is valid then the record is added with an two new tags that is `error` and `error_hash` and the can be specified in labels section for exposing in metrics
|
62
74
|
```
|
63
|
-
demo_error_count{
|
75
|
+
demo_error_count{error_exception="NameError",fingerprint="d85a855fe660c936ea88492a6bd4c3d5f4a448cf"} 1.0
|
64
76
|
```
|
65
77
|
|
66
78
|
## LICENSE
|
@@ -20,19 +20,21 @@ require 'syslog/logger'
|
|
20
20
|
|
21
21
|
module Fluent::Plugin
|
22
22
|
class ApptuitFilter < Filter
|
23
|
-
Fluent::Plugin.register_filter("
|
24
|
-
|
25
|
-
log = Syslog::Logger.new 'finger_printer'
|
23
|
+
Fluent::Plugin.register_filter("apptuit", self)
|
26
24
|
|
27
25
|
config_param :lang, :string
|
28
26
|
config_param :syslog, :bool, default: false
|
29
|
-
config_param :error_msg_tag, :string
|
27
|
+
config_param :error_msg_tag, :string, default: 'message'
|
28
|
+
config_param :fingerprint_name, :string, default: 'error_fingerprint'
|
29
|
+
config_param :exception_name, :string, default: 'exception'
|
30
30
|
|
31
31
|
def get_decoded_message(message)
|
32
|
-
|
32
|
+
message = message.gsub(/#([0-9]{3})/) {$1.oct.chr}
|
33
|
+
return message
|
33
34
|
end
|
34
35
|
|
35
36
|
def filter(tag, time, record)
|
37
|
+
begin
|
36
38
|
fingerprint_object = FingerPrinter.new()
|
37
39
|
if @lang.downcase == 'java'
|
38
40
|
if record.key?(@error_msg_tag)
|
@@ -43,25 +45,21 @@ module Fluent::Plugin
|
|
43
45
|
end
|
44
46
|
err_name, fingerprint, essence, stack = fingerprint_object.fingerprint_java(message)
|
45
47
|
if err_name != nil
|
46
|
-
record[
|
47
|
-
record[
|
48
|
+
record[@exception_name] = err_name
|
49
|
+
record[@fingerprint_name] = fingerprint
|
48
50
|
end
|
49
51
|
end
|
50
52
|
elsif @lang.downcase == 'python'
|
51
|
-
log.error "entered"
|
52
53
|
if record.key?(@error_msg_tag)
|
53
|
-
log.error "entered_first_if"
|
54
54
|
if syslog
|
55
55
|
message = get_decoded_message(record[@error_msg_tag])
|
56
|
-
log.error "entered_syslog_if"
|
57
56
|
else
|
58
57
|
message = record[@error_msg_tag]
|
59
58
|
end
|
60
59
|
err_name, fingerprint, essence, stack = fingerprint_object.fingerprint_python(message)
|
61
|
-
log.error fingerprint
|
62
60
|
if err_name != nil
|
63
|
-
record[
|
64
|
-
record[
|
61
|
+
record[@exception_name] = err_name
|
62
|
+
record[@fingerprint_name] = fingerprint
|
65
63
|
end
|
66
64
|
end
|
67
65
|
elsif @lang.downcase == 'nodejs'
|
@@ -73,15 +71,17 @@ module Fluent::Plugin
|
|
73
71
|
end
|
74
72
|
err_name, fingerprint, essence, stack = fingerprint_object.fingerprint_nodejs(message)
|
75
73
|
if err_name != nil
|
76
|
-
record[
|
77
|
-
record[
|
74
|
+
record[@exception_name] = err_name
|
75
|
+
record[@fingerprint_name] = fingerprint
|
78
76
|
end
|
79
77
|
end
|
80
78
|
else
|
81
|
-
|
82
|
-
record["fingerprint"] = ""
|
79
|
+
return record
|
83
80
|
end
|
84
|
-
|
81
|
+
rescue
|
82
|
+
return record
|
83
|
+
end
|
84
|
+
record
|
85
85
|
end
|
86
|
-
|
86
|
+
end
|
87
87
|
end
|
@@ -36,7 +36,6 @@ class FingerPrinter
|
|
36
36
|
end
|
37
37
|
|
38
38
|
def fingerprint_python(message)
|
39
|
-
begin
|
40
39
|
clean_message = message
|
41
40
|
idx = clean_message.index("Traceback (most recent call last)")
|
42
41
|
if idx == -1
|
@@ -73,53 +72,45 @@ class FingerPrinter
|
|
73
72
|
else
|
74
73
|
return fingerprint_error(LANG_PYTHON, REASON_MULTIPLE_EXCEPTION_NAMES, message)
|
75
74
|
end
|
76
|
-
rescue
|
77
|
-
return nil
|
78
|
-
end
|
79
75
|
end
|
80
76
|
|
81
77
|
def fingerprint_nodejs(message)
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
end
|
116
|
-
rescue
|
117
|
-
return
|
118
|
-
end
|
78
|
+
json_stack_matches = message.scan(/"stack"\s*:\s*"([^\"]*)"/)
|
79
|
+
if json_stack_matches.length > 0
|
80
|
+
clean_message = json_stack_matches[0].to_s
|
81
|
+
clean_message = clean_message[2..clean_message.length-3]
|
82
|
+
clean_message = clean_message.gsub(/\s+at\s+/, "\n--- at ")
|
83
|
+
else
|
84
|
+
clean_message = message.gsub('---', "\n---")
|
85
|
+
end
|
86
|
+
matches = clean_message.scan(/\s*at[^(]*([^)]*\.js:[0-9]+:[0-9]+)/)
|
87
|
+
if matches.length < 1
|
88
|
+
return fingerprint_error(LANG_NODEJS, REASON_NOT_A_STACKTRACE, clean_message)
|
89
|
+
end
|
90
|
+
matches = clean_message.scan(/\s*([a-zA-Z]+)(:\s|(\s*$))/)
|
91
|
+
if matches.length > 0
|
92
|
+
err_name = matches[0][0]
|
93
|
+
matches = clean_message.scan(/(^|\n)---\s*at\s*(.*)/)
|
94
|
+
lines = ""
|
95
|
+
for parts in matches do
|
96
|
+
frame = parts[1].strip
|
97
|
+
lines = "%sat %s\n" % [lines, frame]
|
98
|
+
end
|
99
|
+
clean_message = "%s\n%s" % [err_name,lines]
|
100
|
+
clean_message = clean_message.gsub(/:[0-9]+:[0-9]+/, ":*:*")
|
101
|
+
fingerprint = Digest::SHA1.hexdigest clean_message
|
102
|
+
stack = []
|
103
|
+
stack_matches = clean_message.scan(/at\s+((.+)\s+\()?([^:]*).*/)
|
104
|
+
for stack_match in stack_matches do
|
105
|
+
stack << [stack_match[1], stack_match[2]]
|
106
|
+
end
|
107
|
+
return err_name, fingerprint, clean_message, stack
|
108
|
+
else
|
109
|
+
return fingerprint_error(LANG_NODEJS, REASON_NO_EXCEPTION_NAME, message)
|
110
|
+
end
|
119
111
|
end
|
120
112
|
|
121
113
|
def fingerprint_java(message)
|
122
|
-
begin
|
123
114
|
message = message.gsub(/\\n/, "\n")
|
124
115
|
message = message.gsub(/\\t/, "\t")
|
125
116
|
matches = message.scan(/^[ \t]*([^ \t]+)[:\r\n]/)
|
@@ -164,9 +155,6 @@ class FingerPrinter
|
|
164
155
|
end
|
165
156
|
fingerprint = Digest::SHA1.hexdigest clean_message
|
166
157
|
return err_name, fingerprint, clean_message, stack
|
167
|
-
rescue
|
168
|
-
return
|
169
|
-
end
|
170
158
|
end
|
171
159
|
|
172
160
|
def heuristic_search_java_stack_trace(log_message)
|
@@ -14,7 +14,7 @@
|
|
14
14
|
# limitations under the License.
|
15
15
|
|
16
16
|
require "helper"
|
17
|
-
require "fluent/plugin/
|
17
|
+
require "fluent/plugin/filter_apptuit.rb"
|
18
18
|
require "test/plugin/java_fingerprint_tests.rb"
|
19
19
|
require "test/plugin/node_fingerprint_tests.rb"
|
20
20
|
require "test/plugin/python_fingerprint_tests.rb"
|
@@ -25,10 +25,11 @@ class ApptuitFilterTest < Test::Unit::TestCase
|
|
25
25
|
Fluent::Test.setup
|
26
26
|
end
|
27
27
|
|
28
|
-
def create_driver(
|
29
|
-
Fluent::Test::Driver::Filter.new(Fluent::Plugin::ApptuitFilter).configure(
|
28
|
+
def create_driver(config={})
|
29
|
+
Fluent::Test::Driver::Filter.new(Fluent::Plugin::ApptuitFilter).configure(config)
|
30
30
|
end
|
31
31
|
|
32
|
+
config = ""
|
32
33
|
python_conf = %[
|
33
34
|
lang python
|
34
35
|
]
|
@@ -138,6 +139,8 @@ AssertionError: Found different types with the same name in the schema: Employee
|
|
138
139
|
|
139
140
|
python_sys_msg = "Traceback (most recent call last):#012File \"./app.py\", line 7, in <module>#012 from schema import schema#012File \"/home/joseph/Documents/graphene-sqlalchemy/examples/flask_sqlalchemy/schema.py\", line 60, in <module>#012 schema = graphene.Schema(query=Query, types=[Department, Employee, Role])#012File \"/home/joseph/Documents/graphene-sqlalchemy/examples/flask_sqlalchemy/env/lib/python3.6/site-packages/graphene/types/schema.py\", line 62, in __init__#012 self.build_typemap()#012File \"/home/joseph/Documents/graphene-sqlalchemy/examples/flask_sqlalchemy/env/lib/python3.6/site-packages/graphene/types/schema.py\", line 126, in build_typemap#012 initial_types, auto_camelcase=self.auto_camelcase, schema=self#012File \"/home/joseph/Documents/graphene-sqlalchemy/examples/flask_sqlalchemy/env/lib/python3.6/site-packages/graphene/types/typemap.py\", line 80, in __init__#012 super(TypeMap, self).__init__(types)#012File \"/home/joseph/Documents/graphene-sqlalchemy/examples/flask_sqlalchemy/env/lib/python3.6/site-packages/graphql/type/typemap.py\", line 28, in __init__#012 self.update(reduce(self.reducer, types, OrderedDict())) # type: ignore#012File \"/home/joseph/Documents/graphene-sqlalchemy/examples/flask_sqlalchemy/env/lib/python3.6/site-packages/graphene/types/typemap.py\", line 88, in reducer#012 return self.graphene_reducer(map, type)#012File \"/home/joseph/Documents/graphene-sqlalchemy/examples/flask_sqlalchemy/env/lib/python3.6/site-packages/graphene/types/typemap.py\", line 117, in graphene_reducer#012 return GraphQLTypeMap.reducer(map, internal_type)#012File \"/home/joseph/Documents/graphene-sqlalchemy/examples/flask_sqlalchemy/env/lib/python3.6/site-packages/graphql/type/typemap.py\", line 106, in reducer#012 field_map = type.fields#012File \"/home/joseph/Documents/graphene-sqlalchemy/examples/flask_sqlalchemy/env/lib/python3.6/site-packages/graphql/pyutils/cached_property.py\", line 22, in __get__#012 value = obj.__dict__[self.func.__name__] = self.func(obj)#012File \"/home/joseph/Documents/graphene-sqlalchemy/examples/flask_sqlalchemy/env/lib/python3.6/site-packages/graphql/type/definition.py\", line 221, in fields#012 return define_field_map(self, self._fields)#012File \"/home/joseph/Documents/graphene-sqlalchemy/examples/flask_sqlalchemy/env/lib/python3.6/site-packages/graphql/type/definition.py\", line 235, in define_field_map#012 field_map = field_map()#012File \"/home/joseph/Documents/graphene-sqlalchemy/examples/flask_sqlalchemy/env/lib/python3.6/site-packages/graphene/types/typemap.py\", line 274, in construct_fields_for_type#012 map = self.reducer(map, field.type)#012File \"/home/joseph/Documents/graphene-sqlalchemy/examples/flask_sqlalchemy/env/lib/python3.6/site-packages/graphene/types/typemap.py\", line 88, in reducer#012 return self.graphene_reducer(map, type)#012File \"/home/joseph/Documents/graphene-sqlalchemy/examples/flask_sqlalchemy/env/lib/python3.6/site-packages/graphene/types/typemap.py\", line 117, in graphene_reducer#012 return GraphQLTypeMap.reducer(map, internal_type)#012File \"/home/joseph/Documents/graphene-sqlalchemy/examples/flask_sqlalchemy/env/lib/python3.6/site-packages/graphql/type/typemap.py\", line 106, in reducer#012 field_map = type.fields#012File \"/home/joseph/Documents/graphene-sqlalchemy/examples/flask_sqlalchemy/env/lib/python3.6/site-packages/graphql/pyutils/cached_property.py\", line 22, in __get__#012 value = obj.__dict__[self.func.__name__] = self.func(obj)#012File \"/home/joseph/Documents/graphene-sqlalchemy/examples/flask_sqlalchemy/env/lib/python3.6/site-packages/graphql/type/definition.py\", line 221, in fields#012 return define_field_map(self, self._fields)#012File \"/home/joseph/Documents/graphene-sqlalchemy/examples/flask_sqlalchemy/env/lib/python3.6/site-packages/graphql/type/definition.py\", line 235, in define_field_map#012 field_map = field_map()#012File \"/home/joseph/Documents/graphene-sqlalchemy/examples/flask_sqlalchemy/env/lib/python3.6/site-packages/graphene/types/typemap.py\", line 274, in construct_fields_for_type#012 map = self.reducer(map, field.type)#012File \"/home/joseph/Documents/graphene-sqlalchemy/examples/flask_sqlalchemy/env/lib/python3.6/site-packages/graphene/types/typemap.py\", line 88, in reducer#012 return self.graphene_reducer(map, type)#012File \"/home/joseph/Documents/graphene-sqlalchemy/examples/flask_sqlalchemy/env/lib/python3.6/site-packages/graphene/types/typemap.py\", line 93, in graphene_reducer#012 return self.reducer(map, type.of_type)#012File \"/home/joseph/Documents/graphene-sqlalchemy/examples/flask_sqlalchemy/env/lib/python3.6/site-packages/graphene/types/typemap.py\", line 88, in reducer#012 return self.graphene_reducer(map, type)#012File \"/home/joseph/Documents/graphene-sqlalchemy/examples/flask_sqlalchemy/env/lib/python3.6/site-packages/graphene/types/typemap.py\", line 93, in graphene_reducer#012 return self.reducer(map, type.of_type)#012File \"/home/joseph/Documents/graphene-sqlalchemy/examples/flask_sqlalchemy/env/lib/python3.6/site-packages/graphene/types/typemap.py\", line 88, in reducer#012 return self.graphene_reducer(map, type)#012File \"/home/joseph/Documents/graphene-sqlalchemy/examples/flask_sqlalchemy/env/lib/python3.6/site-packages/graphene/types/typemap.py\", line 117, in graphene_reducer#012 return GraphQLTypeMap.reducer(map, internal_type)#012File \"/home/joseph/Documents/graphene-sqlalchemy/examples/flask_sqlalchemy/env/lib/python3.6/site-packages/graphql/type/typemap.py\", line 106, in reducer#012 field_map = type.fields#012File \"/home/joseph/Documents/graphene-sqlalchemy/examples/flask_sqlalchemy/env/lib/python3.6/site-packages/graphql/pyutils/cached_property.py\", line 22, in __get__#012 value = obj.__dict__[self.func.__name__] = self.func(obj)#012File \"/home/joseph/Documents/graphene-sqlalchemy/examples/flask_sqlalchemy/env/lib/python3.6/site-packages/graphql/type/definition.py\", line 221, in fields#012 return define_field_map(self, self._fields)#012File \"/home/joseph/Documents/graphene-sqlalchemy/examples/flask_sqlalchemy/env/lib/python3.6/site-packages/graphql/type/definition.py\", line 235, in define_field_map#012 field_map = field_map()#012File \"/home/joseph/Documents/graphene-sqlalchemy/examples/flask_sqlalchemy/env/lib/python3.6/site-packages/graphene/types/typemap.py\", line 274, in construct_fields_for_type#012 map = self.reducer(map, field.type)#012File \"/home/joseph/Documents/graphene-sqlalchemy/examples/flask_sqlalchemy/env/lib/python3.6/site-packages/graphene/types/typemap.py\", line 88, in reducer#012 return self.graphene_reducer(map, type)#012File \"/home/joseph/Documents/graphene-sqlalchemy/examples/flask_sqlalchemy/env/lib/python3.6/site-packages/graphene/types/typemap.py\", line 117, in graphene_reducer#012 return GraphQLTypeMap.reducer(map, internal_type)#012File \"/home/joseph/Documents/graphene-sqlalchemy/examples/flask_sqlalchemy/env/lib/python3.6/site-packages/graphql/type/typemap.py\", line 106, in reducer#012 field_map = type.fields#012File \"/home/joseph/Documents/graphene-sqlalchemy/examples/flask_sqlalchemy/env/lib/python3.6/site-packages/graphql/pyutils/cached_property.py\", line 22, in __get__#012 value = obj.__dict__[self.func.__name__] = self.func(obj)#012File \"/home/joseph/Documents/graphene-sqlalchemy/examples/flask_sqlalchemy/env/lib/python3.6/site-packages/graphql/type/definition.py\", line 221, in fields#012 return define_field_map(self, self._fields)#012File \"/home/joseph/Documents/graphene-sqlalchemy/examples/flask_sqlalchemy/env/lib/python3.6/site-packages/graphql/type/definition.py\", line 235, in define_field_map#012 field_map = field_map()#012File \"/home/joseph/Documents/graphene-sqlalchemy/examples/flask_sqlalchemy/env/lib/python3.6/site-packages/graphene/types/typemap.py\", line 274, in construct_fields_for_type#012 map = self.reducer(map, field.type)#012File \"/home/joseph/Documents/graphene-sqlalchemy/examples/flask_sqlalchemy/env/lib/python3.6/site-packages/graphene/types/typemap.py\", line 88, in reducer#012 return self.graphene_reducer(map, type)#012File \"/home/joseph/Documents/graphene-sqlalchemy/examples/flask_sqlalchemy/env/lib/python3.6/site-packages/graphene/types/typemap.py\", line 117, in graphene_reducer#012 return GraphQLTypeMap.reducer(map, internal_type)#012File \"/home/joseph/Documents/graphene-sqlalchemy/examples/flask_sqlalchemy/env/lib/python3.6/site-packages/graphql/type/typemap.py\", line 106, in reducer#012 field_map = type.fields#012File \"/home/joseph/Documents/graphene-sqlalchemy/examples/flask_sqlalchemy/env/lib/python3.6/site-packages/graphql/pyutils/cached_property.py\", line 22, in __get__#012 value = obj.__dict__[self.func.__name__] = self.func(obj)#012File \"/home/joseph/Documents/graphene-sqlalchemy/examples/flask_sqlalchemy/env/lib/python3.6/site-packages/graphql/type/definition.py\", line 221, in fields#012 return define_field_map(self, self._fields)#012File \"/home/joseph/Documents/graphene-sqlalchemy/examples/flask_sqlalchemy/env/lib/python3.6/site-packages/graphql/type/definition.py\", line 235, in define_field_map#012 field_map = field_map()#012File \"/home/joseph/Documents/graphene-sqlalchemy/examples/flask_sqlalchemy/env/lib/python3.6/site-packages/graphene/types/typemap.py\", line 274, in construct_fields_for_type#012 map = self.reducer(map, field.type)#012File \"/home/joseph/Documents/graphene-sqlalchemy/examples/flask_sqlalchemy/env/lib/python3.6/site-packages/graphene/types/typemap.py\", line 88, in reducer#012 return self.graphene_reducer(map, type)#012File \"/home/joseph/Documents/graphene-sqlalchemy/examples/flask_sqlalchemy/env/lib/python3.6/site-packages/graphene/types/typemap.py\", line 99, in graphene_reducer#012 ).format(_type.graphene_type, type)#012AssertionError: Found different types with the same name in the schema: EmployeeConnection, EmployeeConnection"
|
140
141
|
|
142
|
+
python_error_msg = ":#012File \"./app.py\", line 7, in <module>#012 from schema import schema#012File \"/home/joseph/Documents/graphene-sqlalchemy/examples/flask_sqlalchemy/schema.py\", line 60, in <module>#012 schema = graphene.Schema(query=Query, types=[Department, Employee, Role])#012File \"/home/joseph/Documents/graphene-sqlalchemy/examples/flask_sqlalchemy/env/lib/python3.6/site-packages/graphene/types/schema.py\", line 62, in __init__#012 self.build_typemap()#012File \"/home/joseph/Documents/graphene-sqlalchemy/examples/flask_sqlalchemy/env/lib/python3.6/site-packages/graphene/types/schema.py\", line 126, in build_typemap#012 initial_types, auto_camelcase=self.auto_camelcase, schema=self#012File \"/home/joseph/Documents/graphene-sqlalchemy/examples/flask_sqlalchemy/env/lib/python3.6/site-packages/graphene/types/typemap.py\", line 80, in __init__#012 super(TypeMap, self).__init__(types)#012File \"/home/joseph/Documents/graphene-sqlalchemy/examples/flask_sqlalchemy/env/lib/python3.6/site-packages/graphql/type/typemap.py\", line 28, in __init__#012 self.update(reduce(self.reducer, types, OrderedDict())) # type: ignore#012File \"/home/joseph/Documents/graphene-sqlalchemy/examples/flask_sqlalchemy/env/lib/python3.6/site-packages/graphene/types/typemap.py\", line 88, in reducer#012 return self.graphene_reducer(map, type)#012File \"/home/joseph/Documents/graphene-sqlalchemy/examples/flask_sqlalchemy/env/lib/python3.6/site-packages/graphene/types/typemap.py\", line 117, in graphene_reducer#012 return GraphQLTypeMap.reducer(map, internal_type)#012File \"/home/joseph/Documents/graphene-sqlalchemy/examples/flask_sqlalchemy/env/lib/python3.6/site-packages/graphql/type/typemap.py\", line 106, in reducer#012 field_map = type.fields#012File \"/home/joseph/Documents/graphene-sqlalchemy/examples/flask_sqlalchemy/env/lib/python3.6/site-packages/graphql/pyutils/cached_property.py\", line 22, in __get__#012 value = obj.__dict__[self.func.__name__] = self.func(obj)#012File \"/home/joseph/Documents/graphene-sqlalchemy/examples/flask_sqlalchemy/env/lib/python3.6/site-packages/graphql/type/definition.py\", line 221, in fields#012 return define_field_map(self, self._fields)#012File \"/home/joseph/Documents/graphene-sqlalchemy/examples/flask_sqlalchemy/env/lib/python3.6/site-packages/graphql/type/definition.py\", line 235, in define_field_map#012 field_map = field_map()#012File \"/home/joseph/Documents/graphene-sqlalchemy/examples/flask_sqlalchemy/env/lib/python3.6/site-packages/graphene/types/typemap.py\", line 274, in construct_fields_for_type#012 map = self.reducer(map, field.type)#012File \"/home/joseph/Documents/graphene-sqlalchemy/examples/flask_sqlalchemy/env/lib/python3.6/site-packages/graphene/types/typemap.py\", line 88, in reducer#012 return self.graphene_reducer(map, type)#012File \"/home/joseph/Documents/graphene-sqlalchemy/examples/flask_sqlalchemy/env/lib/python3.6/site-packages/graphene/types/typemap.py\", line 117, in graphene_reducer#012 return GraphQLTypeMap.reducer(map, internal_type)#012File \"/home/joseph/Documents/graphene-sqlalchemy/examples/flask_sqlalchemy/env/lib/python3.6/site-packages/graphql/type/typemap.py\", line 106, in reducer#012 field_map = type.fields#012File \"/home/joseph/Documents/graphene-sqlalchemy/examples/flask_sqlalchemy/env/lib/python3.6/site-packages/graphql/pyutils/cached_property.py\", line 22, in __get__#012 value = obj.__dict__[self.func.__name__] = self.func(obj)#012File \"/home/joseph/Documents/graphene-sqlalchemy/examples/flask_sqlalchemy/env/lib/python3.6/site-packages/graphql/type/definition.py\", line 221, in fields#012 return define_field_map(self, self._fields)#012File \"/home/joseph/Documents/graphene-sqlalchemy/examples/flask_sqlalchemy/env/lib/python3.6/site-packages/graphql/type/definition.py\", line 235, in define_field_map#012 field_map = field_map()#012File \"/home/joseph/Documents/graphene-sqlalchemy/examples/flask_sqlalchemy/env/lib/python3.6/site-packages/graphene/types/typemap.py\", line 274, in construct_fields_for_type#012 map = self.reducer(map, field.type)#012File \"/home/joseph/Documents/graphene-sqlalchemy/examples/flask_sqlalchemy/env/lib/python3.6/site-packages/graphene/types/typemap.py\", line 88, in reducer#012 return self.graphene_reducer(map, type)#012File \"/home/joseph/Documents/graphene-sqlalchemy/examples/flask_sqlalchemy/env/lib/python3.6/site-packages/graphene/types/typemap.py\", line 93, in graphene_reducer#012 return self.reducer(map, type.of_type)#012File \"/home/joseph/Documents/graphene-sqlalchemy/examples/flask_sqlalchemy/env/lib/python3.6/site-packages/graphene/types/typemap.py\", line 88, in reducer#012 return self.graphene_reducer(map, type)#012File \"/home/joseph/Documents/graphene-sqlalchemy/examples/flask_sqlalchemy/env/lib/python3.6/site-packages/graphene/types/typemap.py\", line 93, in graphene_reducer#012 return self.reducer(map, type.of_type)#012File \"/home/joseph/Documents/graphene-sqlalchemy/examples/flask_sqlalchemy/env/lib/python3.6/site-packages/graphene/types/typemap.py\", line 88, in reducer#012 return self.graphene_reducer(map, type)#012File \"/home/joseph/Documents/graphene-sqlalchemy/examples/flask_sqlalchemy/env/lib/python3.6/site-packages/graphene/types/typemap.py\", line 117, in graphene_reducer#012 return GraphQLTypeMap.reducer(map, internal_type)#012File \"/home/joseph/Documents/graphene-sqlalchemy/examples/flask_sqlalchemy/env/lib/python3.6/site-packages/graphql/type/typemap.py\", line 106, in reducer#012 field_map = type.fields#012File \"/home/joseph/Documents/graphene-sqlalchemy/examples/flask_sqlalchemy/env/lib/python3.6/site-packages/graphql/pyutils/cached_property.py\", line 22, in __get__#012 value = obj.__dict__[self.func.__name__] = self.func(obj)#012File \"/home/joseph/Documents/graphene-sqlalchemy/examples/flask_sqlalchemy/env/lib/python3.6/site-packages/graphql/type/definition.py\", line 221, in fields#012 return define_field_map(self, self._fields)#012File \"/home/joseph/Documents/graphene-sqlalchemy/examples/flask_sqlalchemy/env/lib/python3.6/site-packages/graphql/type/definition.py\", line 235, in define_field_map#012 field_map = field_map()#012File \"/home/joseph/Documents/graphene-sqlalchemy/examples/flask_sqlalchemy/env/lib/python3.6/site-packages/graphene/types/typemap.py\", line 274, in construct_fields_for_type#012 map = self.reducer(map, field.type)#012File \"/home/joseph/Documents/graphene-sqlalchemy/examples/flask_sqlalchemy/env/lib/python3.6/site-packages/graphene/types/typemap.py\", line 88, in reducer#012 return self.graphene_reducer(map, type)#012File \"/home/joseph/Documents/graphene-sqlalchemy/examples/flask_sqlalchemy/env/lib/python3.6/site-packages/graphene/types/typemap.py\", line 117, in graphene_reducer#012 return GraphQLTypeMap.reducer(map, internal_type)#012File \"/home/joseph/Documents/graphene-sqlalchemy/examples/flask_sqlalchemy/env/lib/python3.6/site-packages/graphql/type/typemap.py\", line 106, in reducer#012 field_map = type.fields#012File \"/home/joseph/Documents/graphene-sqlalchemy/examples/flask_sqlalchemy/env/lib/python3.6/site-packages/graphql/pyutils/cached_property.py\", line 22, in __get__#012 value = obj.__dict__[self.func.__name__] = self.func(obj)#012File \"/home/joseph/Documents/graphene-sqlalchemy/examples/flask_sqlalchemy/env/lib/python3.6/site-packages/graphql/type/definition.py\", line 221, in fields#012 return define_field_map(self, self._fields)#012File \"/home/joseph/Documents/graphene-sqlalchemy/examples/flask_sqlalchemy/env/lib/python3.6/site-packages/graphql/type/definition.py\", line 235, in define_field_map#012 field_map = field_map()#012File \"/home/joseph/Documents/graphene-sqlalchemy/examples/flask_sqlalchemy/env/lib/python3.6/site-packages/graphene/types/typemap.py\", line 274, in construct_fields_for_type#012 map = self.reducer(map, field.type)#012File \"/home/joseph/Documents/graphene-sqlalchemy/examples/flask_sqlalchemy/env/lib/python3.6/site-packages/graphene/types/typemap.py\", line 88, in reducer#012 return self.graphene_reducer(map, type)#012File \"/home/joseph/Documents/graphene-sqlalchemy/examples/flask_sqlalchemy/env/lib/python3.6/site-packages/graphene/types/typemap.py\", line 117, in graphene_reducer#012 return GraphQLTypeMap.reducer(map, internal_type)#012File \"/home/joseph/Documents/graphene-sqlalchemy/examples/flask_sqlalchemy/env/lib/python3.6/site-packages/graphql/type/typemap.py\", line 106, in reducer#012 field_map = type.fields#012File \"/home/joseph/Documents/graphene-sqlalchemy/examples/flask_sqlalchemy/env/lib/python3.6/site-packages/graphql/pyutils/cached_property.py\", line 22, in __get__#012 value = obj.__dict__[self.func.__name__] = self.func(obj)#012File \"/home/joseph/Documents/graphene-sqlalchemy/examples/flask_sqlalchemy/env/lib/python3.6/site-packages/graphql/type/definition.py\", line 221, in fields#012 return define_field_map(self, self._fields)#012File \"/home/joseph/Documents/graphene-sqlalchemy/examples/flask_sqlalchemy/env/lib/python3.6/site-packages/graphql/type/definition.py\", line 235, in define_field_map#012 field_map = field_map()#012File \"/home/joseph/Documents/graphene-sqlalchemy/examples/flask_sqlalchemy/env/lib/python3.6/site-packages/graphene/types/typemap.py\", line 274, in construct_fields_for_type#012 map = self.reducer(map, field.type)#012File \"/home/joseph/Documents/graphene-sqlalchemy/examples/flask_sqlalchemy/env/lib/python3.6/site-packages/graphene/types/typemap.py\", line 88, in reducer#012 return self.graphene_reducer(map, type)#012File \"/home/joseph/Documents/graphene-sqlalchemy/examples/flask_sqlalchemy/env/lib/python3.6/site-packages/graphene/types/typemap.py\", line 99, in graphene_reducer#012 ).format(_type.graphene_type, type)#012AssertionError: Found different types with the same name in the schema: EmployeeConnection, EmployeeConnection"
|
143
|
+
|
141
144
|
java_msg = 'SEVERE [http-nio-8080-exec-10] org.apache.catalina.core.StandardWrapperValve.invoke Servlet.service() for servlet [Testing] in context with path [/test] threw exception [GET method is not supported.] with root cause
|
142
145
|
javax.servlet.ServletException: GET method is not supported.
|
143
146
|
at TestingServlet.doGet(TestingServlet.java:18)
|
@@ -190,91 +193,127 @@ nodejs_error_msg = "Something unexpected has occurred.#012 at main (c:\\Users
|
|
190
193
|
d.run do
|
191
194
|
d.feed("filter.python", time, {'message' => python_msg})
|
192
195
|
end
|
193
|
-
assert_equal('6c4a36dfca6b751f16a4065d61ec0de3f96e7eb8', d.filtered_records[0]['
|
196
|
+
assert_equal('6c4a36dfca6b751f16a4065d61ec0de3f96e7eb8', d.filtered_records[0]['error_fingerprint'])
|
194
197
|
d = create_driver(python_conf+"syslog true")
|
195
198
|
time = event_time
|
196
199
|
d.run do
|
197
200
|
d.feed("filter.python",time, {'message' => python_sys_msg})
|
198
201
|
end
|
199
|
-
assert_equal('6c4a36dfca6b751f16a4065d61ec0de3f96e7eb8', d.filtered_records[0]['
|
202
|
+
assert_equal('6c4a36dfca6b751f16a4065d61ec0de3f96e7eb8', d.filtered_records[0]['error_fingerprint'])
|
200
203
|
d = create_driver(python_conf+"error_msg_tag error_message")
|
201
204
|
time = event_time
|
202
205
|
d.run do
|
203
206
|
d.feed("filter.python",time, {'error_message' => python_msg})
|
204
207
|
end
|
205
|
-
assert_equal('6c4a36dfca6b751f16a4065d61ec0de3f96e7eb8', d.filtered_records[0]['
|
208
|
+
assert_equal('6c4a36dfca6b751f16a4065d61ec0de3f96e7eb8', d.filtered_records[0]['error_fingerprint'])
|
209
|
+
d = create_driver(python_conf+"syslog true\n"+"error_msg_tag error_message")
|
210
|
+
time = event_time
|
211
|
+
d.run do
|
212
|
+
d.feed("filter.python",time, {'error_message' => python_sys_msg})
|
213
|
+
end
|
214
|
+
assert_equal('6c4a36dfca6b751f16a4065d61ec0de3f96e7eb8', d.filtered_records[0]['error_fingerprint'])
|
206
215
|
d = create_driver(python_conf+"error_msg_tag error_message")
|
207
216
|
time = event_time
|
208
217
|
d.run do
|
209
218
|
d.feed("filter.python",time, {'error_message' => python_sys_msg})
|
210
219
|
end
|
211
|
-
assert_equal(nil, d.filtered_records[0]['
|
212
|
-
d = create_driver(
|
220
|
+
assert_equal(nil, d.filtered_records[0]['error_fingerprint'])
|
221
|
+
d = create_driver(config+"lang php")
|
213
222
|
time = event_time
|
214
223
|
d.run do
|
215
224
|
d.feed("filter.python",time, {'error_message' => python_sys_msg})
|
216
225
|
end
|
217
|
-
assert_equal(
|
226
|
+
assert_equal(nil, d.filtered_records[0]['error_fingerprint'])
|
227
|
+
d = create_driver(python_conf+"syslog true"+"error_msg_tag error_message")
|
228
|
+
time = event_time
|
229
|
+
d.run do
|
230
|
+
d.feed("filter.python",time, {'error_message' => python_error_msg})
|
231
|
+
end
|
232
|
+
assert_equal(nil, d.filtered_records[0]['error_fingerprint'])
|
233
|
+
d = create_driver(python_conf+"error_msg_tag error_message")
|
234
|
+
time = event_time
|
235
|
+
d.run do
|
236
|
+
d.feed("filter.python",time, {'error_message' => python_error_msg})
|
237
|
+
end
|
238
|
+
assert_equal(nil, d.filtered_records[0]['error_fingerprint'])
|
239
|
+
d = create_driver(python_conf+"syslog true\n"+"error_msg_tag error_message")
|
240
|
+
time = event_time
|
241
|
+
d.run do
|
242
|
+
d.feed("filter.python",time, {'error_message' => python_error_msg})
|
243
|
+
end
|
244
|
+
assert_equal(nil, d.filtered_records[0]['error_fingerprint'])
|
218
245
|
d = create_driver(java_conf)
|
219
246
|
time = event_time
|
220
247
|
d.run do
|
221
248
|
d.feed("filter.java", time, {'message' => java_msg})
|
222
249
|
end
|
223
|
-
assert_equal('35005154c55de5f08021c04959646a00063a8a81', d.filtered_records[0]['
|
250
|
+
assert_equal('35005154c55de5f08021c04959646a00063a8a81', d.filtered_records[0]['error_fingerprint'])
|
224
251
|
d = create_driver(java_conf+"syslog true")
|
225
252
|
time = event_time
|
226
253
|
d.run do
|
227
254
|
d.feed("filter.java", time, {'message' => java_sys_msg})
|
228
255
|
end
|
229
|
-
assert_equal('35005154c55de5f08021c04959646a00063a8a81', d.filtered_records[0]['
|
256
|
+
assert_equal('35005154c55de5f08021c04959646a00063a8a81', d.filtered_records[0]['error_fingerprint'])
|
230
257
|
d = create_driver(java_conf+"error_msg_tag error_message")
|
231
258
|
time = event_time
|
232
259
|
d.run do
|
233
260
|
d.feed("filter.java", time, {'error_message' => java_msg})
|
234
261
|
end
|
235
|
-
assert_equal('35005154c55de5f08021c04959646a00063a8a81', d.filtered_records[0]['
|
262
|
+
assert_equal('35005154c55de5f08021c04959646a00063a8a81', d.filtered_records[0]['error_fingerprint'])
|
236
263
|
d = create_driver(java_conf+"syslog true\n"+"error_msg_tag error_message")
|
237
264
|
time = event_time
|
238
265
|
d.run do
|
239
266
|
d.feed("filter.java", time, {'error_message' => java_sys_msg})
|
240
267
|
end
|
241
|
-
assert_equal('35005154c55de5f08021c04959646a00063a8a81', d.filtered_records[0]['
|
268
|
+
assert_equal('35005154c55de5f08021c04959646a00063a8a81', d.filtered_records[0]['error_fingerprint'])
|
242
269
|
d = create_driver(java_conf+"error_msg_tag error_message")
|
243
270
|
time = event_time
|
244
271
|
d.run do
|
245
272
|
d.feed("filter.java", time, {'error_message' => java_sys_msg})
|
246
273
|
end
|
247
|
-
assert_equal(nil, d.filtered_records[0]['
|
274
|
+
assert_equal(nil, d.filtered_records[0]['error_fingerprint'])
|
275
|
+
d = create_driver(config+"lang ruby")
|
276
|
+
time = event_time
|
277
|
+
d.run do
|
278
|
+
d.feed("filter.java", time, {'error_message' => java_sys_msg})
|
279
|
+
end
|
280
|
+
assert_equal(nil, d.filtered_records[0]['error_fingerprint'])
|
248
281
|
d = create_driver(nodejs_conf)
|
249
282
|
time = event_time
|
250
283
|
d.run do
|
251
284
|
d.feed("filter.nodejs", time, {'message' => nodejs_msg})
|
252
285
|
end
|
253
|
-
assert_equal('24f271892eeaac14506e7ab563da0f03a19b0d84', d.filtered_records[0]['
|
286
|
+
assert_equal('24f271892eeaac14506e7ab563da0f03a19b0d84', d.filtered_records[0]['error_fingerprint'])
|
254
287
|
d = create_driver(nodejs_conf+"syslog true")
|
255
288
|
time = event_time
|
256
289
|
d.run do
|
257
290
|
d.feed("filter.nodejs", time, {'message' => nodejs_sys_msg})
|
258
291
|
end
|
259
|
-
assert_equal('24f271892eeaac14506e7ab563da0f03a19b0d84', d.filtered_records[0]['
|
292
|
+
assert_equal('24f271892eeaac14506e7ab563da0f03a19b0d84', d.filtered_records[0]['error_fingerprint'])
|
260
293
|
d = create_driver(nodejs_conf+"error_msg_tag error_message")
|
261
294
|
time = event_time
|
262
295
|
d.run do
|
263
296
|
d.feed("filter.nodejs", time, {'error_message' => nodejs_msg})
|
264
297
|
end
|
265
|
-
assert_equal('24f271892eeaac14506e7ab563da0f03a19b0d84', d.filtered_records[0]['
|
298
|
+
assert_equal('24f271892eeaac14506e7ab563da0f03a19b0d84', d.filtered_records[0]['error_fingerprint'])
|
266
299
|
d = create_driver(nodejs_conf+"syslog true\n"+"error_msg_tag error_message")
|
267
300
|
time = event_time
|
268
301
|
d.run do
|
269
302
|
d.feed("filter.nodejs", time, {'error_message' => nodejs_sys_msg})
|
270
303
|
end
|
271
|
-
assert_equal('24f271892eeaac14506e7ab563da0f03a19b0d84', d.filtered_records[0]['
|
304
|
+
assert_equal('24f271892eeaac14506e7ab563da0f03a19b0d84', d.filtered_records[0]['error_fingerprint'])
|
272
305
|
d = create_driver(nodejs_conf+"error_msg_tag error_message")
|
273
306
|
time = event_time
|
274
307
|
d.run do
|
275
308
|
d.feed("filter.nodejs", time, {'error_message' => nodejs_error_msg})
|
276
309
|
end
|
277
|
-
assert_equal(nil, d.filtered_records[0]['
|
310
|
+
assert_equal(nil, d.filtered_records[0]['error_fingerprint'])
|
311
|
+
d = create_driver(config+"lang go")
|
312
|
+
time = event_time
|
313
|
+
d.run do
|
314
|
+
d.feed("filter.nodejs", time, {'error_message' => nodejs_error_msg})
|
315
|
+
end
|
316
|
+
assert_equal(nil, d.filtered_records[0]['error_fingerprint'])
|
278
317
|
end
|
279
318
|
|
280
319
|
#Nodejs fingerprint tests
|
@@ -318,3 +357,4 @@ nodejs_error_msg = "Something unexpected has occurred.#012 at main (c:\\Users
|
|
318
357
|
testing_object.test_multi_line_message(fingerprint_object)
|
319
358
|
testing_object.test_heuristic_stacktrace_search(fingerprint_object)
|
320
359
|
end
|
360
|
+
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: apptuit-fluent-plugin
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- hari prasad
|
@@ -114,13 +114,13 @@ files:
|
|
114
114
|
- README.md
|
115
115
|
- Rakefile
|
116
116
|
- apptuit-fluent-plugin.gemspec
|
117
|
-
- lib/fluent/plugin/
|
117
|
+
- lib/fluent/plugin/filter_apptuit.rb
|
118
118
|
- lib/fluent/plugin/fingerprinter.rb
|
119
119
|
- test/helper.rb
|
120
120
|
- test/plugin/java_fingerprint_tests.rb
|
121
121
|
- test/plugin/node_fingerprint_tests.rb
|
122
122
|
- test/plugin/python_fingerprint_tests.rb
|
123
|
-
- test/plugin/
|
123
|
+
- test/plugin/test_filter_apptuit.rb
|
124
124
|
homepage: https://github.com/hari9973/apptuit-fluent-plugin
|
125
125
|
licenses:
|
126
126
|
- Apache-2.0
|
@@ -140,7 +140,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
140
140
|
- !ruby/object:Gem::Version
|
141
141
|
version: '0'
|
142
142
|
requirements: []
|
143
|
-
|
143
|
+
rubyforge_project:
|
144
|
+
rubygems_version: 2.7.7
|
144
145
|
signing_key:
|
145
146
|
specification_version: 4
|
146
147
|
summary: To find the fingerprints for errors
|
@@ -149,4 +150,4 @@ test_files:
|
|
149
150
|
- test/plugin/java_fingerprint_tests.rb
|
150
151
|
- test/plugin/node_fingerprint_tests.rb
|
151
152
|
- test/plugin/python_fingerprint_tests.rb
|
152
|
-
- test/plugin/
|
153
|
+
- test/plugin/test_filter_apptuit.rb
|