Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Directory check #581

Merged
merged 4 commits into from
Jul 31, 2013
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
67 changes: 67 additions & 0 deletions checks.d/directory.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,67 @@
from fnmatch import fnmatch
from os import stat, walk
from os.path import abspath, exists, join
import time

from checks import AgentCheck


class DirectoryCheck(AgentCheck):
"""This check is for monitoring and reporting metrics on the files for a provided directory

WARNING: the user/group that dd-agent runs as must have access to stat the files in the desired directory

Config options:
"directory" - string, the directory to gather stats for. required
"name" - string, the name to use when tagging the metrics. defaults to the "directory"
"pattern" - string, the `fnmatch` pattern to use when reading the "directory"'s files. default "*"
"recursive" - boolean, when true the stats will recurse into directories. default False
"""
def check(self, instance):
if "directory" not in instance:
raise Exception('DirectoryCheck: missing "directory" in config')

directory = instance["directory"]
abs_directory = abspath(directory)
name = instance.get("name") or directory
pattern = instance.get("pattern") or "*"
recursive = instance.get("recursive") or False

if not exists(abs_directory):
raise Exception("DirectoryCheck: the directory (%s) does not exist" % abs_directory)

self._get_stats(abs_directory, name, pattern, recursive)

def _get_stats(self, directory, name, pattern, recursive):
tags = ["name:%s" % name]
directory_bytes = 0
directory_files = 0
for root, dirs, files in walk(directory):
for filename in files:
filename = join(root, filename)
# check if it passes our filter
if not fnmatch(filename, pattern):
continue
try:
file_stat = stat(filename)

except OSError, ose:
self.warning("DirectoryCheck: could not stat file %s - %s" % (filename, ose))
else:
directory_files += 1
directory_bytes += file_stat.st_size
# file specific metrics
self.histogram("system.disk.directory.file.bytes", file_stat.st_size, tags=tags)
self.histogram("system.disk.directory.file.modified_sec_ago", time.time() - file_stat.st_mtime, tags=tags)
self.histogram("system.disk.directory.file.created_sec_ago", time.time() - file_stat.st_ctime, tags=tags)

# os.walk gives us all sub-directories and their files
# if we do not want to do this recursively and just want
# the top level directory we gave it, then break
if not recursive:
break

# number of files
self.gauge("system.disk.directory.files", directory_files, tags=tags)
# total file size
self.gauge("system.disk.directory.bytes", directory_bytes, tags=tags)
20 changes: 20 additions & 0 deletions conf.d/directory.yaml.example
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
init_config:

instances:
# This config is for the DirectoryCheck which is used to report metrics
# for the files in a given directory
#
# For each instance you *must* provide at least a "directory"
#
# WARNING: the user/group that dd-agent runs as must have access to stat the files in the desired directory
#
# The following options are available:
# "directory" - string, the directory to gather stats for. required
# "name" - string, the name to use when tagging the metrics. defaults to the "directory"
# "pattern" - string, the `fnmatch` pattern to use when reading the "directory"'s files. default "*"
# "recursive" - boolean, when true the stats will recurse into directories. default False

- directory: "/tmp"
name: "tmp"
pattern: "*.log"
recursive: True