Bei der Erstellung eines Systems, das fluentd verwendet, habe ich mich gefragt, wie ich testen soll, ob Daten überhaupt an fluentd gesendet wurden, und habe daher verschiedene Dinge untersucht.
Bei der Erstellung eines Systems, das fluentd verwendet, möchte ich einen kurzen Test schreiben, um zu bestätigen, dass Daten an fluentd gesendet werden.
Ich möchte die Testzeit bei der Durchführung von CI so weit wie möglich verkürzen, daher möchte ich die von FluentLogger ausgelösten Daten so weit wie möglich mit der Ausgabe in Echtzeit verknüpfen.
Früher habe ich den Code geschrieben, um den Socket zu öffnen und alleine zu warten, aber da die Version hochging und SSL involviert wurde, wurde es problematisch, so dass ich so viel wie möglich mit dem Plugin machen möchte.
Da ich beim Drehen von CI häufig Docker verwende, um die umgebende Middleware einzurichten, habe ich bereits einmal versucht, Elasticsearch in das Middleware-Kit aufzunehmen, aber ich habe absichtlich Elasticsearch erstellt, das ich nicht direkt aufgerufen habe, und Elasticsearch-Ruby zum Testen Es ist auch faul, es einzulegen und anzuschließen. .. .. Insbesondere wenn es sich um ein offizielles Image handelt, tritt es nicht mit einem einzelnen Knoten auf, und es ist schwierig, alle Mikrodienste zu verfolgen und zu aktualisieren, wenn sich die Version ändert. Daher möchte ich so viel wie möglich ohne zusätzliche Middleware testen.
Die fließende Pufferung erfolgt immer durch Einstellen des Werts von "flush_interval". Wenn es sich jedoch um einen Test handelt, können Sie anscheinend mit "flush_mode = sofort" fortfahren
Dieses Mal habe ich darüber nachgedacht, wie ich Redis, das auch in ActiveJob usw. verwendet wird, gut nutzen kann, aber es gab ein gutes Plug-In in der offiziellen Plug-In-Liste, also habe ich es versucht. Versuchen.
Es gab auch MySQL, aber die von FluentLogger gesendete Datenstruktur ist ziemlich unterschiedlich, so dass das Redis-Plug-In, das es so einfügt, wie es ist, besser geeignet war.
Wir werden mit der erforderlichen Gem-Installation und den fließenden Einstellungen basierend auf der Methodenstudie fortfahren.
Was Edelsteine betrifft, ist es ausreichend, wenn es zusätzlich zum Hauptteil einen fließenden Plugin-Redis-Store-Plug gibt, also werde ich alles zusammenfügen
command
gem install fluentd fluent-plugin-redis-store --no-document
Ich werde die Installation von Redis weglassen, aber Redis mit Brew oder Docker erstellen.
Da fluentd von forward empfangen und an redis_store gesendet wird, sieht fluent.conf folgendermaßen aus.
fluent.conf
<source>
@type forward
@id input1
@label @mainstream
port 24224
</source>
<label @mainstream>
<filter **>
@type record_transformer
<record>
tag ${tag}
</record>
</filter>
<match **>
@type copy
<store>
@type stdout
</store>
<store>
@type redis_store
key_path tag
<buffer>
flush_mode immediate
</buffer>
</store>
</match>
</label>
Was ich mache ist so.
@ Mainstream
als Übereinstimmung mit stdout und redis_store ausgebenEs ist ein Bonus, es auf stdout zu setzen, aber wenn Sie es herausbringen, ist es einfach, später zu debucken.
Schreiben Sie dies in . / Fluent.conf
und starten Sie fluentd
fluentd -c fluent.conf
Jetzt, da ich bereit bin, möchte ich die Daten einwerfen, aber es ist einfacher, die Bewegung zu verstehen, wenn Sie Redis überwachen. Öffnen Sie also ein anderes Fenster und überwachen Sie es.
redis-cli monitor
Wo Daten an fluentd gesendet werden sollen, verwendet die eigentliche Anwendung fluent-logger-ruby, um Daten zu senden, diesmal jedoch fluent-cat Versuchen Sie,
als Ersatz zu verwenden
echo '{ "key" : "sample" }' | bundle exe fluent-cat debug.test
Dies ist ein Befehl, der die Daten mit dem Tag "debug.test" und dem Zeitstempel der aktuellen Zeit an die Daten "{" key ":" sample "}" sendet. Wenn nicht festgelegt, wird es an localhost adressiert, sodass die Daten an den oben erstellten fließenden Server gesendet werden.
Dann wird die folgende Ausgabe an die Standardausgabe auf der fließenden Seite ausgegeben.
fließendes Fenster ausführen
2020-11-03 09:37:28.016591000 +0900 debug.test: {"key":"sample","tag":"debug.test"}
Dies wird von "@type stdout" ausgegeben, das in "fluent.conf" festgelegt ist, und es kann bestätigt werden, dass dem Filter nach dem tatsächlichen Empfang der Daten ein Tag hinzugefügt wurde.
Wenn Sie das Fenster zur Überwachung von Redis betrachten, wird es wie folgt angezeigt.
redis-CLI-Ausführungsfenster
1604363848.025602 [0 172.28.0.1:40998] "zadd" "debug.test" "1604363848.016591" "{\"key\":\"sample\",\"tag\":\"debug.test\"}"
Es wird wie in der Readme-Datei des Plugins beschrieben zaddiert. Die Einstellung von "key_path tag" ist für key wirksam, und "debug.test", der Wert des in den Daten enthaltenen Tags, wird festgelegt.
Versuchen Sie, die Daten von Redis zu erhalten.
redis-cli zrange debug.test 0 -1 withscores
1) "{\"key\":\"sample\",\"tag\":\"debug.test\"}"
2) "1604363848.016591"
Da der Zeitstempel eine Punktzahl ist, wird er so sortiert, dass Sie viel eingeben können.
Rubin ist übrigens so.
require 'redis'
Redis.new.zrange 'debug.test', 0, -1, withscores: true
output
=> [["{\"key\":\"sample\",\"tag\":\"debug.test\"}", 1604363848.016591]]
Der Wert kann vorerst einfach genommen werden, so dass er relativ einfach zu verwenden scheint.
Wenn Tests parallel mit "parallel_tests" oder "test-queue" ausgeführt werden, muss ermittelt werden, welcher Testprozess in das Protokoll eingegeben wurde. Zu diesem Zeitpunkt können Sie die Prozess-ID in die zu sendenden Daten aufnehmen und zum Festlegen des Schlüssels verwenden.
Ich möchte die Prozess-ID, die Uhrzeit und die Anforderungs-ID in die Rails-Protokolldatei einfügen, damit ich nicht denke, dass dies Schaden anrichten wird.
In diesem Fall lauten die zu sendenden Daten wie folgt
{ "key" : "sample", "pid" : 123 }
Ändern Sie außerdem "fluent.conf" wie folgt.
<label @mainstream>
<filter **>
@type record_transformer
<record>
tag ${tag}
+ tag_with_pid '${tag}.${record["pid"]}'
</record>
</filter>
<match **>
@type copy
<store>
@type stdout
</store>
<store>
@type redis_store
- key_path tag
+ key_path tag_with_pid
<buffer>
flush_mode immediate
</buffer>
</store>
</match>
</label>
Nachdem die Prozess-ID bei der Registrierung in Redis in den Schlüssel eingegeben wurde, verwenden Sie diese Prozess-ID, um das Protokoll Ihres eigenen Prozesses zu identifizieren und es auszuwerten, um festzustellen, ob die Daten tatsächlich gesendet wurden oder nicht. Sie werden in der Lage sein.
Es scheint, dass Sie die Einstellung in der folgenden Form ändern können, wie in README beschrieben
<label @mainstream>
<filter **>
@type record_transformer
<record>
tag ${tag}
</record>
</filter>
<match **>
@type copy
<store>
@type stdout
</store>
<store>
@type redis_store
key_path tag
+ host 10.0.0.1
+ db 11
<buffer>
flush_mode immediate
</buffer>
</store>
</match>
</label>
Wenn Sie einen Helfer wie diesen erstellen, ist er einfach zu verwenden, wenn Sie ihn tatsächlich in einem Test verwenden
# frozen_string_literal: true
require 'redis'
module FluentdLogHelper
def fetch_fluentd_log_by(tag:, pid: nil)
redis_key = pid ? "#{tag}.#{pid}" : tag
redis.zrange redis_key, 0, -1
end
def redis(options = {})
options[:db] ||= 0
@redis ||= Redis.new(options)
end
end
Einfacher Name
fetch_fluentd_log_by tag: 'debug.test'
Anruf mit Prozess-ID
fetch_fluentd_log_by tag: 'debug.test', pid: Process.pid
Recommended Posts