TM1 Planning Analytics

TM1 Logging mit TM1py

Mit TM1py können TM1 Entwickler die IBM Planning Analytics REST API auf relativ einfache Art und Weise nutzen. Sie können zum Beispiel auf TM1-Objekte wie Würfel, Dimension und Elemente zugreifen, sie erstellen, ändern und löschen. Das Python Package TM1py bietet noch viel, viel mehr – bleiben wir bei einem einfachen Beispiel. Jeden Morgen auf x Servern das TM1server.log prüfen? Oder beispielsweise in einem MiniConda Notebook per Python das Log durchsuchen, vielleicht nach Merkmalen clustern – und die Ergebnisse an ein Monitoring Tool schicken.

Das Beispiel gibt es auch in meinem Github Repo TM1py Jupyter Notebooks.

TM1py Beispiel für einen möglichen Startpunkt

from TM1py.Services import TM1Service
import configparser
import datetime
import pandas as pd

# Connect to DEV Server - CAM or Keyring for PROD!!
config = configparser.ConfigParser()
config.read(r'./import/config.ini')
tm1 = TM1Service(**config['tm1pydev'])

try:
    server_name = tm1.server.get_server_name()
    print("Connection to TM1 established!! your Servername is: {}".format(server_name))
except Exception as e:
    print("\nERROR:")
    print("\t" + str(e))
    
# Log lesen und in zwei DataFrames speichern
def parse_tm1_log():
    dt = datetime.date.today() - datetime.timedelta(days=1)
    current_date = datetime.datetime.combine(dt, datetime.datetime.min.time())
    #print(current_date)
    log_entries = tm1.server.get_message_log_entries(since = current_date)
    warn_data = []
    error_data = []

    for entry in log_entries:
        # {'ID': 12636, 'ThreadID': 10196, 'SessionID': 0, 'Level': 'Info', 'TimeStamp': '2024-01-29T19:50:50.908Z', 'Logger': 'TM1.Server', 'Message': 'Admin-Server wird benachrichtigt'}
        log_level = entry['Level']
        logger = entry['Logger']
        message = entry['Message']
        timestamp = entry['TimeStamp']

        if log_level == 'Warn':
            warn_data.append({'Timestamp': timestamp, 'Logger': logger, 'Message': message})
        elif log_level == 'Error':
            error_data.append({'Timestamp': timestamp, 'Logger': logger,  'Message': message})

    warn_df = pd.DataFrame(warn_data)
    error_df = pd.DataFrame(error_data)
    
    return warn_df, error_df

# Exportieren der DataFrames in CSV
def export_to_csv(df, file_name):
    df.to_csv(file_name, sep=';', index=False, encoding='utf-8')
    print("Check updated in {}".format(file_name))

# Parse TM1-Log und Export DF
warnings, errors = parse_tm1_log()
export_to_csv(errors, 'tm1_errors.csv')
export_to_csv(warnings, 'tm1_warnings.csv')

Die Vorlage zu diesem Code und viele weitere Beispiele finden sich hier. In meinen Projekten nutzen wir zunehmend TM1py für DevOps Themen, Datenintegration aber auch für das Finden und Korrigieren von technischen Issues.

Ein Beispiel aus der Praxis – wir mussten kurzfristig über alle Dimensionen, Elemente und Attribute eines TM1 Modells Deltas zwischen der DEV und PROD Umgebung identifizieren. Im Rahmen eines umfangreichen Deployments waren manuell Änderungen an Elementen und Attributen vorgenommen worden – passiert, kein Grund den Kollegen im Urlaub zu stören. Stattdessen haben wir in einem Jupyter Notebook jeweils eine Session zu DEV und PROD geöffnet. Dank TM1py und Pandas konnten wir pro Dimension die Metadaten gegen die jeweils andere Instanz vergleichen. So konnten wir relativ schnell und einfach alle Deltas identifizieren, die Änderungen vornehmen und kamen halbwegs pünktlich in den Feierabend.

Sie suchen Unterstützung für Ihr TM1 Projekt?

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert