blob: c827587219ea5a6746deba23404d224ad890038e [file] [log] [blame]
// Copyright 2015 Cloudera, Inc.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
#include "kudu/server/glog_metrics.h"
#include <glog/logging.h>
#include "kudu/gutil/once.h"
#include "kudu/util/metrics.h"
METRIC_DEFINE_counter(server, glog_info_messages,
"INFO-level Log Messages", kudu::MetricUnit::kMessages,
"Number of INFO-level log messages emitted by the application.");
METRIC_DEFINE_counter(server, glog_warning_messages,
"WARNING-level Log Messages", kudu::MetricUnit::kMessages,
"Number of WARNING-level log messages emitted by the application.");
METRIC_DEFINE_counter(server, glog_error_messages,
"ERROR-level Log Messages", kudu::MetricUnit::kMessages,
"Number of ERROR-level log messages emitted by the application.");
namespace kudu {
class MetricsSink : public google::LogSink {
public:
explicit MetricsSink(const scoped_refptr<MetricEntity>& entity) :
info_counter_(METRIC_glog_info_messages.Instantiate(entity)),
warning_counter_(METRIC_glog_warning_messages.Instantiate(entity)),
error_counter_(METRIC_glog_error_messages.Instantiate(entity)) {
}
virtual void send(google::LogSeverity severity, const char* full_filename,
const char* base_filename, int line,
const struct ::tm* tm_time,
const char* message, size_t message_len) OVERRIDE {
Counter* c;
switch (severity) {
case google::INFO:
c = info_counter_.get();
break;
case google::WARNING:
c = warning_counter_.get();
break;
case google::ERROR:
c = error_counter_.get();
break;
default:
return;
}
c->Increment();
}
private:
scoped_refptr<Counter> info_counter_;
scoped_refptr<Counter> warning_counter_;
scoped_refptr<Counter> error_counter_;
};
ScopedGLogMetrics::ScopedGLogMetrics(const scoped_refptr<MetricEntity>& entity)
: sink_(new MetricsSink(entity)) {
google::AddLogSink(sink_.get());
}
ScopedGLogMetrics::~ScopedGLogMetrics() {
google::RemoveLogSink(sink_.get());
}
} // namespace kudu