Generating Bamboo Agents counts from the database

Platform Notice: Data Center Only - This article only applies to Atlassian products on the Data Center platform.

Note that this KB was created for the Data Center version of the product. Data Center KBs for non-Data-Center-specific features may also work for Server versions of the product, however they have not been tested. Support for Server* products ended on February 15th 2024. If you are running a Server product, you can visit the Atlassian Server end of support announcement to review your migration options.

*Except Fisheye and Crucible

Summary

Bamboo provides a web interface to manage Agents. Though most Bamboo users are happy with that interface, some Enterprise customers have specific requirements that may exceed the usability of the Web UI.

This document describes an SQL query that would assist in extracting Agent counts from the Bamboo database:

  • Agent details and dedication relationships

  • Elastic Agent dependencies

  • Last known build and agent status

  • Uptime (last known information)

Building SQL statements for reporting purposes is not part of the Atlassian Support scope and this work is provided "as-is", on a best effort basis. Queries may work better or worse than expected, your mileage may vary. It is up to each customer to analyse each query individually and understand if that is enough for their specific needs.

Environment

  • Bamboo Server and Data Center

Solution

Use the following SQL to gather statistics about Bamboo Agents.

The SQL below will capture:

  • Information from LOCAL, REMOTE and ELASTIC agents - you can customise it on the WHERE clause. EPHEMERAL agents will only show up in the DB during their existence so not required to be "cleaned-up"

  • Known Uptime: This is the last known time that Bamboo has about that Agent. It is not an indicator of the current uptime of the Agent (but it may be if the agent is up and connected)

Make sure to update any "AT TIME ZONE 'AEST'" occurrences to reflect your local timezone

This SQL works on PostgreSQL and may require changes to work with additional databases

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 SELECT Q.QUEUE_ID "Agent Id", Q.UUID "UUID", EI.NAME "Elastic Image Name", Q.TITLE "Name", Q.AGENT_TYPE "Type", Q.AGENT_DESCRIPTION "Description", Q.CREATED_DATE "Creation Date", Q.LAST_STOP_TIME "Last Stop Time", Q.LAST_START_TIME "Last Start Date", BRSK.BUILD_KEY "Last Build", BRS.BUILD_COMPLETED_DATE "Last Build Date", CASE WHEN Q.AGENT_TYPE = 'LOCAL' THEN Q.AGENT_TYPE WHEN Q.LAST_STOP_TIME IS NULL AND Q.LAST_START_TIME IS NOT NULL THEN CAST( (SELECT DATE_TRUNC('SECOND', CURRENT_TIMESTAMP AT TIME ZONE 'UTC' - Q.LAST_START_TIME AT TIME ZONE 'AEST')) AS TEXT) WHEN Q.LAST_STOP_TIME IS NOT NULL AND Q.LAST_START_TIME IS NOT NULL THEN CAST( (SELECT DATE_TRUNC('SECOND', Q.LAST_STOP_TIME - Q.LAST_START_TIME)) AS TEXT) END AS "Known Uptime", CASE WHEN ( Q.LAST_START_TIME > Q.LAST_STOP_TIME OR Q.LAST_STOP_TIME IS NULL ) THEN TRUE ELSE FALSE END "Online", CASE WHEN Q.ENABLED IS TRUE AND Q.AGENT_TYPE = 'ELASTIC' AND Q.LAST_STOP_TIME IS NOT NULL THEN FALSE WHEN Q.ENABLED IS TRUE THEN TRUE ELSE FALSE END "Enabled", AA.EXECUTABLE_TYPE "Dedication Type", CASE WHEN AA.EXECUTABLE_TYPE = 'PROJECT' THEN CAST( (SELECT PROJECT_KEY FROM PROJECT WHERE PROJECT_ID = AA.EXECUTABLE_ID) AS TEXT) WHEN AA.EXECUTABLE_TYPE IN ('PLAN', 'JOB') THEN CAST( (SELECT FULL_KEY FROM BUILD WHERE BUILD_ID = AA.EXECUTABLE_ID) AS TEXT) WHEN AA.EXECUTABLE_TYPE = 'ENVIRONMENT' THEN CAST( (SELECT NAME FROM DEPLOYMENT_ENVIRONMENT WHERE ENVIRONMENT_ID = AA.EXECUTABLE_ID) AS TEXT) WHEN AA.EXECUTABLE_TYPE = 'DEPLOYMENT_PROJECT' THEN CAST( (SELECT NAME FROM DEPLOYMENT_PROJECT WHERE DEPLOYMENT_PROJECT_ID = AA.EXECUTABLE_ID) AS TEXT) END "Dedicated object" FROM QUEUE Q LEFT JOIN (SELECT MAX(BUILD_COMPLETED_DATE) AS BUILD_COMPLETED_DATE, BUILD_AGENT_ID FROM BUILDRESULTSUMMARY GROUP BY BUILD_AGENT_ID) BRS ON Q.QUEUE_ID = BRS.BUILD_AGENT_ID LEFT JOIN AGENT_ASSIGNMENT AA ON AA.EXECUTOR_ID = Q.QUEUE_ID LEFT JOIN ELASTIC_IMAGE EI ON Q.ELASTIC_IMAGE = EI.ELASTIC_IMAGE_ID LEFT JOIN (SELECT MAX(BUILD_KEY) AS BUILD_KEY, BUILD_AGENT_ID FROM BUILDRESULTSUMMARY GROUP BY BUILD_AGENT_ID) BRSK ON Q.QUEUE_ID = BRSK.BUILD_AGENT_ID WHERE Q.AGENT_TYPE IN ( 'REMOTE', 'LOCAL', 'ELASTIC' ) ORDER BY Q.CREATED_DATE, BRS.BUILD_COMPLETED_DATE;
Updated on March 13, 2025

Still need help?

The Atlassian Community is here for you.