Conhecendo a ferramenta Opensearch
Tags: opensearch, opensource, monitoring
Published: 2022-06-06 14:55:19

Heeey!

> Podemos nos referir ao Opensearch como um fork do Elasticsearch e Kibana 7.10. Basicamente, o Opensearch é uma ferramente de monitoração de aplicação e análise de logs totalmente opensource (mas neste post vamos explorar um pouco mais sobre demais recursos que a ferramenta oferece).

Antes de tudo, vamos entender um pouco mais sobre o que a própria AWS nos conta sobre a ferramenta: 

## O que é Opensearch?
O OpenSearch é um conjunto distribuído de pesquisa e análise de código aberto usado para uma ampla variedade de casos de uso, como monitoramento de aplicações em tempo real, análise de logs e pesquisa de sites. O OpenSearch fornece um sistema altamente escalável para fornecer acesso rápido e resposta a grandes volumes de dados com uma ferramenta de visualização integrada, o OpenSearch Dashboards, que facilita a exploração de dados pelos usuários. 
Assim como o Elasticsearch, o Opensearch oferece um mecanismo de pesquisa de texto completo distribuído baseado no Apache Lucene com uma interface de API RESTful e suporte para documentos JSON.

## Qual a ideia por trás da criação?
Em 2021 a Elastic mudou a licença de software permissiva ALv2 para a Elastic License v2 (ELv2) and SSPL, essas licenças não seguem firmemente a ideia do Open Source e não oferecem as mesmas liberdades para os usuários. Logo, o opensearch virou um fork do Elasticsearch e Kibana na versão 7.10. Com o objetivo de oferecer uma ferramenta totalmente opensource para a comunidade.

## Principais recursos do Opensearch que não fazem parte da licença free do Elasticsearch

Recurso                  | Benefício
-------------------------|----------
Segurança avançada       | Oferece recursos de criptografia, autenticação, autorização e auditoria. Eles incluem integrações com Active Directory, LDAP, SAML, Kerberos, tokens da Web JSON
Geração de relatórios    | Agende, exporte e compartilhe relatórios de painéis, pesquisas salvas, alertas e visualizações. 
Detecção de anomalias    | Aproveite a detecção de anomalias de Machine Learning com base no algoritmo Random Cut Forest (RCF) para detectar anomalias automaticamente à medida que seus dados são ingeridos. Combine com Alertas para monitorar dados quase em tempo real e enviar notificações de alertas automaticamente. 
Analisador de performance e framework RCA| Consulte várias métricas e agregações de performance do cluster. Use o PerfTop, a interface de linha de comando (CLI) para exibir e analisar essas métricas rapidamente. Use a framework de análise de causas-raiz (RCA) para investigar problemas de performance e confiabilidade em clusters.
Trace Analytics          | Ingere e visualize dados OpenTelemetry para aplicações distribuídas. Visualize o fluxo de eventos entre essas aplicações para identificar problemas de performance.
Geração de alertas       | Monitore dados automaticamente e envie notificações de alertas automaticamente para as partes interessadas. Crie condições de alerta altamente específicas usando a linguagem de consulta completa e os recursos de script do OpenSearch.

#Vamos a prática!

Vamos subir o Opensearch e o Opensearch dashboards na versão de teste, esta versão, o Opensearch já provisiona todas as configurações de segurança (certificados).

