logstash-input-beats 3.1.15-java → 3.1.17-java
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/CHANGELOG.md +4 -0
- data/Gemfile +7 -1
- data/VERSION +1 -1
- data/docs/index.asciidoc +240 -0
- data/lib/logstash-input-beats_jars.rb +1 -1
- data/lib/logstash/inputs/beats.rb +10 -0
- data/lib/logstash/inputs/beats/message_listener.rb +17 -0
- data/lib/tasks/build.rake +1 -1
- data/logstash-input-beats.gemspec +1 -1
- data/spec/inputs/beats/message_listener_spec.rb +26 -0
- data/vendor/jar-dependencies/org/logstash/beats/logstash-input-beats/3.1.17/logstash-input-beats-3.1.17.jar +0 -0
- metadata +52 -51
- data/vendor/jar-dependencies/org/logstash/beats/logstash-input-beats/3.1.15/logstash-input-beats-3.1.15.jar +0 -0
    
        checksums.yaml
    CHANGED
    
    | @@ -1,7 +1,7 @@ | |
| 1 1 | 
             
            ---
         | 
| 2 2 | 
             
            SHA1:
         | 
| 3 | 
            -
              metadata.gz:  | 
| 4 | 
            -
              data.tar.gz:  | 
| 3 | 
            +
              metadata.gz: 5705ed7e37b0878e836c68f0e322e6117347a712
         | 
| 4 | 
            +
              data.tar.gz: dd0293c09e6f3b137f1804fd2537c77e130be2f5
         | 
| 5 5 | 
             
            SHA512:
         | 
| 6 | 
            -
              metadata.gz:  | 
| 7 | 
            -
              data.tar.gz:  | 
| 6 | 
            +
              metadata.gz: b2182c00ddc8c54c1bd7e769fc1caf4dce9e8f1bf6731aa8e7bcf8fec36790c05427c77383a1fd37f4a6e9a7f283f32d92494837900c75f50d284fdc411a03bc
         | 
| 7 | 
            +
              data.tar.gz: 1c61a23450770b28e5680a4764242213dd07633860bcda603b5ba9fcc9cb673f9119f021bf82972554ef32869d8bdb0aa9f8fa23c724e51743ccb17e1e1a95aa
         | 
    
        data/CHANGELOG.md
    CHANGED
    
    | @@ -1,3 +1,7 @@ | |
| 1 | 
            +
            ## 3.1.17
         | 
| 2 | 
            +
             - Docs: Add note indicating that the multiline codec should not be used with the Beats input plugin
         | 
| 3 | 
            +
             - Deprecate warning for multiline codec with the Beats input plugin
         | 
| 4 | 
            +
             | 
| 1 5 | 
             
            ## 3.1.15
         | 
| 2 6 | 
             
             - DEBUG: Add information about the remote when an exception is catched #192
         | 
| 3 7 |  | 
    
        data/Gemfile
    CHANGED
    
    | @@ -1,4 +1,10 @@ | |
| 1 1 | 
             
            source 'https://rubygems.org'
         | 
| 2 2 |  | 
| 3 | 
            -
            # Specify your gem's dependencies in logstash-mass_effect.gemspec
         | 
| 4 3 | 
             
            gemspec
         | 
| 4 | 
            +
             | 
| 5 | 
            +
            logstash_path = "../../logstash"
         | 
| 6 | 
            +
             | 
| 7 | 
            +
            if Dir.exist?(logstash_path) && ENV["LOGSTASH_SOURCE"] == "1"
         | 
| 8 | 
            +
              gem 'logstash-core', :path => "#{logstash_path}/logstash-core"
         | 
| 9 | 
            +
              gem 'logstash-core-plugin-api', :path => "#{logstash_path}/logstash-core-plugin-api"
         | 
| 10 | 
            +
            end
         | 
    
        data/VERSION
    CHANGED
    
    | @@ -1 +1 @@ | |
| 1 | 
            -
            3.1. | 
| 1 | 
            +
            3.1.17
         | 
    
        data/docs/index.asciidoc
    ADDED
    
    | @@ -0,0 +1,240 @@ | |
| 1 | 
            +
            :plugin: beats
         | 
| 2 | 
            +
            :type: input
         | 
| 3 | 
            +
             | 
| 4 | 
            +
            ///////////////////////////////////////////
         | 
| 5 | 
            +
            START - GENERATED VARIABLES, DO NOT EDIT!
         | 
| 6 | 
            +
            ///////////////////////////////////////////
         | 
| 7 | 
            +
            :version: %VERSION%
         | 
| 8 | 
            +
            :release_date: %RELEASE_DATE%
         | 
| 9 | 
            +
            :changelog_url: %CHANGELOG_URL%
         | 
| 10 | 
            +
            :include_path: ../../../logstash/docs/include
         | 
| 11 | 
            +
            ///////////////////////////////////////////
         | 
| 12 | 
            +
            END - GENERATED VARIABLES, DO NOT EDIT!
         | 
| 13 | 
            +
            ///////////////////////////////////////////
         | 
| 14 | 
            +
             | 
| 15 | 
            +
            [id="plugins-{type}-{plugin}"]
         | 
| 16 | 
            +
             | 
| 17 | 
            +
            === Beats
         | 
| 18 | 
            +
             | 
| 19 | 
            +
            include::{include_path}/plugin_header.asciidoc[]
         | 
| 20 | 
            +
             | 
| 21 | 
            +
            ==== Description
         | 
| 22 | 
            +
             | 
| 23 | 
            +
            This input plugin enables Logstash to receive events from the
         | 
| 24 | 
            +
            https://www.elastic.co/products/beats[Elastic Beats] framework.
         | 
| 25 | 
            +
             | 
| 26 | 
            +
            The following example shows how to configure Logstash to listen on port
         | 
| 27 | 
            +
            5044 for incoming Beats connections and to index into Elasticsearch:
         | 
| 28 | 
            +
             | 
| 29 | 
            +
            [source,ruby]
         | 
| 30 | 
            +
            ------------------------------------------------------------------------------
         | 
| 31 | 
            +
            input {
         | 
| 32 | 
            +
              beats {
         | 
| 33 | 
            +
                port => 5044
         | 
| 34 | 
            +
              }
         | 
| 35 | 
            +
            }
         | 
| 36 | 
            +
             | 
