Адаптер Istio fluentd отправляет IP-адреса в байтах

Поскольку «Вход с помощью Fluentd» в https://istio.io/docs/tasks/telemetry/logs/fluentd/ довольно ограничен, я попытался настроить более полный logentry, содержащий IP-адреса, для отправки на fluentd (как тот, который определен здесь ).

Когда я это делаю, elasticsearch жалуется на недопустимые символы UTF-8, потому что IP фактически отправляется как байты. (см. здесь: https://github.com/istio/istio/blob/84f3b8ff576125a6c3cab667bb213c65768f68a3/mixer/pkg/lang/cel/types.go#L291). Есть ли способ преобразовать в строку, используя язык выражений istio или, возможно, уже существующий плагин fluentd?

Ниже приведен пример сообщения, которое я отправил на stdout как в микшере с адаптером stdio, так и в fluentd с плагином stdout. Как видите, поля destinationIP и sourceIP действительно искажены в выводе fluentd.

Mixer stdio adapter

{"level":"info","time":"2019-09-10T17:06:09.847408Z","instance":"accesslog.instance.istio-system","apiClaims":"","apiKey":"","clientTraceId":"","connection_security_policy":"none","destinationApp":"telemetry","destinationIp":"10.1.2.64","destinationName":"istio-telemetry-cb4486d94-c8b8z","destinationNamespace":"istio-system","destinationOwner":"kubernetes://apis/apps/v1/namespaces/istio-system/deployments/istio-telemetry","destinationPrincipal":"","destinationServiceHost":"istio-telemetry.istio-system.svc.cluster.local","destinationWorkload":"istio-telemetry","grpcMessage":"","grpcStatus":"0","httpAuthority":"mixer","latency":"1.586447ms","method":"POST","permissiveResponseCode":"none","permissiveResponsePolicyID":"none","protocol":"http","receivedBytes":1251,"referer":"","reporter":"destination","requestId":"5c796abc-b379-41e6-9814-c6ef2d33dec2","requestSize":873,"requestedServerName":"","responseCode":200,"responseFlags":"-","responseSize":5,"sentBytes":141,"sourceApp":"reviews","sourceIp":"10.1.1.61","sourceName":"reviews-v1-59fd8b965b-5zp9f","sourceNamespace":"default","sourceOwner":"kubernetes://apis/apps/v1/namespaces/default/deployments/reviews-v1","sourcePrincipal":"","sourceWorkload":"reviews-v1","url":"/istio.mixer.v1.Mixer/Report","userAgent":"","xForwardedFor":"10.1.1.61"}


Fluentd stdout

2019-09-10 17:06:09.000000000 +0000 accesslog.instance.istio-system: {"sourcePrincipal":"","destinationNamespace":"istio-system","permissiveResponseCode":"none","permissiveResponsePolicyID":"none","latency":"2.250387ms","apiClaims":"","destinationOwner":"kubernetes://apis/apps/v1/namespaces/istio-system/deployments/istio-telemetry","requestedServerName":"","connection_security_policy":"none","destinationName":"istio-telemetry-cb4486d94-c8b8z","requestId":"486b70d4-85e8-4c34-aa1b-7c4a83accbb7","userAgent":"","responseCode":200,"xForwardedFor":"10.1.2.83","reporter":"destination","grpcStatus":"0","grpcMessage":"","apiKey":"","severity":"Info","destinationServiceHost":"istio-telemetry.istio-system.svc.cluster.local","sourceOwner":"kubernetes://apis/apps/v1/namespaces/default/deployments/reviews-v2","referer":"","responseFlags":"-","sourceWorkload":"reviews-v2","protocol":"http","httpAuthority":"mixer","sourceIp":"\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000��\n\u0001\u0002S","destinationApp":"telemetry","sourceApp":"reviews","method":"POST","requestSize":1902,"destinationPrincipal":"","destinationIp":"\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000��\n\u0001\u0002@","receivedBytes":2280,"destinationWorkload":"istio-telemetry","sentBytes":141,"url":"/istio.mixer.v1.Mixer/Report","sourceNamespace":"default","sourceName":"reviews-v2-d6cfdb7d6-hckpr","responseSize":5,"clientTraceId":""}

Я также запустил захват tcpdump, чтобы проверить, что входит в fluentd, и сразу после строки destinationIP есть два байта, 0xC4 и 0x04, что означает, что после него идет массив байтов длиной 4. https://github.com/msgpack/msgpack/blob/master/spec.md#bin-format-family

У кого-нибудь еще была такая проблема, а может, хоть солютон?


person maxdebayser    schedule 10.09.2019    source источник
comment
Было подтверждено, что это ошибка, и она исправлена ​​в github.com/istio/istio/pull/17793 < / а>   -  person maxdebayser    schedule 14.10.2019


Ответы (1)


Я закончил тем, что написал плагин fluentd filter для исправления неправильных записей.

require 'fluent/plugin/filter'

module Fluent::Plugin
  class IstioCorrector < Filter
    Fluent::Plugin.register_filter('istiocorrect', self)

    def configure(conf)
      super
    end

    def filter(tag, time, record)
      if (record["destinationIp"] != nil)
        record["destinationIp"] = record["destinationIp"].unpack('CCCC').join('.')
      end
      if (record["sourceIp"] != nil)
        record["sourceIp"] = record["sourceIp"].unpack('CCCC').join('.')
      end
      record
    end
  end
end
person maxdebayser    schedule 11.09.2019