├── .abapgit.xml
├── .github
├── dependabot.yml
├── release-drafter.yml
└── workflows
│ ├── release-drafter.yml
│ └── update-changelog.yml
├── .gitignore
├── CHANGELOG.md
├── LICENSE
├── README.md
├── abaplint.json
├── architecture
└── architecture.planuml
├── docs
├── logo-abap-log-exporter-horizontal.png
└── logo-abap-log-exporter.png
├── local-tests
├── README.md
├── docker-compose-fluentd.yml
├── docker-compose-grafana-loki.yml
├── docker-compose-graylog.yml
├── docker-compose-graylog4.yml
├── fluentd
│ └── conf
│ │ └── fluent.conf
├── grafana
│ └── provisioning
│ │ └── datasources
│ │ └── loki.yml
└── graylog
│ └── plugin
│ └── graylog-plugin-integrations-3.3.5.jar
├── out
└── architecture
│ └── architecture
│ └── architecture.png
├── package-lock.json
├── package.json
└── src
├── package.devc.xml
├── zale_connector
├── package.devc.xml
├── zcl_ale_log_connector_gelf.clas.abap
├── zcl_ale_log_connector_gelf.clas.xml
├── zcl_ale_log_connector_loki.clas.abap
├── zcl_ale_log_connector_loki.clas.xml
├── zif_ale_log_connector.intf.abap
└── zif_ale_log_connector.intf.xml
├── zale_converter
├── package.devc.xml
├── zcl_ale_log_converter_gelf.clas.abap
├── zcl_ale_log_converter_gelf.clas.xml
├── zcl_ale_log_converter_loki.clas.abap
├── zcl_ale_log_converter_loki.clas.xml
├── zif_ale_log_converter.intf.abap
└── zif_ale_log_converter.intf.xml
├── zale_customizing
├── package.devc.xml
├── zale_config.tabl.xml
├── zale_config.tran.xml
├── zale_config_mp.fugr.lzale_config_mpf00.abap
├── zale_config_mp.fugr.lzale_config_mpf00.xml
├── zale_config_mp.fugr.lzale_config_mpi00.abap
├── zale_config_mp.fugr.lzale_config_mpi00.xml
├── zale_config_mp.fugr.lzale_config_mpt00.abap
├── zale_config_mp.fugr.lzale_config_mpt00.xml
├── zale_config_mp.fugr.lzale_config_mptop.abap
├── zale_config_mp.fugr.lzale_config_mptop.xml
├── zale_config_mp.fugr.saplzale_config_mp.abap
├── zale_config_mp.fugr.saplzale_config_mp.xml
├── zale_config_mp.fugr.tableframe_zale_config_mp.abap
├── zale_config_mp.fugr.tableproc_zale_config_mp.abap
├── zale_config_mp.fugr.xml
├── zale_configs.tobj.xml
├── zale_connector_class.dtel.xml
├── zale_connector_url.doma.xml
├── zale_connector_url.dtel.xml
├── zale_converter_class.dtel.xml
├── zale_log_scenario.doma.xml
├── zale_log_scenario.dtel.xml
├── zale_reader_class.dtel.xml
├── zcl_ale_customizing.clas.abap
├── zcl_ale_customizing.clas.xml
├── zcl_ale_customizing_base.clas.abap
└── zcl_ale_customizing_base.clas.xml
├── zale_example.prog.abap
├── zale_example.prog.xml
├── zale_example_bal_log_creator.prog.abap
├── zale_example_bal_log_creator.prog.xml
├── zale_example_configuration.scp1.xml
├── zale_export_log_bal.prog.abap
├── zale_export_log_bal.prog.xml
└── zale_reader
├── package.devc.xml
├── zcl_ale_log_reader_bal.clas.abap
├── zcl_ale_log_reader_bal.clas.xml
├── zcl_ale_log_reader_sm21.clas.abap
├── zcl_ale_log_reader_sm21.clas.xml
├── zcl_ale_log_reader_smicm.clas.abap
├── zcl_ale_log_reader_smicm.clas.xml
├── zif_ale_log_reader.intf.abap
└── zif_ale_log_reader.intf.xml
/.abapgit.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | E
6 | /src/
7 | FULL
8 |
9 | - /.gitignore
10 | - /LICENSE
11 | - /README.md
12 | - /package.json
13 | - /package-lock.json
14 | - /.travis.yml
15 | - /.gitlab-ci.yml
16 | - /abaplint.json
17 | - /azure-pipelines.yml
18 |
19 |
20 |
21 |
22 |
--------------------------------------------------------------------------------
/.github/dependabot.yml:
--------------------------------------------------------------------------------
1 | # To get started with Dependabot version updates, you'll need to specify which
2 | # package ecosystems to update and where the package manifests are located.
3 | # Please see the documentation for all configuration options:
4 | # https://help.github.com/github/administering-a-repository/configuration-options-for-dependency-updates
5 |
6 | version: 2
7 | updates:
8 | - package-ecosystem: "npm" # See documentation for possible values
9 | directory: "/" # Location of package manifests
10 | schedule:
11 | interval: "daily"
12 |
--------------------------------------------------------------------------------
/.github/release-drafter.yml:
--------------------------------------------------------------------------------
1 | name-template: 'v$RESOLVED_VERSION 🌈'
2 | tag-template: 'v$RESOLVED_VERSION'
3 | categories:
4 | - title: '🚀 Features'
5 | labels:
6 | - 'feature'
7 | - 'enhancement'
8 | - title: '🐛 Bug Fixes'
9 | labels:
10 | - 'fix'
11 | - 'bugfix'
12 | - 'bug'
13 | - title: '🧰 Maintenance'
14 | label: 'chore'
15 | - title: '🧺 Miscellaneous' #Everything except ABAP
16 | label: 'misc'
17 | change-template: '- $TITLE @$AUTHOR (#$NUMBER)'
18 | change-title-escapes: '\<*_&' # You can add # and @ to disable mentions, and add ` to disable code blocks.
19 | version-resolver:
20 | major:
21 | labels:
22 | - 'major'
23 | minor:
24 | labels:
25 | - 'minor'
26 | patch:
27 | labels:
28 | - 'patch'
29 | default: patch
30 | template: |
31 | ## Changes
32 | $CHANGES
--------------------------------------------------------------------------------
/.github/workflows/release-drafter.yml:
--------------------------------------------------------------------------------
1 | name: Release Drafter
2 |
3 | on:
4 | push:
5 | # branches to consider in the event; optional, defaults to all
6 | branches:
7 | - main
8 |
9 | jobs:
10 | update_release_draft:
11 | runs-on: ubuntu-latest
12 | steps:
13 | # Drafts your next Release notes as Pull Requests are merged into "master"
14 | - uses: release-drafter/release-drafter@v5
15 | env:
16 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
--------------------------------------------------------------------------------
/.github/workflows/update-changelog.yml:
--------------------------------------------------------------------------------
1 | name: "update changelog"
2 | on:
3 | release:
4 | types: [published]
5 |
6 | jobs:
7 | update-changelog:
8 | runs-on: ubuntu-latest
9 | steps:
10 | - uses: actions/checkout@v2
11 |
12 | - name: Update changelog
13 | run: |
14 | npm install github-release-notes
15 | export GREN_GITHUB_TOKEN=${{ secrets.GITHUB_TOKEN }}
16 | npm run overrideChangelog
17 | - name: Create Pull Request
18 | uses: peter-evans/create-pull-request@v3
19 | with:
20 | commit-message: update changelog
21 | title: Update Changelog
22 | body: Update changelog to reflect release changes
23 | branch: update-changelog
24 | base: main
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | node_modules/
2 |
3 | # vs code remote
4 | .devcontainer/
--------------------------------------------------------------------------------
/CHANGELOG.md:
--------------------------------------------------------------------------------
1 | # Changelog
2 |
3 | ## v0.3.0 🌈 (08/03/2021)
4 | ## Changes
5 | ## 🚀 Features
6 |
7 | - loki converter and connector added @JohannesKonings (#86)
8 |
9 | ## 🧺 Miscellaneous
10 |
11 | - Bump @abaplint/cli from 2.69.8 to 2.69.10 @dependabot (#87)
12 | - local-test loki versions added and provisioning @JohannesKonings (#84)
13 | - Bump @abaplint/cli from 2.69.7 to 2.69.8 @dependabot (#82)
14 | - Bump @abaplint/cli from 2.69.4 to 2.69.7 @dependabot (#79)
15 | - Update Changelog @github-actions (#78)
16 |
17 | ---
18 |
19 | ## v0.2.0 🌈 (01/03/2021)
20 | ## Changes
21 | ## 🐛 Bug Fixes
22 |
23 | - clear table added in bal reader @JohannesKonings (#76)
24 |
25 | ## 🧰 Maintenance
26 |
27 | - maintenance view for ale config added @JohannesKonings (#75)
28 | - package for component customizing added @JohannesKonings (#72)
29 |
30 | ## 🧺 Miscellaneous
31 |
32 | - Update LICENSE @JohannesKonings (#77)
33 | - Bump @abaplint/cli from 2.69.2 to 2.69.4 @dependabot (#74)
34 | - Bump @abaplint/cli from 2.69.1 to 2.69.2 @dependabot (#71)
35 | - Update Changelog @github-actions (#69)
36 |
37 | ---
38 |
39 | ## v0.1.0 🌈 (23/02/2021)
40 | ## Changes
41 | ## 🚀 Features
42 |
43 | - BAL export enhanced for more objects and subobject @JohannesKonings (#66)
44 |
45 | ## 🧺 Miscellaneous
46 |
47 | - Bump @abaplint/cli from 2.58.26 to 2.69.1 @dependabot (#68)
48 | - package and command for github-release-notes added @JohannesKonings (#65)
49 | - Create dependabot.yml @JohannesKonings (#64)
50 | - vs code remote .devcontainer to gitignore added @JohannesKonings (#62)
51 |
52 | ---
53 |
54 | ## v0.0.1 🌈 (22/02/2021)
55 | ## Changes
56 |
57 | ## 🚀 Features
58 |
59 | - bal export with timeframes added @JohannesKonings (#59)
60 | - Additional fields @JohannesKonings (#48)
61 | - First draft of SM21 reader @JohannesKonings (#42)
62 | - new customizing field + calling of the classes @JohannesKonings (#29)
63 | - header/item for BAL and GELF @JohannesKonings (#28)
64 | - scenario + wrapper @JohannesKonings (#26)
65 | - Connector added to bal export programm @JohannesKonings (#23)
66 | - level of log incl converting for GELF @JohannesKonings (#22)
67 | - rough converter and connector implementation @JohannesKonings (#17)
68 | - Add example programs for log creating and viewing @Goala (#16)
69 | - first rough implementation of bal log reading @JohannesKonings (#13)
70 | - WIP first draft BAL-Reader @JohannesKonings (#4)
71 |
72 | ## 🧰 Maintenance
73 |
74 | - Refactor if ale customizing to abstract class @Goala (#39)
75 |
76 | ## 🐛 Bug Fixes
77 |
78 | - fix customzing type domain values @JohannesKonings (#7)
79 |
80 | ## 🧺 Miscellaneous
81 |
82 | - link and emoji to component status added @JohannesKonings (#56)
83 | - docker compose for graylog 4 added @JohannesKonings (#55)
84 | - docker-compose patch update of graylog and elaticsearch @JohannesKonings (#54)
85 | - grafana tempo removed @JohannesKonings (#51)
86 | - github actions for automatic versioning added @JohannesKonings (#50)
87 | - gh action abaplint removed (will be replaced with abaplint app) @JohannesKonings (#46)
88 | - local test grafana tempo volume @JohannesKonings (#44)
89 | - github workflow rename branch master to main @JohannesKonings (#43)
90 | - update abaplint @JohannesKonings (#40)
91 | - start of components docu @JohannesKonings (#38)
92 | - initial grafana tempo setting for local tests @JohannesKonings (#37)
93 | - logo for readme added @JohannesKonings (#35)
94 | - new folder local-tests with docker compose files @JohannesKonings (#34)
95 | - Add abap field keys @Goala (#32)
96 | - Add additional log systems @Goala (#31)
97 | - Remove files @Goala (#15)
98 | - architecture diagram updated @JohannesKonings (#14)
99 | - Update readme and package.json @Goala (#6)
100 | - readme typo fixed @JohannesKonings (#3)
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | MIT License
2 |
3 | Copyright (c) 2021 abap-observability-tools
4 |
5 | Permission is hereby granted, free of charge, to any person obtaining a copy
6 | of this software and associated documentation files (the "Software"), to deal
7 | in the Software without restriction, including without limitation the rights
8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 | copies of the Software, and to permit persons to whom the Software is
10 | furnished to do so, subject to the following conditions:
11 |
12 | The above copyright notice and this permission notice shall be included in all
13 | copies or substantial portions of the Software.
14 |
15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21 | SOFTWARE.
22 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | 
2 |
3 | # abap-log-exporter :construction: WIP
4 |
5 | [](https://snyk.io/test/github/Goala/abap-log-exporter?targetFile=package.json)
6 | 
7 | 
8 |
9 | # architecture
10 |
11 | 
12 |
13 | # documentation
14 |
15 | ## components
16 |
17 | | component | variant | status |
18 | | ----------------|----------------|---------|
19 | | reader | BAL | :heavy_check_mark: |
20 | | | SMICM | open |
21 | | | SM21 | [#41](https://github.com/abap-observability-tools/abap-log-exporter/issues/41) |
22 | | converter | GELF | :heavy_check_mark: |
23 | | | Loki | :heavy_check_mark: |
24 | | connector | GELF | :heavy_check_mark: |
25 | | | Loki | :heavy_check_mark: |
26 |
27 |
28 | ## customizing
29 |
30 | Different scenarios can be customized via transaction ZALE_CONFIG. This are the fields for each sceanrio
31 |
32 | | Field | Description |
33 | | ----------------|-------------------------------------|
34 | | reader class | class for the reader component |
35 | | converter class | class for the converter component |
36 | | connector url | URL to the log tool e.g. GrayLog |
37 | | connector class | class for the connector component |
38 |
39 | # local tests
40 |
41 | [local test folder](local-tests/)
42 |
43 | :warning: instead of localhost the URLs have to be customized with the IP of the Ethernet Adapter
44 |
--------------------------------------------------------------------------------
/abaplint.json:
--------------------------------------------------------------------------------
1 | {
2 | "global": {
3 | "files": "/src/**/*.*",
4 | "skipGeneratedGatewayClasses": true,
5 | "skipGeneratedPersistentClasses": true,
6 | "skipGeneratedFunctionGroups": true
7 | },
8 | "dependencies": [
9 | {
10 | "url": "https://github.com/abaplint/deps",
11 | "folder": "/deps",
12 | "files": "/src/**/*.*"
13 | }
14 | ],
15 | "syntax": {
16 | "version": "v754",
17 | "errorNamespace": "^(Z|Y)",
18 | "globalConstants": [],
19 | "globalMacros": []
20 | },
21 | "rules": {
22 | "7bit_ascii": {
23 | "exclude": [],
24 | "reason": ""
25 | },
26 | "allowed_object_naming": {
27 | "exclude": [],
28 | "reason": ""
29 | },
30 | "allowed_object_types": {
31 | "exclude": [],
32 | "reason": "",
33 | "allowed": []
34 | },
35 | "ambiguous_statement": {
36 | "exclude": [],
37 | "reason": ""
38 | },
39 | "avoid_use": {
40 | "exclude": [],
41 | "reason": "",
42 | "define": true,
43 | "endselect": true,
44 | "execSQL": true,
45 | "kernelCall": true,
46 | "communication": true,
47 | "statics": true,
48 | "systemCall": true,
49 | "defaultKey": false,
50 | "break": true
51 | },
52 | "begin_end_names": {
53 | "exclude": [],
54 | "reason": ""
55 | },
56 | "check_abstract": {
57 | "exclude": [],
58 | "reason": ""
59 | },
60 | "check_ddic": {
61 | "exclude": [],
62 | "reason": ""
63 | },
64 | "check_include": {
65 | "exclude": [],
66 | "reason": ""
67 | },
68 | "check_no_handler_pragma": {
69 | "exclude": [],
70 | "reason": ""
71 | },
72 | "check_syntax": {
73 | "exclude": [],
74 | "reason": ""
75 | },
76 | "check_text_elements": {
77 | "exclude": [],
78 | "reason": ""
79 | },
80 | "check_transformation_exists": {
81 | "exclude": [],
82 | "reason": ""
83 | },
84 | "cloud_types": {
85 | "exclude": [],
86 | "reason": ""
87 | },
88 | "colon_missing_space": {
89 | "exclude": [],
90 | "reason": ""
91 | },
92 | "commented_code": {
93 | "exclude": [],
94 | "reason": "",
95 | "allowIncludeInFugr": true
96 | },
97 | "constructor_visibility_public": {
98 | "exclude": [],
99 | "reason": ""
100 | },
101 | "contains_tab": {
102 | "exclude": [],
103 | "reason": ""
104 | },
105 | "definitions_top": {
106 | "exclude": [],
107 | "reason": ""
108 | },
109 | "description_empty": {
110 | "exclude": [],
111 | "reason": ""
112 | },
113 | "double_space": {
114 | "exclude": [],
115 | "reason": "",
116 | "keywords": true,
117 | "startParen": true,
118 | "endParen": true,
119 | "afterColon": true
120 | },
121 | "empty_line_in_statement": {
122 | "exclude": [],
123 | "reason": "",
124 | "allowChained": false
125 | },
126 | "empty_statement": {
127 | "exclude": [],
128 | "reason": ""
129 | },
130 | "empty_structure": {
131 | "exclude": [],
132 | "reason": "",
133 | "loop": true,
134 | "if": true,
135 | "while": true,
136 | "case": true,
137 | "select": true,
138 | "do": true,
139 | "at": true
140 | },
141 | "exit_or_check": {
142 | "exclude": [],
143 | "reason": ""
144 | },
145 | "exporting": {
146 | "exclude": [],
147 | "reason": ""
148 | },
149 | "forbidden_identifier": {
150 | "exclude": [],
151 | "reason": "",
152 | "check": []
153 | },
154 | "form_no_dash": {
155 | "exclude": [],
156 | "reason": ""
157 | },
158 | "form_tables_obsolete": {
159 | "exclude": [],
160 | "reason": ""
161 | },
162 | "fully_type_constants": {
163 | "exclude": [],
164 | "reason": "",
165 | "checkData": true
166 | },
167 | "functional_writing": {
168 | "exclude": [],
169 | "reason": "",
170 | "ignoreExceptions": true
171 | },
172 | "global_class": {
173 | "exclude": [],
174 | "reason": ""
175 | },
176 | "identical_form_names": {
177 | "exclude": [],
178 | "reason": ""
179 | },
180 | "if_in_if": {
181 | "exclude": [],
182 | "reason": ""
183 | },
184 | "in_statement_indentation": {
185 | "exclude": [],
186 | "reason": "",
187 | "ignoreExceptions": true
188 | },
189 | "indentation": {
190 | "exclude": [],
191 | "reason": "",
192 | "ignoreExceptions": true,
193 | "alignTryCatch": false,
194 | "globalClassSkipFirst": false,
195 | "ignoreGlobalClassDefinition": false,
196 | "ignoreGlobalInterface": false
197 | },
198 | "inline_data_old_versions": {
199 | "exclude": ["\\w"],
200 | "reason": ""
201 | },
202 | "keep_single_parameter_on_one_line": {
203 | "exclude": [],
204 | "reason": "",
205 | "length": 120
206 | },
207 | "keyword_case": {
208 | "exclude": [],
209 | "reason": "",
210 | "style": "upper",
211 | "ignoreExceptions": true,
212 | "ignoreLowerClassImplmentationStatement": true,
213 | "ignoreGlobalClassDefinition": false,
214 | "ignoreGlobalInterface": false,
215 | "ignoreFunctionModuleName": false
216 | },
217 | "line_only_punc": {
218 | "exclude": [],
219 | "reason": "",
220 | "ignoreExceptions": true
221 | },
222 | "local_class_naming": {
223 | "exclude": [],
224 | "reason": "",
225 | "patternKind": "required",
226 | "ignoreNames": [],
227 | "ignorePatterns": [],
228 | "local": "^LCL_.+$",
229 | "exception": "^LCX_.+$",
230 | "test": "^LTCL_.+$"
231 | },
232 | "local_testclass_location": {
233 | "exclude": [],
234 | "reason": ""
235 | },
236 | "main_file_contents": {
237 | "exclude": [],
238 | "reason": ""
239 | },
240 | "max_one_statement": {
241 | "exclude": [],
242 | "reason": ""
243 | },
244 | "message_exists": {
245 | "exclude": [],
246 | "reason": ""
247 | },
248 | "method_length": {
249 | "exclude": [],
250 | "reason": "",
251 | "statements": 100,
252 | "errorWhenEmpty": true,
253 | "ignoreTestClasses": false
254 | },
255 | "method_parameter_names": {
256 | "exclude": [],
257 | "reason": "",
258 | "patternKind": "required",
259 | "ignoreNames": [],
260 | "ignorePatterns": [],
261 | "ignoreExceptions": true,
262 | "importing": "\\w",
263 | "returning": "\\w",
264 | "changing": "\\w",
265 | "exporting": "\\w"
266 | },
267 | "mix_returning": {
268 | "exclude": [],
269 | "reason": ""
270 | },
271 | "msag_consistency": {
272 | "exclude": [],
273 | "reason": ""
274 | },
275 | "nesting": {
276 | "exclude": [],
277 | "reason": "",
278 | "depth": 5
279 | },
280 | "newline_between_methods": {
281 | "exclude": [],
282 | "reason": "",
283 | "count": 3,
284 | "logic": "less"
285 | },
286 | "no_public_attributes": {
287 | "exclude": [],
288 | "reason": "",
289 | "allowReadOnly": false
290 | },
291 | "object_naming": {
292 | "exclude": [],
293 | "reason": "",
294 | "patternKind": "required",
295 | "ignoreNames": [],
296 | "ignorePatterns": [],
297 | "clas": "^ZC(L|X)\\_",
298 | "intf": "^ZIF\\_",
299 | "prog": "^Z",
300 | "fugr": "^Z",
301 | "tabl": "^Z",
302 | "ttyp": "^Z",
303 | "dtel": "^Z",
304 | "doma": "^Z",
305 | "msag": "^Z",
306 | "tran": "^Z",
307 | "enqu": "^EZ",
308 | "auth": "^Z",
309 | "pinf": "^Z",
310 | "idoc": "^Z",
311 | "xslt": "^Z",
312 | "ssfo": "^Z",
313 | "ssst": "^Z"
314 | },
315 | "obsolete_statement": {
316 | "exclude": [],
317 | "reason": "",
318 | "refresh": true,
319 | "compute": true,
320 | "add": true,
321 | "subtract": true,
322 | "multiply": true,
323 | "move": true,
324 | "divide": true,
325 | "requested": true,
326 | "occurs": true,
327 | "setExtended": true
328 | },
329 | "parser_error": {
330 | "exclude": [],
331 | "reason": ""
332 | },
333 | "prefer_returning_to_exporting": {
334 | "exclude": [],
335 | "reason": ""
336 | },
337 | "preferred_compare_operator": {
338 | "exclude": [],
339 | "reason": "",
340 | "badOperators": [
341 | "EQ",
342 | "><",
343 | "NE",
344 | "GE",
345 | "GT",
346 | "LT",
347 | "LE"
348 | ]
349 | },
350 | "prefix_is_current_class": {
351 | "exclude": [],
352 | "reason": "",
353 | "omitMeInstanceCalls": false
354 | },
355 | "release_idoc": {
356 | "exclude": [],
357 | "reason": ""
358 | },
359 | "remove_descriptions": {
360 | "exclude": [],
361 | "reason": "",
362 | "ignoreExceptions": false
363 | },
364 | "rfc_error_handling": {
365 | "exclude": [],
366 | "reason": ""
367 | },
368 | "selection_screen_naming": {
369 | "exclude": [],
370 | "reason": "",
371 | "patternKind": "required",
372 | "ignoreNames": [],
373 | "ignorePatterns": [],
374 | "parameter": "\\w",
375 | "selectOption": "\\w"
376 | },
377 | "sequential_blank": {
378 | "exclude": [],
379 | "reason": "",
380 | "lines": 4
381 | },
382 | "short_case": {
383 | "exclude": [],
384 | "reason": "",
385 | "length": 1,
386 | "allow": []
387 | },
388 | "sicf_consistency": {
389 | "exclude": [],
390 | "reason": ""
391 | },
392 | "space_before_colon": {
393 | "exclude": [],
394 | "reason": ""
395 | },
396 | "space_before_dot": {
397 | "exclude": [],
398 | "reason": "",
399 | "ignoreGlobalDefinition": true,
400 | "ignoreExceptions": true
401 | },
402 | "sql_escape_host_variables": {
403 | "exclude": [],
404 | "reason": ""
405 | },
406 | "start_at_tab": {
407 | "exclude": [],
408 | "reason": ""
409 | },
410 | "superclass_final": {
411 | "exclude": [],
412 | "reason": ""
413 | },
414 | "tabl_enhancement_category": {
415 | "exclude": [],
416 | "reason": ""
417 | },
418 | "try_without_catch": {
419 | "exclude": [],
420 | "reason": ""
421 | },
422 | "type_begin_single_include": {
423 | "exclude": [],
424 | "reason": ""
425 | },
426 | "type_form_parameters": {
427 | "exclude": [],
428 | "reason": ""
429 | },
430 | "types_naming": {
431 | "exclude": [],
432 | "reason": "",
433 | "pattern": "\\w"
434 | },
435 | "unknown_types": {
436 | "exclude": ["\\w"],
437 | "reason": ""
438 | },
439 | "unreachable_code": {
440 | "exclude": [],
441 | "reason": ""
442 | },
443 | "use_new": {
444 | "exclude": [],
445 | "reason": ""
446 | },
447 | "when_others_last": {
448 | "exclude": [],
449 | "reason": ""
450 | },
451 | "whitespace_end": {
452 | "exclude": [],
453 | "reason": ""
454 | },
455 | "xml_consistency": {
456 | "exclude": [],
457 | "reason": ""
458 | }
459 | }
460 | }
461 |
--------------------------------------------------------------------------------
/architecture/architecture.planuml:
--------------------------------------------------------------------------------
1 | @startuml architecture
2 |
3 | database "BAL" {
4 | }
5 | database "SMICM" {
6 | }
7 | database "SM21" {
8 | }
9 |
10 | () "job scheduling" - program
11 |
12 | node "program" {
13 | BAL --> [log reader]
14 | SMICM --> [log reader]
15 | SM21 --> [log reader]
16 | [log reader] --> [log converter]
17 | [log converter] --> [log connector]
18 | }
19 |
20 | [customizing] --> [log reader]
21 | [customizing] --> [log converter]
22 | [customizing] --> [log connector]
23 |
24 | [log connector] --> [GELF]
25 | [log connector] --> [Loki]
26 | [log connector] --> [Fluentd]
27 | [log connector] ..> [Additional log systems]
28 |
29 |
30 | @enduml
--------------------------------------------------------------------------------
/docs/logo-abap-log-exporter-horizontal.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/abap-observability-tools/abap-log-exporter/951d9d00cd2dcef9f3ef61a94e70b4bca1d450f5/docs/logo-abap-log-exporter-horizontal.png
--------------------------------------------------------------------------------
/docs/logo-abap-log-exporter.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/abap-observability-tools/abap-log-exporter/951d9d00cd2dcef9f3ef61a94e70b4bca1d450f5/docs/logo-abap-log-exporter.png
--------------------------------------------------------------------------------
/local-tests/README.md:
--------------------------------------------------------------------------------
1 | # abap-log-exporter
2 | ## start
3 |
4 | ```
5 | docker-compose -f docker-compose-graylog.yml up
6 | docker-compose -f docker-compose-graylog4.yml up
7 | docker-compose -f docker-compose-grafana-loki.yml up
8 | docker-compose -f docker-compose-fluentd.yml up
9 | ```
10 |
11 | ## updates
12 |
13 | ### graylog
14 |
15 | plugins: https://docs.graylog.org/en/3.3/pages/integrations/setup.html
16 |
17 | ## utils
18 |
19 | ### Loki
20 |
21 | ```
22 | curl -v -H "Content-Type: application/json" -XPOST -s "http://localhost:3100/api/prom/push" --data-raw '{"streams": [{ "labels": "{foo=\"bar\"}", "entries": [{ "ts": "2020-04-11T14:01:06.801064-04:00", "line": "fizzbuzz" }] }]}'
23 | ```
24 |
25 | ### graylog
26 |
27 | ```
28 | curl -v -X POST -H 'Content-Type: application/json' -d '{ "version": "1.1", "host": "example.org", "short_message": "A short message", "level": 5, "_some_info": "foo" }' 'http://graylog:12201/gelf'
29 | ```
30 | ### fluentd
31 |
32 | ```
33 | curl -X POST -d 'json={"json":"message"}' http://localhost:9880/sample.test
34 | ```
35 |
36 | ## based on
37 |
38 | ### Loki
39 |
40 | https://github.com/grafana/loki/tree/master/production
41 |
42 | ### graylog
43 |
44 | https://hometechhacker.com/how-to-create-a-graylog-container-in-docker/
45 |
46 | https://mfyz.com/quick-and-dirty-set-up-graylog-in-5-minutes-with-docker/
47 |
48 | https://github.com/pecigonzalo/graylog-compose/blob/master/docker-compose.yml
49 |
50 | https://gist.github.com/Ghostbird/2365c64c6cb125566e1ee55737bedd5a
51 |
52 | https://docs.graylog.org/en/4.0/pages/installation/docker.html
53 |
54 | ### fluentd
55 |
56 | https://docs.fluentd.org/v/0.12/container-deployment/install-by-docker
57 |
--------------------------------------------------------------------------------
/local-tests/docker-compose-fluentd.yml:
--------------------------------------------------------------------------------
1 | version: '3.7'
2 | services:
3 | fluentd:
4 | image: fluent/fluentd
5 | volumes:
6 | - ./fluentd/conf:/fluentd/etc
7 | ports:
8 | - "9880:9880"
--------------------------------------------------------------------------------
/local-tests/docker-compose-grafana-loki.yml:
--------------------------------------------------------------------------------
1 | version: "3"
2 |
3 | networks:
4 | loki:
5 |
6 | services:
7 | loki:
8 | image: grafana/loki:2.1.0
9 | ports:
10 | - "3100:3100"
11 | command: -config.file=/etc/loki/local-config.yaml
12 | networks:
13 | - loki
14 |
15 | promtail:
16 | image: grafana/promtail:2.1.0
17 | volumes:
18 | - /var/log:/var/log
19 | command: -config.file=/etc/promtail/docker-config.yaml
20 | networks:
21 | - loki
22 |
23 | grafana:
24 | image: grafana/grafana:7.4.3
25 | ports:
26 | - "3000:3000"
27 | networks:
28 | - loki
29 | volumes:
30 | - ./grafana/provisioning/:/etc/grafana/provisioning/
31 |
32 | volumes:
33 | grafana_data: {}
--------------------------------------------------------------------------------
/local-tests/docker-compose-graylog.yml:
--------------------------------------------------------------------------------
1 | version: '3'
2 | services:
3 | mongodb:
4 | image: mongo:3
5 | elasticsearch:
6 | image: docker.elastic.co/elasticsearch/elasticsearch-oss:6.8.14
7 | environment:
8 | - http.host=0.0.0.0
9 | - transport.host=localhost
10 | - network.host=0.0.0.0
11 | - "ES_JAVA_OPTS=-Xms512m -Xmx512m"
12 | ulimits:
13 | memlock:
14 | soft: -1
15 | hard: -1
16 | mem_limit: 1g
17 | graylog:
18 | image: graylog/graylog:3.3.8
19 | environment:
20 | - GRAYLOG_PASSWORD_SECRET=mfyz11sanane22banane
21 | # Password: admin
22 | - GRAYLOG_ROOT_PASSWORD_SHA2=8c6976e5b5410415bde908bd4dee15dfb167a9c873fc4bb8a81f6f2ab448a918
23 | - GRAYLOG_HTTP_EXTERNAL_URI=http://127.0.0.1:9000/
24 | volumes:
25 | - ./graylog/plugin/:/usr/share/graylog/plugin/
26 | links:
27 | - mongodb:mongo
28 | - elasticsearch
29 | depends_on:
30 | - mongodb
31 | - elasticsearch
32 | ports:
33 | - 9000:9000 # Graylog web interface and REST API
34 | - 5555:5555 # Raw/Plaintext TCP
35 | - 1514:1514 # Syslog TCP
36 | - 1514:1514/udp # Syslog UDP
37 | - 12201:12201 # GELF TCP
38 | - 12201:12201/udp # GELF UDP
--------------------------------------------------------------------------------
/local-tests/docker-compose-graylog4.yml:
--------------------------------------------------------------------------------
1 | version: '3'
2 | services:
3 | # MongoDB: https://hub.docker.com/_/mongo/
4 | mongo:
5 | image: mongo:4.4.4
6 | networks:
7 | - graylog
8 | # Elasticsearch: https://www.elastic.co/guide/en/elasticsearch/reference/7.10/docker.html
9 | elasticsearch:
10 | image: docker.elastic.co/elasticsearch/elasticsearch-oss:7.10.2
11 | environment:
12 | - http.host=0.0.0.0
13 | - transport.host=localhost
14 | - network.host=0.0.0.0
15 | - "ES_JAVA_OPTS=-Xms512m -Xmx512m"
16 | ulimits:
17 | memlock:
18 | soft: -1
19 | hard: -1
20 | deploy:
21 | resources:
22 | limits:
23 | memory: 1g
24 | networks:
25 | - graylog
26 | # Graylog: https://hub.docker.com/r/graylog/graylog/
27 | graylog:
28 | image: graylog/graylog:4.0.3
29 | environment:
30 | # CHANGE ME (must be at least 16 characters)!
31 | - GRAYLOG_PASSWORD_SECRET=somepasswordpepper
32 | # Password: admin
33 | - GRAYLOG_ROOT_PASSWORD_SHA2=8c6976e5b5410415bde908bd4dee15dfb167a9c873fc4bb8a81f6f2ab448a918
34 | - GRAYLOG_HTTP_EXTERNAL_URI=http://localhost:9000/
35 | entrypoint: /usr/bin/tini -- wait-for-it elasticsearch:9200 -- /docker-entrypoint.sh
36 | networks:
37 | - graylog
38 | restart: always
39 | depends_on:
40 | - mongo
41 | - elasticsearch
42 | ports:
43 | # Graylog web interface and REST API
44 | - 9000:9000
45 | # Syslog TCP
46 | - 1514:1514
47 | # Syslog UDP
48 | - 1514:1514/udp
49 | # GELF TCP
50 | - 12201:12201
51 | # GELF UDP
52 | - 12201:12201/udp
53 | networks:
54 | graylog:
55 | driver: bridge
--------------------------------------------------------------------------------
/local-tests/fluentd/conf/fluent.conf:
--------------------------------------------------------------------------------
1 | # fluentd/conf/fluent.conf
2 | #https://docs.fluentd.org/v/0.12/input/http
3 |
4 | @type http
5 | port 9880
6 | bind 0.0.0.0
7 | body_size_limit 32m
8 | keepalive_timeout 10s
9 |
10 |
11 | @type stdout
12 |
--------------------------------------------------------------------------------
/local-tests/grafana/provisioning/datasources/loki.yml:
--------------------------------------------------------------------------------
1 | # config file version
2 | apiVersion: 1
3 |
4 | # list of datasources that should be deleted from the database
5 | deleteDatasources:
6 | - name: loki
7 | orgId: 1
8 |
9 | # list of datasources to insert/update depending
10 | # whats available in the database
11 | datasources:
12 | # name of the datasource. Required
13 | - name: loki
14 | # datasource type. Required
15 | type: loki
16 | # access mode. direct or proxy. Required
17 | access: proxy
18 | # org id. will default to orgId 1 if not specified
19 | orgId: 1
20 | # url
21 | url: http://loki:3100
22 | # database password, if used
23 | password: "admin"
24 | # database user, if used
25 | user: "admin"
26 | # database name, if used
27 | database: "loki"
28 | # enable/disable basic auth
29 | basicAuth: false
30 | # withCredentials:
31 | # mark as default datasource. Max one per org
32 | isDefault: true
33 | #