Request Tracker 4.4 Security Update and UTF8 issues with Perl's DBD::Mysql 4.042

Last week, Best Practical announced that there are critical security fixes available for Request Tracker. We’ve therefore immediately pulled the patches from 4.4.2rc2 into our test stages and rolled them out in production.
 

Update == Broken Umlauts

One thing we did notice too late: German umlauts were broken on new ticket creation. Text was simply cut off and rendered subjects and ticket body fairly unreadable.

Encoding issues are not nice, and hard to track down. We rolled back the security fix upgrade, and hoped it would simply fix the issue. It did not, even our production version 4.4.1 now led into this error.
Our first idea was that our Docker image build somehow changes the locale, but that would have at least rendered “strange” text, not entirely cut off. Same goes for the Apache webserver encoding. We’ve then started comparing the database schema, but was not touched in these regards too.
 

DBD::Mysql UTF8 Encoding Changes

During our research we learned that there is a patch available which avoids Perl’s DBD::mysql in version 4.042. The description says something about changed behaviour with utf8 encoding. Moving from RT to DBD::Mysql’s Changelog there is a clear indication that they’ve fixed a long standing bug with utf8 encoding, but that probably renders all other workarounds in RT and other applications unusable.

2016-12-12 Patrick Galbraith, Michiel Beijen, DBI/DBD community (4.041_1)
* Unicode fixes: when using mysql_enable_utf8 or mysql_enable_utf8mb4,
previous versions of DBD::mysql did not properly encode input statements
to UTF-8 and retrieved columns were always UTF-8 decoded regardless of the
column charset.
Fix by Pali Rohár.
Reported and feedback on fix by Marc Lehmann
(https://rt.cpan.org/Public/Bug/Display.html?id=87428)
Also, the UTF-8 flag was not set for decoded data:
(https://rt.cpan.org/Public/Bug/Display.html?id=53130)

 

Solution

Our build system for the RT container pulls in all required Perl dependencies by a cpanfile configuration. Instead of always pulling the latest version for DBD::Mysql, we’ve now pinned it to the last known working version 4.0.41.

 # MySQL
-requires 'DBD::mysql', '2.1018';
+# Avoid bug with utf8 encoding: https://issues.bestpractical.com/Ticket/Display.html?id=32670
+requires 'DBD::mysql', '== 4.041';

Voilá, NETWAYS and Icinga RT production instances fixed.

 

Conclusion

RT 4.4.2 will fix that by explicitly avoiding the DBD::Mysql version in its dependency checks, but older installations may suffer from that problem in local source builds. Keep that in mind when updating your production instances. Hopefully a proper fix can be found to allow a smooth upgrade to newer library dependencies.
If you need assistance with building your own RT setup, or having trouble fixing this exact issue, just contact us 🙂

Michael Friedrich
Michael Friedrich
Senior Developer

Michael ist seit vielen Jahren Icinga-Entwickler und hat sich Ende 2012 in das Abenteuer NETWAYS gewagt. Ein Umzug von Wien nach Nürnberg mit der Vorliebe, österreichische Köstlichkeiten zu importieren - so mancher Kollege verzweifelt an den süchtig machenden Dragee-Keksi und der Linzer Torte. Oder schlicht am österreichischen Dialekt der gerne mit Thomas im Büro intensiviert wird ("Jo eh."). Wenn sich Michael mal nicht in der Community helfend meldet, arbeitet er am nächsten LEGO-Projekt oder geniesst...

CPAN Minus

CpanPerl ist ein etablierter Kanndidat wenn es darum geht, mit kleiner Software Probleme zu lösen. Zum Beispiel ist die nahtlose Integration von Textverarbeitung in Kombination mit regulären Ausdrücken ein unschlagbares Feature.
Perl erweitert seine Funktionalität mit Modulen welche im Comprehensive Perl Archive Network zu Verfügung gestellt werden, kurz CPAN genannt. Unglücklicherweise ist die Nutzung von CPAN immer mit schmerzhaften Erfahrungen verbunden. Builden, Testen, fehlende Abhängigkeiten und megabyteweise Ausgaben führen oft zu einem Fehlschlag und rütteln an der Akzeptanz des Tools.
Seit einiger Zeit wird CPAN Minus immer populärer. Ein Grund ist vermutlich die einfache Arbeitsweise. So kann man ohne Konfiguration und Kommandozeilenschlachten, Module und deren Abhängigkeiten installieren. Na bitte, so geht es also auch.
Beispiele:
Installation unter Ubuntu / Debian:
$ apt-get install build-essential perl # Abhängigkeiten
$ apt-get install cpanminus

Alternativ kann das Skript auch einfach mit Curl oder Wget runter laden:
$ curl -L http://cpanmin.us > cpanm
$ chmod +x cpanm

Die Installation von Modulen kann jetzt auf zwei Arten erfolgen. Entweder installiert man ein einzelnes Modul:
$ sudo cpanm --installdeps Date::Holidays

Oder eine Gruppe von Modulen wird in einer Datei bereitgestellt:
$ head -n3 cpanfile
# Core
requires 'Apache::Session', '1.53';
requires 'CGI', '3.38';
$ cpanm --installdeps .

Alles übrige wird im Hintergrund erledigt.
Nach Jahren der Selbstkasteiung ist das mal ein gutes Tool!

Marius Hein
Marius Hein
Head of Development

Marius Hein ist schon seit 2003 bei NETWAYS. Er hat hier seine Ausbildung zum Fachinformatiker absolviert, dann als Application Developer gearbeitet und ist nun Leiter der Softwareentwicklung. Ausserdem ist er Mitglied im Icinga Team und verantwortet dort das Icinga Web.

Monthly Snap September: Tools for Graphite, OSMC and OSBConf, Poor man´s Cloud and much more

In September Markus W. told us about tools to use to generate metrics for Graphite.
The Open Source Monitoring Conference ist getting and Bernd counted 49 to the conference by sharing Florian Forster tweekly snapalk: “Introduction into collectd”. Michael Medin, our old stager at the OSMC, wrote a guest post where he explained why the OSMC is the best conference and Daniela gave us an insight into the OSBConf which took place in Cologne last month.
Alexander F. looked at the advantages of Perl over PHP and Python while Markus F. followed and showed us poor man´s Docker with own Cloud.
Jean-Marcel, one of our trainees, then explained why dynamic window manager is the best and Alexander K., also trainee,  told us what he learned new  at NETWAYS.
And last but not least, Marius G. reported on the first team event of the managed services guys.

Stephanie Kotilge
Stephanie Kotilge
Accountant

Steffi kümmert sich bei NETWAYS ums Office-Management und ist die gute Seele der Fabrik. Auch unsere Kunden kommen an ihr nicht vorbei und wollen dies natürlich auch nicht. Da sie ein überdurchschnittliches sprachliches Talent besitzt und neben Deutsch noch fliessend in Englisch und Französisch unterwegs ist, kümmert sie sich auch um einen Großteil der Übersetzungen. In diesem Sinn ... Merci

From Perl to Python and beyond

I’ve seen and learned plenty of programming languages either during my studies or in work or spare time related projects – be it C/C++/C#, VHDL, Java or PHP/Perl/Python/Ruby even (I’ve removed some in my XING profile to reduce recruiter spam level ;)). Choosing the “right” language is always hard but most of the time the requirements of existing software or newly designed projects allow you to skip that part and already have one in mind.
python-logo-master-v3-TMWhen joining NETWAYS in late 2012, I took over the LConf backend project being entirely written in Perl similar to other plugins and scripts floating around as open source software. Icinga 1.x Core is partially using Perl as well (although embedded Perl in C is a horrible mess). Most recently our development team decided to go for Python as the primary programming language.
So, my Python foo wasn’t that good after some years not really using it. Learning from my colleagues and looking into additional ressources helped a lot. I also found “Head first Python” from O’Reilly in my bookshelf as a gift from the Nagios/Icinga cookbook review which also provides an extensive introduction into Python – when you already know a scripting language like Perl.
We’ve been working on a customer’s project developing a plugin framework for executing checks via a defined transport (e.g. ssh) and parsing cli output. Find some collected hints and tricks I’ve learned below.

Remove colors from shell output

The EMC “isi” cli command puts colors into the shell output (e.g. for a critical state turning the background red). While one could disable color support on the shell, this was not possible in that environment. The fix by Gunnar was easy: Parsing text output into a list called “lines” and clean the line string from shell color codes:

lines = text.split('\n')
lines = [re.sub('\x1b\[[0-9;]*m', '', line).strip() for line in lines]

Convert datetime to unix timestamp

Consider having a datetime string whose output format is not fixed, which means some strftime print magic does not work for proper parsing. Luckily there’s a Python module called dateutil providing the required functionality.

import time
import datetime
import dateutil.parser
def datetime2unixts(time_str):
    dt = dateutil.parser.parse(time_str)
    return time.mktime(dt.timetuple())
$ python
Python 2.7.8 (default, Apr 15 2015, 09:26:43)
[GCC 4.9.2 20150212 (Red Hat 4.9.2-6)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import time, datetime, dateutil.parser
>>> def datetime2unixts(time_str):
...     dt = dateutil.parser.parse(time_str)
...     return time.mktime(dt.timetuple())
...
>>> time_str = "Wed May 13 16:15:34 CEST 2015"
>>> datetime2unixts(time_str)
1431526534.0

Initialize nested dictionary

Similar to what I am used to do with Perl and hashes I was stumbling over this with Python. In Perl one does not care about initializers, but just keeps populating all items like so:

my $hash = {}
$hash{'key1'}{'key2'} = "val1";

In Python this does not work out-of-the-box. There are some modules available such as “collectors”, but I prefer a somewhat native implementation making it work on older distributions. I came across this solution which I consider pure awesome 🙂

class AutoVivification(dict):
    """Implementation of perl's autovivification feature."""
    def __getitem__(self, item):
        try:
            return dict.__getitem__(self, item)
        except KeyError:
            value = self[item] = type(self)()
            return value
hash = AutoVivification()
hash["key1"]["key2"] = "val1"

Note: It certainly does create non-existing keys if you are checking for their existance. My implementation does not care about key checks, but requires known-to-exist values from a flat dictionary with “id_label” as key stashed into a nested dictionary where id and label are separated/nested for further operations.

        jobs = AutoVivification()  # use a pre-initialized nested dict
        for k, v in sorted(perfdata.iteritems()):
            (job_id, label) = k.split("_", 1)
            if label == "ended_ts":
                jobs[job_id][label] = float(v)
            if label == "started_ts":
                jobs[job_id][label] = float(v)

Fix the indent

If your editor doesn’t do that automatically (e.g. converting tabs into 4 spaces) it might still work, but could also cause weird behaviour in Python depending on the indent only (no brackets as I am used to with Perl). Fixing this is fairly easy by using autopep8 – I’m using Fedora 22:

dnf install python-autopep8
autopep8 check_plugin -i

Note: ‘-i’ replaces the given file with all the changes. Make sure to commit your other changes to git before.

Conclusion

I never thought that I would dig deep in Python again that easy. I used to hack that in the past with Win2k usb driver test frameworks, and also checkmk plugins, but gaining back experience worked out pretty well.
Icinga 2’s code, value types and configuration look a lot like Python as well – take dictionaries for custom attributes using apply for loops, eh? (Hint: Testdrive this config snippet inside the Icinga 2 Docker container).

object Host "dns" {
  import "generic-host"
  address = "127.0.0.1"
  address6 = "::1"
  vars.dns_checks["dns icinga.org"] = {
    dns_lookup = "icinga.org"
    dns_server = "ns1.netways.de"
    dns_expected_answers = "185.11.254.83"
  }
  vars.dns_checks["dns netways.org"] = {
    dns_lookup = "netways.org"
    dns_server = "ns1.netways.de"
    dns_expected_answers = "185.11.252.37"
  }
}
apply Service for (dns_check => config in host.vars.dns_checks) {
  check_interval = 1m
  retry_interval = 30s
  check_command = "dns"
  vars += config
}

Icinga 2, plugins, your project – here I come 🙂
PS: See you at the OSMC hackathon.

Michael Friedrich
Michael Friedrich
Senior Developer

Michael ist seit vielen Jahren Icinga-Entwickler und hat sich Ende 2012 in das Abenteuer NETWAYS gewagt. Ein Umzug von Wien nach Nürnberg mit der Vorliebe, österreichische Köstlichkeiten zu importieren - so mancher Kollege verzweifelt an den süchtig machenden Dragee-Keksi und der Linzer Torte. Oder schlicht am österreichischen Dialekt der gerne mit Thomas im Büro intensiviert wird ("Jo eh."). Wenn sich Michael mal nicht in der Community helfend meldet, arbeitet er am nächsten LEGO-Projekt oder geniesst...

OSDC 2014: Der Countdown läuft – nur noch 8 Tage

NUR NOCH EINE WOCHE!!!
Aber heute gibt’s noch mal Serverorchestrierung mit Rex.

OSDC? Noch nie gehört…
Das ist aber schade und fast schon ein unentschuldbares Versäumnis!
Aber wir holen das nach:
Die Open Source Data Center Conference (kurz OSDC) ist unsere internationale Konferenz zum Thema Open Source Software in Rechenzentren und großen IT-Umgebungen. 2014 findet sie zum sechsten Mal statt und bietet mit dem Schwerpunktthema Agile Infrastructures ganz besonders erfahrenen Administratoren und Architekten ein Forum zum Austausch und die Gelegenheit zur Aneignung des aktuellsten Know-Hows für die tägliche Praxis. Diesmal treffen wir uns dafür in Berlin!
Workshops am Vortag der Konferenz und das im Anschluss an die Veranstaltung stattfindende Puppet Camp komplettieren dabei das Rundum-sorglos-Paket für Teilnehmer, die gar nicht genug Wissen in sich aufsaugen können.

Brackets – Open Source Editor

Brackets(Quelle: brackets.io)

Brackets ist ein Open Source Editor von Adobe und ist – haltet euch jetzt gaaaanz fest: Open Source!!
Der Editor wurde speziell für Web Designer und Front-End Developer entworfen, kann aber durch Zusatzmodule auch beispielsweise Perl handeln. Ich finde das Brackets zwar im Vergleich zu anderen Editoren beim Tippen eher etwas “langsam” bzw. “träge” reagiert, dafür ist die GUI aber schön aufgeräumt, wodurch für den Code viel Platz zur Verfügung steht.
Eines meiner persönlichen Highlights ist das “Live HTML Development”. Ja, richtig gelesen! Änderungen am HTML werden direkt an den Browser übermittelt ohne zwischendurch speichern zu müssen. Die Entwickler von Brackets haben hierzu ein sehr schönes Video-Beispiel veröffentlicht, in dem auch das modifizieren von Stylesheets gezeigt wird.
Die Stylesheet Funktion ist eine weitere, wirklich sehr coole Geschichte. Die Stylesheets werden (egal in welcher extern eingebundenen Datei sie stecken) direkt an Ort und Stelle angezeigt. Das hin und her springen zwischen mehren Dateien entfällt.
Wenn ihr mehr über Brackets wissen oder es einfach mal ausprobieren wollt: http://brackets.io  🙂

Tobias Redel
Tobias Redel
Head of Professional Services

Tobias hat nach seiner Ausbildung als Fachinformatiker bei der Deutschen Telekom bei T-Systems gearbeitet. Seit August 2008 ist er bei NETWAYS, wo er in der Consulting-Truppe unsere Kunden in Sachen Open Source, Monitoring und Systems Management unterstützt. Insgeheim führt er jedoch ein Doppelleben als Travel-Hacker, arbeitet an seiner dritten Millionen Euro (aus den ersten beiden ist nix geworden) und versucht die Weltherrschaft an sich zu reißen.

Weekly Snap: Puppet Camp Munich, Perl Profiling & Cyanogenmod

weekly snap25 – 29 November ended the month with Puppet Camp Munich and a few guides on Perl profiling, internal Bash variables and Cyanogenmod.
Eva started the week by counting 134 days to the OSDC 2014 with Nicholas Mailer’s presentation on Deconstructing the Cloud”.
She then headed off to Puppet Camp Munich, to report live from the event alongside Dirk and his top Puppet presentation picks.
Tobias followed by introducing a few lesser-known, internal Bash variables as Michael showed how to profile Perl scripts using NYTProf.
Finally, Marcus put the case forward for Cyanogenmod as a better alternative to original smartphone firmware.

Perl Profiling mit NYTProf

Nachdem sich meine Kollegen bereits eingehend mit PHP Profiling mit KCacheGrind und XDebug sowie GPerfTools am Beispiel von Icinga 2 beschäftigt haben, möchte ich mich heute dem Perl Profiler NYTProf widmen. Profiling von Perl Scripts ist vor allem dann interessant, wenn man eigene Funktionsaufrufe gekapselt hat, und natürlich, um zu erkennen, womit man aktuell am meisten Zeit verbrät, um daraus Optimierungsstrategien zu entwickeln. Vielleicht gibt es ja auch eine besser Library, um Objekte von der Platte in einen Hash einzulesen, oder schnellere Stringoperationen? Oder auch nur das Übliche – alles ist zu langsam, und man möchte gezielt wissen, wer oder was schuld daran ist 😉
Die Installation ist trivial, wahlweise aus Paketen (EL6 benötigt das Repoforge Repository), oder direkt aus CPAN.

# apt-get install libdevel-nytprof-perl
# yum install perl-Devel-NYTProf
# zypper in perl-Devel-NYTProf
# perl -MCPAN -e 'install Devel::NYTProf'

Den Profiler bindet man wie folgt ein

# perl -d:NYTProf my_perl_script.pl

Standardmässig legt NYTProf im aktuellen Verzeichnis eine Datei namens nytprof.out an (falls Prozesse geforkt werden, mit PID als Suffix. Mittels nytprofmerge können mehrere Dateien wieder zusammengefügt werden). Das kann bei längerer Laufzeit schonmal mehrere hundert Megabyte ausspucken, dementsprechend sollte mans auf einem schnellen Device mit viel Platz ausführen.
Nachdem das Perl Script erfolgreich beendet wurde, kann man das Ergebnis mit unterschiedlichen Exportmechanismen visualisieren.
Die schnellste Methode hierbei ist eine generierte HTML Übersicht inkl Flamegraph, Treemap und Übersichtstabellen mit den am meisten aufgerufensten/längsten dauernden Funktionen. nytprofhtml erwartet sich ohne Angabe von –file als Parameter im aktuellen Verzeichnis die vorher erstelle nytprof.out Datei.

$ nytprofhtml
$ chromium nytprof/index.html

NYTProf HTML Output
Alternativ dazu bietet NYTProf seit Version 3 an, die Profiling Datei in ein Callgrind-lesbares Format zu exportieren. Damit ist es möglich, in gewohnter Umgebung mit KCacheGrind zu arbeiten.

$ nytprofcg
$ kcachegrind nytprof.callgrind

Nytprof Callgrind Kcachegrind
Sofern wider Erwarten mal Performanceprobleme auftreten – wir wissen Bescheid, wie man die Ergebnisse interpretiert und die Performance optimiert, fragt uns einfach 🙂

Michael Friedrich
Michael Friedrich
Senior Developer

Michael ist seit vielen Jahren Icinga-Entwickler und hat sich Ende 2012 in das Abenteuer NETWAYS gewagt. Ein Umzug von Wien nach Nürnberg mit der Vorliebe, österreichische Köstlichkeiten zu importieren - so mancher Kollege verzweifelt an den süchtig machenden Dragee-Keksi und der Linzer Torte. Oder schlicht am österreichischen Dialekt der gerne mit Thomas im Büro intensiviert wird ("Jo eh."). Wenn sich Michael mal nicht in der Community helfend meldet, arbeitet er am nächsten LEGO-Projekt oder geniesst...

OSMC 2013: Der Countdown läuft – nur noch 1 Tag

Morgen Kinder wird’s was geben!
Was genau, das erfahrt Ihr hier.
Heute gibt’s erstmal aber noch Christian Schneemann.

OSMC? Was soll das denn sein und wer sind die netten Menschen in diesen Videos?Die Open Source Monitoring Conference (kurz: OSMC) ist die internationale Plattform für alle an Open Source Monitoring Lösungen Interessierten, speziell Nagios und Icinga. Jedes Jahr gibt es hier die Möglichkeit sein Wissen über freie Monitoringsysteme zu erweitern und sich mit anderen Anwendern auszutauschen. Die Konferenz richtet sich besonders an IT-Verantwortliche aus den Bereichen System- und Netzwerkadministration, Entwicklung und IT-Management. Und die netten Menschen, die Ihr in unseren Videos zur OSMC seht, gehören dazu. 2013 wird die OSMC zum 8. Mal in Nürnberg stattfinden.

Monitor WMI mit perl unter windows

Es gibt 1000 und einen Weg Windows zu überwachen. Heute möchte ich euch zeigen wie es möglich ist mit WMI und Perl an ein Fülle von Daten zu kommen.
Zuerst einmal muss perl unter Windows installiert werden. Auf perl.org bekommt man eine Übersicht welche Versionen es für Windows gibt. Ich bevorzuge Strawberry Perl für Windows, da es zu 100% OpenSource ist.
Wenn man nsclient benutzt kann man sich auch überlegen es in ein Unterverzeichnis zu installieren. Es reicht prinzipiell es dort hin zu kopieren und die richtigen Abhängigkeiten mit zu installieren. Vor allem Modul Win32::OLE ist hierbei wichtig. Im Beispiel-Command weiter unten liegt perl unterhalb von nsclient im verzeichnis “extra”
Wenn perl installiert ist braucht man noch das plugin. Ich habe eins geschrieben, dass check_wmi_range.pl heißt und diverse Werte nach bestimmten Regeln abruft,auswertet und ausgibt. Es lässt sich auf hier von netways.org herunterladen
Da das Plugin aufgerufen werden möchte sollte man ein paar commands in die nsclient.ini eintragen.
Ein allgemeines Command zum aufruf von perl scripten sieht so aus:
call_perl=extra\Perl\bin\perl.exe -I extra\perl\lib -I extra\perl\site\lib $ARG1$
Der Aufruf von check_wmi_range.pl sieht dann folgendermaßen aus:
define command {
command_line $USER1$/check_nrpe -u -t 40 -H $HOSTADDRESS$ -c call_perl -a 'scripts/check_wmi_range.pl -w "$ARG1$" -c "$ARG2$" -C "$ARG3$" -o "$ARG4$" $ARG5$'
command_name win-wmi-range
}

Die Hilfe zum plugin lässt mit ./check_wmi_range.pl –help aufrufen oder hier nachlesen.

HELP
check_wmi_range.pl 0.55 - checks one wmi object per instance against a threshold
Options are:
  -c, --critical                  Enter the critical threshold
  -w, --warning                   Enter the warning threshold
  -C  --class                     Enter the WMI class
  -o  --object                    Enter the WMI object
  -e  --exclude                   Enter a regex to exclude instances
        to exclude more than one instance write -e "(instance1|instance2)"
  -i  -- include                  Enter a regex to include instances
        other Instances will be skipped
  -t  --no_Total                  hide the _Total instance
  -z  --zero                      hide zero values
  -s  --sleep                     run twice and sleep between the iterations <time to sleep>
  -I  --idle-contra-indicator     designed for proc_process. Check's if there's enough idle time left <threshold>
        It becomes critical if the real idle time of the last free core falls below threshold
  -n, --no-perf-data              no performance data
  -v  --verbose                   verbose mode
  -h, --help                      display this help and exit
      --usage                     display a short usage instruction
  -V, --version                   output version information and exit
Requirements:
 A fully qualified wmi String consists of \Class\Instance\Object\Value
 This plugin uses perl and DBD::WMI to get values from multiple WMI Instances for each object.
 A working WMI counter is for example Win32_PerfFormattedData_Tcpip_NetworkInterface\<InstanceName>\BytesTotalPersec
 In most cases you want to exclude the "_Total" instance ( -t).
Examples:
 Physical disktime:
  Class = Win32_PerfFormattedData_PerfDisk_PhysicalDisk
  Object = percentdisktime
  cmd: perl -w check_wmi_range.pl -w 10 -c 20 -C Win32_PerfFormattedData_PerfDisk_PhysicalDisk -o percentdisktime -t
 Interface Traffic:
  Class = Win32_PerfFormattedData_Tcpip_NetworkInterface
  Object = BytesTotalPersec
  cmd: perl -w check_wmi_range.pl -w 1000000 -c 1500000 -C Win32_PerfFormattedData_Tcpip_NetworkInterface -o BytesTotalPersec
 Process CPU usage:
  Class = Win32_PerfFormattedData_Perfproc_Process
  Object = PercentProcessorTime
  cmd: perl -w check_wmi_range.pl -w 10 -c 20 -C Win32_PerfFormattedData_Perfproc_Process -o PercentProcessorTime -t -e Idle -z -I 60
Christoph Niemann
Christoph Niemann
Senior Consultant

Christoph hat bei uns im Bereich Managed Service begonnen und sich dort intensiv mit dem internen Monitoring auseinandergesetzt. Seit 2011 ist er nun im Consulting aktiv und unterstützt unsere Kunden vor Ort bei größeren Monitoring-Projekten und PERL-Developer-Hells.