Al tijdens de ontwerpfase van een Splunk implementatie moet er nagedacht worden over hoe de data naar Splunk getransporteerd gaat worden.
Vaak zijn de benodigde bronnen lokaal aanwezig op verschillende systemen in de infrastructuur en zijn er agents nodig om dit voor elkaar te krijgen. Ook als de data van een extern systeem / applicatie gehaald moet worden is er een component nodig om de data periodiek op te halen.
In veel grote organisaties zijn er al meerdere agents aanwezig en niet iedereen staat te springen om er “maar weer” een agent bij te plaatsen.
Gelukkig biedt Splunk meerdere opties om data aan te leveren. Vandaag wil ik dit verder uitleggen middels een plug-in die ik ontwikkelt heb voor de fluentd agent. Deze plug-in verstuurd data naar de Splunk HTTP Event Collector.
Wat is Fluentd?
Fluentd is een open source data collector. Het bedrijf achter Fluentd is Treasure Data die een eigen build van Fluentd onderhouden die td-agent heet. Als je meer wilt weten over Fluentd en de verschillen tussen Fluentd en td-agent verwijs ik je naar de site.
Wat ik persoonlijk erg mooi vind aan Fluentd is dat het een soort universele brug is tussen inputs en outputs. Het is ook nog eens een brug die meerdere inputs kan koppelen aan meerdere outputs. Dit maakt het een hele flexibele oplossing om zaken aan elkaar te knopen. Een beetje zoals een ESB.
Hoe werkt Fluentd?
Zoals je ook in de afbeelding kunt zien koppel je een input plug-in aan een output plug-in. Deze plug-ins zijn in Ruby geschreven en zijn eenvoudig te installeren maar ook zelf te ontwikkelen.
Er zijn ook filter plug-ins die de inkomende data kan verwerken voordat het weggestuurd wordt.
In de loop der jaren is er al een grote lijst aan plug-ins ontwikkelt. Deze lijst kun je online vinden.
Het koppelen wordt gedaan in een configuratie-file. Als je td-agent geinstalleerd hebt via een RPM of DEB package kun je de file vinden /etc/td-agent/td-agent.conf. Als je een aanpassing doet aan deze file moet je een reload en restart van de td-agent doen om de wijzigingen actief te maken.
sudo vi /etc/td-agent/td-agent.conf
sudo /etc/init.d/td-agent reload
Als je de open source variant gebruikt moet je de configuratie-file eerst genereren en daarna de aanpassingen doorvoeren.
sudo fluentd --setup /etc/fluent
sudo vi /etc/fluent/fluent.conf
De configuratie-file is opgebouwd als een XML structuur waar je met verschillende tags de plug-ins kunt configureren.
- source – deze tag bepaalt de werking van de input plug-in
- match – deze tag bepaalt de werking van de output plug-in
- filter – deze tag bepaalt de werking van de filter plug-in
Meer informatie over hoe je de configuratie-file moet inrichten vind je in de Fluentd Docs.
Fluentd en de Splunk HTTP Event Collector
Een plug-in om data naar de Splunk HTTP Event Collector (HEC) te sturen was er nog niet. De HEC is een Splunk endpoint waar je data in JSON formaat naartoe kunt sturen zodat dit netjes geformatteerd opgeslagen wordt in een Splunk index.
Op de site van SMT heb ik hier een artikel over geschreven als je een introductie wilt. In de volgende paragrafen zal ik een gedeelte herhalen en aanvullen met de aansluiting op de Fluentd plug-in.
Configureer de HEC
Ga in Splunk naar Settings -> Data Inputs -> HTTP Event Collector en zorg dat de Global Settings zo staan dat de HEC enabled is en bereikbaar op de port die je configureert.
Genereer vervolgens een token die nodig is om data succesvol in Splunk te krijgen. Deze heb je nodig in het configureren van de plug-in.
Alles is nu op zijn plek om data te accepteren en we gaan nu naar Fluentd.
Configureer Fluentd
Ik ga er even vanuit dat je td-agent geïnstalleerd hebt in de stappen zoals beschreven in de docs. Gebruik je de fluentd dan de stappen nagenoeg gelijk. In de fluentd docs wordt dit goed uitgelegd. Vraag het me vooral als je hier meer over wilt weten (@cmeerbeek).
Zoals aangegeven worden fluentd plug-ins in Ruby ontwikkeld. Dit betekent dat we Ruby lokaal nodig hebben en dat we een Gem-file moeten gaan maken die we vervolgens installeren.
Zorg ervoor dat je de laatste Ruby versie gebruikt (2.3.x) en dat je de bundler gem installeerd hebt.
- Download de Splunk HEC plug-in van GitHub (git clone https://github.com/cmeerbeek/fluent-plugin-splunkhec)
- Voer “bundle install” uit
- Bouw de gem-file “gem build fluent-plugin-splunkhec.gemspec” en er verschijnt een file genaamd fluent-plugin-splunkhec-x.y.z.gem.
- Installeer de gem met het commando “sudo td-agent-gem install /home/cmeerbeek/fluent-plugin-splunkhec-0.9.0.gem”
We kunnen nu de configuratie file gaan aanmaken zoals eerder uitgelegd. In onderstaand voorbeeld gebruik ik mijn Google Analytics input plug-in (nog in ontwikkeling 😉 ) en koppel deze aan Splunk.
De minimale configuratie bestaat uit host (splunk endpoint), port (default is 8088), protocol (https is ook ondersteund maar dan moet je een geverifieerd certificaat hebben en niet het out-of-the-box Splunk certificaat), token (plaats hier het eerder gegenereerde token).
@type is een fluent optie die de output plug-in aanroept. Hier moet je “splunkhec” plaatsen.
Als je nu de agent start (sudo td-agent -vv voor debug-mode) zal de data naar Splunk verstuurd worden.
Mijn plug-in kan de volgende Ruby objecten verwerken:
- Integers (wordt omgezet in een String)
- String (wordt niets mee gedaan)
- Hash (wordt omgezet in JSON zoals je in dit voorbeeld kunt zien)
Conclusie
Het koppelen van additionele bronnen aan Splunk is eenvoudig en als je gebruik maakt van fluentd als data collector kun je deze makkelijk aansluiten op de Splunk HEC.
Mijn fluent plug-is nog volop in ontwikkeling. Zo zal ik binnenkort ondersteuning voor custom indexes en sourcetypes toevoegen zodat je deze bij de fluentd configuratie op kunt nemen. Ook hoop ik snel ondersteuning voor weak certificates toe te voegen zodat het standaard Splunk certificaat ook werkt.
Heb je problemen met de plug-in of tips? Bezoek de GitHub plug-in pagina en maak een issue aan.
Wil je hulp bij het ontwikkelen van een add-on voor Splunk die de aangeboden data verwerkt en presenteert? Je kunt me altijd een bericht sturen!
Speak Your Mind