Splunk + Docker + Serilog + C#

Flavio Ribeiro Lima
7 min readMar 27, 2023

--

Com o Splunk você pode pesquisar, monitorar e analisar dados.

Veja em…

Nesse post vamos subir o Splunk no Docker, gravar log, pesquisar e montar um gráfico.

Docker

Você pode obter o docker no link abaixo:

Caso queira se aprofundar na CLI segue…

Caso precise de mais detalhes sobre a instalação no Mac, Linux ou Windows, segue…

Nosso primeiro passo é criar o arquivo docker compose para subirmos o container com o Splunk, veja abaixo:

version: "3.6"

services:
so1:
image: splunk/splunk:latest
container_name: so1
environment:
- SPLUNK_START_ARGS=--accept-license
- SPLUNK_HEC_TOKEN=abcd1234
- SPLUNK_PASSWORD=123456
ports:
- 8000:8000
- 8088:8088

A primeira consideração a fazer é, veja que além da porta 8000, é importante também mapear a porta 8088, ela é usada para a captura de dados via service collector. E você pode dar um nome diferente para seu container.

Já a variável SPLUNK_HEC_TOKEN nesse momento é opcional, após subir o container você incluir o token diretamente pela interface web.

Salve o arquivo com o nome docker-compose.yml. Após isso abre seu console, entre no diretório onde se encontra o arquivo e digite o comando…

docker-compose up

No seu console será listado uma série de comandos para subir o container. Para conferir os detalhes do container, abra uma nova aba no seu console o comando abaixo…

docker container ps

Com o container em execução abra seu navegador e digite…

http://localhost:8000/

Você vera a pagina inicial do Splunk. Entre com o usuário admin e senha que você definiu no docker-compose.yml

Página de login do Splunk

Ao fazer o login você verá a página inicial do Splunk.

Página inicial do Splunk

Agora iremos criar um novo token HEC para usar o service collector. Siga o caminho Settings > Monitor > HTTP Event Collector. No formulário que aparece digite o nome do token, os demais campos são opcionais, clique em Next > Review > Submit. O token irá aparecer no campo Token Value, copie e guarde. Veja o caminho com as imagens abaixo…

Caminho para criar um Token
Caminho para criar um Token
Caminho para criar um Token
Caminho para criar um Token

Você pode verificar seus tokens criados no seguinte caminho, Settings > Data Inputs > HTTP Event Collector.

Visualizando o token criado
Visualizando o token criado
Página exibindo seus tokens

Um alteração que iremos fazer para nosso exemplo é desabilitar o SSL. Na página onde os tokens são exibidos, clique no botão Global Settings conforme imagem acima e desabilite o SSL, conforme imagem abaixo…

Desabilite o SSL

Após essa alteração, você pode criar uma aplicação para gravar no Splunk. Para esse exemplo criei uma aplicação Console no Visual Studio, nós iremos utilizar o Serilog para enviar logs para o Splunk, para isso instale o seguintes pacotes…

<package id="Serilog" version="2.12.0" />
<package id="Serilog.Enrichers.Context" version="4.6.0" />
<package id="Serilog.Sinks.PeriodicBatching" version="2.3.0" />
<package id="Serilog.Sinks.Splunk" version="3.7.0" />

Para saber saber mais sobre o Serilog e logs no Splunk veja…

Após isso, na sua aplicação você pode criar um método parecido com o que segue abaixo…

class Program
{
static void Main(string[] args)
{
try
{
Log.Logger = new LoggerConfiguration()
.Enrich.FromLogContext()
.WriteTo.EventCollector("http://localhost:8088/services/collector", "5692bf5b-bd30-46dd-b7fd-6d832debb754")
.CreateLogger();

var log = new Logs() { Sistema = "Sistema1", Data = DateTime.Now, StackTrace = "StackTrace", Messagem = "Mensagem" };

var objLog = JsonConvert.SerializeObject(log);
Log.Logger.Information(objLog);

Console.ReadLine();
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
Console.WriteLine("");
Console.WriteLine(ex.StackTrace);
Console.ReadLine();
}

}
}

