Wykorzystanie C# i PowerShell do monitorowania SSAS

Wprowadzenie

Analysis Services, jak już zostało to omówione w poście “Metody monitorowania i optymalizacji SQL Server Analysis Services” (http://pl.seequality.net/monitorowanie-optymalizacja-ssas/), dostarcza wielu różnych opcji za pomocą których możemy monitorować oraz analizować stan serwera, baz danych analitycznych, a nawet poszczególnych obiektów. Czasami zdarza się jednak, że dostępne metody nie dostarczają informacji, których szukamy lub dostarczają informację na temat poszczególnego obiektu bez możliwości wygenerowania raportu dla zbioru takich elementów. Może się wówczas okazać, że takie informacje można pobrać samemu wykorzystując w tym celu język C# lub PowerShell. W niniejszym poście zaprezentuję prostą bibliotekę C# oraz skrypty PowerShell, które według mnie mogą okazać się przydatne podczas pracy z Analysis Services. W szczególności jeżeli pracujemy z dużymi bazami lub z dużą ilością baz analitycznych. Wszystkie kody źródłowe dla projektów, które zostaną tutaj omówione dostępne są na GitHub: https://github.com/seequality/seequality_ssas/tree/master/ssas_tollbox

Zaprezentowane skrypty powinny ułatwić zdobycie informacji o tym, które elementy zostały przeprocesowane i kiedy oraz szczegółowych informacji o rolach i ich konfiguracji. W przypadku małych baz analitycznych nawet ręczne sprawdzenie wszystkich obiektów – wliczając w to partycje – może być rzeczą prostą i szybką. W sytuacji gdy w bazie analitycznej znajduje się duża ilość grup miar, które dodatkowo są partycjonowane miesięcznie lub tygodniowo w chwili, kiedy chcemy sprawdzić, który obiekt nie został jeszcze przeprocesowany takie zadanie może okazać się praco- i czasochłonne. Podobny problem może wystąpić w przypadku pracy z rolami. W chwili, kiedy z bazy danych korzysta setki użytkowników, a w kostce zdefiniowane są dziesiątki ról ewentualne sprawdzenie dostępu dla jednego użytkownika staje się poważnym kłopotem. Warto również zauważyć, że w przypadku sprawdzania staniu przeprocesowania obiektu przydatnym może okazać się projekt “Analysis Services Stored Procedure Project” https://asstoredprocedures.codeplex.com/, natomiast niestety nie zawsze istnieje możliwość instalacji dodatkowych bibliotek na serwerze SSAS – szczególnie serwerze produkcyjnym. Biorąc pod uwagę powyższe zaprezentuje skrypty i prosty program napisany w języku C#, który może ułatwić i przyspieszyć niektóre zadania związane z pracą z Analysis Services i z których sam korzystam.

Opis metod w projektach

Solucja składa się z trzech projektów:

  • Projekt:ssas_toolbox_library – biblioteka, która pozwala na połączenie się do serwera Analysis Services wykorzystując “Analysis Management Objects” oraz zwraca pożądane informacje o obiektach
  • Projekt ssas_toolbox_console – aplikacja konsolowa, która pozwala na skorzystanie z metod zdefiniowanych w bibliotece
  • Projekt ssas_toolbox_powershell – projekt zawierający skrypty PowerShell. Oba skrypty wykonują dokładnie to samo co biblioteka napisana w języku C#. W przypadku pierwszego z nich: SSASDiscover.ps1 cała logika została przepisana do PowerShell. Drugi wykorzystuje natomiast tę bibliotekę odwołując się bezpośrednio do jej metod

Ideą każdej metody jest pobranie informacji z serwera SSAS oraz zapisanie logu do pliku. Plik wynikowy będzie oddzielny dla każdej metody i może zostać nadpisany lub utworzony z bieżącą datą w celu zachowania historii.

Dostępne są następujące metody (poniżej metody znajduje się przykładowa zawartość z pliku wynikowego):

  • “1. Discover databases processing states” – zwraca informacje o stanie przeprocesowania baz analitycznych
  • “2. Discover dimensions processing states” – zwraca informacje o stanie przeprocesowania wymiarów
  • “3. Discover cubes processing states” – zwraca informacje o stanie przeprocesowania kostek
  • “4. Discover measure groups processing states” – zwraca informacje o stanie przeprocesowania grup miar
  • “5a. Discover partitions processing states” – zwraca informacje o stanie przeprocesowania poszczególnych partycji
  • “5b. Discover partitions processing states – unprocessed only” – zwraca informacje o stanie przeprocesowania poszczególnych partycji. Zwraca informacje tylko o nieprzeprocesowanych partycjach
  • “5c. Discover partitions processing states – specify database, cube and measure group name” – zwraca informacje o stanie przeprocesowania poszczególnych partycji. Możliwość podania konkretnej bazy danych, kostki oraz grupy miar.
  • “6a. Discover users in roles” – zwraca listę użytkowników w poszczególnych rolach
  • “6b. Discover users in roles – specify database and role name” – zwraca listę użytkowników w poszczególnych rolach. Możliwość podania konkretnej bazy danych oraz konkretnej roli
  • “7a. Discover roles permissions” – zwraca listę poszczególnych elementów, które zostały zdefiniowane jako dozwolone dla użytkowników na poziomie wymiaru dla poszczególnych ról
  • “7b. Discover roles permissions – specify database and role name” – zwraca listę poszczególnych elementów, które zostały zdefiniowane jako dozwolone dla użytkowników na poziomie wymiaru dla poszczególnych ról. Możliwość podania konkretnej bazy danych oraz konkretnej roli.

Jak już wspomniano wyżej, zarówno biblioteka C# jak i skrypty PowerShell, realizuje dokładnie te same zadania i zwraca takie same dane. Warto tylko dodać, ze zarówno do skryptów PowerShell jak i aplikacji konsolowej zostało dodane menu oraz pętla, która ułatwia korzystanie z projektu.

Szczegóły techniczne

SSAS dostarcza kilku bibliotek dzięki, którym można komunikować się do niego z poziomu kodu. W tym przypadku wykorzystano bibliotekę “Analysis Management Objects”, która służy głównie do zarządzania obiektami w Analysis Services. Kod każdej z metod jest stosunkowy prosty:

Zaczynając od samej góry na początku utworzony jest StringBuilder, który będzie służył do przechowywania logów. Następnie tworzona jest dynamicznie nazwa pliku w którym zostaną te logi zapisane. Jeżeli zdefiniujemy, ze chcemy nadpisać wcześniejszy plik nazwa pliku będzie miała charakter ogólny: np: “ssas_toolset_MeasureGroupState.txt”, jeżeli nie chcemy nadpisywać poprzedniego pliku to do nazwy pliku zostanie dodana data i czas wygenerowania pliku np “ssas_toolset_MeasureGroupState_20170802031458.txt”. Następnie próbujemy połączyć się do serwera Analysis Services i za pomocą pętli foreach iterujemy po strukturze serwera: począwszy od serwera, przez bazę danych i kostki oraz skończywszy na grupach miar w tym przypadku.W sytuacji błędu zwracamy wyjątek, a jeżeli wszystko przebiegnie prawidłowo log zapisywany jest do pliku. Wszystkie metody wyglądają bardzo podobnie i działają na tej samej zasadzie.

Funkcja PowerShell, która będzie zwracać identyczne dane może wyglądać następująco:

Jak widać różnice są naprawdę niewielkie i zasada działania pozostaje niezmienna. W przypadku skrypu PowerShell można również odwołać się bezpośrednio do biblioteki C#. Wówczas skrpyt może wyglądać następująco:

W tym przypadku wystarczy dołączyć bibliotekę podając jej ścieżkę, następnie ustawić pożądane parametry, zainicjować obiekt i wywołać metody.

Zakończenie

Mimo, że SSAS dostarcza naprawdę mnóstwo metod do monitorowania oraz zbierania informacji o serwerze i jego obiektach czasami dobrą drogą może okazać się jednak napisanie krótkiego skryptu w PowerShell lub prostego programu w C#. Dzięki dostępnym bibliotekom pisanie własnych rozszerzeń nie jest skomplikowane, a oczywiście może ułatwić naszą pracę i zautomatyzować niektóre zadania. Jak już zostało to zaznaczone wyżej pełny kod źródłowy dostępny jest na GitHub: https://github.com/seequality/seequality_ssas/tree/master/ssas_tollbox Warto również dodać, że to oczywiście nie koniec możliwości zarówno C# jak i PowerShell w kontekście pracy z bazą analityczną i poszerzenie wiedzy w tym obszarze może przynieść wiele korzyści w kwestii monitorowania oraz analizy SQL Server Analyis Services.

Slawomir Drzymala
Follow me on

Slawomir Drzymala

Still playing with data and .NET technologies
Slawomir Drzymala
Follow me on

Latest posts by Slawomir Drzymala (see all)

Leave a Comment

Your email address will not be published. Required fields are marked *