Kibana — Log Visualization Tool
Overview
This page covers our internal log visualisation tool, powered by open-source Kibana, to help Support and SA/IE teams debug production issues. The aim is to make log analysis accessible to non-technical users by offering clear instructions and examples.
Prerequisites
While using Kibana doesn't require any prerequisite, a basic understanding of Lucene / KQL queries is helpful for advanced filtering.
Purpose & use case
- Allow a new user of Kibana to find the logs that could be helpful for a given troubleshooting.
- Build an understanding of the different kinds of logs that HyperVerge applications publish, for advanced debugging.
Log types and index names
Our system generates various types of logs, each stored in specific indices:
-
Request Response Logs — contain request payloads (body and headers), response bodies, status codes, processing times, content lengths, etc. Useful for understanding individual request details.
- Index name:
kubera-log-request-* - Retention: 90 days
- Index name:
-
Application Logs — generated by backend applications, essential for advanced debugging.
- Index name:
kubera-log-app-* - Retention: 7 days
- Index name:
-
Nginx Logs — produced by our Nginx reverse proxy at the backend application's entry point. Include a subset of data from request response logs. For most services,
nginx.request_timealso accounts for the time taken to upload the request payload from the client application.- Index name:
filebeat-* - Retention: 7 days
- Index name:
-
System Logs (syslogs) — insights into system or OS-level events.
- Index name:
filebeat-* - Retention: 7 days
- Index name:
-
Machine Access Logs — details of users who have accessed the machine/system/server.
- Index name:
filebeat-* - Retention: 7 days
- Index name:
The index name selector is at the top-left of the Discover page of Kibana, under the search bar.
Standard fields across logs
Several fields are consistent across different log types:
transactionId— inreq.headers.transactionid(request response logs) andnginx.req_headers.transactionId(Nginx logs).appId— inreq.headers.appid(request response logs) andnginx.req_headers.appId(Nginx logs). May be absent in Nginx logs if not in request headers (e.g., when using Authorization Token for authentication).requestId—requestIdin request response logs,nginx.res_headers.x-request-idin Nginx logs,requestIdin application logs.product— the product or service associated with the log, accessible via theproductkeyword in request response and application logs.region— AWS or other cloud region where the request was processed.cloud.regionin request response/application logs;meta.cloud.regionin Nginx logs.url— the API endpoint:nginx.access.urlin Nginx logs,req.originalUrlin request response logs.
Commonly used fields per index
Request Response Logs (kubera-log-request-*)
req.headers.transactionidreq.headers.appidrequestIdproductbeat.namecloud.regionres.statusCoderesponseTimereq.originalUrlreq.headersStrreq.bodyStrres.bodyStr
App Logs (kubera-log-app-*)
productcloud.regionrequestIdloglinelevelmessagebeat.name
Nginx Logs (filebeat-*)
nginx.res_headers.x-request-idnginx.req_headers.transactionIdnginx.req_headers.appIdnginx.statusnginx.upstream_statusnginx.request_timenginx.upstream_response_timenginx.proxy_add_x_forwarded_forORnginx.remote_ipbeat.name
Using Kibana for log analysis
Accessing Kibana
- Open Kibana at https://cg-1.log.hyperverge.org/.
- Log in with your HyperVerge Google account.
Discovering logs
- Navigate to Discover at https://cg-1.log.hyperverge.org/app/kibana#/discover.
- Select the index pattern from the dropdown menu (e.g.,
kubera-log-request-*). - Set the time range in the top-right corner.
warning
Keep the duration as specific as possible and do not use a time window greater than a week for faster processing and to reduce load on the Elastic cluster.
- Search logs — enter search queries in the search bar to filter logs based on specific criteria. You can also click Add a filter to filter by specific fields. Multiple fields can be combined.
Screenshots: Discover page, index selector, search bar, and "Add a filter" panel. (Pending migration from Notion.)
Example — trace a specific request
Trace a specific request via transactionId
- In the search bar, enter:
req.headers.transactionid: "YOUR_TRANSACTION_ID". - View results — Kibana displays all logs associated with the specified
transactionIdin the given time frame.
Find a specific request in Nginx and App Logs (advanced debugging)
-
Get the RequestId from request-response logs
- Filter for
req.originalUrl: "/v1/readId" AND res.statusCode: 500. Use a longer time frame if no results show up. - Find a sample request and copy the value for
requestId.
- Filter for
-
Find the request in Nginx logs
- Open Kibana in a new tab and select
filebeat-*index. Use the same time frame. - Filter for
nginx.res_headers.x-request-id: <requestId>.
- Open Kibana in a new tab and select
-
Find the request in App Logs
- Open Kibana in a new tab and select
kubera-log-app-*index. Use the same time frame. - Filter for
requestId: <requestId>. - Read through the log lines / messages to identify the cause of the 500 error.
- Open Kibana in a new tab and select
Advanced — KQL queries
For more refined searches, use Kibana Query Language (KQL) / Lucene syntax:
Basic syntax:
- Specific status code:
req.statusCode: 200 - Range of status codes:
req.statusCode: [400 TO 499]
Combining conditions:
req.originalUrl: "/v1/readId" AND res.statusCode: 200
Wildcards and regex:
- URLs starting with
/api:req.originalUrl: "/api*" - Regex:
res.bodyStr: /error.*/
For a full KQL tutorial, see the official Elastic documentation: Kibana Query Language.