# Set Up Integration from SonarQube

#### <span style="color: rgb(53, 152, 219);">**SonarQube**</span>

**Introduction**

SonarQube is a self-hosted or cloud-enabled tool that scans source code to detect bugs, vulnerabilities, code smells, duplications, and coverage issues across 30+ languages. It integrates with build tools (Maven, Gradle, MSBuild) and CI/CD pipelines like Jenkins, GitLab, and GitHub Actions. With IDE plugins for VS Code, IntelliJ, Eclipse, and more, it enforces "Clean as You Code" practices during development. Built for DevSecOps, it can block pull requests or deployments if quality gates are not met.

<p class="callout warning">**Description:**  
SonarQube does not natively support direct integration with the Elastic Stack for sending code quality metrics. </p>

<p class="callout info">However, it can forward **logs**, **metrics**, or even **SonarQube API data** into Elasticsearch using custom setups.</p>

##### What It Does:

- Sends SonarQube logs to Elasticsearch for indexing and analysis in Kibana.
- Optionally pushes code quality metrics (bugs, vulnerabilities, coverage, etc.) to Elasticsearch using custom scripts.
- Enables unified observability of code health and platform behavior inside Elastic Stack.

#### <span style="color: rgb(53, 152, 219);">**Option 1: Send Logs to Elastic Using Filebeat**</span>

**Description:**

Use Filebeat to collect and forward SonarQube logs to Elasticsearch for centralized logging and visualization in Kibana.

<p class="callout info">**What It Does:**</p>

- Automatically ships log files from the SonarQube server to Elasticsearch.
- Allows real-time log monitoring, search, and alerting via Kibana.
- Supports analysis of SonarQube behavior, errors, and performance patterns.

##### Steps

**Prepare SonarQube Logs**

- **Locate logs (default path: /opt/sonarqube/logs/)**
    
    
    - web.log
    - ce.log
    - es.log
    - sonar.log

**Install Filebeat on the SonarQube Host**

- I**nstall Filebeat from**
    
    
    - <span style="color: rgb(35, 111, 161);">https://www.elastic.co/docs/reference/beats/filebeat/filebeat-installation-configuration</span>

**Configure Filebeat to Read SonarQube Logs**

- **Edit filebeat.yml configuration file:**

> filebeat.inputs:  
> \- type: log  
>  enabled: true  
>  paths:  
> \- /opt/sonarqube/logs/\*.log
> 
> output.elasticsearch:  
>  hosts: \["http://&lt;elasticsearch-host&gt;:9200"\]  
>  username: "elastic"  
>  password: "your-password"

- **Start and Enable Filebeat**

> sudo systemctl enable filebeat  
> sudo systemctl start filebeat

#### <span style="color: rgb(53, 152, 219);">**Option 2: Push Metrics to Elastic via SonarQube API**</span>

**Description:**  
Use SonarQube’s built-in Web API to extract code quality metrics and push them into Elasticsearch using a custom script.

<p class="callout info">**What It Does:**</p>

- Retrieves metrics like bugs, vulnerabilities, code smells, and coverage.
- Pushes data to an Elasticsearch index for dashboarding or analysis.
- Enables tracking of project quality trends over time in Kibana.

##### Steps:

**Enable API Access in SonarQube**

- **SonarQube provides a built-in Web API at:**
- - http://&lt;sonarqube-host&gt;/api/measures/component

- **Use the API to retrieve metrics like:**

> GET /api/measures/component?component=&lt;project\_key&gt;&amp;metricKeys=bugs,vulnerabilities,coverage

**Build a Custom Script (Python Example)**

- **Use Python to fetch and send metrics:**

> import requests, json
> 
> sonar\_url = "http://&lt;sonarqube&gt;/api/measures/component"  
> params = {"component": "your\_project", "metricKeys": "bugs,vulnerabilities,code\_smells"}
> 
> res = requests.get(sonar\_url, params=params)  
> data = res.json()
> 
> \# Send to Elasticsearch  
> es\_url = "http://&lt;elasticsearch&gt;:9200/sonarqube-metrics/\_doc"  
> requests.post(es\_url, headers={"Content-Type": "application/json"}, data=json.dumps(data))

<p class="callout info">What Happens Next?</p>

<table border="1" class="w-fit min-w-(--thread-content-width)" data-end="3199" data-start="2618" id="bkmrk-action-result-sonarq" style="height: 181px; width: 100%; border-collapse: collapse; border-style: solid;"><thead data-end="2714" data-start="2618"><tr data-end="2714" data-start="2618"><th data-col-size="sm" data-end="2655" data-start="2618" style="width: 49.9338%;">Action</th><th data-col-size="md" data-end="2714" data-start="2655" style="width: 49.9338%;">Result</th></tr></thead><tbody data-end="3199" data-start="2812"><tr data-end="2908" data-start="2812"><td data-col-size="sm" data-end="2849" data-start="2812" style="width: 49.9338%;">SonarQube writes logs</td><td data-col-size="md" data-end="2908" data-start="2849" style="width: 49.9338%;">Filebeat ships them to Elasticsearch</td></tr><tr data-end="3005" data-start="2909"><td data-col-size="sm" data-end="2946" data-start="2909" style="width: 49.9338%;">Kibana receives log data</td><td data-col-size="md" data-end="3005" data-start="2946" style="width: 49.9338%;">Visualize system behavior and performance</td></tr><tr data-end="3102" data-start="3006"><td data-col-size="sm" data-end="3043" data-start="3006" style="width: 49.9338%;">Script pulls SonarQube metrics</td><td data-col-size="md" data-end="3102" data-start="3043" style="width: 49.9338%;">Elasticsearch stores code health data (via API)</td></tr><tr data-end="3199" data-start="3103"><td data-col-size="sm" data-end="3140" data-start="3103" style="width: 49.9338%;">Kibana dashboards can be created</td><td data-col-size="md" data-end="3199" data-start="3140" style="width: 49.9338%;">Visualize bugs, vulnerabilities, coverage, etc.</td></tr></tbody></table>

