NOTA: Este projeto está em desenvolvimento, por favor não dependa dele ainda, pois as coisas podem quebrar.
MinSQL é um mecanismo de pesquisa de log projetado com simplicidade em mente, na medida em que nenhum SDK é necessário para interagir com ele, a maioria das linguagens e ferramentas de programação tem alguma forma de capacidade de solicitação http (ou seja: curl) e isso é tudo que você precisa para interagir com MinSQL .
docker build . -t minio/minsql
docker run --rm minio/minsql --help
OU
make
./minsql --help
Uma instância do MinIO é necessária como mecanismo de armazenamento para MinSQL. Para facilitar as coisas, temos um exemplo docker-compose
para MinIO e MinSQL.
Para executar o projeto você precisa fornecer os detalhes de acesso de um Meta Bucket
para armazenar a configuração compartilhada entre múltiplas instâncias MinSQL
, a localização e o acesso a ele devem ser configurados através de variáveis de ambiente ao iniciar o MinSQL.
export MINSQL_METABUCKET_NAME=minsql-meta
export MINSQL_METABUCKET_ENDPOINT=http://localhost:9000
export MINSQL_METABUCKET_ACCESS_KEY=minio
export MINSQL_METABUCKET_SECRET_KEY=minio123
export MINSQL_ROOT_ACCESS_KEY=minsqlaccesskeyx
export MINSQL_ROOT_SECRET_KEY=minsqlsecretkeypleasechangexxxx
./minsql
Em seguida, vá para http://127.0.0.1:9999/ui/
e faça login com MINSQL_ROOT_ACCESS_KEY
e MINSQL_ROOT_SECRET_KEY
fornecidos.
Crie o arquivo de composição
cat > docker-compose.yml <<EOF
version: '2'
services:
minio-engine:
image: minio/minio
volumes:
- data:/data
environment:
MINIO_ACCESS_KEY: minio
MINIO_SECRET_KEY: minio123
command: server /data
mc:
image: minio/mc
depends_on:
- minio
entrypoint: >
/bin/sh -c "
echo /usr/bin/mc config host a http://minio-engine:9000 minio minio123;
/usr/bin/mc mb a/minsql-meta;
"
minsql:
image: minio/minsql
depends_on:
- minio
- mc
ports:
- "9999:9999"
environment:
MINSQL_METABUCKET_NAME: minsql-meta
MINSQL_METABUCKET_ENDPOINT: http://minio-engine:9000
MINSQL_ACCESS_KEY: minio
MINSQL_SECRET_KEY: minio123
MINSQL_ROOT_ACCESS_KEY: minsqlaccesskeyx
MINSQL_ROOT_SECRET_KEY: minsqlsecretkeypleasechangexxxx
volumes:
data:
EOF
docker-compose up
Ambiente | Descrição |
---|---|
MINSQL_METABUCKET_NAME | Nome do meta bucket |
MINSQL_METABUCKET_ENDPOINT | Nome do endpoint, ex: http://localhost:9000 |
MINSQL_METABUCKET_ACCESS_KEY | Chave de acesso ao meta bucket |
MINSQL_METABUCKET_SECRET_KEY | Chave secreta do Meta Bucket |
MINSQL_PKCS12_CERT | Opcional: localização para um certificado pkcs12. |
MINSQL_PKCS12_PASSWORD | Opcional: senha para desbloquear o certificado. |
MINSQL_ROOT_ACCESS_KEY | Opcional: chave de acesso de 16 dígitos para inicializar o minsql |
MINSQL_ROOT_SECRET_KEY | Opcional: chave secreta de 32 dígitos para inicializar o minsql |
Para começar a armazenar logs você precisa configurar um DataStore
, Log
, Token
e uma Authorization
no MinSQL, isso pode ser feito usando as APIs REST do administrador.
Para colocar nosso código de exemplo em funcionamento, iremos:
minioplay
mylog
Nosso armazenamento de dados de amostra apontará para play
, uma instância de demonstração do MinIO.
curl -X POST
http://127.0.0.1:9999/api/datastores
-H ' Content-Type: application/json '
-d ' {
"bucket" : "play-minsql",
"endpoint" : "https://play.minio.io:9000",
"prefix" : "",
"name" : "minioplay",
"access_key" : "Q3AM3UQ867SPQQA43P2F",
"secret_key" : "zuf+tfteSlswRu7BJ86wekitnifILbZam1KYY3TG"
} '
Vamos adicionar um log mylog
que armazena seu conteúdo no armazenamento de dados minioplay
.
curl -X POST
http://127.0.0.1:9999/api/logs
-H ' Content-Type: application/json '
-d ' {
"name" : "mylog",
"datastores" : [
"minioplay",
],
"commit_window" : "5s"
} '
Vamos gerar um token com um token codificado abcdefghijklmnopabcdefghijklmnopabcdefghijklmnop
curl -X POST
http://127.0.0.1:9999/api/tokens
-H ' Content-Type: application/json '
-d ' {
"access_key" : "abcdefghijklmnop",
"secret_key" : "abcdefghijklmnopabcdefghijklmnop",
"description" : "test",
"is_admin" : true,
"enabled" : false
} '
Por fim, vamos autorizar nosso novo token para acessar mylog
curl -X POST
http://127.0.0.1:9999/api/auth/abcdefghijklmnop
-H ' Content-Type: application/json '
-d ' {
"log_name" : "mylog",
"api" : ["search","store"]
} '
Para um log mylog
definido na configuração, podemos armazenar logs no MinSQL executando um PUT
em sua instância MinSQL
curl -X PUT
http://127.0.0.1:9999/mylog/store
-H 'MINSQL-TOKEN: TOKEN1'
-d '10.8.0.1 - - [16/May/2019:23:02:56 +0000] "GET / HTTP/1.1" 400 256 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:52.0) Gecko/20100101 Firefox/52.0"'
Você pode enviar várias linhas de log separadas por new line
Para obter dados do MinSQL você pode usar SQL. Observe que MinSQL é uma camada de dados e não uma camada de computação, portanto, certas instruções SQL que precisam de cálculos (SUM, MAX, GROUP BY, JOIN, etc...) não são suportadas.
Todas as instruções de consulta devem ser enviadas via POST
para sua instância MinSQL.
Para selecionar todos os logs de um log específico, você pode executar uma instrução SELECT simples
SELECT * FROM mylog
E envie isso para MinSQL via POST
curl -X POST
http://127.0.0.1:9999/search
-H 'MINSQL-TOKEN: TOKEN1'
-d 'SELECT * FROM mylog'
Isso retornará todas as linhas de log brutas armazenadas para esse log.
67.164.164.165 - - [24/Jul/2017:00:16:46 +0000] "GET /info.php HTTP/1.1" 200 24564 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.115 Safari/537.36"
67.164.164.165 - - [24/Jul/2017:00:16:48 +0000] "GET /favicon.ico HTTP/1.1" 404 209 "http://104.236.9.232/info.php" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.115 Safari/537.36"
24.26.204.22 - - [24/Jul/2017:00:17:16 +0000] "GET /info.php HTTP/1.1" 200 24579 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.115 Safari/537.36"
45.23.126.92 - - [24/Jul/2017:00:16:18 +0000] "GET /info.php HTTP/1.1" 200 24589 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.115 Safari/537.36"
Podemos obter apenas partes dos dados usando qualquer uma das entidades MinSQL suportadas, que começam com um sinal $
.
Podemos selecionar os dados por sua posição, por exemplo, para obter a primeira coluna e a quarta podemos usar $1
e $4
SELECT $ 1 , $ 4 FROM mylog;
Ao qual o MinSQL responderá
67.164.164.165 [24/Jul/2017:00:16:46
67.164.164.165 [24/Jul/2017:00:16:48
24.26.204.22 [24/Jul/2017:00:17:16
45.23.126.92 [24/Jul/2017:00:16:18
Você pode ver que os dados foram selecionados como estão, porém a coluna de data selecionada não está limpa o suficiente, o MinSQL fornece outras entidades para lidar com isso.
MinSQL fornece uma boa lista de entidades que facilitam a extração de blocos de dados de seus dados brutos, graças à nossa poderosa abordagem Schema on Read. Por exemplo, podemos selecionar qualquer ip em nossos dados usando a entidade $ip
e qualquer data usando $date
.
SELECT $ip, $ date FROM mylog
Ao qual o MinSQL responderá
67.164.164.165 24/Jul/2017
67.164.164.165 24/Jul/2017
24.26.204.22 24/Jul/2017
45.23.126.92 24/Jul/2017
Se seus dados contiverem mais de um endereço IP, você poderá acessar os IPs subsequentes usando entidades posicionais.
SELECT $ip, $ip2, $ip3, $ date FROM mylog
Observe que se nenhum número posicional for especificado em uma entidade, o padrão será a primeira posição, neste caso $ip == $ip1
Usando o poderoso mecanismo de seleção do MinSQL, você também pode filtrar os dados para que apenas as informações relevantes que você precisa extrair de seus logs sejam retornadas.
Por exemplo, para filtrar um único IP dos seus logs, você pode selecionar $ip
SELECT * FROM mylog WHERE $ip = ' 67.164.164.165 '
Ao qual o MinSQL responderá apenas com as linhas correspondentes
67.164.164.165 - - [24/Jul/2017:00:16:46 +0000] "GET /info.php HTTP/1.1" 200 24564 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.115 Safari/537.36"
67.164.164.165 - - [24/Jul/2017:00:16:48 +0000] "GET /favicon.ico HTTP/1.1" 404 209 "http://104.236.9.232/info.php" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.115 Safari/537.36"
Você pode selecionar linhas de log que contenham um valor usando o operador LIKE
ou NOT NULL
para qualquer entidade.
SELECT * FROM mylog WHERE $ line LIKE ' Intel ' AND $email IS NOT NULL
Esta consulta retornaria todas as linhas de log contendo a palavra Intel
que também contém um endereço de e-mail.
Uma lista de entidades suportadas pelo MinSQL: