Informatica Session Statistiken ohne Zugriff auf das Repository erfassen

Das Erfassen von Ladestatistiken ist eigentlich ganz einfach, wenn man Zugriff auf das Informatica Repository hat und die entsprechenden Tabellen kennt. Leider ist das Abfragen der Informatica Repository Tabellen aber in manchen Projekten nicht erlaubt. Vor der Veröffentlichung der Informatica Powercenter Version 9.0 hatte man schlechte Karten, denn es gab keine andere Möglichkeit auf diese Daten zuzugreifen. Informatica hat hier mitgedacht und eine Reihe neuer Build-in Variablen eingeführt, die dies ab der Version 9 ermöglichen.

In diesem Artikel möchte ich an einem kleinen Beispiel erklären, wie man die neuen Variablen numAffectedRows und numRejectedRows nutzt und wie eine solche Implementierung aussehen könnte.

Tabelle anlegen

Für die Ablage der Statistiken erstellt man eine Tabelle, die alle wichtigen Attribute für die Statistikauswertungen enthält. In meinem Beispiel sind in dieser Tabelle Start- und Endzeitpunkt der Session, die Namen der verschiedenen Informatica Objekte, die Anzahl an erfolgreich geladenen und abgewiesenene Datensätzen der Quell- und der Zieltabelle enthalten.

CREATE TABLE T_SESSION_STATISTICS
(
  START_TIME DATE,
  END_TIME DATE,
  REPOSITORY_NAME VARCHAR2(100 CHAR),
  FOLDER_NAME VARCHAR2(100 CHAR),
  WORKFLOW_NAME VARCHAR2(100 CHAR),
  SESSION_NAME VARCHAR2(100 CHAR),
  MAPPING_NAME VARCHAR2(100 CHAR),
  SOURCE_TABLE_NAME VARCHAR2(35 CHAR),
  TARGET_TABLE_NAME VARCHAR2(35 CHAR),
  SUCCEEDED_SOURCE_ROWS NUMBER,
  FAILED_SOURCE_ROWS NUMBER,
  SUCCEEDED_TARGET_ROWS NUMBER,
  FAILED_TARGET_ROWS NUMBER,
  ETL_STATUS VARCHAR2(10 CHAR)
);

Statistik Dateien bereinigen

Um alte Statistik Dateien vor jedem Lauf zu löschen, verwende ich einen Command Task, in dem ein Shell Skript aufgerufen wird.

Informatica Statistiken erfassen - Cleanup

Informatica Statistiken erfassen – Cleanup

Dieses Skript erstellt eine neue indirekte Dateiliste und löscht alle Dateien, die im Ordner session_statistics vorhanden sind.

#!/bin/bash

# variables definition
HOME_DIR=/opt/infa_shared
SOURCE_PATH=SrcFiles
STATISTICS_FILE_FOLDER=session_statistics
STATISTICS_FILE_LIST=stg_session_statistics.lst

# remove old statistics file if it exists
if [ -f ${HOME_DIR}/${SOURCE_PATH}/${STATISTICS_FILE_LIST} ]
then
rm ${HOME_DIR}/${SOURCE_PATH}/${STATISTICS_FILE_LIST}
fi

# delete all old session files in the session_statistics folder
rm -r ${HOME_DIR}/${SOURCE_PATH}/${STATISTICS_FILE_FOLDER}/*

Statistiken erfassen

In jeder Session, in der Statistiken erfasst werden sollen, nutzt man im Components Reiter der Sessionkonfiguration die Einträge für einen Pre-Session, einen Post-Session Success und einen Post-Session Failure Command.

Informatica Statistiken - Session Konfiguration

Informatica Statistiken – Session Konfiguration

Pre-Session Command

Im Pre-Session Command schreibt man in die Session spezifische Statistik Datei die Startzeit der Session.

echo -n $(date +"%Y-%m-%d %H:%M:%S") > /opt/infa_shared/SrcFiles/session_statistics/$PMSessionName.csv;
echo -n "" >> /opt/infa_shared/SrcFiles/session_statistics/$PMSessionName.csv;

Post-Session Success Command

In diesem Skript wird zuerst das Endedatum der Session in der Statistikdatei festgehalten. Anschließend werden folgende Werte erfasst:

  • $PMRepositoryServiceName: Name des Repository Services
  • $PMFolderName: Name des Ordners
  • $PMWorkflowName: Name des Workflows
  • $PMSessionName: Name der Session
  • $PMMappingName: Name des Mappings
  • $PMSTATISTICS_TEST_TABLE@TableName: Name der Quelltabelle
  • $PMSTATISTICS_TEST_TABLE1@TableName: Name der Zieltabelle
  • $PMSQ_STATISTICS_TEST_TABLE@numAffectedRows: Anzahl erfolgreich aus der Quelltabelle gelesene Datensätze
  • $PMSQ_STATISTICS_TEST_TABLE@numRejectedRows: Anzahl fehlgeschlagene Datensätze der Quelltabelle
  • $PMSTATISTICS_TEST_TABLE1@numAffectedRows: Anzahl erfolgreich in die Zieltabelle geschriebene Datensätze
  • $PMSTATISTICS_TEST_TABLE1@numRejectedRows: Anzahl fehlgeschlagene Datensätze der Zieltabelle

Hierbei ist es sehr wichtig zu wissen, dass beim Attribut @numAffectedRows und @ numRejectedRows bei der Quelltabelle der Name des Source Qualifiers angegeben werden muss. In den anderen Fällen wird der Name der Quell- bzw der Zieltabelle angegeben.

echo -n $(date +"%Y-%m-%d %H:%M:%S") >> /opt/infa_shared/SrcFiles/session_statistics/$PMSessionName.csv;
echo -n ";" >> /opt/infa_shared/SrcFiles/session_statistics/$PMSessionName.csv;
echo -n $PMRepositoryServiceName >> /opt/infa_shared/SrcFiles/session_statistics/$PMSessionName.csv;
echo -n ";" >> /opt/infa_shared/SrcFiles/session_statistics/$PMSessionName.csv;
echo -n $PMFolderName >> /opt/infa_shared/SrcFiles/session_statistics/$PMSessionName.csv;
echo -n ";" >> /opt/infa_shared/SrcFiles/session_statistics/$PMSessionName.csv;
echo -n $PMWorkflowName >> /opt/infa_shared/SrcFiles/session_statistics/$PMSessionName.csv;
echo -n ";" >> /opt/infa_shared/SrcFiles/session_statistics/$PMSessionName.csv;
echo -n $PMSessionName >> /opt/infa_shared/SrcFiles/session_statistics/$PMSessionName.csv;
echo -n ";" >> /opt/infa_shared/SrcFiles/session_statistics/$PMSessionName.csv;
echo -n $PMMappingName >> /opt/infa_shared/SrcFiles/session_statistics/$PMSessionName.csv;
echo -n ";" >> /opt/infa_shared/SrcFiles/session_statistics/$PMSessionName.csv;
echo -n $PMSTATISTICS_TEST_TABLE@TableName >> /opt/infa_shared/SrcFiles/session_statistics/$PMSessionName.csv;
echo -n ";" >> /opt/infa_shared/SrcFiles/session_statistics/$PMSessionName.csv;
echo -n $PMSTATISTICS_TEST_TABLE1@TableName >> /opt/infa_shared/SrcFiles/session_statistics/$PMSessionName.csv;
echo -n ";" >> /opt/infa_shared/SrcFiles/session_statistics/$PMSessionName.csv;
echo -n $PMSQ_STATISTICS_TEST_TABLE@numAffectedRows >> /opt/infa_shared/SrcFiles/session_statistics/$PMSessionName.csv;
echo -n ";" >> /opt/infa_shared/SrcFiles/session_statistics/$PMSessionName.csv;
echo -n $PMSQ_STATISTICS_TEST_TABLE@numRejectedRows >> /opt/infa_shared/SrcFiles/session_statistics/$PMSessionName.csv;
echo -n ";" >> /opt/infa_shared/SrcFiles/session_statistics/$PMSessionName.csv;
echo -n $PMSTATISTICS_TEST_TABLE1@numAffectedRows >> /opt/infa_shared/SrcFiles/session_statistics/$PMSessionName.csv;
echo -n ";" >> /opt/infa_shared/SrcFiles/session_statistics/$PMSessionName.csv;
echo -n $PMSTATISTICS_TEST_TABLE1@numRejectedRows >> /opt/infa_shared/SrcFiles/session_statistics/$PMSessionName.csv;
echo -n ";" >> /opt/infa_shared/SrcFiles/session_statistics/$PMSessionName.csv;
echo -n "SUCCEEDED" >> /opt/infa_shared/SrcFiles/session_statistics/$PMSessionName.csv;"

Post-Session Failure Command

Das Post-Session Failure Skript unterscheidet sich nur geringfügig vom Post-Session Success Skript. In der letzten Zeile wird für den ETL_STATUS der Wert FAILED gesetzt. Alle anderen Zeilen sind analog zum Success Skript.

echo -n $(date +"%Y-%m-%d %H:%M:%S") >> /opt/infa_shared/SrcFiles/session_statistics/$PMSessionName.csv;
echo -n ";" >> /opt/infa_shared/SrcFiles/session_statistics/$PMSessionName.csv;
echo -n $PMRepositoryServiceName >> /opt/infa_shared/SrcFiles/session_statistics/$PMSessionName.csv;
echo -n ";" >> /opt/infa_shared/SrcFiles/session_statistics/$PMSessionName.csv;
echo -n $PMFolderName >> /opt/infa_shared/SrcFiles/session_statistics/$PMSessionName.csv;
echo -n ";" >> /opt/infa_shared/SrcFiles/session_statistics/$PMSessionName.csv;
echo -n $PMWorkflowName >> /opt/infa_shared/SrcFiles/session_statistics/$PMSessionName.csv;
echo -n ";" >> /opt/infa_shared/SrcFiles/session_statistics/$PMSessionName.csv;
echo -n $PMSessionName >> /opt/infa_shared/SrcFiles/session_statistics/$PMSessionName.csv;
echo -n ";" >> /opt/infa_shared/SrcFiles/session_statistics/$PMSessionName.csv;
echo -n $PMMappingName >> /opt/infa_shared/SrcFiles/session_statistics/$PMSessionName.csv;
echo -n ";" >> /opt/infa_shared/SrcFiles/session_statistics/$PMSessionName.csv;
echo -n $PMSTATISTICS_TEST_TABLE@TableName >> /opt/infa_shared/SrcFiles/session_statistics/$PMSessionName.csv;
echo -n ";" >> /opt/infa_shared/SrcFiles/session_statistics/$PMSessionName.csv;
echo -n $PMSTATISTICS_TEST_TABLE1@TableName >> /opt/infa_shared/SrcFiles/session_statistics/$PMSessionName.csv;
echo -n ";" >> /opt/infa_shared/SrcFiles/session_statistics/$PMSessionName.csv;
echo -n $PMSQ_STATISTICS_TEST_TABLE@numAffectedRows >> /opt/infa_shared/SrcFiles/session_statistics/$PMSessionName.csv;
echo -n ";" >> /opt/infa_shared/SrcFiles/session_statistics/$PMSessionName.csv;
echo -n $PMSQ_STATISTICS_TEST_TABLE@numRejectedRows >> /opt/infa_shared/SrcFiles/session_statistics/$PMSessionName.csv;
echo -n ";" >> /opt/infa_shared/SrcFiles/session_statistics/$PMSessionName.csv;
echo -n $PMSTATISTICS_TEST_TABLE1@numAffectedRows >> /opt/infa_shared/SrcFiles/session_statistics/$PMSessionName.csv;
echo -n ";" >> /opt/infa_shared/SrcFiles/session_statistics/$PMSessionName.csv;
echo -n $PMSTATISTICS_TEST_TABLE1@numRejectedRows >> /opt/infa_shared/SrcFiles/session_statistics/$PMSessionName.csv;
echo -n ";" >> /opt/infa_shared/SrcFiles/session_statistics/$PMSessionName.csv;
echo -n "FAILED" >> /opt/infa_shared/SrcFiles/session_statistics/$PMSessionName.csv;"

Erfasste Statistiken in die Datenbank laden

Nachdem alle Sessions beendet sind, in denen die Statistiken erfasst wurden, werden im letzten Schritt diese Daten in die Datenbank geschrieben. Dies erfolgt in meinem Beispiel in zwei Schritten.

Informatica Statistiken in die Datenbank schreiben

Informatica Statistiken in die Datenbank schreiben

Indirekte Dateiliste füllen

Um alle im Ordner session_statistics erfassten Statistiken laden zu können, erstellt man eine indirekte Dateiliste. Dazu verwendet ich einen Command Task, der nachfolgendes Shell-Skript aufruft.

#!/bin/bash

STATISTICS_DIR=/opt/infa_shared/SrcFiles/session_statistics
FILE_LIST=/opt/infa_shared/SrcFiles/stg_session_statistics.lst

touch $FILE_LIST

for cur_file in "$STATISTICS_DIR"/*
do
if [ -f "$cur_file" ]
then
echo "$cur_file" >> $FILE_LIST
fi
done

Mapping zum Laden der Statistiken

Im letzten Schritt wird in einem Mapping die indirekte Dateiliste als Quelle genommen und alle darin enthaltenen Statistiken in die Datenbank geschrieben. In der Expression Transformation konvertiere ich lediglich die Datums- und Zahlenwerte von String in DATE bzw INTEGER.

Informatica Mapping - Statistiken schreiben

Informatica Mapping – Statistiken schreiben

Das war es auch schon. Ich hoffe, dass ich dem einen oder anderen mit meinem Artikel weiterhelfen konnte – auch wenn das Thema schon etwas älter ist.