<p class="callout info">Requirements</p>

<table border="1" class="w-fit min-w-(--thread-content-width)" data-end="3852" data-start="3223" id="bkmrk-requirement-purpose-" style="height: 179.271px; width: 107.857%; border-collapse: collapse; border-style: solid;"><thead data-end="3312" data-start="3223"><tr data-end="3312" data-start="3223" style="height: 29.8785px;"><th data-col-size="sm" data-end="3247" data-start="3223" style="height: 29.8785px;">Requirement</th><th data-col-size="md" data-end="3312" data-start="3247" style="height: 29.8785px;">Purpose</th></tr></thead><tbody data-end="3852" data-start="3403"><tr data-end="3492" data-start="3403" style="height: 29.8785px;"><td data-col-size="sm" data-end="3427" data-start="3403" style="height: 29.8785px;">Filebeat</td><td data-col-size="md" data-end="3492" data-start="3427" style="height: 29.8785px;">Forwards log files to Elasticsearch</td></tr><tr data-end="3582" data-start="3493" style="height: 29.8785px;"><td data-col-size="sm" data-end="3517" data-start="3493" style="height: 29.8785px;">Elasticsearch</td><td data-col-size="md" data-end="3582" data-start="3517" style="height: 29.8785px;">Stores both logs and custom metrics</td></tr><tr data-end="3672" data-start="3583" style="height: 29.8785px;"><td data-col-size="sm" data-end="3607" data-start="3583" style="height: 29.8785px;">SonarQube API</td><td data-col-size="md" data-end="3672" data-start="3607" style="height: 29.8785px;">Source of code quality data</td></tr><tr data-end="3762" data-start="3673" style="height: 29.8785px;"><td data-col-size="sm" data-end="3697" data-start="3673" style="height: 29.8785px;">Custom Script</td><td data-col-size="md" data-end="3762" data-start="3697" style="height: 29.8785px;">Pulls metrics and pushes them to Elastic</td></tr><tr data-end="3852" data-start="3763" style="height: 29.8785px;"><td data-col-size="sm" data-end="3787" data-start="3763" style="height: 29.8785px;">Cron (optional)</td><td data-col-size="md" data-end="3852" data-start="3787" style="height: 29.8785px;">Automates periodic metric synchronization</td></tr></tbody></table>

<p class="callout info">Integration Mapping Summary</p>

<table border="1" class="w-fit min-w-(--thread-content-width)" data-end="4539" data-start="3891" id="bkmrk-component-function-s" style="height: 213px; width: 106.905%; border-collapse: collapse; border-style: solid;"><thead data-end="3972" data-start="3891"><tr data-end="3972" data-start="3891"><th data-col-size="sm" data-end="3911" data-start="3891" style="width: 49.947%;">Component</th><th data-col-size="md" data-end="3972" data-start="3911" style="width: 49.947%;">Function</th></tr></thead><tbody data-end="4539" data-start="4054"><tr data-end="4134" data-start="4054"><td data-col-size="sm" data-end="4074" data-start="4054" style="width: 49.947%;">SonarQube Logs</td><td data-col-size="md" data-end="4134" data-start="4074" style="width: 49.947%;">Shipped to Elasticsearch via Filebeat</td></tr><tr data-end="4215" data-start="4135"><td data-col-size="sm" data-end="4155" data-start="4135" style="width: 49.947%;">Filebeat</td><td data-col-size="md" data-end="4215" data-start="4155" style="width: 49.947%;">Collects and forwards logs</td></tr><tr data-end="4296" data-start="4216"><td data-col-size="sm" data-end="4236" data-start="4216" style="width: 49.947%;">Elasticsearch</td><td data-col-size="md" data-end="4296" data-start="4236" style="width: 49.947%;">Stores logs and metrics</td></tr><tr data-end="4377" data-start="4297"><td data-col-size="sm" data-end="4317" data-start="4297" style="width: 49.947%;">SonarQube API</td><td data-col-size="md" data-end="4377" data-start="4317" style="width: 49.947%;">Retrieves code metrics like bugs, smells, coverage</td></tr><tr data-end="4458" data-start="4378"><td data-col-size="sm" data-end="4398" data-start="4378" style="width: 49.947%;">Custom Script</td><td data-col-size="md" data-end="4458" data-start="4398" style="width: 49.947%;">Pushes metrics to Elasticsearch</td></tr><tr data-end="4539" data-start="4459"><td data-col-size="sm" data-end="4479" data-start="4459" style="width: 49.947%;">Kibana</td><td data-col-size="md" data-end="4539" data-start="4479" style="width: 49.947%;">Visualizes logs and code quality over time</td></tr></tbody></table>