| 37 | 
            +
            output {
         | 
| 38 | 
            +
              elasticsearch {
         | 
| 39 | 
            +
                hosts => "localhost:9200"
         | 
| 40 | 
            +
                manage_template => false
         | 
| 41 | 
            +
                index => "%{[@metadata][beat]}-%{+YYYY.MM.dd}"
         | 
| 42 | 
            +
                document_type => "%{[@metadata][type]}"
         | 
| 43 | 
            +
              }
         | 
| 44 | 
            +
            }
         | 
| 45 | 
            +
            ------------------------------------------------------------------------------
         | 
| 46 | 
            +
             | 
| 47 | 
            +
            NOTE: The Beats shipper automatically sets the `type` field on the event.
         | 
| 48 | 
            +
            You cannot override this setting in the Logstash config. If you specify
         | 
| 49 | 
            +
            a setting for the <<plugins-inputs-beats-type,`type`>> config option in
         | 
| 50 | 
            +
            Logstash, it is ignored.
         | 
| 51 | 
            +
             | 
| 52 | 
            +
            IMPORTANT: If you are shipping events that span multiple lines, you need to
         | 
| 53 | 
            +
            use the configuration options available in Filebeat to handle multiline events
         | 
| 54 | 
            +
            before sending the event data to Logstash. You cannot use the
         | 
| 55 | 
            +
            <<plugins-codecs-multiline>> codec to handle multiline events. Doing so may
         | 
| 56 | 
            +
            result in the mixing of streams and corrupted event data. 
         | 
| 57 | 
            +
             | 
| 58 | 
            +
             | 
| 59 | 
            +
            [id="plugins-{type}s-{plugin}-options"]
         | 
| 60 | 
            +
            ==== Beats Input Configuration Options
         | 
| 61 | 
            +
             | 
| 62 | 
            +
            This plugin supports the following configuration options plus the <<plugins-{type}s-common-options>> described later.
         | 
| 63 | 
            +
             | 
| 64 | 
            +
            [cols="<,<,<",options="header",]
         | 
| 65 | 
            +
            |=======================================================================
         | 
| 66 | 
            +
            |Setting |Input type|Required
         | 
| 67 | 
            +
            | <<plugins-{type}s-{plugin}-cipher_suites>> |<<array,array>>|No
         | 
| 68 | 
            +
            | <<plugins-{type}s-{plugin}-client_inactivity_timeout>> |<<number,number>>|No
         | 
| 69 | 
            +
            | <<plugins-{type}s-{plugin}-host>> |<<string,string>>|No
         | 
| 70 | 
            +
            | <<plugins-{type}s-{plugin}-include_codec_tag>> |<<boolean,boolean>>|No
         | 
| 71 | 
            +
            | <<plugins-{type}s-{plugin}-port>> |<<number,number>>|Yes
         | 
| 72 | 
            +
            | <<plugins-{type}s-{plugin}-ssl>> |<<boolean,boolean>>|No
         | 
| 73 | 
            +
            | <<plugins-{type}s-{plugin}-ssl_certificate>> |a valid filesystem path|No
         | 
| 74 | 
            +
            | <<plugins-{type}s-{plugin}-ssl_certificate_authorities>> |<<array,array>>|No
         | 
| 75 | 
            +
            | <<plugins-{type}s-{plugin}-ssl_handshake_timeout>> |<<number,number>>|No
         | 
| 76 | 
            +
            | <<plugins-{type}s-{plugin}-ssl_key>> |a valid filesystem path|No
         | 
| 77 | 
            +
            | <<plugins-{type}s-{plugin}-ssl_key_passphrase>> |<<password,password>>|No
         | 
| 78 | 
            +
            | <<plugins-{type}s-{plugin}-ssl_verify_mode>> |<<string,string>>, one of `["none", "peer", "force_peer"]`|No
         | 
| 79 | 
            +
            | <<plugins-{type}s-{plugin}-tls_max_version>> |<<number,number>>|No
         | 
| 80 | 
            +
            | <<plugins-{type}s-{plugin}-tls_min_version>> |<<number,number>>|No
         | 
| 81 | 
            +
            |=======================================================================
         | 
| 82 | 
            +
             | 
| 83 | 
            +
            Also see <<plugins-{type}s-common-options>> for a list of options supported by all
         | 
| 84 | 
            +
            input plugins.
         | 
| 85 | 
            +
             | 
| 86 | 
            +
             
         | 
| 87 | 
            +
             | 
| 88 | 
            +
            [id="plugins-{type}s-{plugin}-cipher_suites"]
         | 
| 89 | 
            +
            ===== `cipher_suites` 
         | 
| 90 | 
            +
             | 
| 91 | 
            +
              * Value type is <<array,array>>
         | 
| 92 | 
            +
              * Default value is `java.lang.String[TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384, TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384, TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256, TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256, TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384, TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384, TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256]@459cfcca`
         | 
| 93 | 
            +
             | 
| 94 | 
            +
            The list of ciphers suite to use, listed by priorities.
         | 
| 95 | 
            +
             | 
| 96 | 
            +
            [id="plugins-{type}s-{plugin}-client_inactivity_timeout"]
         | 
| 97 | 
            +
            ===== `client_inactivity_timeout` 
         | 
| 98 | 
            +
             | 
| 99 | 
            +
              * Value type is <<number,number>>
         | 
| 100 | 
            +
              * Default value is `60`
         | 
| 101 | 
            +
             | 
| 102 | 
            +
            Close Idle clients after X seconds of inactivity.
         | 
| 103 | 
            +
             | 
| 104 | 
            +
            [id="plugins-{type}s-{plugin}-congestion_threshold"]
         | 
| 105 | 
            +
            ===== `congestion_threshold`  (DEPRECATED)
         | 
| 106 | 
            +
             | 
| 107 | 
            +
              * DEPRECATED WARNING: This configuration item is deprecated and may not be available in future versions.
         | 
| 108 | 
            +
              * Value type is <<number,number>>
         | 
| 109 | 
            +
              * Default value is `5`
         | 
| 110 | 
            +
             | 
| 111 | 
            +
            The number of seconds before we raise a timeout. 
         | 
| 112 | 
            +
            This option is useful to control how much time to wait if something is blocking the pipeline.
         | 
| 113 | 
            +
             | 
