
Ich versuche, eineselbstverwaltete Docker-AppSearch-Instanz, zusammen mit Kibana und Elasticsearch, abgefragt von einer Uvicorn-Python-App, geproxied von einem Nginx-Webserver
Mein aktuelles Problem ist, dass in den AppSearch-Protokollen der Python-Standardbenutzeragent und die IP angezeigt werden (d. h. python-requests/2.22.0 und eine LAN-IP).
Ich möchte die benutzerdefinierten Nginx-Header, die die richtige IP und den richtigen Benutzeragenten des Remote-Clients enthalten, an die AppSearch-Protokolle weiterleiten, die in Kibana so gut abfragbar sind.
Mir ist aufgefallen, dass output.elasticsearch.headers
in der Umgebung oder in filebeat.yml benutzerdefinierte Header eingestellt werden können.
Habt ihr irgendwelche Ideen dazu?
Danke schön.
Antwort1
Nun, ich habe es endlich geschafft.
Es war weder notwendig noch ausreichend, YML- oder Umgebungsvariablen zu verwenden, da die tatsächliche Client-IP und der Benutzeragent nicht statisch waren.
Ich habe zuerst den Proxy von nginx.conf wie folgt geändert:
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;
Dann habe ich in jeder uvicorn FastAPI-Methode einen ersten request
Parameter hinzugefügt:
from fastapi import FastAPI
app = FastAPI()
# ...
@app.get("/search")
async def search_endpoint(request: Request):
# ... method implementation
Der Suchendpunkt ruft meine Suchklasse auf, die wiederum den Python-Client von Appsearch verwendet:
import elastic_app_search
# ...
client = elastic_app_search.Client(api_key = XXX, base_endpoint = YYY, use_https=False)
Und dann aktualisiere ich im Client die Header:
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
Dann begannen die Anwendungsprotokolle mit der Protokollierung der benutzerdefinierten X-Header =)