Veeam PRTG Sensor Reloaded

Ich habe mich sehr über das breite Feedback zu meinem Artikel PRTG – Veeam B&R Monitoring gefreut. Klar wurde mir dabei jedoch auch, dass der Einsatz des Veeam Enterprise Servers mit der freigeschalteten RESTful API gar nicht so verbreitet ist.
Daher habe ich mich an eine neue Variante des PRTG Veeam Advanced Sensor gesetzt – den Veeam PRTG Sensor Reloaded.

Veeam PRTG Sensor Reloaded - Overview

Veeam PRTG Sensor Reloaded – Overview

 

Veeam PRTG Sensor Reloaded - Channels

Veeam PRTG Sensor Reloaded – Channels

 

Anforderung an neuen Sensor:

  • Verwendung der Veeam PowerShell SnapIn
  • Ziel Server (Veeam Backup & Replication Server) als Parameter
  • Repository Nutzung reporten
  • Leichte Erweiterbarkeit

Sehr schnell hat sich allerdings ein grundlegendes Problem des Veeam PowerShell Plugin in Verbindung mit PRTG aufgetan:

Das Veeam PowerShell Plugin ist 64 Bit only und PRTG führt alle Scripte auf der Probe nur in 32 Bit aus.

Nach etwas Recherche und Tests fand ich das Tool PSx64 von PRTG Tools Family (@prtgtoolsfamily) als eine wirklich robuste und gute Lösung des Problems.

Note:

Paessler hat diesen Artikel mittlerweile offiziell in seine Knowledge Base aufgenommen:

Monitoring Veeam Backup & Replication Without Veeam Enterprise Manager

Veeam PRTG Sensor Reloaded – Einrichtung

Um das 64 Bit Problem zu umgehen wird die PSx64 EXE mit dem Veeam PRTG Sensor Reloaded PowerShell Script als Parameter in einem Advanced Sensor eingebunden:

Veeam PRTG Sensor Reloaded - Einrichtung

Note:

Es macht in den meisten Umgebungen Sinn den Timeout des Sensors auf mindestens 120 Sekunden zu erhöhen, damit können bestimmte Fehler auch korrekt abgehandelt werden.

Veeam PRTG Sensor Reloaded - Error

Der Aufruf kann auch noch PowerShell Parameter beinhalten (hier der Veeam B&R Server FQDN):

PRTG Sensor mit Parameter NEU

Parameter der PSx64.exe:

  • -f= PowerShell Script
  • -p= Parameter für das Script – z.B. „-BRHost veeam01.lan.local“

Da die PowerShell Session Credentials zum Verbindungsaufbau zum Veeam Backup & Recovery Server verwendet werden, sollten hier passende in PRTG eingetragen werden und mit der Option „use Windows credentials of parent device“ genutzt werden.

Veeam PRTG Sensor Reloaded – Das Script

<#
        .SYNOPSIS
        PRTG Veeam Advanced Sensor

        .DESCRIPTION
        Advanced Sensor will Report Statistics about Backups during last 24 Hours and Actual Repository usage.

        .EXAMPLE
        PRTG-VeeamBRStats.ps1 -BRHost veeam01.lan.local

        .EXAMPLE
        PRTG-VeeamBRStats.ps1 -BRHost veeam01.lan.local -reportmode "Monthly" -repoCritical 80 -repoWarn 70 -Debug

        .EXAMPLE
        PRTG-VeeamBRStats.ps1 -BRHost veeam01.lan.local -reportmode "Monthly" -repoCritical 80 -repoWarn 70 -selChann "BR"

        .Notes
        NAME:  PRTG-VeeamBRStats.ps1
        LASTEDIT: 02/08/2018
        VERSION: 1.8
        KEYWORDS: Veeam, PRTG

        CREDITS:
        Thanks to Shawn, for creating an awsome Reporting Script:
        
Veeam v9 – My Veeam Report v9.0.1
Thanks to Bernd Leinfelder for the Scalout Repository part! https://github.com/berndleinfelder Thanks to Guy Zuercher for the Endpoint Backup part and a lot of other enhancmeents! https://github.com/gzuercher .Link http://mycloudrevolution.com/ #> #Requires -Version 3 [cmdletbinding()] param( [Parameter(Position=0, Mandatory=$false)] [string] $BRHost = "localhost", [Parameter(Position=1, Mandatory=$false)] $reportMode = "24", # Weekly, Monthly as String or Hour as Integer [Parameter(Position=2, Mandatory=$false)] $repoCritical = 10, [Parameter(Position=3, Mandatory=$false)] $repoWarn = 20, [Parameter(Position=4, Mandatory=$false)] $selChann = "BCRE" # Inital channel selection ) $includeBackup = $selChann.Contains("B") $includeCopy = $selChann.Contains("C") $includeRepl = $selChann.Contains("R") $includeEP = $selChann.Contains("E") # Disable output of warning to prevent Veeam PS quirks $WarningPreference = "SilentlyContinue" # Big thanks to Shawn, creating an awsome Reporting Script: # http://blog.smasterson.com/2016/02/16/veeam-v9-my-veeam-report-v9-0-1/ #region: Start Load VEEAM Snapin (if not already loaded) if (!(Get-PSSnapin -Name VeeamPSSnapIn -ErrorAction SilentlyContinue)) { try { $Trash = Add-PSSnapin -PassThru VeeamPSSnapIn -ErrorAction Stop } catch { Write-Error "Failed to load VeeamPSSnapIn" Write-Output "<prtg>" Write-Output " <error>1</error>" Write-Output " <text>Failed to load VeeamPSSnapIn</text>" Write-Output "</prtg>" Exit } } #endregion #region: Functions Function Get-vPCRepoInfo { [CmdletBinding()] param ( [Parameter(Position=0, ValueFromPipeline=$true)] [PSObject[]]$Repository ) Begin { $outputAry = @() Function New-RepoObject {param($name, $repohost, $path, $free, $total) $repoObj = New-Object -TypeName PSObject -Property @{ Target = $name RepoHost = $repohost Storepath = $path StorageFree = [Math]::Round([Decimal]$free/1GB,2) StorageTotal = [Math]::Round([Decimal]$total/1GB,2) FreePercentage = [Math]::Round(($free/$total)*100) } Return $repoObj | Select-Object Target, RepoHost, Storepath, StorageFree, StorageTotal, FreePercentage } } Process { Foreach ($r in $Repository) { # Refresh Repository Size Info try { [Veeam.Backup.Core.CBackupRepositoryEx]::SyncSpaceInfoToDb($r, $true) } catch { Write-Debug "SyncSpaceInfoToDb Failed" } If ($r.HostId -eq "00000000-0000-0000-0000-000000000000") { $HostName = "" } Else { $HostName = $($r.GetHost()).Name.ToLower() } $outputObj = New-RepoObject $r.Name $Hostname $r.Path $r.info.CachedFreeSpace $r.Info.CachedTotalSpace } $outputAry += $outputObj } End { $outputAry } } #endregion #region: Start BRHost Connection Write-Debug "Starting to Process Connection to $BRHost ..." $OpenConnection = (Get-VBRServerSession).Server if($OpenConnection -eq $BRHost) { Write-Debug "BRHost is Already Connected..." } elseif ($OpenConnection -eq $null ) { Write-Debug "Connecting BRHost..." try { Connect-VBRServer -Server $BRHost } catch { Write-Error "Failed to connect to Veeam BR Host" Write-Output "<prtg>" Write-Output " <error>1</error>" Write-Output " <text>Failed to connect to Veeam BR Host</text>" Write-Output "</prtg>" Exit } } else { Write-Debug "Disconnection actual BRHost..." Disconnect-VBRServer Write-Debug "Connecting new BRHost..." try { Connect-VBRServer -Server $BRHost } catch { Write-Error "Failed to connect to Veeam BR Host" Write-Output "<prtg>" Write-Output " <error>1</error>" Write-Output " <text>Failed to connect to Veeam BR Host</text>" Write-Output "</prtg>" Exit } } $NewConnection = (Get-VBRServerSession).Server if ($NewConnection -eq $null ) { Write-Error "Failed to connect to Veeam BR Host" Write-Output "<prtg>" Write-Output " <error>1</error>" Write-Output " <text>Failed to connect to Veeam BR Host</text>" Write-Output "</prtg>" Exit } #endregion #region: Convert mode (timeframe) to hours If ($reportMode -eq "Monthly") { $HourstoCheck = 720 } Elseif ($reportMode -eq "Weekly") { $HourstoCheck = 168 } Else { $HourstoCheck = $reportMode } #endregion #region: Collect and filter Sessions [Array]$repoList = Get-VBRBackupRepository | Where-Object {$_.Type -ne "SanSnapshotOnly"} # Get all Repositories <# Thanks to Bernd Leinfelder for the Scalouts Part! https://github.com/berndleinfelder #> [Array]$scaleouts = Get-VBRBackupRepository -scaleout if ($scaleouts) { foreach ($scaleout in $scaleouts) { $extents = Get-VBRRepositoryExtent -Repository $scaleout foreach ($ex in $extents) { $repoList = $repoList + $ex.repository } } } $allSesh = Get-VBRBackupSession # Get all Sessions (Backup/BackupCopy/Replica) $allEPSesh = Get-VBREPSession # Get all Sessions of Endpoint Backups $SessionObject = [PSCustomObject] @{ } # Filled for debug option #endregion Write-Output "<prtg>" #region: Backup Jobs if ($includeBackup) { $seshListBk = @($allSesh | Where-Object{($_.CreationTime -ge (Get-Date).AddHours(-$HourstoCheck)) -and $_.JobType -eq "Backup"}) # Gather all Backup sessions within timeframe $TotalBackupTransfer = 0 $TotalBackupRead = 0 $seshListBk | ForEach-Object{$TotalBackupTransfer += $([Math]::Round([Decimal]$_.Progress.TransferedSize/1GB, 0))} $seshListBk | ForEach-Object{$TotalBackupRead += $([Math]::Round([Decimal]$_.Progress.ReadSize/1GB, 0))} $successSessionsBk = @($seshListBk | Where-Object{$_.Result -eq "Success"}) $warningSessionsBk = @($seshListBk | Where-Object{$_.Result -eq "Warning"}) $failsSessionsBk = @($seshListBk | Where-Object{$_.Result -eq "Failed"}) $runningSessionsBk = @($allSesh | Where-Object{$_.State -eq "Working" -and $_.JobType -eq "Backup"}) $failedSessionsBk = @($seshListBk | Where-Object{($_.Result -eq "Failed") -and ($_.WillBeRetried -ne "True")}) $Count = $successSessionsBk.Count Write-Output "<result>" " <channel>Successful-Backups</channel>" " <value>$Count</value>" " <showChart>1</showChart>" " <showTable>1</showTable>" "</result>" $Count = $warningSessionsBk.Count Write-Output "<result>" " <channel>Warning-Backups</channel>" " <value>$Count</value>" " <showChart>1</showChart>" " <showTable>1</showTable>" " <LimitMaxWarning>0</LimitMaxWarning>" " <LimitMode>1</LimitMode>" "</result>" $Count = $failsSessionsBk.Count Write-Output "<result>" " <channel>Failes-Backups</channel>" " <value>$Count</value>" " <showChart>1</showChart>" " <showTable>1</showTable>" " <LimitMaxError>0</LimitMaxError>" " <LimitMode>1</LimitMode>" "</result>" $Count = $failedSessionsBk.Count Write-Output "<result>" " <channel>Failed-Backups</channel>" " <value>$Count</value>" " <showChart>1</showChart>" " <showTable>1</showTable>" " <LimitMaxError>0</LimitMaxError>" " <LimitMode>1</LimitMode>" "</result>" $Count = $runningSessionsBk.Count Write-Output "<result>" " <channel>Running-Backups</channel>" " <value>$Count</value>" " <showChart>1</showChart>" " <showTable>1</showTable>" "</result>" Write-Output "<result>" " <channel>TotalBackupRead</channel>" " <value>$TotalBackupRead</value>" " <unit>Custom</unit>" " <customUnit>GB</customUnit>" " <showChart>1</showChart>" " <showTable>1</showTable>" "</result>" Write-Output "<result>" " <channel>TotalBackupTransfer</channel>" " <value>$TotalBackupTransfer</value>" " <unit>Custom</unit>" " <customUnit>GB</customUnit>" " <showChart>1</showChart>" " <showTable>1</showTable>" "</result>" $SessionObject | Add-Member -MemberType NoteProperty -Name "Successful Backups" -Value $successSessionsBk.Count $SessionObject | Add-Member -MemberType NoteProperty -Name "Successful Backups" -Value $successSessionsBk.Count $SessionObject | Add-Member -MemberType NoteProperty -Name "Warning Backups" -Value $warningSessionsBk.Count $SessionObject | Add-Member -MemberType NoteProperty -Name "Failes Backups" -Value $failsSessionsBk.Count $SessionObject | Add-Member -MemberType NoteProperty -Name "Failed Backups" -Value $failedSessionsBk.Count $SessionObject | Add-Member -MemberType NoteProperty -Name "Running Backups" -Value $runningSessionsBk.Count $SessionObject | Add-Member -MemberType NoteProperty -Name "Total Backup Transfer" -Value $TotalBackupTransfer $SessionObject | Add-Member -MemberType NoteProperty -Name "Total Backup Read" -Value $TotalBackupRead } #endregion: #region: Copy Jobs if ($includeCopy) { $seshListBkc = @($allSesh | Where-Object{($_.CreationTime -ge (Get-Date).AddHours(-$HourstoCheck)) -and $_.JobType -eq "BackupSync"}) # Gather all BackupCopy sessions within timeframe $successSessionsBkC = @($seshListBkC | Where-Object{$_.Result -eq "Success"}) $warningSessionsBkC = @($seshListBkC | Where-Object{$_.Result -eq "Warning"}) $failsSessionsBkC = @($seshListBkC | Where-Object{$_.Result -eq "Failed"}) $runningSessionsBkC = @($allSesh | Where-Object{$_.State -eq "Working" -and $_.JobType -eq "BackupSync"}) $IdleSessionsBkC = @($allSesh | Where-Object{$_.State -eq "Idle" -and $_.JobType -eq "BackupSync"}) $failedSessionsBkC = @($seshListBkC | Where-Object{($_.Result -eq "Failed") -and ($_.WillBeRetried -ne "True")}) $Count = $successSessionsBkC.Count Write-Output "<result>" " <channel>Successful-BackupCopys</channel>" " <value>$Count</value>" " <showChart>1</showChart>" " <showTable>1</showTable>" "</result>" $Count = $warningSessionsBkC.Count Write-Output "<result>" " <channel>Warning-BackupCopys</channel>" " <value>$Count</value>" " <showChart>1</showChart>" " <showTable>1</showTable>" " <LimitMaxWarning>0</LimitMaxWarning>" " <LimitMode>1</LimitMode>" "</result>" $Count = $failsSessionsBkC.Count Write-Output "<result>" " <channel>Failes-BackupCopys</channel>" " <value>$Count</value>" " <showChart>1</showChart>" " <showTable>1</showTable>" " <LimitMaxError>0</LimitMaxError>" " <LimitMode>1</LimitMode>" "</result>" $Count = $failedSessionsBkC.Count Write-Output "<result>" " <channel>Failed-BackupCopys</channel>" " <value>$Count</value>" " <showChart>1</showChart>" " <showTable>1</showTable>" " <LimitMaxError>0</LimitMaxError>" " <LimitMode>1</LimitMode>" "</result>" $Count = $runningSessionsBkC.Count Write-Output "<result>" " <channel>Running-BackupCopys</channel>" " <value>$Count</value>" " <showChart>1</showChart>" " <showTable>1</showTable>" "</result>" $Count = $IdleSessionsBkC.Count Write-Output "<result>" " <channel>Idle-BackupCopys</channel>" " <value>$Count</value>" " <showChart>1</showChart>" " <showTable>1</showTable>" "</result>" $SessionObject | Add-Member -MemberType NoteProperty -Name "Warning BackupCopys" -Value $warningSessionsBkC.Count $SessionObject | Add-Member -MemberType NoteProperty -Name "Failes BackupCopys" -Value $failsSessionsBkC.Count $SessionObject | Add-Member -MemberType NoteProperty -Name "Failed BackupCopys" -Value $failedSessionsBkC.Count $SessionObject | Add-Member -MemberType NoteProperty -Name "Running BackupCopys" -Value $runningSessionsBkC.Count $SessionObject | Add-Member -MemberType NoteProperty -Name "Idle BackupCopys" -Value $IdleSessionsBkC.Count } #endregion: #region: Replication Jobs if ($includeRepl) { $seshListRepl = @($allSesh | Where-Object{($_.CreationTime -ge (Get-Date).AddHours(-$HourstoCheck)) -and $_.JobType -eq "Replica"}) # Gather all Replication sessions within timeframe $successSessionsRepl = @($seshListRepl | Where-Object{$_.Result -eq "Success"}) $warningSessionsRepl = @($seshListRepl | Where-Object{$_.Result -eq "Warning"}) $failsSessionsRepl = @($seshListRepl | Where-Object{$_.Result -eq "Failed"}) $runningSessionsRepl = @($allSesh | Where-Object{$_.State -eq "Working" -and $_.JobType -eq "Replica"}) $failedSessionsRepl = @($seshListRepl | Where-Object{($_.Result -eq "Failed") -and ($_.WillBeRetried -ne "True")}) $Count = $successSessionsRepl.Count Write-Output "<result>" " <channel>Successful-Replications</channel>" " <value>$Count</value>" " <showChart>1</showChart>" " <showTable>1</showTable>" "</result>" $Count = $warningSessionsRepl.Count Write-Output "<result>" " <channel>Warning-Replications</channel>" " <value>$Count</value>" " <showChart>1</showChart>" " <showTable>1</showTable>" " <LimitMaxWarning>0</LimitMaxWarning>" " <LimitMode>1</LimitMode>" "</result>" $Count = $failsSessionsRepl.Count Write-Output "<result>" " <channel>Failes-Replications</channel>" " <value>$Count</value>" " <showChart>1</showChart>" " <showTable>1</showTable>" " <LimitMaxError>0</LimitMaxError>" " <LimitMode>1</LimitMode>" "</result>" $Count = $failedSessionsRepl.Count Write-Output "<result>" " <channel>Failed-Replications</channel>" " <value>$Count</value>" " <showChart>1</showChart>" " <showTable>1</showTable>" " <LimitMaxError>0</LimitMaxError>" " <LimitMode>1</LimitMode>" "</result>" $Count = $runningSessionsRepl.Count Write-Output "<result>" " <channel>Running-Replications</channel>" " <value>$Count</value>" " <showChart>1</showChart>" " <showTable>1</showTable>" "</result>" $SessionObject | Add-Member -MemberType NoteProperty -Name "Successful Replications" -Value $successSessionsRepl.Count $SessionObject | Add-Member -MemberType NoteProperty -Name "Warning Replications" -Value $warningSessionsRepl.Count $SessionObject | Add-Member -MemberType NoteProperty -Name "Failes Replications" -Value $failsSessionsRepl.Count $SessionObject | Add-Member -MemberType NoteProperty -Name "Failed Replications" -Value $failedSessionsRepl.Count $SessionObject | Add-Member -MemberType NoteProperty -Name "Running Replications" -Value $RunningSessionsRepl.Count } #endregion: #region: Endpoint Jobs if ($includeEP) { $seshListEP = @($allEPSesh | Where-Object{($_.CreationTime -ge (Get-Date).AddHours(-$HourstoCheck))}) # Gather all Endpoint sessions within timeframe $successSessionsEP = @($seshListEP | Where-Object{$_.Result -eq "Success"}) $warningSessionsEP = @($seshListEP | Where-Object{$_.Result -eq "Warning"}) $failsSessionsEP = @($seshListEP | Where-Object{$_.Result -eq "Failed"}) $runningSessionsEP = @($allEPSesh | Where-Object{$_.State -eq "Working"}) $Count = $successSessionsEP.Count Write-Output "<result>" " <channel>Successful-Endpoints</channel>" " <value>$Count</value>" " <showChart>1</showChart>" " <showTable>1</showTable>" "</result>" $Count = $warningSessionsEP.Count Write-Output "<result>" " <channel>Warning-Endpoints</channel>" " <value>$Count</value>" " <showChart>1</showChart>" " <showTable>1</showTable>" " <LimitMaxWarning>0</LimitMaxWarning>" " <LimitMode>1</LimitMode>" "</result>" $Count = $failsSessionsEP.Count Write-Output "<result>" " <channel>Failes-Endpoints</channel>" " <value>$Count</value>" " <showChart>1</showChart>" " <showTable>1</showTable>" " <LimitMaxError>0</LimitMaxError>" " <LimitMode>1</LimitMode>" "</result>" $Count = $runningSessionsEP.Count Write-Output "<result>" " <channel>Running-Endpoints</channel>" " <value>$Count</value>" " <showChart>1</showChart>" " <showTable>1</showTable>" "</result>" $SessionObject | Add-Member -MemberType NoteProperty -Name "Seccessful Endpoints" -Value $successSessionsEP.Count $SessionObject | Add-Member -MemberType NoteProperty -Name "Warning Endpoints" -Value $warningSessionsEP.Count $SessionObject | Add-Member -MemberType NoteProperty -Name "Failes Endpoints" -Value $failsSessionsEP.Count $SessionObject | Add-Member -MemberType NoteProperty -Name "Running Endpoints" -Value $runningSessionsEP.Count } #endregion: #region: Repository $RepoReport = $repoList | Get-vPCRepoInfo | Select-Object @{Name="Repository Name"; Expression = {$_.Target}}, @{Name="Host"; Expression = {$_.RepoHost}}, @{Name="Path"; Expression = {$_.Storepath}}, @{Name="Free (GB)"; Expression = {$_.StorageFree}}, @{Name="Total (GB)"; Expression = {$_.StorageTotal}}, @{Name="Free (%)"; Expression = {$_.FreePercentage}}, @{Name="Status"; Expression = { If ($_.FreePercentage -lt $repoCritical) {"Critical"} ElseIf ($_.FreePercentage -lt $repoWarn) {"Warning"} ElseIf ($_.FreePercentage -eq "Unknown") {"Unknown"} Else {"OK"}}} | ` Sort-Object "Repository Name" foreach ($Repo in $RepoReport){ $Name = "REPO - " + $Repo."Repository Name" $Free = $Repo."Free (%)" Write-Output "<result>" " <channel>$Name</channel>" " <value>$Free</value>" " <unit>Percent</unit>" " <showChart>1</showChart>" " <showTable>1</showTable>" " <LimitMinWarning>$repoWarn</LimitMinWarning>" " <LimitMinError>$repoCritical</LimitMinError>" " <LimitMode>1</LimitMode>" "</result>" } #endregion Write-Output "</prtg>" #region: Debug if ($DebugPreference -eq "Inquire") { $RepoReport | Format-Table * -Autosize $SessionReport += $SessionObject $SessionReport } #endregion # eof

 

