iZettle / dropwizard-metrics-influxdb

Dropwizard Metrics v3 InfluxDB
Apache License 2.0
88 stars 37 forks source link

InfluxDbHttpSender encodes auth string with newline symbol in the end #80

Open e-vrvr opened 6 years ago

e-vrvr commented 6 years ago

I'm trying to add authorization to my http(s) reporter, so I set config entry to auth: user:password. Later, here it gets encrypted to dXNlcjpwYXNzd29yZA==\r\n -note the newline symbols in the end. And then during connection construction, it fails with Illegal character(s) in message header field here .

Full stack trace:

java.lang.IllegalArgumentException: Illegal character(s) in message header value: Basic dXNlcjpwYXNzd29yZA==(newline symbol)

    at sun.net.www.protocol.http.HttpURLConnection.checkMessageHeader(HttpURLConnection.java:507)
    at sun.net.www.protocol.http.HttpURLConnection.isExternalMessageHeaderAllowed(HttpURLConnection.java:459)
    at sun.net.www.protocol.http.HttpURLConnection.setRequestProperty(HttpURLConnection.java:3017)
    at sun.net.www.protocol.https.HttpsURLConnectionImpl.setRequestProperty(HttpsURLConnectionImpl.java:316)
    at com.izettle.metrics.influxdb.InfluxDbHttpSender.writeData(InfluxDbHttpSender.java:68)
    at com.izettle.metrics.influxdb.InfluxDbBaseSender.writeData(InfluxDbBaseSender.java:46)
    at com.izettle.metrics.influxdb.InfluxDbHttpSender.writeData(InfluxDbHttpSender.java:15)
    at com.izettle.metrics.influxdb.InfluxDbReporter.report(InfluxDbReporter.java:240)
    at com.codahale.metrics.ScheduledReporter.report(ScheduledReporter.java:162)
    at com.codahale.metrics.ScheduledReporter$1.run(ScheduledReporter.java:117)
    at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
    at java.util.concurrent.FutureTask.runAndReset(FutureTask.java:308)
    at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$301(ScheduledThreadPoolExecutor.java:180)
    at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:294)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
    at java.lang.Thread.run(Thread.java:745)

Sample config

metrics:
  frequency: 1m
  reporters:
    - type: influxdb
      protocol: https
      host: influxdb.example.com
      port: 443
      database: test

Is there any way to make this working?

rickard-von-essen-iz commented 6 years ago

Could you give an example of you config with auth where you see this?

e-vrvr commented 6 years ago

Sure

metrics:
  frequency: 1m
  reporters:
    - type: influxdb
      protocol: https
      host: influxdb.example.com
      port: 443
      database: test
      auth: user:password
      tags:
        host: dev
      prefix: mymetrics_
      precision: 10s
      frequency: 10s
      groupGauges: yes
      includes:
        - memory.heap.usage

UPD. latest version of library, dropwizard 1.2.0

artragis commented 6 years ago

I have the same issue.

I am using the influxdb docker without any configuration.

I basically call the reporter like this :

new InfluxDbHttpSender(influxUrl.getProtocol(),
                influxUrl.getHost(),
                influxUrl.getPort(),
                db, influxUrl.getUserInfo(), TimeUnit.SECONDS,
                1000, 1000, "")

and influxUrl is http://root:root@influx:8086/dbname

then I get the error :

api-service_1  | 13:47:37.650 [metrics-influxDb-reporter-1-thread-1] WARN com.izettle.metrics.influxdb.InfluxDbReporter - Unable to report to InfluxDB with error 'Illegal character(s) in message header value: Basic cm9vdDpyb290
api-service_1  | 13:48:37.643 [metrics-influxDb-reporter-1-thread-1] WARN com.izettle.metrics.influxdb.InfluxDbReporter - Unable to report to InfluxDB with error 'Illegal character(s) in message header value: Basic cm9vdDpyb290

I'm using the 1.2.2 version.

artragis commented 6 years ago

I think I have the fix, I try a PR soon. Found from stackoverflow

e-vrvr commented 6 years ago

what I did was extending InfluxDbHttpSender with this code

if (authString != null && !authString.isEmpty()) {
            this.authStringEncoded = Base64.encodeBase64String(authString.getBytes(Charsets.UTF_8)).trim(); // this is the one single difference from parent class
        } else {
            this.authStringEncoded = "";
        }
artragis commented 6 years ago

How can you extend as the properties are private final?

artragis commented 6 years ago

I found the reason of this bug : I was using another dependency that requires commons-condecs at version 1.4, and this version... adds a \n\r. Once I forced in my own pom the common-codecs to be 1.9 or later (we are at 1.11 today) no problem occures.

@rickard-von-essen-iz To ensure my fix, I have a unittest, do you want me to make a PR for that?