YouTube-Monitoring mit check_logfiles

Anlässlich der neuen Videoserie "ConSol Monitoring Minutes" habe ich mir überlegt, wie man die Zahl der Zugriffe auf ein YouTube-Video mit einem Nagios-Plugin auslesen und mit PNP4Nagios aufzeichnen kann. Ein eigenes Plugin müsste dazu die Informationen herunterladen, Kennzahlen aus dem Resultat herausparsen, ausgeben und nicht zuletzt irgendwie auf Download-Fehler reagieren. Mit check_logfiles, einer kleinen Konfigurationsdatei und der YouTube-API ist das aber kein Problem.

So sieht die Konfigurationsdatei aus:

$prescript = 'wget';
$prescriptparams = '--quiet'.
    ' --output-document=/tmp/$CL_VIDEO$.xml'.
    ' http://gdata.youtube.com/feeds/api/videos?q=$CL_VIDEO$&v=2';
$scriptpath = "/usr/bin";
$options = "prescript,supersmartpostscript";

@searches = ({
  tag => '$CL_VIDEO$',
  logfile => '/tmp/$CL_VIDEO$.xml',
  criticalpatterns => ['statistics', 'rating', 'media:title'],
  options => "script,allyoucaneat",
  script => sub {
    my $line = $ENV{CHECK_LOGFILES_SERVICEOUTPUT};
    if ($line =~ /viewCount='(\d+)'/) {
      $CHECK_LOGFILES_PRIVATESTATE->{views} = $1;
    }
    if ($line =~ /numDislikes='(\d+)'/) {
      $CHECK_LOGFILES_PRIVATESTATE->{dislikes} = $1;
    }
    if ($line =~ /numLikes='(\d+)'/) {
      $CHECK_LOGFILES_PRIVATESTATE->{likes} = $1;
    }
    if ($line =~ /<media:title.*?>(.*?)<\/media:title>/) {
      $CHECK_LOGFILES_PRIVATESTATE->{title} = $1;
    }
  },
});

$postscript = sub {
  my $video = $ENV{CHECK_LOGFILES_VIDEO};
  my $state = $CHECK_LOGFILES_PRIVATESTATE->{$video};
  my $title = exists $state->{title} ? $state->{title} : "(unknown)";
  my $views = exists $state->{views} ? $state->{views} : 0;
  my $likes = exists $state->{likes} ? $state->{likes} : 0;
  my $dislikes = exists $state->{dislikes} ? $state->{dislikes} : 0;
  my $popularity = ($likes + $dislikes) ?
      $likes * 100 / ($likes + $dislikes) : 100;
  printf "%s was viewed %d times | %s=%d popularity=%.02f%%\n",
    $title, $views, $video, $views, $popularity;
  unlink '/tmp/'.$video.'.xml';
  return 0;
};

Und so ruft man’s dann auf:

$ check_logfiles --config youtube.cfg --macro CL_VIDEO=1fk0V7M
OMD im Überblick - ConSol Monitoring Minutes 1/13 was viewed 77 times | 1J0V7M=77 popularity=100.00%



Das ist noch ein bisschen mager, bei bekannteren Videos sehen die Zahlen schon imposanter aus. "Gangnam Style" hätte ich gern als Beispiel gezeigt, aber da hat die GEMA einen Riegel vorgeschoben. Das derzeit populärste Video bei YouTube ist aber auch nicht schlecht.

$ check_logfiles --config youtube.cfg --macro CL_VIDEO=Gng3sPiJdzA
The Ultimate Girls Fail Compilation 2012 was viewed 67845545 times | Gng3sPiJdzA=67845545 popularity=86.39%


Mir ging es einfach nur darum, den Anstieg der Views aufzuzeichnen. Zwecks Alarmierung Schwellwerte zu setzen wäre aber auch kein Problem. Man erweitert dann das Postscript im Konfigfile folgendermassen:

  printf "%s was viewed %d times | %s=%d popularity=%.02f%%\n",
    $title, $views, $video, $views, $popularity;
  if ($ENV{CHECK_LOGFILES_CRITICAL} &&
      $views > $ENV{CHECK_LOGFILES_CRITICAL}) {
    return 2;
  } elsif ($ENV{CHECK_LOGFILES_WARNING} &&
      $views > $ENV{CHECK_LOGFILES_WARNING}) {
    return 1;
  } else {
    return 0;
  }
};

$ check_logfiles --config youtube.cfg --macro CL_VIDEO=qHX34uMNXQ8 --warning 1000000 --critical 2000000
Andre Rieu &amp; Heino - Rosamunde 2009 was viewed 1231937 times | qHX34uMNXQ8=1
231937 popularity=95.77%
$ echo $?
1
Author: Gerhard Laußer
Monitoring-Workshop 2017 12./13.9. Düsseldorf