Problem
In many organizations, SailPoint IdentityIQ is connected to a wide range of applications to handle identity and access management. Keeping these connections healthy and working is essential, after all, smooth provisioning, aggregation, and governance depend on it.
The challenge, however, is that IdentityIQ doesn’t offer a simple, built-in way to view the connectivity status of all these applications in one place. Instead, administrators have to check each connection manually, one at a time. As the number of applications grows, this quickly becomes a tedious and time-consuming task.
Because of this, there’s a clear need for a more efficient approach, something that can automatically check and report on application connectivity. A centralized report like this would not only save time but also give teams better visibility into the health of their integrations, helping them spot and resolve issues much faster.
Diagnosis
This requirement can be effectively met by creating a custom LiveReport in SailPoint IdentityIQ that checks the connectivity status of all configured applications in one go.
The idea is straightforward: the report pulls in the list of applications from the Application object and then runs a connectivity check for each one using SailPoint’s APIs. Instead of relying on manual effort, the report does the heavy lifting behind the scenes.
The LiveReport itself can be kept simple and practical, with columns like Application Name and Test Connection Status. Behind the scenes, a layer of custom logic can call the appropriate SailPoint API to perform a real-time health check for each application. The outcome, whether the connection is successful or not, is then captured and displayed directly in the report.
With this approach, administrators get a clear, centralized view of application connectivity without having to test each integration individually. It not only saves time but also makes it much easier to spot and address issues early, keeping the overall system running smoothly.
Solution
To address this challenge, I have built a custom Live Report using SailPoint’s reporting capabilities. By leveraging SailPoint APIs, the report can automatically check the health and connectivity status of each application within the organization.
Instead of relying on manual checks, this approach provides a more streamlined and reliable way to monitor integrations. The report runs the necessary checks in the background and presents a clear view of application health, helping administrators quickly identify and resolve any connectivity issues.
<?xml version='1.0' encoding='UTF-8'?>
<!DOCTYPE TaskDefinition PUBLIC "sailpoint.dtd" "sailpoint.dtd">
<TaskDefinition executor="sailpoint.reporting.LiveReportExecutor" name="Application Health Check" progressMode="Percentage" resultAction="Rename" subType="Administration Report" template="true" type="LiveReport">
<Attributes>
<Map>
<entry key="report">
<value>
<LiveReport title="Applications Health Check">
<DataSource objectType="Application" type="Filter">
<QueryParameters>
<Parameter argument="applications" property="id"/>
<Parameter argument="excludeApplications" operation="NE" property="id">
<QueryScript>
<Source>
import sailpoint.object.*;
import java.lang.*;
List exclApplFilter = new ArrayList();
if(value != null){
queryOptions.addFilter(Filter.not(Filter.in("id", value)));
}
return queryOptions;
</Source>
</QueryScript>
</Parameter>
</QueryParameters>
</DataSource>
<Columns>
<ReportColumnConfig field="appName" header="Application Name" property="name" sortable="true" width="110"/>
<ReportColumnConfig field="appType" header="Application Type" property="type" sortable="true" width="110"/>
<ReportColumnConfig field="connectionStatus" header="Connection Status" property="id" sortable="true" width="110">
<RenderScript>
<Source>
import sailpoint.connector.Connector;
import sailpoint.connector.ConnectorFactory;
import sailpoint.object.Application;
String appName;
Application app = (Application) context.getObjectById(Application.class, value);
if(null != app){
appName = app.getName();
try{
Connector appConnector = ConnectorFactory.getConnector(app, null);
Object applCheckResult = appConnector.doHealthCheck(null);
if(void == applCheckResult || null == applCheckResult){
return "Success";
}else{
return "Success, Please refer Test Connection Details column";
}
}catch(Exception exp){
return "Failure, Please refer Test Connection Details Column";
}
}
</Source>
</RenderScript>
</ReportColumnConfig>
<ReportColumnConfig field="ConnectionErrorDetails" header="Test Connection Details" property="id" sortable="true" width="110">
<RenderScript>
<Source>
import sailpoint.connector.Connector;
import sailpoint.connector.ConnectorFactory;
import sailpoint.object.Application;
String appName;
Application app = (Application) context.getObjectById(Application.class, value);
if(null != app){
appName = app.getName();
try{
Connector appConnector = ConnectorFactory.getConnector(app, null);
Object applCheckResult = appConnector.doHealthCheck(null);
if(void == applCheckResult || null == applCheckResult){
return "Success";
}else{
return "Health check complete and is success for application: [" + appName + "] and result message is: "+ applCheckResult ;
}
}catch(Exception exp){
return "Error while performing Health Check for Application: [" + appName +" ] and the error is: "+ e;
}
}
</Source>
</RenderScript>
</ReportColumnConfig>
</Columns>
</LiveReport>
</value>
</entry>
</Map>
</Attributes>
<Description>
Displays configured application Test Connection
</Description>
<Signature>
<Inputs>
<Argument multi="true" name="application" type="Application">
<Description>rept_app_status_help_apps</Description>
<Prompt>rept_app_status_label_apps</Prompt>
</Argument>
<Argument multi="true" name="excludeApplications" type="Application">
<Description>rept_app_status_help_apps</Description>
</Argument>
</Inputs>
</Signature>
</TaskDefinition>