| 114 | 
            +
            [id="plugins-{type}s-{plugin}-host"]
         | 
| 115 | 
            +
            ===== `host` 
         | 
| 116 | 
            +
             | 
| 117 | 
            +
              * Value type is <<string,string>>
         | 
| 118 | 
            +
              * Default value is `"0.0.0.0"`
         | 
| 119 | 
            +
             | 
| 120 | 
            +
            The IP address to listen on.
         | 
| 121 | 
            +
             | 
| 122 | 
            +
            [id="plugins-{type}s-{plugin}-include_codec_tag"]
         | 
| 123 | 
            +
            ===== `include_codec_tag` 
         | 
| 124 | 
            +
             | 
| 125 | 
            +
              * Value type is <<boolean,boolean>>
         | 
| 126 | 
            +
              * Default value is `true`
         | 
| 127 | 
            +
             | 
| 128 | 
            +
             | 
| 129 | 
            +
             | 
| 130 | 
            +
            [id="plugins-{type}s-{plugin}-port"]
         | 
| 131 | 
            +
            ===== `port` 
         | 
| 132 | 
            +
             | 
| 133 | 
            +
              * This is a required setting.
         | 
| 134 | 
            +
              * Value type is <<number,number>>
         | 
| 135 | 
            +
              * There is no default value for this setting.
         | 
| 136 | 
            +
             | 
| 137 | 
            +
            The port to listen on.
         | 
| 138 | 
            +
             | 
| 139 | 
            +
            [id="plugins-{type}s-{plugin}-ssl"]
         | 
| 140 | 
            +
            ===== `ssl` 
         | 
| 141 | 
            +
             | 
| 142 | 
            +
              * Value type is <<boolean,boolean>>
         | 
| 143 | 
            +
              * Default value is `false`
         | 
| 144 | 
            +
             | 
| 145 | 
            +
            Events are by default sent in plain text. You can
         | 
| 146 | 
            +
            enable encryption by setting `ssl` to true and configuring
         | 
| 147 | 
            +
            the `ssl_certificate` and `ssl_key` options.
         | 
| 148 | 
            +
             | 
| 149 | 
            +
            [id="plugins-{type}s-{plugin}-ssl_certificate"]
         | 
| 150 | 
            +
            ===== `ssl_certificate` 
         | 
| 151 | 
            +
             | 
| 152 | 
            +
              * Value type is <<path,path>>
         | 
| 153 | 
            +
              * There is no default value for this setting.
         | 
| 154 | 
            +
             | 
| 155 | 
            +
            SSL certificate to use.
         | 
| 156 | 
            +
             | 
| 157 | 
            +
            [id="plugins-{type}s-{plugin}-ssl_certificate_authorities"]
         | 
| 158 | 
            +
            ===== `ssl_certificate_authorities` 
         | 
| 159 | 
            +
             | 
| 160 | 
            +
              * Value type is <<array,array>>
         | 
| 161 | 
            +
              * Default value is `[]`
         | 
| 162 | 
            +
             | 
| 163 | 
            +
            Validate client certificates against these authorities. 
         | 
| 164 | 
            +
            You can define multiple files or paths. All the certificates will
         | 
| 165 | 
            +
            be read and added to the trust store. You need to configure the `ssl_verify_mode`
         | 
| 166 | 
            +
            to `peer` or `force_peer` to enable the verification.
         | 
| 167 | 
            +
             | 
| 168 | 
            +
             | 
| 169 | 
            +
            [id="plugins-{type}s-{plugin}-ssl_handshake_timeout"]
         | 
| 170 | 
            +
            ===== `ssl_handshake_timeout` 
         | 
| 171 | 
            +
             | 
| 172 | 
            +
              * Value type is <<number,number>>
         | 
| 173 | 
            +
              * Default value is `10000`
         | 
| 174 | 
            +
             | 
| 175 | 
            +
            Time in milliseconds for an incomplete ssl handshake to timeout
         | 
| 176 | 
            +
             | 
| 177 | 
            +
            [id="plugins-{type}s-{plugin}-ssl_key"]
         | 
| 178 | 
            +
            ===== `ssl_key` 
         | 
| 179 | 
            +
             | 
| 180 | 
            +
              * Value type is <<path,path>>
         | 
| 181 | 
            +
              * There is no default value for this setting.
         | 
| 182 | 
            +
             | 
| 183 | 
            +
            SSL key to use.
         | 
| 184 | 
            +
            NOTE: This key need to be in the PKCS8 format, you can convert it with https://www.openssl.org/docs/man1.1.0/apps/pkcs8.html[OpenSSL]
         | 
| 185 | 
            +
            for more information.
         | 
| 186 | 
            +
             | 
| 187 | 
            +
            [id="plugins-{type}s-{plugin}-ssl_key_passphrase"]
         | 
| 188 | 
            +
            ===== `ssl_key_passphrase` 
         | 
| 189 | 
            +
             | 
| 190 | 
            +
              * Value type is <<password,password>>
         | 
| 191 | 
            +
              * There is no default value for this setting.
         | 
| 192 | 
            +
             | 
| 193 | 
            +
            SSL key passphrase to use.
         | 
| 194 | 
            +
             | 
| 195 | 
            +
            [id="plugins-{type}s-{plugin}-ssl_verify_mode"]
         | 
| 196 | 
            +
            ===== `ssl_verify_mode` 
         | 
| 197 | 
            +
             | 
| 198 | 
            +
              * Value can be any of: `none`, `peer`, `force_peer`
         | 
| 199 | 
            +
              * Default value is `"none"`
         | 
| 200 | 
            +
             | 
| 201 | 
            +
            By default the server doesn't do any client verification.
         | 
| 202 | 
            +
             | 
| 203 | 
            +
            `peer` will make the server ask the client to provide a certificate. 
         | 
| 204 | 
            +
            If the client provides a certificate, it will be validated.
         | 
| 205 | 
            +
             | 
| 206 | 
            +
            `force_peer` will make the server ask the client to provide a certificate.
         | 
| 207 | 
            +
            If the client doesn't provide a certificate, the connection will be closed.
         | 
| 208 | 
            +
             | 
| 209 | 
            +
            This option needs to be used with `ssl_certificate_authorities` and a defined list of CAs.
         | 
| 210 | 
            +
             | 
