
Estou tentando configurar uminstância docker appsearch autogerenciada, junto com kibana e elasticsearch, consultado por um aplicativo uvicorn python, proxy de um servidor web nginx
Meu problema atual é que os logs do appsearch mostram o agente de usuário padrão do python e o IP nos logs do appsearch (ou seja, python-requests/2.22.0 e um IP da LAN).
Gostaria de encaminhar os cabeçalhos personalizados nginx que contêm o IP correto e o agente do usuário do cliente remoto para os logs do appsearch que são tão bem consultáveis no kibana.
Percebi que existe um output.elasticsearch.headers
que pode ser definido para cabeçalhos personalizados no ambiente ou no filebeat.yml.
Vocês têm alguma idéia sobre isso?
Obrigado.
Responder1
Bem, finalmente consegui.
Não foi necessário nem suficiente usar variáveis yml ou de ambiente, pois o IP do cliente real e o agente do usuário não eram estáticos.
Mudei primeiro o proxy nginx.conf para este:
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-User-Agent $http_user_agent;
Então, em cada método FastAPI do uvicorn, adicionei um primeiro request
parâmetro:
from fastapi import FastAPI
app = FastAPI()
# ...
@app.get("/search")
async def search_endpoint(request: Request):
# ... method implementation
O search_endpoint chama minha classe de pesquisa que, por sua vez, usa o cliente python do appsearch:
import elastic_app_search
# ...
client = elastic_app_search.Client(api_key = XXX, base_endpoint = YYY, use_https=False)
E então no cliente eu atualizo os cabeçalhos:
x_headers = {
'Connection': 'close',
'X-Forwarded-For': request.headers['X-Forwarded-For'],
'X-User-Agent': request.headers['X-User-Agent']
}
client.session.session.headers.update(x_headers)
# For current appsearch python client the repeated name was necessary
Em seguida, os logs do aplicativo começaram a registrar os cabeçalhos X personalizados =)