[RAILS] Erstellen Sie einen fließenden Server zum Testen

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.

Was du machen willst

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.

Politik

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.

Methodenstudie

Echtzeit

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

Benutzerfreundlichkeit in CI

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.

Ich habe es tatsächlich versucht

Wir werden mit der erforderlichen Gem-Installation und den fließenden Einstellungen basierend auf der Methodenstudie fortfahren.

0. Vorbereitung

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.

Es 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

1. Daten auf fließend werfen

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.

2. Bestätigung der geworfenen Daten

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.

Bonus

Berücksichtigen Sie die Benutzerfreundlichkeit beim parallelen Testen

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.

Ändern Sie das Ziel von Redis

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>

Helfer bei der Verwendung mit RSpec und Gurke

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

Erstellen Sie einen fließenden Server zum Testen
[Android] Validierung für Datumseingabe erstellen!
Erstellen Sie Ihre eigene Codierung für String.getBytes ()
Erstellen Sie einen fließenden Server zum Testen
So erstellen Sie ein Maven-Repository für 2020
So erstellen Sie überall eine H2-Datenbank
So erstellen Sie Pagenationen für das "Kaminari" -Array
[Java] Erstellen wir einen Minecraft Mod 1.16.1 [Einführung]
[Java] Erstellen wir einen Minecraft Mod 1.14.4 [99. Mod-Ausgabe]
Erstellen Sie einen Web-API-Server mit Spring Boot
Erstellen Sie eine Docker-Umgebung für Oracle 11g XE
[Java] Erstellen wir einen Minecraft Mod 1.14.4 [0. Basisdatei]
[Java] Erstellen wir einen Minecraft Mod 1.14.4 [4. Tools hinzufügen]
Erstellen Sie einen Docker-Container für einen einfachen Python-Webserver
Erstellen Sie einen HTTPS-Dateiserver für die Entwicklung mit dem Ring-Jetty-Adapter
[Java] Erstellen Sie einen Filter
[Java] Lass uns einen Minecraft Mod 1.14.4 erstellen [5. Rüstung hinzufügen]
[Java] Erstellen wir einen Minecraft Mod 1.14.4 [Extra Edition]
[Java] Erstellen wir einen Minecraft Mod 1.14.4 [7. Fortschritt hinzufügen]
[Java] Erstellen wir einen Minecraft Mod 1.14.4 [6. Rezept hinzufügen]
Erstellen Sie eine Vorlage für das iOS14-Widget mit Absichtskonfiguration.
[Java] Erstellen wir einen Minecraft Mod 1.16.1 [Basisdatei]
[Java] Erstellen wir einen Minecraft Mod 1.14.4 [1. Element hinzufügen]
Probieren Sie Easy Ramdom, ein PropertyBase-Testtool für Java
[Java] Erstellen wir einen Minecraft Mod 1.14.4 [2. Fügen Sie einen Block hinzu]
Ich möchte eine generische Anmerkung für einen Typ erstellen
[Java] Erstellen wir einen Minecraft Mod 1.16.1 [Block hinzufügen]
Tutorial zum Erstellen eines Blogs mit Rails für Anfänger Teil 1
So erstellen Sie ein leichtes Container-Image für Java-Apps
[Java-Zweig] Erstellen Sie einen Parser-Kombinator für die rekursive Abstiegssyntaxanalyse 2
Erstellen Sie abschließend eine Methode, um festzustellen, ob ein Zeichen vorhanden ist
Tutorial zum Erstellen eines Blogs mit Rails für Anfänger Teil 2
So erstellen und starten Sie eine Docker-Datei für Payara Micro
Erstellen Sie eine Java-Methode [Memo] [java11]
[Java] Erstellen Sie eine temporäre Datei
Erstellen Sie ein VSCode-Plugin.
Erstellen Sie einen Spielplatz mit Xcode 12
Erstellen Sie eine Lotterie mit Ruby
So erstellen Sie eine Methode
Erstellen Sie einen einfachen Webserver mit der Java-Standardbibliothek com.sun.net.httpserver
[Java] Erstellen wir einen Minecraft Mod 1.16.1 [Bäume hinzufügen und generieren]
[Java] Erstellen wir einen Minecraft Mod 1.14.4 [9. Bäume hinzufügen und generieren]
So erstellen Sie einen Webserver auf einer EC2-Instanz von AWS
Erstellen Sie ein Docker-Image für redoc-cli und registrieren Sie es auf Docker Hub
[Java] Lass uns einen Minecraft Mod 1.14.4 erstellen [8. Erz hinzufügen und erzeugen]