| 211 | 
            +
            [id="plugins-{type}s-{plugin}-target_field_for_codec"]
         | 
| 212 | 
            +
            ===== `target_field_for_codec`  (DEPRECATED)
         | 
| 213 | 
            +
             | 
| 214 | 
            +
              * DEPRECATED WARNING: This configuration item is deprecated and may not be available in future versions.
         | 
| 215 | 
            +
              * Value type is <<string,string>>
         | 
| 216 | 
            +
              * Default value is `"message"`
         | 
| 217 | 
            +
             | 
| 218 | 
            +
            This is the default field to which the specified codec will be applied.
         | 
| 219 | 
            +
             | 
| 220 | 
            +
            [id="plugins-{type}s-{plugin}-tls_max_version"]
         | 
| 221 | 
            +
            ===== `tls_max_version` 
         | 
| 222 | 
            +
             | 
| 223 | 
            +
              * Value type is <<number,number>>
         | 
| 224 | 
            +
              * Default value is `1.2`
         | 
| 225 | 
            +
             | 
| 226 | 
            +
            The maximum TLS version allowed for the encrypted connections. The value must be the one of the following:
         | 
| 227 | 
            +
            1.0 for TLS 1.0, 1.1 for TLS 1.1, 1.2 for TLS 1.2
         | 
| 228 | 
            +
             | 
| 229 | 
            +
            [id="plugins-{type}s-{plugin}-tls_min_version"]
         | 
| 230 | 
            +
            ===== `tls_min_version` 
         | 
| 231 | 
            +
             | 
| 232 | 
            +
              * Value type is <<number,number>>
         | 
| 233 | 
            +
              * Default value is `1`
         | 
| 234 | 
            +
             | 
| 235 | 
            +
            The minimum TLS version allowed for the encrypted connections. The value must be one of the following:
         | 
| 236 | 
            +
            1.0 for TLS 1.0, 1.1 for TLS 1.1, 1.2 for TLS 1.2
         | 
| 237 | 
            +
             | 
| 238 | 
            +
             | 
| 239 | 
            +
             | 
| 240 | 
            +
            include::{include_path}/{type}.asciidoc[]
         | 
| @@ -9,4 +9,4 @@ require_jar('com.fasterxml.jackson.core', 'jackson-annotations', '2.7.5') | |
| 9 9 | 
             
            require_jar('com.fasterxml.jackson.core', 'jackson-databind', '2.7.5')
         | 
| 10 10 | 
             
            require_jar('com.fasterxml.jackson.module', 'jackson-module-afterburner', '2.7.5')
         | 
| 11 11 | 
             
            require_jar('log4j', 'log4j', '1.2.17')
         | 