Garanta que você tenha o[docker-compose](https://docs.docker.com/compose/install/) instalado.

Garanta que a variável **vm.max_map_count** esteja setada com o valor de 262144:
```bash
sysctl -w vm.max_map_count=262144
```
> Essa configuração do sysctl não é permanente

Crie o arquivo docker-compose.yml:
```yml
version: '3'
services:
  opensearch-node1:
    image: opensearchproject/opensearch:latest
    container_name: opensearch-node1
    environment:
      - cluster.name=opensearch-cluster
      - node.name=opensearch-node1
      - discovery.seed_hosts=opensearch-node1,opensearch-node2
      - cluster.initial_master_nodes=opensearch-node1,opensearch-node2
      - bootstrap.memory_lock=true
      - "OPENSEARCH_JAVA_OPTS=-Xms1g -Xmx1g" 
    ulimits:
      memlock:
        soft: -1
        hard: -1
      nofile:
        soft: 65536 
        hard: 65536
    volumes:
      - opensearch-data1:/usr/share/opensearch/data
    ports:
      - 9200:9200
      - 9600:9600
    networks:
      - opensearch-net
  opensearch-node2:
    image: opensearchproject/opensearch:latest
    container_name: opensearch-node2
    environment:
      - cluster.name=opensearch-cluster
      - node.name=opensearch-node2
      - discovery.seed_hosts=opensearch-node1,opensearch-node2
      - cluster.initial_master_nodes=opensearch-node1,opensearch-node2
      - bootstrap.memory_lock=true
      - "OPENSEARCH_JAVA_OPTS=-Xms1g -Xmx1g"
    ulimits:
      memlock:
        soft: -1
        hard: -1
      nofile:
        soft: 65536
        hard: 65536
    volumes:
      - opensearch-data2:/usr/share/opensearch/data
    networks:
      - opensearch-net
  opensearch-dashboards:
    image: opensearchproject/opensearch-dashboards:latest
    container_name: opensearch-dashboards
    ports:
      - 5601:5601
    expose:
      - "5601"
    environment:
      OPENSEARCH_HOSTS: '["https://opensearch-node1:9200","https://opensearch-node2:9200"]'
    networks:
      - opensearch-net

volumes:
  opensearch-data1:
  opensearch-data2:

networks:
  opensearch-net:

```

Assim que salvar o arquivo, suba todos os serviços:
```bash
docker-compose up -d
```

Temos que ter 3 containers rodando, dois opensearch e um opensearch Dashboards
```bash
CONTAINER ID   IMAGE                                            COMMAND                  CREATED         STATUS              PORTS                                                                                                      NAMES
7e1de85c3f8c   opensearchproject/opensearch-dashboards:latest   "./opensearch-dashbo…"   2 minutes ago   Up About a minute   0.0.0.0:5601->5601/tcp, :::5601->5601/tcp                                                                  opensearch-dashboards
40b047a9123e   opensearchproject/opensearch:latest              "./opensearch-docker…"   2 minutes ago   Up About a minute   9200/tcp, 9300/tcp, 9600/tcp, 9650/tcp                                                                     opensearch-node2
c72ebd7f6e3b   opensearchproject/opensearch:latest              "./opensearch-docker…"   2 minutes ago   Up About a minute   0.0.0.0:9200->9200/tcp, :::9200->9200/tcp, 9300/tcp, 0.0.0.0:9600->9600/tcp, :::9600->9600/tcp, 9650/tcp   opensearch-node1
```

Agora basta acessar o Opensearch Dashboard na porta **5601**:
![Opensearch Dashboards](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/cw04f6urujyq8juxc47b.png)

>Você consegue acessar com user admin, senha admin.

###Inserindo dados para visualização

Para visualizar dados eu importei alguns dados. 

No **Menu lateral**, na área de Management, selecione o **Dev Tools**.

>Através do Dev Tools, é possível realizar requisições direto no nós de Opensearch.

Os nossos documentos não tem nenhum campo do tipo datetime (ele é necessário para uma melhor visualização e análise), então primeiro vamos criar uma pipeline que irá criar o campo "indexed_at" em todo arquivo que for adicionado:

```json
PUT /_ingest/pipeline/timestamp
{
  "description": "Adicionando o campo indexed_at nos documentos",
  "processors": [
    {
      "set": {
        "field": "indexed_at",
        "value": "{{_ingest.timestamp}}"
      }
    }
  ]
}
```
Vamos criar o índice e definir essa pipeline como default:
```json
PUT /movies
{
  "settings": {
    "index.default_pipeline": "timestamp"
  }
}
```

Vamos adicionar um bulk request para alguns documentos:
```json
PUT /movies/_bulk/
{ "index":{} }
{ "title" : " Predestination", "year":2014 , "genre":["Action", "Drama", "Sci-Fi"] }
{ "index":{} }
{ "title" : "Star Wars: Episode VII - The Force Awakens", "year":2015 , "genre":["Action", "Adventure", "Fantasy", "Sci-Fi"] }
{ "index":{} }
{ "title" : "Interstellar", "year":2014 , "genre":["Sci-Fi", "Adventure", "Drama"] }
{ "index":{} }
{ "title" : "Venom", "year":2018 , "genre":["Action", " Adventure", "Sci-Fi"] }
{ "index":{} }
{ "title" : "A Quiet Place Part II", "year":2020 , "genre":["Horror", "Sci-Fi", "Drama"] }
{ "index":{} }
{ "title" : "Donnie Darko", "year":2001 , "genre":["Drama", "Sci-Fi", "Mistery"] }
{ "index":{} }
{ "title" : "Black Widow", "year":2021 , "genre":["Action", " Adventure", "Sci-Fi"] }
{ "index":{} }
{ "title" : "Nobody", "year":2021 , "genre":["Action", "Drama", "Crime"] }
{ "index":{} }
{ "title" : "The Dark Knight", "year":2008 , "genre":["Action", "Drama", "Crime"] }
{ "index":{} }
{ "title" : "Inception", "year":2010 , "genre":["Action", " Adventure", "Sci-Fi"] }
{ "index":{} }
{ "title" : " The Matrix", "year":1999 , "genre":["Action",  "Sci-Fi"] }
{ "index":{} }
{ "title" : "Avatar", "year":2009 , "genre":["Action", " Adventure", "Fantasy"] }
{ "index":{} }
{ "title" : "Ex Machina", "year":2014 , "genre":["Action", " Adventure", "Sci-Fi"] }
{ "index":{} }
{ "title" : " The Hobbit: An Unexpected Journey", "year":2012 , "genre":[" Adventure", "Fantasy"] }
{ "index":{} }
{ "title" : "Wonder Woman", "year":2017 , "genre":["Action", " Adventure", "Fantasy"] }
```

Clique em um ícone de play para enviar a requisição:
![Opensearch Dashboards-Dev Tools](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/5dq76bnym4hbjj7mbtfk.png)

### Configurando Index Pattern

Ao retornar no **Discover** aparecerá uma página para criar o **Index Pattern**, clique em **Create index pattern**:

**Index pattern name**: movies*

**Time field**: indexed_at

Clique em **Create Index pattern**

Aparecerá todos os campos existentes neste index, podemos alterar o modo de visualização. Por exemplo:

Acesse o campo **year** e clique no ícone de editar:

**Format**: Number
**Numeral.js format pattern**: 0

![Opensearch Dashboards- movies-fields](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/xuoirj5er8b1yuintxpc.png)

Clique em **Save field**
 
Após retornar para o **Discover**, já conseguimos visualizar os documentos que adicionamos:
![Opensearch Dashboards-Discover](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/e2uqjwo4cjis0jefy72j.png)

>Um recurso que faz falta no Opensearch Dashboard é o Lens. Não foi possível inseri-lo porque esta feature do Kibana não é Open Source.
 
Espero que tenham gostado da ferramenta!
Até mais o/