Vielen Dank auch noch einmal an dieser Stelle an Shawn Masterson (@smasterson24) für die Erstellung dieses großartigen Veeam Reports, aus dem ich mich etwas bedient habe.

Neue Versionen

Das Veeam PRTG Sensor Reloaded Skript wird dank des ständigen Inputs der Nutzer (vielen Dank dafür!) von mir immer wieder etwas aktualisiert.

Version 1.2 – 09.08.2016

  • Neu: BackupCopy Sessions
  • Optimierung: Ausschluss unbenutzter Daten
  • Optimierung: PS Region definitions
  • Optimierung: PS Required definitions

Getestet mit Veeam B&R Version 9 Update 1 und Update 2

Version 1.3 – 03.11.2016

  • Neu: Debug
  • Neu: zusätzliche Parameter „-reportmode -repoCritical -repoWarn“
  • Optimierung: Reorganisierung der Regions
Veeam PRTG Sensor Reloaded - debug

Veeam PRTG Sensor Reloaded – Debug

Version 1.6 – 06.11.2017

  • Neu: Scale Out Repository Extends
  • Optimierung: Cmdlet Aliase ersetzt
  • Optimierung: SanSnapshotOnly Repositories ausgeschlossen
  • Fix: Errorhandling bei nicht verbundenem Repository

