> ## Documentation Index
> Fetch the complete documentation index at: https://docs.germainux.com/llms.txt
> Use this file to discover all available pages before exploring further.

# 02/28/22 Release Notes

> Highlights of the GermainUX release of February 28, 2022, including automation features, monitoring and analytics updates and maintenance fixes.

> **[Multiple Distribution List](#automation-multiple-distribution-list)**
>
> Automation

> **[\[Last Value\] on Pivot Dashboard](#monitoring-%26-analytics-last-value-on-pivot-dashboard)**
>
> Monitoring & Analytics

> **[Siebel Task](#monitoring-%26-analytics-siebel-task)**
>
> Monitoring & Analytics

> **[Engine Logs back to Enterprise](#maintenance-engine-logs-back-to-enterprise)**
>
> Maintenance

> **[ElasticSearch plugin for percentile aggregation](#open-source-elasticsearch-plugin-for-percentile-aggregation)**
>
> Open Source

## Automation - Multiple Distribution List

### Description

Germain now supports the ability to add multiple Distribution List/DL when sending an alert or a report. This way it is now possible to keep original DLs (e.g. for separate teams) and create a super-DL that contains some or all of them.

### Configure

Log on to Germain > Left menu > Wizard > (search for) Distribution List

![02/28/22 Release Notes: Configure](https://mintcdn.com/germain-ux/Jw6D65yKWJ4U5yOS/images/main/02-28-22-release-notes/image-20220302-180300.png?fit=max\&auto=format\&n=Jw6D65yKWJ4U5yOS\&q=85\&s=c36f8a2d906b5446a3ad082dd7b244f9)

![image](https://user-images.githubusercontent.com/8227807/155018667-9ac0d792-1b37-4c12-8109-1b0da11285a5.png)

![02/28/22 Release Notes: Configure, image 2](https://mintcdn.com/germain-ux/Jw6D65yKWJ4U5yOS/images/main/02-28-22-release-notes/image-20220302-180634.png?fit=max\&auto=format\&n=Jw6D65yKWJ4U5yOS\&q=85\&s=908d4f69fd00191d4b51723c269ce751)

## Monitoring & Analytics - \[Last Value] on Pivot Dashboard

### Description

\[Last Value] metric had been supported on any Aggregate dashboard and now is also support on any Pivot dashboard.

![02/28/22 Release Notes: Monitoring & Analytics - \Last Value on Pivot Dashboard](https://mintcdn.com/germain-ux/Jw6D65yKWJ4U5yOS/images/main/02-28-22-release-notes/image-20220303-201036.png?fit=max\&auto=format\&n=Jw6D65yKWJ4U5yOS\&q=85\&s=0b29486f2ea19622e06aef1c0cd2a10c)

## Monitoring & Analytics - Siebel Task

### Description

Germain’s rule that monitors Siebel Tasks (among other things) have been updated mostly to reduce the number of siebel server manager call.

![02/28/22 Release Notes: Monitoring & Analytics - Siebel Task](https://mintcdn.com/germain-ux/Jw6D65yKWJ4U5yOS/images/main/02-28-22-release-notes/image-20220303-201337.png?fit=max\&auto=format\&n=Jw6D65yKWJ4U5yOS\&q=85\&s=6a84f2f661746c84d2f70b9ad0063e9a)

![02/28/22 Release Notes: Monitoring & Analytics - Siebel Task, image 2](https://mintcdn.com/germain-ux/Jw6D65yKWJ4U5yOS/images/main/02-28-22-release-notes/image-20220303-201429.png?fit=max\&auto=format\&n=Jw6D65yKWJ4U5yOS\&q=85\&s=1545c14e6affb47f370f25a405b859b4)

### Configure

Log on to germain>Left Menu> Analytics > Rules > siebel-app-monitor-drl > `Component Task Metrics`

```text theme={null}
rule "Component Task Metrics"
when
    $r : ListComponentsOutputRecord( cpDispRunState in ( "Online", "Running" ), cpMaxTasks > 0 )
    $tasks : List( ) from collect ( ListTasksOutputRecord( ccAlias == $r.ccAlias ) )
then
    StringBuilder sb = new StringBuilder();
    for (ListTasksOutputRecord t : $tasks) {
        sb.append(t.svName);
        sb.append("\t");
        sb.append(t.ccAlias);
        sb.append("\t");
        sb.append(t.cgAlias);
        sb.append("\t");
        sb.append(t.tkTaskId);
        sb.append("\t");
        sb.append(t.tkPid);
        sb.append("\t");
        sb.append(t.tkDispRunstate);
        sb.append("\t");
        sb.append(t.ccRunmode);
        sb.append("\t");
        sb.append(t.tkStartTime);
        sb.append("\t");
        sb.append(t.tkEndTime);
        sb.append("\t");
        sb.append(t.tkStatus);
        sb.append("\t");
        sb.append(t.tkParentTaskId);
        sb.append("\t");
        sb.append(t.ccIncarnationNum);
        sb.append("\t");
        sb.append(t.tkLabel);
        sb.append("\t");
        sb.append(t.tkTasktype);
        sb.append("\t");
        sb.append(t.tkPingTime);
        sb.append("\n");
    }

    // Number of running tasks per component
    GenericMetric m = new GenericMetric();
    m.timestamp = OffsetDateTime.now();
    m.type = "Siebel:Task";
    m.name = $r.ccRunmode;
    m.value = (double)$r.cpNumRunTasks;
    m.details = sb.toString();
    m.application.component = $r.ccAlias;
    datamart.insert(m, context);

    // Pct of max tasks running per component
    m = new GenericMetric();
    m.timestamp = OffsetDateTime.now();
    m.type = "Siebel:TaskPct";
    m.name = $r.ccRunmode;
    m.value = Math.round(((double)$r.cpNumRunTasks / (double)$r.cpMaxTasks) * 100.0 * 1000.0) / 1000.0;
    m.details = sb.toString();
    m.application.component = $r.ccAlias;
    datamart.insert(m, context);

    // Number of running tasks per process for this component
    int numProcs = $r.cpActvMtsProcs == 0 ? 1 : $r.cpActvMtsProcs;
    m = new GenericMetric();
    m.timestamp = OffsetDateTime.now();
    m.type = "Siebel:Running Tasks Process";
    m.name = $r.ccRunmode;
    double numTasksPerProc = (double)$r.cpNumRunTasks / (double)numProcs;
    m.value = numTasksPerProc;
    m.details = sb.toString();
    m.application.component = $r.ccAlias;
    datamart.insert(m, context);

    // Max number of running tasks per process for this component
    int maxProcs = $r.cpMaxMtsProcs == 0 ? 1 : $r.cpMaxMtsProcs;
    m = new GenericMetric();
    m.timestamp = OffsetDateTime.now();
    m.type = "Siebel:Max Tasks Process";
    m.name = $r.ccRunmode;
    double maxTasksPerProc = (double)$r.cpMaxTasks / (double)numProcs;
    m.value = maxTasksPerProc;
    m.details = sb.toString();
    m.application.component = $r.ccAlias;
    datamart.insert(m, context);

    // Pct of max tasks per process for this component
    m = new GenericMetric();
    m.timestamp = OffsetDateTime.now();
    m.type = "Siebel:TaskPct Process";
    m.name = $r.ccRunmode;
    m.value = Math.round((numTasksPerProc / maxTasksPerProc) * 100.0 * 1000.0) / 1000.0;
    m.details = sb.toString();
    m.application.component = $r.ccAlias;
    datamart.insert(m, context);
end

rule "Component Mts Metrics"
when
    $r : ListComponentsOutputRecord( cpDispRunState in ( "Online", "Running" ), cpMaxMtsProcs > 0 )
then
    // Number of running processes
    GenericMetric m = new GenericMetric();
    m.timestamp = OffsetDateTime.now();
    m.type = "Siebel:MtsProcs";
    m.name = $r.ccAlias;
    m.value = (double)$r.cpActvMtsProcs;
    m.application.component = $r.ccAlias;
    datamart.insert(m, context);

    // Percent running of max processes
    m = new GenericMetric();
    m.timestamp = OffsetDateTime.now();
    m.type = "Siebel:MtsProcsPct";
    m.name = $r.ccAlias;
    m.value = ((double)$r.cpActvMtsProcs/(double)$r.cpMaxMtsProcs) * 100.0;
    m.application.component = $r.ccAlias;
    datamart.insert(m, context);
end
```

## Maintenance - Engine Logs back to Enterprise

Germain engine is now sending its own logs to Germain enterprise server. This will make it easier for troubleshooting an engine issue since you no longer need to log on to the box where the engine runs to check its running status.

## Open Source - ElasticSearch plugin for percentile aggregation

### Description

The Germain plugin for Elasticsearch computes percentile values for aggregated data using the T-digest algorithm, which is something Elasticsearch doesn’t support out-of-the-box. The engineering effort behind it was fairly small, and can be used with Germain or without i.e. that plugin doesn’t include anything specific to Germain.

### Download

Release Page: [https://github.com/germainsoftware/germain-es-plugin/releases](https://github.com/germainsoftware/germain-es-plugin/releases)

Documentation: [https://github.com/germainsoftware/germain-es-plugin/blob/main/README.md](https://github.com/germainsoftware/germain-es-plugin/blob/main/README.md)

## Get Help

> **[Contact GermainUX Support](https://docs.germainux.com/main/support.md)**
>
> The Germain Team can help you set this up.

> **Can't find what you need?**
>
> Search all GermainUX docs with **Ctrl + K**, or use the feedback buttons at the bottom of this page to tell us what is missing.

The content of this document is proprietary to GERMAIN SOFTWARE.


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.