| 12 | 
            -
            require_jar('org.logstash.beats', 'logstash-input-beats', '3.1. | 
| 12 | 
            +
            require_jar('org.logstash.beats', 'logstash-input-beats', '3.1.17')
         | 
| @@ -37,6 +37,12 @@ require_relative "beats/patch" | |
| 37 37 | 
             
            # a setting for the <<plugins-inputs-beats-type,`type`>> config option in
         | 
| 38 38 | 
             
            # Logstash, it is ignored.
         | 
| 39 39 | 
             
            #
         | 
| 40 | 
            +
            # IMPORTANT: If you are shipping events that span multiple lines, you need to
         | 
| 41 | 
            +
            # use the configuration options available in Filebeat to handle multiline events
         | 
| 42 | 
            +
            # before sending the event data to Logstash. You cannot use the
         | 
| 43 | 
            +
            # <<plugins-codecs-multiline>> codec to handle multiline events. Doing so may
         | 
| 44 | 
            +
            # result in the mixing of streams and corrupted event data. 
         | 
| 45 | 
            +
            #
         | 
| 40 46 | 
             
            class LogStash::Inputs::Beats < LogStash::Inputs::Base
         | 
| 41 47 | 
             
              require "logstash/inputs/beats/codec_callback_listener"
         | 
| 42 48 | 
             
              require "logstash/inputs/beats/event_transform_common"
         | 
| @@ -141,6 +147,10 @@ class LogStash::Inputs::Beats < LogStash::Inputs::Base | |
| 141 147 | 
             
                  raise LogStash::ConfigurationError, "Using `verify_mode` set to PEER or FORCE_PEER, requires the configuration of `certificate_authorities`"
         | 
| 142 148 | 
             
                end
         | 
| 143 149 |  | 
| 150 | 
            +
                if @codec.kind_of? LogStash::Codecs::Multiline
         | 
| 151 | 
            +
                  @logger.warn("WARNING! - Multiline codec with beats input has been deprecated. Support for this configuration will be removed in a future version. Please refer to the beats documentation for how to best manage multiline data. See https://www.elastic.co/guide/en/beats/filebeat/current/multiline-examples.html")
         | 
| 152 | 
            +
                end
         | 
| 153 | 
            +
             | 
| 144 154 | 
             
                @logger.info("Beats inputs: Starting input listener", :address => "#{@host}:#{@port}")
         | 
| 145 155 |  | 
| 146 156 | 
             
                # wrap the configured codec to support identity stream
         | 
| @@ -19,6 +19,8 @@ module LogStash module Inputs class Beats | |
| 19 19 | 
             
                  @queue = queue
         | 
| 20 20 | 
             
                  @logger = input.logger
         | 
| 21 21 | 
             
                  @input = input
         | 
| 22 | 
            +
                  @metric = @input.metric
         | 
| 23 | 
            +
                  @peak_connection_count = Concurrent::AtomicFixnum.new(0)
         | 
| 22 24 |  | 
| 23 25 | 
             
                  @nocodec_transformer = RawEventTransform.new(@input)
         | 
| 24 26 | 
             
                  @codec_transformer = DecodedEventTransform.new(@input)
         | 
| @@ -44,10 +46,12 @@ module LogStash module Inputs class Beats | |
| 44 46 |  | 
| 45 47 | 
             
                def onNewConnection(ctx)
         | 
| 46 48 | 
             
                  register_connection(ctx)
         | 
| 49 | 
            +
                  increment_connection_count()
         | 
| 47 50 | 
             
                end
         | 
| 48 51 |  | 
| 49 52 | 
             
                def onConnectionClose(ctx)
         | 
| 50 53 | 
             
                  unregister_connection(ctx)
         | 
| 54 | 
            +
                  decrement_connection_count()
         | 
| 51 55 | 
             
                end
         | 
| 52 56 |  | 
| 53 57 | 
             
                def onChannelInitializeException(ctx, cause)
         | 
| @@ -107,5 +111,18 @@ module LogStash module Inputs class Beats | |
| 107 111 | 
             
                def from_logstash_forwarder?(hash)
         | 
| 108 112 | 
             
                  !hash[LSF_LOG_LINE_FIELD].nil?
         | 
| 109 113 | 
             
                end
         | 
| 114 | 
            +
             | 
| 115 | 
            +
                def increment_connection_count
         | 
| 116 | 
            +
                  current_connection_count = @connections_list.size
         | 
| 117 | 
            +
                  @metric.gauge(:current_connections, current_connection_count)
         | 
| 118 | 
            +
                  if current_connection_count > @peak_connection_count.value
         | 
| 119 | 
            +
                    @peak_connection_count.value = current_connection_count
         | 
| 120 | 
            +
                    @metric.gauge(:peak_connections, @peak_connection_count.value)
         | 
| 121 | 
            +
                  end
         | 
| 122 | 
            +
                end
         | 
| 123 | 
            +
             | 
| 124 | 
            +
                def decrement_connection_count
         | 
| 125 | 
            +
                  @metric.gauge(:current_connections, @connections_list.size)
         | 
| 126 | 
            +
                end
         | 
| 110 127 | 
             
              end
         | 
| 111 128 | 
             
            end; end; end
         | 
    
        data/lib/tasks/build.rake
    CHANGED
    
    
| @@ -12,7 +12,7 @@ Gem::Specification.new do |s| | |
| 12 12 | 
             
              s.require_paths = ["lib", "vendor/jar-dependencies"]
         | 
| 13 13 |  | 
| 14 14 | 
             
              # Files
         | 
| 15 | 
            -
              s.files = Dir["lib/**/*","spec/**/*","*.gemspec","*.md","CONTRIBUTORS","Gemfile","LICENSE","NOTICE.TXT", "vendor/jar-dependencies/**/*.jar", "vendor/jar-dependencies/**/*.rb", "VERSION"]
         | 
| 15 | 
            +
              s.files = Dir["lib/**/*","spec/**/*","*.gemspec","*.md","CONTRIBUTORS","Gemfile","LICENSE","NOTICE.TXT", "vendor/jar-dependencies/**/*.jar", "vendor/jar-dependencies/**/*.rb", "VERSION", "docs/**/*"]
         | 
| 16 16 | 
             
              # Tests
         | 
| 17 17 | 
             
              s.test_files = s.files.grep(%r{^(test|spec|features)/})
         | 
| 18 18 |  | 
| @@ -1,7 +1,9 @@ | |
| 1 1 | 
             
            # encoding: utf-8
         | 
| 2 | 
            +
            require "logstash-core"
         | 
| 2 3 | 
             
            require "logstash/inputs/beats"
         | 
| 3 4 | 
             
            require "logstash/event"
         | 
| 4 5 | 
             
            require "logstash/inputs/beats/message_listener"
         | 
| 6 | 
            +
            require "logstash/instrument/namespaced_null_metric"
         | 
| 5 7 | 
             
            require "thread"
         | 
| 6 8 |  | 
| 7 9 | 
             
            class MockMessage
         | 
| @@ -48,6 +50,30 @@ describe LogStash::Inputs::Beats::MessageListener do | |
| 48 50 | 
             
                it "register the connection to the connection list" do
         | 
| 49 51 | 
             
                  expect { subject.onNewConnection(double("ChannelHandlerContext")) }.to change { subject.connections_list.count }.by(1)
         | 
| 50 52 | 
             
                end
         | 
| 53 | 
            +
             | 
| 54 | 
            +
                describe "metrics" do
         | 
| 55 | 
            +
                  it "new connection should increment connection count" do
         | 
| 56 | 
            +
                    expect(subject).to receive(:increment_connection_count).once
         | 
| 57 | 
            +
                    subject.onNewConnection(double("ChannelHandlerContext"))
         | 
| 58 | 
            +
                  end
         | 
| 59 | 
            +
             | 
| 60 | 
            +
                  describe "peak connections" do
         | 
| 61 | 
            +
                    it "closing and open connections should keep highest count" do
         | 
| 62 | 
            +
                      expect(subject.instance_eval("@peak_connection_count").value).to eq(1)
         | 
| 63 | 
            +
                      subject.onNewConnection(1)
         | 
| 64 | 
            +
                      expect(subject.instance_eval("@peak_connection_count").value).to eq(2)
         | 
| 65 | 
            +
                      subject.onNewConnection(2)
         | 
| 66 | 
            +
                      expect(subject.instance_eval("@peak_connection_count").value).to eq(3)
         | 
| 67 | 
            +
                      subject.onConnectionClose(2)
         | 
| 68 | 
            +
                      expect(subject.instance_eval("@peak_connection_count").value).to eq(3)
         | 
| 69 | 
            +
                      subject.onNewConnection(3)
         | 
| 70 | 
            +
                      expect(subject.instance_eval("@peak_connection_count").value).to eq(3)
         | 
| 71 | 
            +
                      subject.onNewConnection(4)
         | 
| 72 | 
            +
                      expect(subject.instance_eval("@peak_connection_count").value).to eq(4)
         | 
| 73 | 
            +
                    end
         | 
| 74 | 
            +
                  end
         | 
| 75 | 
            +
             | 
| 76 | 
            +
                end
         | 
| 51 77 | 
             
              end
         | 
| 52 78 |  | 
| 53 79 | 
             
              context "onNewMessage" do
         | 
| Binary file | 
    
        metadata
    CHANGED
    
    | @@ -1,18 +1,17 @@ | |
| 1 1 | 
             
            --- !ruby/object:Gem::Specification
         | 
| 2 2 | 
             
            name: logstash-input-beats
         | 
| 3 3 | 
             
            version: !ruby/object:Gem::Version
         | 
| 4 | 
            -
              version: 3.1. | 
| 4 | 
            +
              version: 3.1.17
         | 
| 5 5 | 
             
            platform: java
         | 
| 6 6 | 
             
            authors:
         | 
| 7 7 | 
             
            - Elastic
         | 
| 8 8 | 
             
            autorequire:
         | 
| 9 9 | 
             
            bindir: bin
         | 
| 10 10 | 
             
            cert_chain: []
         | 
| 11 | 
            -
            date: 2017- | 
| 11 | 
            +
            date: 2017-06-05 00:00:00.000000000 Z
         | 
| 12 12 | 
             
            dependencies:
         | 
| 13 13 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 14 | 
            -
               | 
| 15 | 
            -
              version_requirements: !ruby/object:Gem::Requirement
         | 
| 14 | 
            +
              requirement: !ruby/object:Gem::Requirement
         | 
| 16 15 | 
             
                requirements:
         | 
| 17 16 | 
             
                - - ">="
         | 
| 18 17 | 
             
                  - !ruby/object:Gem::Version
         | 
| @@ -20,7 +19,10 @@ dependencies: | |
| 20 19 | 
             
                - - "<="
         | 
| 21 20 | 
             
                  - !ruby/object:Gem::Version
         | 
| 22 21 | 
             
                    version: '2.99'
         | 
| 23 | 
            -
               | 
| 22 | 
            +
              name: logstash-core-plugin-api
         | 
| 23 | 
            +
              prerelease: false
         | 
| 24 | 
            +
              type: :runtime
         | 
| 25 | 
            +
              version_requirements: !ruby/object:Gem::Requirement
         | 
| 24 26 | 
             
                requirements:
         | 
| 25 27 | 
             
                - - ">="
         | 
| 26 28 | 
             
                  - !ruby/object:Gem::Version
         | 
| @@ -28,32 +30,21 @@ dependencies: | |
| 28 30 | 
             
                - - "<="
         | 
| 29 31 | 
             
                  - !ruby/object:Gem::Version
         | 
| 30 32 | 
             
                    version: '2.99'
         | 
| 31 | 
            -
              prerelease: false
         | 
| 32 | 
            -
              type: :runtime
         | 
| 33 33 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 34 | 
            -
              name: logstash-codec-plain
         | 
| 35 | 
            -
              version_requirements: !ruby/object:Gem::Requirement
         | 
| 36 | 
            -
                requirements:
         | 
| 37 | 
            -
                - - ">="
         | 
| 38 | 
            -
                  - !ruby/object:Gem::Version
         | 
| 39 | 
            -
                    version: '0'
         | 
| 40 34 | 
             
              requirement: !ruby/object:Gem::Requirement
         | 
| 41 35 | 
             
                requirements:
         | 
| 42 36 | 
             
                - - ">="
         | 
| 43 37 | 
             
                  - !ruby/object:Gem::Version
         | 
| 44 38 | 
             
                    version: '0'
         | 
| 39 | 
            +
              name: logstash-codec-plain
         | 
| 45 40 | 
             
              prerelease: false
         | 
| 46 41 | 
             
              type: :runtime
         | 
| 47 | 
            -
            - !ruby/object:Gem::Dependency
         | 
| 48 | 
            -
              name: concurrent-ruby
         | 
| 49 42 | 
             
              version_requirements: !ruby/object:Gem::Requirement
         | 
| 50 43 | 
             
                requirements:
         | 
| 51 44 | 
             
                - - ">="
         | 
| 52 45 | 
             
                  - !ruby/object:Gem::Version
         | 
| 53 | 
            -
                    version: 0 | 
| 54 | 
            -
             | 
| 55 | 
            -
                  - !ruby/object:Gem::Version
         | 
| 56 | 
            -
                    version: 1.0.0
         | 
| 46 | 
            +
                    version: '0'
         | 
| 47 | 
            +
            - !ruby/object:Gem::Dependency
         | 
| 57 48 | 
             
              requirement: !ruby/object:Gem::Requirement
         | 
| 58 49 | 
             
                requirements:
         | 
| 59 50 | 
             
                - - ">="
         | 
| @@ -62,162 +53,171 @@ dependencies: | |
| 62 53 | 
             
                - - "<="
         | 
| 63 54 | 
             
                  - !ruby/object:Gem::Version
         | 
| 64 55 | 
             
                    version: 1.0.0
         | 
| 56 | 
            +
              name: concurrent-ruby
         | 
| 65 57 | 
             
              prerelease: false
         | 
| 66 58 | 
             
              type: :runtime
         | 
| 67 | 
            -
            - !ruby/object:Gem::Dependency
         | 
| 68 | 
            -
              name: thread_safe
         | 
| 69 59 | 
             
              version_requirements: !ruby/object:Gem::Requirement
         | 
| 70 60 | 
             
                requirements:
         | 
| 71 | 
            -
                - - " | 
| 61 | 
            +
                - - ">="
         | 
| 72 62 | 
             
                  - !ruby/object:Gem::Version
         | 
| 73 | 
            -
                    version: 0. | 
| 63 | 
            +
                    version: 0.9.2
         | 
| 64 | 
            +
                - - "<="
         | 
| 65 | 
            +
                  - !ruby/object:Gem::Version
         | 
| 66 | 
            +
                    version: 1.0.0
         | 
| 67 | 
            +
            - !ruby/object:Gem::Dependency
         | 
| 74 68 | 
             
              requirement: !ruby/object:Gem::Requirement
         | 
| 75 69 | 
             
                requirements:
         | 
| 76 70 | 
             
                - - "~>"
         | 
| 77 71 | 
             
                  - !ruby/object:Gem::Version
         | 
| 78 72 | 
             
                    version: 0.3.5
         | 
| 73 | 
            +
              name: thread_safe
         | 
| 79 74 | 
             
              prerelease: false
         | 
| 80 75 | 
             
              type: :runtime
         | 
| 81 | 
            -
            - !ruby/object:Gem::Dependency
         | 
| 82 | 
            -
              name: logstash-codec-multiline
         | 
| 83 76 | 
             
              version_requirements: !ruby/object:Gem::Requirement
         | 
| 84 77 | 
             
                requirements:
         | 
| 85 | 
            -
                - - " | 
| 78 | 
            +
                - - "~>"
         | 
| 86 79 | 
             
                  - !ruby/object:Gem::Version
         | 
| 87 | 
            -
                    version:  | 
| 80 | 
            +
                    version: 0.3.5
         | 
| 81 | 
            +
            - !ruby/object:Gem::Dependency
         | 
| 88 82 | 
             
              requirement: !ruby/object:Gem::Requirement
         | 
| 89 83 | 
             
                requirements:
         | 
| 90 84 | 
             
                - - ">="
         | 
| 91 85 | 
             
                  - !ruby/object:Gem::Version
         | 
| 92 86 | 
             
                    version: 2.0.5
         | 
| 87 | 
            +
              name: logstash-codec-multiline
         | 
| 93 88 | 
             
              prerelease: false
         | 
| 94 89 | 
             
              type: :runtime
         | 
| 95 | 
            -
            - !ruby/object:Gem::Dependency
         | 
| 96 | 
            -
              name: jar-dependencies
         | 
| 97 90 | 
             
              version_requirements: !ruby/object:Gem::Requirement
         | 
| 98 91 | 
             
                requirements:
         | 
| 99 | 
            -
                - - " | 
| 92 | 
            +
                - - ">="
         | 
| 100 93 | 
             
                  - !ruby/object:Gem::Version
         | 
| 101 | 
            -
                    version: 0. | 
| 94 | 
            +
                    version: 2.0.5
         | 
| 95 | 
            +
            - !ruby/object:Gem::Dependency
         | 
| 102 96 | 
             
              requirement: !ruby/object:Gem::Requirement
         | 
| 103 97 | 
             
                requirements:
         | 
| 104 98 | 
             
                - - "~>"
         | 
| 105 99 | 
             
                  - !ruby/object:Gem::Version
         | 
| 106 100 | 
             
                    version: 0.3.4
         | 
| 101 | 
            +
              name: jar-dependencies
         | 
| 107 102 | 
             
              prerelease: false
         | 
| 108 103 | 
             
              type: :runtime
         | 
| 109 | 
            -
            - !ruby/object:Gem::Dependency
         | 
| 110 | 
            -
              name: flores
         | 
| 111 104 | 
             
              version_requirements: !ruby/object:Gem::Requirement
         | 
| 112 105 | 
             
                requirements:
         | 
| 113 106 | 
             
                - - "~>"
         | 
| 114 107 | 
             
                  - !ruby/object:Gem::Version
         | 
| 115 | 
            -
                    version: 0. | 
| 108 | 
            +
                    version: 0.3.4
         | 
| 109 | 
            +
            - !ruby/object:Gem::Dependency
         | 
| 116 110 | 
             
              requirement: !ruby/object:Gem::Requirement
         | 
| 117 111 | 
             
                requirements:
         | 
| 118 112 | 
             
                - - "~>"
         | 
| 119 113 | 
             
                  - !ruby/object:Gem::Version
         | 
| 120 114 | 
             
                    version: 0.0.6
         | 
| 115 | 
            +
              name: flores
         | 
| 121 116 | 
             
              prerelease: false
         | 
| 122 117 | 
             
              type: :development
         | 
| 123 | 
            -
            - !ruby/object:Gem::Dependency
         | 
| 124 | 
            -
              name: rspec
         | 
| 125 118 | 
             
              version_requirements: !ruby/object:Gem::Requirement
         | 
| 126 119 | 
             
                requirements:
         | 
| 127 | 
            -
                - - " | 
| 120 | 
            +
                - - "~>"
         | 
| 128 121 | 
             
                  - !ruby/object:Gem::Version
         | 
| 129 | 
            -
                    version:  | 
| 122 | 
            +
                    version: 0.0.6
         | 
| 123 | 
            +
            - !ruby/object:Gem::Dependency
         | 
| 130 124 | 
             
              requirement: !ruby/object:Gem::Requirement
         | 
| 131 125 | 
             
                requirements:
         | 
| 132 126 | 
             
                - - ">="
         | 
| 133 127 | 
             
                  - !ruby/object:Gem::Version
         | 
| 134 128 | 
             
                    version: '0'
         | 
| 129 | 
            +
              name: rspec
         | 
| 135 130 | 
             
              prerelease: false
         | 
| 136 131 | 
             
              type: :development
         | 
| 137 | 
            -
            - !ruby/object:Gem::Dependency
         | 
| 138 | 
            -
              name: stud
         | 
| 139 132 | 
             
              version_requirements: !ruby/object:Gem::Requirement
         | 
| 140 133 | 
             
                requirements:
         | 
| 141 134 | 
             
                - - ">="
         | 
| 142 135 | 
             
                  - !ruby/object:Gem::Version
         | 
| 143 136 | 
             
                    version: '0'
         | 
| 137 | 
            +
            - !ruby/object:Gem::Dependency
         | 
| 144 138 | 
             
              requirement: !ruby/object:Gem::Requirement
         | 
| 145 139 | 
             
                requirements:
         | 
| 146 140 | 
             
                - - ">="
         | 
| 147 141 | 
             
                  - !ruby/object:Gem::Version
         | 
| 148 142 | 
             
                    version: '0'
         | 
| 143 | 
            +
              name: stud
         | 
| 149 144 | 
             
              prerelease: false
         | 
| 150 145 | 
             
              type: :development
         | 
| 151 | 
            -
            - !ruby/object:Gem::Dependency
         | 
| 152 | 
            -
              name: pry
         | 
| 153 146 | 
             
              version_requirements: !ruby/object:Gem::Requirement
         | 
| 154 147 | 
             
                requirements:
         | 
| 155 148 | 
             
                - - ">="
         | 
| 156 149 | 
             
                  - !ruby/object:Gem::Version
         | 
| 157 150 | 
             
                    version: '0'
         | 
| 151 | 
            +
            - !ruby/object:Gem::Dependency
         | 
| 158 152 | 
             
              requirement: !ruby/object:Gem::Requirement
         | 
| 159 153 | 
             
                requirements:
         | 
| 160 154 | 
             
                - - ">="
         | 
| 161 155 | 
             
                  - !ruby/object:Gem::Version
         | 
| 162 156 | 
             
                    version: '0'
         | 
| 157 | 
            +
              name: pry
         | 
| 163 158 | 
             
              prerelease: false
         | 
| 164 159 | 
             
              type: :development
         | 
| 165 | 
            -
            - !ruby/object:Gem::Dependency
         | 
| 166 | 
            -
              name: rspec-wait
         | 
| 167 160 | 
             
              version_requirements: !ruby/object:Gem::Requirement
         | 
| 168 161 | 
             
                requirements:
         | 
| 169 162 | 
             
                - - ">="
         | 
| 170 163 | 
             
                  - !ruby/object:Gem::Version
         | 
| 171 164 | 
             
                    version: '0'
         | 
| 165 | 
            +
            - !ruby/object:Gem::Dependency
         | 
| 172 166 | 
             
              requirement: !ruby/object:Gem::Requirement
         | 
| 173 167 | 
             
                requirements:
         | 
| 174 168 | 
             
                - - ">="
         | 
| 175 169 | 
             
                  - !ruby/object:Gem::Version
         | 
| 176 170 | 
             
                    version: '0'
         | 
| 171 | 
            +
              name: rspec-wait
         | 
| 177 172 | 
             
              prerelease: false
         | 
| 178 173 | 
             
              type: :development
         | 
| 179 | 
            -
            - !ruby/object:Gem::Dependency
         | 
| 180 | 
            -
              name: logstash-devutils
         | 
| 181 174 | 
             
              version_requirements: !ruby/object:Gem::Requirement
         | 
| 182 175 | 
             
                requirements:
         | 
| 183 176 | 
             
                - - ">="
         | 
| 184 177 | 
             
                  - !ruby/object:Gem::Version
         | 
| 185 178 | 
             
                    version: '0'
         | 
| 179 | 
            +
            - !ruby/object:Gem::Dependency
         | 
| 186 180 | 
             
              requirement: !ruby/object:Gem::Requirement
         | 
| 187 181 | 
             
                requirements:
         | 
| 188 182 | 
             
                - - ">="
         | 
| 189 183 | 
             
                  - !ruby/object:Gem::Version
         | 
| 190 184 | 
             
                    version: '0'
         | 
| 185 | 
            +
              name: logstash-devutils
         | 
| 191 186 | 
             
              prerelease: false
         | 
| 192 187 | 
             
              type: :development
         | 
| 193 | 
            -
            - !ruby/object:Gem::Dependency
         | 
| 194 | 
            -
              name: logstash-codec-json
         | 
| 195 188 | 
             
              version_requirements: !ruby/object:Gem::Requirement
         | 
| 196 189 | 
             
                requirements:
         | 
| 197 190 | 
             
                - - ">="
         | 
| 198 191 | 
             
                  - !ruby/object:Gem::Version
         | 
| 199 192 | 
             
                    version: '0'
         | 
| 193 | 
            +
            - !ruby/object:Gem::Dependency
         | 
| 200 194 | 
             
              requirement: !ruby/object:Gem::Requirement
         | 
| 201 195 | 
             
                requirements:
         | 
| 202 196 | 
             
                - - ">="
         | 
| 203 197 | 
             
                  - !ruby/object:Gem::Version
         | 
| 204 198 | 
             
                    version: '0'
         | 
| 199 | 
            +
              name: logstash-codec-json
         | 
| 205 200 | 
             
              prerelease: false
         | 
| 206 201 | 
             
              type: :development
         | 
| 207 | 
            -
            - !ruby/object:Gem::Dependency
         | 
| 208 | 
            -
              name: childprocess
         | 
| 209 202 | 
             
              version_requirements: !ruby/object:Gem::Requirement
         | 
| 210 203 | 
             
                requirements:
         | 
| 211 204 | 
             
                - - ">="
         | 
| 212 205 | 
             
                  - !ruby/object:Gem::Version
         | 
| 213 206 | 
             
                    version: '0'
         | 
| 207 | 
            +
            - !ruby/object:Gem::Dependency
         | 
| 214 208 | 
             
              requirement: !ruby/object:Gem::Requirement
         | 
| 215 209 | 
             
                requirements:
         | 
| 216 210 | 
             
                - - ">="
         | 
| 217 211 | 
             
                  - !ruby/object:Gem::Version
         | 
| 218 212 | 
             
                    version: '0'
         | 
| 213 | 
            +
              name: childprocess
         | 
| 219 214 | 
             
              prerelease: false
         | 
| 220 215 | 
             
              type: :development
         | 
| 216 | 
            +
              version_requirements: !ruby/object:Gem::Requirement
         | 
| 217 | 
            +
                requirements:
         | 
| 218 | 
            +
                - - ">="
         | 
| 219 | 
            +
                  - !ruby/object:Gem::Version
         | 
| 220 | 
            +
                    version: '0'
         | 
| 221 221 | 
             
            description: This gem is a Logstash plugin required to be installed on top of the Logstash core pipeline using $LS_HOME/bin/logstash-plugin install gemname. This gem is not a stand-alone program
         | 
| 222 222 | 
             
            email: info@elastic.co
         | 
| 223 223 | 
             
            executables: []
         | 
| @@ -232,6 +232,7 @@ files: | |
| 232 232 | 
             
            - PROTOCOL.md
         | 
| 233 233 | 
             
            - README.md
         | 
| 234 234 | 
             
            - VERSION
         | 
| 235 | 
            +
            - docs/index.asciidoc
         | 
| 235 236 | 
             
            - lib/logstash-input-beats_jars.rb
         | 
| 236 237 | 
             
            - lib/logstash/inputs/beats.rb
         | 
| 237 238 | 
             
            - lib/logstash/inputs/beats/codec_callback_listener.rb
         | 
| @@ -269,7 +270,7 @@ files: | |
| 269 270 | 
             
            - vendor/jar-dependencies/io/netty/netty-tcnative-boringssl-static/1.1.33.Fork23/netty-tcnative-boringssl-static-1.1.33.Fork23.jar
         | 
| 270 271 | 
             
            - vendor/jar-dependencies/log4j/log4j/1.2.17/log4j-1.2.17.jar
         | 
| 271 272 | 
             
            - vendor/jar-dependencies/org/javassist/javassist/3.20.0-GA/javassist-3.20.0-GA.jar
         | 
| 272 | 
            -
            - vendor/jar-dependencies/org/logstash/beats/logstash-input-beats/3.1. | 
| 273 | 
            +
            - vendor/jar-dependencies/org/logstash/beats/logstash-input-beats/3.1.17/logstash-input-beats-3.1.17.jar
         | 
| 273 274 | 
             
            homepage: http://www.elastic.co/guide/en/logstash/current/index.html
         | 
| 274 275 | 
             
            licenses:
         | 
| 275 276 | 
             
            - Apache License (2.0)
         |