Não esqueça de incluir o seu token no método EventCollector().

Após você pode conferir seu log no diretamente no Splunk.

Página de pesquisa

Veja que no campo de pesquisa eu digitei source=”http:novotoken”, porém a linguagem do Splunk a Search Processing Language (SPL) é bastante vasta. Você pode começar a aprender mais em…

Com um pouco de pesquisa você irá encontrar muitas páginas e tutoriais dedicados a explicar a SPL.

Dashboard

Para criarmos o Dashboard, considere o cenário em que esteja gravando um array de objetos JSON para montar o seu gráfico, existem diversos cenários para isso. Vou montar um exemplo genérico, mas você pode adaptar facilmente para seu cenário.

Criei classe Analise e preenchi da seguinte forma…

var sistema = new List<Analise>
{
new Analise() { Sistema = "Sistema2", Data = DateTime.Now, Descricao = "Acessos", Total = 15 },
new Analise() { Sistema = "Sistema2", Data = DateTime.Now, Descricao = "Erros", Total = 7 },
new Analise() { Sistema = "Sistema2", Data = DateTime.Now, Descricao = "Finalizados", Total = 22 },
new Analise() { Sistema = "Sistema2", Data = DateTime.Now, Descricao = "Devolvidos", Total = 3 },
};

E gravei no Splunk usando o Serilog…

Resultado da gravação do array de objeto JSON

Repare que o JSON gravado é uma string, e não objeto JSON gravado diretamente no Splunk. Se fosse um objeto JSON a query para montar uma tabela seria extremamente simples, ficaria algo como…

YOUR_SEARCH | table Descricao Total

Porém nesse caso a query fica um pouco mais complicada, segue abaixo…

YOUR_SEARCH
| eval Response=MessageTemplate
| eval x=ltrim(Response,"[")
| eval n=rtrim(x, "]")
| eval temp=split(n,"},")
| mvexpand temp
| eval y=ltrim(temp,",")
| eval testData=mvindex(y,-1)
| rex field=testData Descricao\"\:\"(?<Descricao>\w+)
| rex field=testData \"Total\":(?<Total>\d+)
| table Descricao, Total

Repare que, primeiramente tratamos a string, é feito também um split para quebrar em várias linhas, após isso, usamos regex para obter os campos que queremos, então com o comando table exibimos o resultado…

Tabela criada a partir da string JSON

Temos o cenário onde os dados com essa estrutura podem ser gravados minuto a minuto por exemplo, nesse caso com essa query, você verá uma tabela com os itens repetidos, para realizar a soma e obter o total utilize a query abaixo, com modificação na última linha.

YOUR_SEARCH
| eval Response=MessageTemplate
| eval x=ltrim(Response,"[")
| eval n=rtrim(x, "]")
| eval temp=split(n,"},")
| mvexpand temp
| eval y=ltrim(temp,",")
| eval testData=mvindex(y,-1)
| rex field=testData Descricao\"\:\"(?<Descricao>\w+)
| rex field=testData \"Total\":(?<Total>\d+)
| stats sum(Total) as Total by Descricao

Agora podemos criar o Dashboard a partir dessa query. Vá em Dashboard > Create New Dashboard > Preencha Dashboard Title > Selecione Classic Dashboard > Create.

Adicinando um Dashboard
Adicinando um Dashboard

Irá aparece um Dash vazio, basta adicionar um Painel.

Adicinando um Dashboard

Cole a query e clique em Add to Dashbord

Adicinando um Dashboard

Veja o resultado abaixo…

Dashboard criado

Com isso você pode personalizar o Dashboard, alterar a query e fazer algumas outras modificações, você adicionar outros gráficos e etc.

Para saber mais sobre a criação de Dashboard no Splunk veja…

E existem diversos outros tutorais na web!

Espero que tenha curtido e até a próxima!!

Abraços.

--

--

Flavio Ribeiro Lima

Desenvolvedor de Software. Entusiasta de boas práticas, padrões de desenvolvimento e arquitetura de sistemas.