Advanced PRTG Sensors GitHub Repository

Wegen der großen Nachfrage, habe ich nun ein GitHub Repositoy der aktuellen Skripte erstellt.

Ich freue mich über jede Teilnahme an diesem kleinen Projekt. Egal ob Pull Request, Bug Report oder Feature Request, alles ist willkommen.

advanced-prtg-sensors-github

GitHub Repository öffnen

 

321 Comments

  1. Markus Kraus 26. Mai 2016
  2. Wolfgang 20. Juli 2016
    • Markus Kraus 20. Juli 2016
      • Wolfgang 11. Januar 2017
  3. Simon Andersen 26. Juli 2016
  4. Markus Kraus 9. August 2016
  5. Patrick 23. August 2016
    • Markus Kraus 23. August 2016
  6. Patrick 23. August 2016
  7. Patrick 24. August 2016
    • Markus Kraus 24. August 2016
  8. Robert 29. August 2016
    • Markus Kraus 29. August 2016
  9. Robert 30. August 2016
  10. Robert 30. August 2016
    • Markus Kraus 30. August 2016
      • Robert 31. August 2016
        • Markus Kraus 31. August 2016
          • Robert 31. August 2016
  11. Markus Kraus 31. August 2016
    • Robert 31. August 2016
  12. Jestar 1. September 2016
    • Markus Kraus 1. September 2016
      • Jestar 1. September 2016
        • Markus Kraus 1. September 2016
          • Jestar 1. September 2016
          • Markus Kraus 1. September 2016
          • Jestar 1. September 2016
          • Markus Kraus 1. September 2016
          • Robert 1. September 2016
          • Jestar 2. September 2016
          • Robert 2. September 2016
          • Jestar 2. September 2016
          • Markus Kraus 2. September 2016
          • Robert 2. September 2016
      • Jestar 2. September 2016
        • Markus Kraus 2. September 2016
  13. Jestar 6. September 2016
    • Markus Kraus 6. September 2016
      • Jestar 7. September 2016
  14. Robert 7. September 2016
    • Markus Kraus 7. September 2016
      • Robert 8. September 2016
        • Markus Kraus 8. September 2016
          • Robert 8. September 2016
          • Markus Kraus 9. September 2016
  15. Jestar 9. September 2016
    • Markus Kraus 10. September 2016
      • Jestar 12. September 2016
  16. Robert 9. September 2016
    • Markus Kraus 10. September 2016
      • Robert 12. September 2016
  17. Mike 15. September 2016
  18. Markus Kraus 15. September 2016
  19. Gordon Wagner 15. September 2016
    • Mike 15. September 2016
  20. Markus Kraus 15. September 2016
    • Gordon Wagner 15. September 2016
  21. Gordon Wagner 15. September 2016
    • Markus Kraus 15. September 2016
  22. Joris 17. Oktober 2016
    • Markus Kraus 17. Oktober 2016
      • Joris 17. Oktober 2016
        • Markus Kraus 17. Oktober 2016
          • Joris 17. Oktober 2016
          • Joris 17. Oktober 2016
  23. Robert 18. Oktober 2016
    • Markus Kraus 18. Oktober 2016
      • Robert 21. Oktober 2016
  24. Marcel 7. November 2016
    • Markus Kraus 8. November 2016
      • Torsten 10. September 2018
        • Markus Kraus 10. September 2018
          • Torsten 11. September 2018
          • Markus Kraus 11. September 2018
  25. Markus Kraus 9. November 2016
  26. Markus Kraus 21. November 2016
    • Newton Viegas 15. Januar 2017
      • Markus Kraus 15. Januar 2017
        • Newton Viegas 16. Januar 2017
          • Markus Kraus 16. Januar 2017
  27. Newton Viegas 16. Januar 2017
    • Markus Kraus 17. Januar 2017
  28. Carsten Trautmann 24. Januar 2017
    • Markus Kraus 24. Januar 2017
  29. Bernd Oliver 8. Februar 2017
  30. alpash mepani 4. April 2017
  31. Rolf 9. April 2017
    • Rolf 9. April 2017
  32. WSchraft 10. Mai 2017
    • Markus Kraus 10. Mai 2017
  33. Alex 14. Juni 2017
    • Markus Kraus 14. Juni 2017
      • Alex 14. Juni 2017
  34. Tom 20. Juni 2017
    • Markus Kraus 20. Juni 2017
      • Tom 20. Juni 2017
        • Markus Kraus 20. Juni 2017
  35. Tom 20. Juni 2017
  36. Tom 20. Juni 2017
    • Markus Kraus 20. Juni 2017
  37. Tom 20. Juni 2017
  38. Philipp 31. Juli 2017
    • Markus Kraus 31. Juli 2017
      • Philipp Metzler 31. Juli 2017
        • Markus Kraus 31. Juli 2017
  39. Jürgen Kreutzer 9. August 2017
    • Markus Kraus 9. August 2017
  40. Anakim 11. August 2017
    • Markus Kraus 11. August 2017
  41. Nathanael 5. September 2017
    • Markus Kraus 5. September 2017
      • Nathanael 5. September 2017
        • Markus Kraus 5. September 2017
  42. Markus Kraus 11. September 2017
  43. Fiede 17. September 2017
    • Markus Kraus 17. September 2017
      • Fiede 17. September 2017
        • Markus Kraus 17. September 2017
  44. Xavi 28. September 2017
    • Markus Kraus 28. September 2017
      • Xavi 28. September 2017
        • Markus Kraus 28. September 2017
          • Xavi 29. September 2017
          • Xavi 29. September 2017
          • Markus Kraus 29. September 2017
  45. Lukas 24. Januar 2018
    • Markus Kraus 7. Februar 2018
  46. Patrick Eis 2. Februar 2018
  47. Sebastian Pollex 21. Februar 2018
    • Markus Kraus 21. Februar 2018
      • Sebastian Pollex 21. Februar 2018
        • Sebastian Pollex 21. Februar 2018
          • Markus Kraus 21. Februar 2018
          • Sebastian Pollex 21. Februar 2018
          • Markus Kraus 21. Februar 2018
          • Sebastian Pollex 22. Februar 2018
          • Markus Kraus 22. Februar 2018
          • Sebastian Pollex 22. Februar 2018
          • Markus Kraus 22. Februar 2018
  48. Michael Yorke 17. April 2018
    • Markus Kraus 17. April 2018
      • Michael Yorke 17. April 2018
        • Markus Kraus 17. April 2018
          • Michael Yorke 18. April 2018
  49. Bastian 17. Mai 2018
    • Markus Kraus 17. Mai 2018
  50. Bastian 17. Mai 2018
    • Markus Kraus 18. Mai 2018
  51. Bastian 18. Mai 2018
  52. Bastian 22. Mai 2018
    • Markus Kraus 22. Mai 2018
  53. Fabian Beitz 23. Mai 2018
    • Markus Kraus 23. Mai 2018
      • Fabian Beitz 23. Mai 2018
        • Markus Kraus 23. Mai 2018
          • Fabian Beitz 23. Mai 2018
          • Markus Kraus 23. Mai 2018
  54. Thomas 18. September 2018
    • Markus Kraus 18. September 2018
  55. Ash 14. Februar 2019
    • Markus Kraus 14. Februar 2019
  56. Danny Robinson 19. Februar 2019
    • Markus Kraus 19. Februar 2019
      • Danny Robinson 22. Februar 2019
        • Markus Kraus 25. Februar 2019
          • Danny Robinson 26. Februar 2019
  57. Dario 24. April 2019
    • Markus Kraus 24. April 2019
  58. Dario 24. April 2019
  59. Dennis 8. Mai 2019
    • Markus Kraus 8. Mai 2019
  60. Dennis 16. Mai 2019
    • Markus Kraus 16. Mai 2019
  61. ol 17. Mai 2019
  62. Dom 24. Mai 2019
    • Markus Kraus 24. Mai 2019
  63. Dom 24. Mai 2019
  64. Peter 21. Juni 2019
  65. Ludo 3. Juli 2019
    • Markus Kraus 3. Juli 2019
  66. Ludo 4. Juli 2019
    • Markus Kraus 4. Juli 2019
  67. Alex Ruff 18. Juli 2019
    • Markus Kraus 18. Juli 2019
  68. Alex Ruff 18. Juli 2019
    • Markus Kraus 18. Juli 2019
  69. Alex Ruff 18. Juli 2019
  70. Susanne Pfeuffer 25. Juli 2019
  71. Susanne Pfeuffer 25. Juli 2019
    • Markus Kraus 25. Juli 2019
  72. Christian 2. August 2019
    • Markus Kraus 2. August 2019
  73. Christian 2. August 2019
  74. Christian 5. August 2019
  75. Manfred Schenk 6. Oktober 2019
    • Markus Kraus 6. Oktober 2019
  76. Marcus Krümmel 1. November 2019
    • Markus Kraus 1. November 2019
  77. Marcus Krümmel 6. November 2019
    • Markus Kraus 6. November 2019
  78. Daniel 6. November 2019
    • Markus Kraus 6. November 2019
  79. Daniel 6. November 2019
  80. Marcus Krümmel 14. November 2019
  81. Markus Schwienbacher 29. November 2019
    • Markus Kraus 29. November 2019
  82. Alexander Baumgartner 17. Januar 2020
    • Markus Kraus 17. Januar 2020
  83. Alexander Baumgartner 20. Januar 2020
  84. Alexander Baumgartner 21. Januar 2020
  85. Alexander Baumgartner 21. Januar 2020
    • Markus Kraus 21. Januar 2020
  86. Alexander Baumgartner 21. Januar 2020
    • Markus Kraus 21. Januar 2020
  87. Babar 13. Februar 2020
  88. Toby 17. Februar 2020
  89. Toby 17. Februar 2020
    • Markus Kraus 18. Februar 2020
  90. Roman 10. April 2020
  91. Roman 11. April 2020
    • Markus Kraus 11. April 2020
  92. Roman 11. April 2020
  93. Roman 11. April 2020
    • Markus Kraus 11. April 2020
  94. Roman 12. April 2020
  95. Roman 13. April 2020
    • Markus Kraus 13. April 2020
  96. Roman 14. April 2020
  97. Roman 14. April 2020
  98. Roman 14. April 2020
  99. Signalcc 1. Juli 2020
  100. Daniel St. 16. September 2020
    • Markus Kraus 16. September 2020
  101. Daniel St. 16. September 2020
  102. Daniel 17. September 2020
  103. Daniel St. 24. September 2020
  104. Daniel 19. Januar 2021
    • Markus Kraus 19. Januar 2021
  105. Daniel 25. Januar 2021
  106. Claas 25. Februar 2021
  107. Claas 2. März 2021
    • Markus Kraus 2. März 2021
  108. Sascha 3. März 2021
  109. Manfred 5. März 2021
    • Markus Kraus 5. März 2021
  110. Manfred 6. März 2021
    • Markus Kraus 6. März 2021
      • Markus Kraus 6. März 2021
  111. Manfred 8. März 2021
    • Markus Kraus 8. März 2021
  112. Marlon 8. März 2021
    • Markus Kraus 8. März 2021
  113. Manfred 8. März 2021
    • Markus Kraus 8. März 2021
  114. Manfred 8. März 2021
  115. Florian 9. März 2021
    • Markus Kraus 9. März 2021
  116. Florian 9. März 2021
    • Markus Kraus 9. März 2021
  117. Manfred 26. März 2021
  118. Simon Felder 30. März 2021
  119. Simon Felder 31. März 2021
    • Markus Kraus 31. März 2021
  120. Florian 8. April 2021
  121. Simon Felder 12. April 2021
  122. Florian Pichler 26. April 2021
  123. Florian 29. April 2021
  124. Andreas 18. Juni 2021
    • Markus Kraus 18. Juni 2021
  125. Giles 2. November 2021
    • Markus Kraus 2. November 2021
  126. Giles McNamara 3. November 2021
  127. Afiz 11. Dezember 2021
    • Markus Kraus 12. Dezember 2021
    • Markus Kraus 12. Dezember 2021
  128. Christoph Seither 1. Juli 2022
    • Markus Kraus 1. Juli 2022
  129. Patrick 12. Juni 2023
  130. Thorsten 28. Juli 2023
  131. Sebastian 15. November 2023
    • Markus Kraus 16. November 2023
  132. Enea 29. November 2023
    • Markus Kraus 7. Dezember 2023
  133. Francois MARQUIS 6. Dezember 2023
    • Markus Kraus 7. Dezember 2023

Leave a Reply