ecs-logging 0.1.0 → 0.2.0
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/.ci/Jenkinsfile +84 -0
- data/.ci/install-rbenv.sh +7 -0
- data/.ci/jobs/apm-agent-ruby.yml +4 -0
- data/.ci/jobs/defaults.yml +24 -0
- data/.ci/jobs/ecs-logging-ruby-mbp.yml +42 -0
- data/.github/labeler-config.yml +3 -0
- data/.github/workflows/labeler.yml +16 -0
- data/.gitignore +7 -0
- data/CHANGELOG.asciidoc +49 -0
- data/Dockerfile +40 -0
- data/Gemfile +1 -0
- data/README.md +33 -5
- data/bin/dev +55 -0
- data/docker-compose.yml +28 -0
- data/docker/entrypoint.sh +38 -0
- data/lib/ecs_logging/formatter.rb +4 -1
- data/lib/ecs_logging/logger.rb +26 -3
- data/lib/ecs_logging/middleware.rb +10 -5
- data/lib/ecs_logging/version.rb +1 -1
- metadata +15 -3
- data/Gemfile.lock +0 -50
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 43b9e37dc57c2eadf7ea3e27ba6ee4060d94e814dc4921e1262702927b9a8a12
|
4
|
+
data.tar.gz: a255a92fc7cf973b266ecc8e8eec64f599cba52c45b033c15920280ef590fd2d
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 0d47468fc499ebd03c1335a55a2d7c4f0b0dac14a92865d6a847c9c7dc10035ba067ae2c5c9a5469545483dc62d4f3f0429ac2232bbf054a64e97da258f87863
|
7
|
+
data.tar.gz: 37353532f52a56192916c791871eed288b57001a44df012f2a582cfb06f78c3dbe535f0fe478071e0a7dded74896679163f9d5b8388d7709e0504578b1cda7ef
|
data/.ci/Jenkinsfile
ADDED
@@ -0,0 +1,84 @@
|
|
1
|
+
#!/usr/bin/env groovy
|
2
|
+
@Library('apm@current') _
|
3
|
+
|
4
|
+
pipeline {
|
5
|
+
agent { label 'linux && immutable' }
|
6
|
+
environment {
|
7
|
+
REPO = 'ecs-logging-ruby'
|
8
|
+
BASE_DIR = "src/github.com/elastic/${env.REPO}"
|
9
|
+
DOCKER_REGISTRY = 'docker.elastic.co'
|
10
|
+
DOCKER_SECRET = 'secret/apm-team/ci/docker-registry/prod'
|
11
|
+
PIPELINE_LOG_LEVEL = 'INFO'
|
12
|
+
NOTIFY_TO = credentials('notify-to')
|
13
|
+
JOB_GCS_BUCKET = credentials('gcs-bucket')
|
14
|
+
VERSION = '2.7.2'
|
15
|
+
HOME = "${WORKSPACE}"
|
16
|
+
PATH = "${WORKSPACE}/.rbenv/bin:${WORKSPACE}/.rbenv/versions/${VERSION}/bin:${PATH}"
|
17
|
+
}
|
18
|
+
options {
|
19
|
+
timeout(time: 2, unit: 'HOURS')
|
20
|
+
buildDiscarder(logRotator(numToKeepStr: '20', artifactNumToKeepStr: '20', daysToKeepStr: '30'))
|
21
|
+
timestamps()
|
22
|
+
ansiColor('xterm')
|
23
|
+
disableResume()
|
24
|
+
durabilityHint('PERFORMANCE_OPTIMIZED')
|
25
|
+
rateLimitBuilds(throttle: [count: 60, durationName: 'hour', userBoost: true])
|
26
|
+
quietPeriod(10)
|
27
|
+
}
|
28
|
+
triggers {
|
29
|
+
issueCommentTrigger('(?i).*(?:jenkins\\W+)?run\\W+(?:the\\W+)?tests(?:\\W+please)?.*')
|
30
|
+
}
|
31
|
+
stages {
|
32
|
+
stage('Checkout') {
|
33
|
+
options { skipDefaultCheckout() }
|
34
|
+
steps {
|
35
|
+
pipelineManager([ cancelPreviousRunningBuilds: [ when: 'PR' ] ])
|
36
|
+
deleteDir()
|
37
|
+
gitCheckout(basedir: "${BASE_DIR}", githubNotifyFirstTimeContributor: true)
|
38
|
+
stash allowEmpty: true, name: 'source', useDefaultExcludes: false
|
39
|
+
}
|
40
|
+
}
|
41
|
+
stage('Tests') {
|
42
|
+
failFast false
|
43
|
+
matrix {
|
44
|
+
agent { label 'linux && docker && ubuntu-18.04 && immutable' }
|
45
|
+
options { skipDefaultCheckout() }
|
46
|
+
axes {
|
47
|
+
axis {
|
48
|
+
name 'RUBY_VERSION'
|
49
|
+
values 'ruby:2.7', 'ruby:2.6', 'ruby:2.5', 'ruby:2.4', 'ruby:2.3', 'jruby:9.2', 'jruby:9.1'
|
50
|
+
}
|
51
|
+
axis {
|
52
|
+
name 'FRAMEWORK'
|
53
|
+
values 'rails-6.0', 'rails-5.2', 'rails-5.1', 'sinatra-2.0'
|
54
|
+
}
|
55
|
+
}
|
56
|
+
stages {
|
57
|
+
stage('Tests') {
|
58
|
+
steps {
|
59
|
+
withGithubNotify(context: "Tests-${RUBY_VERSION}-${FRAMEWORK}") {
|
60
|
+
deleteDir()
|
61
|
+
unstash 'source'
|
62
|
+
dir("${BASE_DIR}"){
|
63
|
+
dockerLogin(secret: "${DOCKER_SECRET}", registry: "${DOCKER_REGISTRY}")
|
64
|
+
sh(label: 'install rbenv', script: '.ci/install-rbenv.sh "${VERSION}"')
|
65
|
+
sh("bin/dev -i${RUBY_VERSION} -f${FRAMEWORK}")
|
66
|
+
}
|
67
|
+
}
|
68
|
+
}
|
69
|
+
post {
|
70
|
+
always {
|
71
|
+
junit(allowEmptyResults: true, keepLongStdio: true, testResults: "${BASE_DIR}/spec/junit-reports/**/*-junit.xml")
|
72
|
+
}
|
73
|
+
}
|
74
|
+
}
|
75
|
+
}
|
76
|
+
}
|
77
|
+
}
|
78
|
+
}
|
79
|
+
post {
|
80
|
+
cleanup {
|
81
|
+
notifyBuildResult()
|
82
|
+
}
|
83
|
+
}
|
84
|
+
}
|
@@ -0,0 +1,7 @@
|
|
1
|
+
#!/usr/bin/env bash
|
2
|
+
VERSION=${1:-"2.7.2"}
|
3
|
+
export PATH="$HOME/.rbenv/bin:$PATH"
|
4
|
+
git clone https://github.com/rbenv/rbenv.git ~/.rbenv
|
5
|
+
git clone git@github.com:rbenv/ruby-build.git ~/.rbenv/plugins/ruby-buildCloning
|
6
|
+
eval "$(rbenv init -)"
|
7
|
+
rbenv install "${VERSION}"
|
@@ -0,0 +1,24 @@
|
|
1
|
+
---
|
2
|
+
|
3
|
+
##### GLOBAL METADATA
|
4
|
+
|
5
|
+
- meta:
|
6
|
+
cluster: apm-ci
|
7
|
+
|
8
|
+
##### JOB DEFAULTS
|
9
|
+
|
10
|
+
- job:
|
11
|
+
view: APM-CI
|
12
|
+
project-type: multibranch
|
13
|
+
logrotate:
|
14
|
+
daysToKeep: 30
|
15
|
+
numToKeep: 300
|
16
|
+
number-to-keep: '100'
|
17
|
+
days-to-keep: '30'
|
18
|
+
concurrent: true
|
19
|
+
node: linux
|
20
|
+
periodic-folder-trigger: 1w
|
21
|
+
prune-dead-branches: true
|
22
|
+
publishers:
|
23
|
+
- email:
|
24
|
+
recipients: infra-root+build@elastic.co
|
@@ -0,0 +1,42 @@
|
|
1
|
+
---
|
2
|
+
- job:
|
3
|
+
name: apm-agent-ruby/ecs-logging-ruby-mbp
|
4
|
+
display-name: ECS logging Ruby
|
5
|
+
description: ECS logging Ruby
|
6
|
+
script-path: .ci/Jenkinsfile
|
7
|
+
scm:
|
8
|
+
- github:
|
9
|
+
branch-discovery: no-pr
|
10
|
+
discover-pr-forks-strategy: merge-current
|
11
|
+
discover-pr-forks-trust: permission
|
12
|
+
discover-pr-origin: merge-current
|
13
|
+
discover-tags: true
|
14
|
+
notification-context: 'apm-ci'
|
15
|
+
repo: ecs-logging-ruby
|
16
|
+
repo-owner: elastic
|
17
|
+
credentials-id: 2a9602aa-ab9f-4e52-baf3-b71ca88469c7-UserAndToken
|
18
|
+
ssh-checkout:
|
19
|
+
credentials: f6c7695a-671e-4f4f-a331-acdce44ff9ba
|
20
|
+
build-strategies:
|
21
|
+
- tags:
|
22
|
+
ignore-tags-older-than: -1
|
23
|
+
ignore-tags-newer-than: -1
|
24
|
+
- regular-branches: true
|
25
|
+
- change-request:
|
26
|
+
ignore-target-only-changes: false
|
27
|
+
clean:
|
28
|
+
after: true
|
29
|
+
before: true
|
30
|
+
prune: true
|
31
|
+
shallow-clone: true
|
32
|
+
depth: 3
|
33
|
+
do-not-fetch-tags: true
|
34
|
+
submodule:
|
35
|
+
disable: false
|
36
|
+
recursive: true
|
37
|
+
parent-credentials: true
|
38
|
+
timeout: 100
|
39
|
+
reference-repo: /var/lib/jenkins/.git-references/ecs-logging-ruby.git
|
40
|
+
timeout: '15'
|
41
|
+
use-author: true
|
42
|
+
wipe-workspace: 'True'
|
@@ -0,0 +1,16 @@
|
|
1
|
+
name: "Issue Labeler"
|
2
|
+
on:
|
3
|
+
issues:
|
4
|
+
types: [opened]
|
5
|
+
pull_request_target:
|
6
|
+
types: [opened]
|
7
|
+
|
8
|
+
jobs:
|
9
|
+
triage:
|
10
|
+
runs-on: ubuntu-latest
|
11
|
+
steps:
|
12
|
+
- uses: AlexanderWert/issue-labeler@v2.3
|
13
|
+
with:
|
14
|
+
repo-token: "${{ secrets.GITHUB_TOKEN }}"
|
15
|
+
configuration-path: .github/labeler-config.yml
|
16
|
+
enable-versioned-regex: 0
|
data/.gitignore
CHANGED
data/CHANGELOG.asciidoc
ADDED
@@ -0,0 +1,49 @@
|
|
1
|
+
ifdef::env-github[]
|
2
|
+
NOTE: Release notes are best read in our documentation at
|
3
|
+
https://www.elastic.co/guide/en/apm/agent/ruby/current/release-notes.html[elastic.co]
|
4
|
+
endif::[]
|
5
|
+
|
6
|
+
////
|
7
|
+
[[release-notes-x.x.x]]
|
8
|
+
==== x.x.x (YYYY-MM-DD)
|
9
|
+
|
10
|
+
[float]
|
11
|
+
===== Breaking changes
|
12
|
+
- Breaking change
|
13
|
+
|
14
|
+
[float]
|
15
|
+
===== Deprecated
|
16
|
+
- Deprecation {pull}2526[#2526]
|
17
|
+
|
18
|
+
[float]
|
19
|
+
===== Added
|
20
|
+
- Feature {pull}2526[#2526]
|
21
|
+
|
22
|
+
[float]
|
23
|
+
===== Changed
|
24
|
+
- Change {pull}2526[#2526]
|
25
|
+
|
26
|
+
[float]
|
27
|
+
===== Fixed
|
28
|
+
- Fix {pull}2526[#2526]
|
29
|
+
|
30
|
+
[float]
|
31
|
+
[[unreleased]]
|
32
|
+
==== Unreleased
|
33
|
+
////
|
34
|
+
|
35
|
+
[[release-notes-0.x]]
|
36
|
+
=== ECS logging Ruby 0.x
|
37
|
+
|
38
|
+
[[release-notes-0.2.0]]
|
39
|
+
==== 0.2.0 (2020-12-09)
|
40
|
+
|
41
|
+
===== Added
|
42
|
+
|
43
|
+
- Use `include_origin` to attach stack traces to logs {pull}1[#1]
|
44
|
+
- More fields logged when using Rack middleware {pull}6[#6]
|
45
|
+
|
46
|
+
[[release-notes-0.1.0]]
|
47
|
+
==== 0.1.0 (2020-11-25)
|
48
|
+
|
49
|
+
Initial release
|
data/Dockerfile
ADDED
@@ -0,0 +1,40 @@
|
|
1
|
+
ARG RUBY_IMAGE
|
2
|
+
FROM ${RUBY_IMAGE}
|
3
|
+
|
4
|
+
ARG USER_ID_GROUP
|
5
|
+
ARG FRAMEWORKS
|
6
|
+
ARG VENDOR_PATH
|
7
|
+
ARG BUNDLER_VERSION
|
8
|
+
|
9
|
+
RUN apt-get update -qq \
|
10
|
+
&& apt-get install -qq -y --no-install-recommends \
|
11
|
+
build-essential libpq-dev git \
|
12
|
+
&& rm -rf /var/lib/apt/lists/*
|
13
|
+
|
14
|
+
# Configure bundler and PATH
|
15
|
+
ENV LANG=C.UTF-8
|
16
|
+
|
17
|
+
ENV GEM_HOME=$VENDOR_PATH
|
18
|
+
ENV BUNDLE_PATH=$GEM_HOME \
|
19
|
+
BUNDLE_JOBS=4 BUNDLE_RETRY=3
|
20
|
+
ENV BUNDLE_APP_CONFIG=$BUNDLE_PATH \
|
21
|
+
BUNDLE_BIN=$BUNDLE_PATH/bin
|
22
|
+
ENV PATH=/app/bin:$BUNDLE_BIN:$PATH
|
23
|
+
|
24
|
+
ENV FRAMEWORKS $FRAMEWORKS
|
25
|
+
ENV RUBY_IMAGE $RUBY_IMAGE
|
26
|
+
|
27
|
+
# Copy cached folder to speed up docker containers
|
28
|
+
COPY vendor /vendor
|
29
|
+
RUN chown -R $USER_ID_GROUP /vendor
|
30
|
+
USER $USER_ID_GROUP
|
31
|
+
|
32
|
+
# Upgrade RubyGems and install required Bundler version
|
33
|
+
RUN gem update --system && \
|
34
|
+
gem install bundler:$BUNDLER_VERSION
|
35
|
+
|
36
|
+
# Use unpatched, system version for more speed over less security
|
37
|
+
RUN gem install nokogiri -- --use-system-libraries
|
38
|
+
|
39
|
+
WORKDIR /app
|
40
|
+
|
data/Gemfile
CHANGED
data/README.md
CHANGED
@@ -1,12 +1,14 @@
|
|
1
1
|
# ecs-logging-ruby
|
2
2
|
|
3
|
+
[](https://apm-ci.elastic.co/job/apm-agent-ruby/job/ecs-logging-ruby-mbp/job/master/) [](https://rubygems.org/gems/ecs-logging)
|
4
|
+
|
3
5
|
This set of libraries allows you to transform your application logs to structured logs that comply with the [Elastic Common Schema (ECS)](https://www.elastic.co/guide/en/ecs/current/ecs-reference.html).
|
4
6
|
In combination with [filebeat](https://www.elastic.co/products/beats/filebeat) you can send your logs directly to Elasticsearch and leverage [Kibana's Logs UI](https://www.elastic.co/guide/en/infrastructure/guide/current/logs-ui-overview.html) to inspect all logs in one single place.
|
5
7
|
See [ecs-logging](https://github.com/elastic/ecs-logging) for other ECS logging libraries and more resources about ECS & logging.
|
6
8
|
|
7
9
|
---
|
8
10
|
|
9
|
-
**Please note** that this library is in a <
|
11
|
+
**Please note** that this library is in a <strong>pre-1.0</strong> version and backwards-incompatible changes might be introduced in future releases. While we strive to comply to [semver](https://semver.org/), we can not guarantee to avoid breaking changes in minor releases.
|
10
12
|
|
11
13
|
## Installation
|
12
14
|
|
@@ -32,7 +34,7 @@ Or install it yourself as:
|
|
32
34
|
require 'ecs/logger'
|
33
35
|
|
34
36
|
logger = Ecs::Logger.new($stdout)
|
35
|
-
logger.info
|
37
|
+
logger.info('my informative message')
|
36
38
|
logger.warn { 'be aware that…' }
|
37
39
|
logger.error('a_progname') { 'oh no!' }
|
38
40
|
```
|
@@ -48,7 +50,7 @@ Logs the following JSON to `$stdout`:
|
|
48
50
|
Additionally, it allows for adding additional keys to messages, eg:
|
49
51
|
|
50
52
|
```ruby
|
51
|
-
logger.info
|
53
|
+
logger.info('ok', labels: { my_label: 'value' }, 'trace.id': 'abc-xyz')
|
52
54
|
```
|
53
55
|
|
54
56
|
Logs:
|
@@ -64,6 +66,28 @@ Logs:
|
|
64
66
|
}
|
65
67
|
```
|
66
68
|
|
69
|
+
To include info about where the log was called, call the methods with `include_origin: true`, like:
|
70
|
+
|
71
|
+
```ruby
|
72
|
+
logger.warn('Hello!', include_origin: true)
|
73
|
+
```
|
74
|
+
|
75
|
+
Resulting in
|
76
|
+
|
77
|
+
```json
|
78
|
+
{
|
79
|
+
"@timestamp":"2020-11-24T13:32:21.331Z",
|
80
|
+
"log.level":"WARN",
|
81
|
+
"message":"Hello!",
|
82
|
+
"ecs.version":"1.4.0",
|
83
|
+
"log.origin": {
|
84
|
+
"file.line": 123,
|
85
|
+
"file.name": "my_file.rb",
|
86
|
+
"function": "call"
|
87
|
+
}
|
88
|
+
}
|
89
|
+
```
|
90
|
+
|
67
91
|
## Usage with Rack
|
68
92
|
|
69
93
|
```ruby
|
@@ -74,13 +98,17 @@ Example output:
|
|
74
98
|
|
75
99
|
```json
|
76
100
|
{
|
77
|
-
"@timestamp":"2020-
|
101
|
+
"@timestamp":"2020-12-07T13:44:04.568Z",
|
78
102
|
"log.level":"INFO",
|
79
103
|
"message":"GET /",
|
80
104
|
"ecs.version":"1.4.0",
|
105
|
+
"client":{
|
106
|
+
"address":"127.0.0.1"
|
107
|
+
},
|
81
108
|
"http":{
|
82
109
|
"request":{
|
83
|
-
"method":"GET"
|
110
|
+
"method":"GET",
|
111
|
+
"body.bytes":"0"
|
84
112
|
}
|
85
113
|
},
|
86
114
|
"url":{
|
data/bin/dev
ADDED
@@ -0,0 +1,55 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
# frozen_string_literal: true
|
3
|
+
|
4
|
+
require 'optparse'
|
5
|
+
|
6
|
+
options = {}
|
7
|
+
OptionParser.new do |opts|
|
8
|
+
opts.banner = 'Usage: bin/dev [options] [command]'
|
9
|
+
|
10
|
+
opts.on(
|
11
|
+
'-iIMAGE', '--image=IMAGE',
|
12
|
+
'Specify Docker image (eg. ruby:latest)'
|
13
|
+
) { |val| options[:image] = val }
|
14
|
+
|
15
|
+
opts.on(
|
16
|
+
'-fFRAMEWORKS', '--frameworks=FRAMEWORKS',
|
17
|
+
'Specify frameworks to test (eg. rails:master,sinatra)'
|
18
|
+
) { |val| options[:frameworks] = val }
|
19
|
+
|
20
|
+
opts.on(
|
21
|
+
'-s', '--skip-build',
|
22
|
+
'Skip building image'
|
23
|
+
) { |val| options[:skip_build] = val }
|
24
|
+
end.parse!
|
25
|
+
|
26
|
+
USER_ID_GROUP = %w[u g].map { |f| `id -#{f}`.chomp }.join(':')
|
27
|
+
|
28
|
+
RUBY_IMAGE = options.fetch(:image, 'ruby:latest')
|
29
|
+
FRAMEWORKS = options.fetch(:frameworks, 'rails')
|
30
|
+
|
31
|
+
IMAGE_PATH_SAFE = RUBY_IMAGE.tr(':', '_')
|
32
|
+
IMAGE_NAME = "apm-agent-ruby:#{IMAGE_PATH_SAFE}"
|
33
|
+
VENDOR_PATH = "/vendor/#{IMAGE_PATH_SAFE}"
|
34
|
+
|
35
|
+
def run(cmd)
|
36
|
+
"IMAGE_NAME=#{IMAGE_NAME} USER_ID_GROUP=#{USER_ID_GROUP} #{cmd}".tap do |str|
|
37
|
+
puts str
|
38
|
+
system str
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
unless options[:skip_build]
|
43
|
+
run 'docker-compose build ' \
|
44
|
+
" --build-arg RUBY_IMAGE=#{RUBY_IMAGE}" \
|
45
|
+
" --build-arg USER_ID_GROUP=#{USER_ID_GROUP}" \
|
46
|
+
" --build-arg FRAMEWORKS=#{FRAMEWORKS}" \
|
47
|
+
" --build-arg VENDOR_PATH=#{VENDOR_PATH}"
|
48
|
+
exit $?.exitstatus unless $?.success?
|
49
|
+
end
|
50
|
+
|
51
|
+
run 'docker-compose run' \
|
52
|
+
' --rm' \
|
53
|
+
" specs #{ARGV.join}"
|
54
|
+
|
55
|
+
exit $?.exitstatus unless $?.success?
|
data/docker-compose.yml
ADDED
@@ -0,0 +1,28 @@
|
|
1
|
+
---
|
2
|
+
version: '3.4'
|
3
|
+
|
4
|
+
services:
|
5
|
+
specs:
|
6
|
+
build:
|
7
|
+
context: .
|
8
|
+
args:
|
9
|
+
BUNDLER_VERSION: '2.0.2'
|
10
|
+
image: '$IMAGE_NAME'
|
11
|
+
environment:
|
12
|
+
HOME: '/tmp'
|
13
|
+
entrypoint:
|
14
|
+
'docker/entrypoint.sh'
|
15
|
+
tty: true
|
16
|
+
volumes:
|
17
|
+
- .:/app:cached
|
18
|
+
tmpfs:
|
19
|
+
- /tmp:exec,mode=1777
|
20
|
+
user: ${USER_ID_GROUP}
|
21
|
+
|
22
|
+
ruby_rspec:
|
23
|
+
image: apm-agent-ruby:${RUBY_VERSION}
|
24
|
+
user: ${USER_ID_GROUP}
|
25
|
+
|
26
|
+
volumes:
|
27
|
+
vendor:
|
28
|
+
|
@@ -0,0 +1,38 @@
|
|
1
|
+
#!/bin/bash
|
2
|
+
set -x
|
3
|
+
|
4
|
+
runRspec(){
|
5
|
+
local case=${1:-""}
|
6
|
+
local bn=${case}
|
7
|
+
|
8
|
+
if [ -n "${case}" ]; then
|
9
|
+
bn="$(basename "${case}")/"
|
10
|
+
fi
|
11
|
+
if [ -n "${RUBY_VERSION}" ]; then
|
12
|
+
bn="$RUBY_VERSION-$bn"
|
13
|
+
fi
|
14
|
+
if [ -n "${FRAMEWORKS}" ]; then
|
15
|
+
bn="$FRAMEWORKS-$bn"
|
16
|
+
fi
|
17
|
+
bundle exec rspec \
|
18
|
+
-f progress \
|
19
|
+
-r yarjuf -f JUnit -o "spec/junit-reports/${bn}ruby-agent-junit.xml" ${case}
|
20
|
+
}
|
21
|
+
|
22
|
+
bundle check || (rm -f Gemfile.lock && bundle)
|
23
|
+
|
24
|
+
# If first arg is a spec path, run spec(s)
|
25
|
+
if [[ $1 == spec/* ]]; then
|
26
|
+
runRspec $@
|
27
|
+
exit $?
|
28
|
+
fi
|
29
|
+
|
30
|
+
# If no arguments, run all specs
|
31
|
+
if [[ $# == 0 ]]; then
|
32
|
+
runRspec
|
33
|
+
exit $?
|
34
|
+
fi
|
35
|
+
|
36
|
+
# Otherwise, run args as command
|
37
|
+
$@
|
38
|
+
|
@@ -17,6 +17,9 @@
|
|
17
17
|
|
18
18
|
# frozen_string_literal: true
|
19
19
|
|
20
|
+
require 'time'
|
21
|
+
require 'json'
|
22
|
+
|
20
23
|
module EcsLogging
|
21
24
|
class Formatter
|
22
25
|
def call(severity, time, progname, msg, **extras)
|
@@ -27,7 +30,7 @@ module EcsLogging
|
|
27
30
|
"ecs.version": "1.4.0"
|
28
31
|
}
|
29
32
|
|
30
|
-
base['
|
33
|
+
base['log.logger'] = progname if progname
|
31
34
|
|
32
35
|
base.merge!(extras) if extras
|
33
36
|
|
data/lib/ecs_logging/logger.rb
CHANGED
@@ -19,6 +19,7 @@
|
|
19
19
|
|
20
20
|
require "logger"
|
21
21
|
require "ecs_logging/formatter"
|
22
|
+
require 'pp'
|
22
23
|
|
23
24
|
module EcsLogging
|
24
25
|
class Logger < ::Logger
|
@@ -27,7 +28,7 @@ module EcsLogging
|
|
27
28
|
self.formatter = Formatter.new
|
28
29
|
end
|
29
30
|
|
30
|
-
def add(severity, message = nil, progname = nil, **extras)
|
31
|
+
def add(severity, message = nil, progname = nil, include_origin: false, **extras)
|
31
32
|
severity ||= UNKNOWN
|
32
33
|
|
33
34
|
return true if @logdev.nil? or severity < level
|
@@ -55,12 +56,34 @@ module EcsLogging
|
|
55
56
|
true
|
56
57
|
end
|
57
58
|
|
58
|
-
|
59
|
-
|
59
|
+
%w[unknown fatal error warn info debug].each do |severity|
|
60
|
+
define_method(severity) do |progname, include_origin: false, **extras, &block|
|
61
|
+
if include_origin && origin = origin_from_caller(caller)
|
62
|
+
extras[:"log.origin"] = origin
|
63
|
+
end
|
64
|
+
|
65
|
+
name = severity.upcase.to_sym
|
66
|
+
cnst = self.class.const_get(name)
|
67
|
+
add(cnst, nil, progname, **extras, &block)
|
68
|
+
end
|
60
69
|
end
|
61
70
|
|
62
71
|
private
|
63
72
|
|
73
|
+
RUBY_FORMAT = /^(.+?):(\d+)(?::in `(.+?)')?$/.freeze
|
74
|
+
|
75
|
+
def origin_from_caller(stack)
|
76
|
+
return unless (ruby_match = stack.first.match(RUBY_FORMAT))
|
77
|
+
|
78
|
+
_, file, number, method = ruby_match.to_a
|
79
|
+
|
80
|
+
{
|
81
|
+
'file.name': File.basename(file),
|
82
|
+
'file.line': number.to_i,
|
83
|
+
function: method
|
84
|
+
}
|
85
|
+
end
|
86
|
+
|
64
87
|
def format_message(severity, datetime, progname, msg, **extras)
|
65
88
|
formatter.call(severity, datetime, progname, msg, **extras)
|
66
89
|
end
|
@@ -43,11 +43,8 @@ module EcsLogging
|
|
43
43
|
severity = status >= 500 ? Logger::ERROR : Logger::INFO
|
44
44
|
|
45
45
|
extras = {
|
46
|
-
|
47
|
-
|
48
|
-
method: req_method
|
49
|
-
}
|
50
|
-
},
|
46
|
+
client: { address: env["REMOTE_ADDR"] },
|
47
|
+
http: { request: { method: req_method } },
|
51
48
|
url: {
|
52
49
|
domain: env['HTTP_HOST'],
|
53
50
|
path: path,
|
@@ -56,6 +53,14 @@ module EcsLogging
|
|
56
53
|
}
|
57
54
|
}
|
58
55
|
|
56
|
+
if content_length = env["CONTENT_LENGTH"]
|
57
|
+
extras[:http][:request][:'body.bytes'] = content_length
|
58
|
+
end
|
59
|
+
|
60
|
+
if user_agent = env['HTTP_USER_AGENT']
|
61
|
+
extras[:user_agent] = { original: user_agent }
|
62
|
+
end
|
63
|
+
|
59
64
|
@logger.add(severity, message, **extras)
|
60
65
|
end
|
61
66
|
end
|
data/lib/ecs_logging/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ecs-logging
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Mikkel Malmberg
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2020-
|
11
|
+
date: 2020-12-09 00:00:00.000000000 Z
|
12
12
|
dependencies: []
|
13
13
|
description: Write a longer description or delete this line.
|
14
14
|
email:
|
@@ -17,14 +17,25 @@ executables: []
|
|
17
17
|
extensions: []
|
18
18
|
extra_rdoc_files: []
|
19
19
|
files:
|
20
|
+
- ".ci/Jenkinsfile"
|
21
|
+
- ".ci/install-rbenv.sh"
|
22
|
+
- ".ci/jobs/apm-agent-ruby.yml"
|
23
|
+
- ".ci/jobs/defaults.yml"
|
24
|
+
- ".ci/jobs/ecs-logging-ruby-mbp.yml"
|
25
|
+
- ".github/labeler-config.yml"
|
26
|
+
- ".github/workflows/labeler.yml"
|
20
27
|
- ".gitignore"
|
21
28
|
- ".rspec"
|
22
29
|
- ".travis.yml"
|
30
|
+
- CHANGELOG.asciidoc
|
31
|
+
- Dockerfile
|
23
32
|
- Gemfile
|
24
|
-
- Gemfile.lock
|
25
33
|
- LICENSE
|
26
34
|
- README.md
|
27
35
|
- Rakefile
|
36
|
+
- bin/dev
|
37
|
+
- docker-compose.yml
|
38
|
+
- docker/entrypoint.sh
|
28
39
|
- ecs-logging.gemspec
|
29
40
|
- lib/ecs-logging.rb
|
30
41
|
- lib/ecs_logging.rb
|
@@ -33,6 +44,7 @@ files:
|
|
33
44
|
- lib/ecs_logging/logger.rb
|
34
45
|
- lib/ecs_logging/middleware.rb
|
35
46
|
- lib/ecs_logging/version.rb
|
47
|
+
- vendor/.gitkeep
|
36
48
|
homepage: https://github.com/elastic/ecs-logging-ruby
|
37
49
|
licenses:
|
38
50
|
- Apache-2.0
|
data/Gemfile.lock
DELETED
@@ -1,50 +0,0 @@
|
|
1
|
-
PATH
|
2
|
-
remote: .
|
3
|
-
specs:
|
4
|
-
ecs-logging (0.1.0)
|
5
|
-
|
6
|
-
GEM
|
7
|
-
remote: https://rubygems.org/
|
8
|
-
specs:
|
9
|
-
diff-lcs (1.4.4)
|
10
|
-
mustermann (1.1.1)
|
11
|
-
ruby2_keywords (~> 0.0.1)
|
12
|
-
rack (2.2.3)
|
13
|
-
rack-protection (2.1.0)
|
14
|
-
rack
|
15
|
-
rack-test (1.1.0)
|
16
|
-
rack (>= 1.0, < 3)
|
17
|
-
rake (13.0.1)
|
18
|
-
rspec (3.10.0)
|
19
|
-
rspec-core (~> 3.10.0)
|
20
|
-
rspec-expectations (~> 3.10.0)
|
21
|
-
rspec-mocks (~> 3.10.0)
|
22
|
-
rspec-core (3.10.0)
|
23
|
-
rspec-support (~> 3.10.0)
|
24
|
-
rspec-expectations (3.10.0)
|
25
|
-
diff-lcs (>= 1.2.0, < 2.0)
|
26
|
-
rspec-support (~> 3.10.0)
|
27
|
-
rspec-mocks (3.10.0)
|
28
|
-
diff-lcs (>= 1.2.0, < 2.0)
|
29
|
-
rspec-support (~> 3.10.0)
|
30
|
-
rspec-support (3.10.0)
|
31
|
-
ruby2_keywords (0.0.2)
|
32
|
-
sinatra (2.1.0)
|
33
|
-
mustermann (~> 1.0)
|
34
|
-
rack (~> 2.2)
|
35
|
-
rack-protection (= 2.1.0)
|
36
|
-
tilt (~> 2.0)
|
37
|
-
tilt (2.0.10)
|
38
|
-
|
39
|
-
PLATFORMS
|
40
|
-
ruby
|
41
|
-
|
42
|
-
DEPENDENCIES
|
43
|
-
ecs-logging!
|
44
|
-
rack-test
|
45
|
-
rake
|
46
|
-
rspec
|
47
|
-
sinatra
|
48
|
-
|
49
|
-
BUNDLED WITH
|
50
|
-
2.1.4
|