Skip to content
This repository has been archived by the owner on May 27, 2024. It is now read-only.

Commit

Permalink
Merge pull request #1 from customink/drinks/logger-sink
Browse files Browse the repository at this point in the history
Refactor sinks to be stateful; Add a logger sink
  • Loading branch information
drinks committed Jul 30, 2020
2 parents b020561 + 4dc4cad commit a87fafe
Show file tree
Hide file tree
Showing 13 changed files with 106 additions and 22 deletions.
12 changes: 12 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,18 @@

See this http:https://keepachangelog.com link for information on how we want this documented formatted.

## v0.2.0

### Changed

- `Lambda` sink renamed to `Stdout` to reflect its destination rather than its intended use
- The currently configured sink is now accessed through the `Config` object rather than from the root namespace
- Improved test coverage

### Added

- A `Logger` sink to emit to a Ruby Logger instance, for logfile output

## v0.1.0

### Added
Expand Down
2 changes: 1 addition & 1 deletion Gemfile.lock
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
PATH
remote: .
specs:
aws-embedded-metrics-customink (0.1.0)
aws-embedded-metrics-customink (0.2.0)

GEM
remote: https://rubygems.org/
Expand Down
10 changes: 9 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -29,14 +29,22 @@ gem 'aws-embedded-metrics-customink'
```
## Usage

Simple configuration.
Simple configuration:

```ruby
Aws::Embedded::Metrics.configure do |c|
c.namespace = 'MyApplication'
end
```

Using the `Logger` sink to write to a log file:

```ruby
Aws::Embedded::Metrics.configure do |c|
c.sink = Aws::Embedded::Metrics::Sinks::Logger.new(Rails.logger)
end
```

Usage is in a scope block. All metrics are flushed afterward

```ruby
Expand Down
10 changes: 5 additions & 5 deletions lib/aws-embedded-metrics-customink.rb
Original file line number Diff line number Diff line change
@@ -1,14 +1,18 @@
require 'json'
require 'benchmark'
require 'aws-embedded-metrics-customink/version'
require 'aws-embedded-metrics-customink/config'
require 'aws-embedded-metrics-customink/sinks'
require 'aws-embedded-metrics-customink/config'
require 'aws-embedded-metrics-customink/logger'

module Aws
module Embedded
module Metrics

def config
Config.config
end

def configure
Config.configure { |c| yield(c) }
end
Expand All @@ -23,10 +27,6 @@ def logger
end
end

def sink
@sink ||= Sinks::Lambda.new
end

extend self

end
Expand Down
9 changes: 8 additions & 1 deletion lib/aws-embedded-metrics-customink/config.rb
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,8 @@ module Embedded
module Metrics
module Config

DEFAULT_SINK = Sinks::Stdout

def configure
yield(config)
config
Expand All @@ -20,7 +22,7 @@ def config

class Configuration

attr_writer :namespace
attr_writer :namespace, :sink

def reconfigure
instance_variables.each { |var| instance_variable_set var, nil }
Expand All @@ -30,9 +32,14 @@ def reconfigure

def namespace
return @namespace if defined?(@namespace)

ENV['AWS_EMF_NAMESPACE'] || 'aws-embedded-metrics'
end

def sink
@sink ||= DEFAULT_SINK.new
end

end
end
end
Expand Down
6 changes: 3 additions & 3 deletions lib/aws-embedded-metrics-customink/logger.rb
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,8 @@ module Embedded
module Metrics
class Logger

def initialize(sink = Sinks::Lambda)
@sink = sink.new
def initialize(sink = Config.config.sink)
@sink = sink
@namespace = Config.config.namespace
@dimensions = []
@metrics = []
Expand All @@ -18,7 +18,7 @@ def metrics
end

def flush
Metrics.sink.accept(message) unless empty?
@sink.accept(message) unless empty?
end

def put_dimension(name, value)
Expand Down
3 changes: 2 additions & 1 deletion lib/aws-embedded-metrics-customink/sinks.rb
Original file line number Diff line number Diff line change
@@ -1 +1,2 @@
require 'aws-embedded-metrics-customink/sinks/lambda'
require 'aws-embedded-metrics-customink/sinks/logger'
require 'aws-embedded-metrics-customink/sinks/stdout'
22 changes: 22 additions & 0 deletions lib/aws-embedded-metrics-customink/sinks/logger.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
module Aws
module Embedded
module Metrics
module Sinks
class Logger

attr_reader :logger, :level

def initialize(logger, level: :info)
@logger = logger
@level = level.to_sym
end

def accept(message)
logger.public_send(level, JSON.dump(message))
end

end
end
end
end
end
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ module Aws
module Embedded
module Metrics
module Sinks
class Lambda
class Stdout

def accept(message)
puts JSON.dump(message)
Expand Down
2 changes: 1 addition & 1 deletion lib/aws-embedded-metrics-customink/version.rb
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
module Aws
module Embedded
module Metrics
VERSION = '0.1.0'.freeze
VERSION = '0.2.0'.freeze
end
end
end
22 changes: 22 additions & 0 deletions test/cases/sinks/logger_test.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
require 'logger'
require 'stringio'

module Sinks
class LoggerTest < TestCase
let(:logger) { Logger.new(StringIO.new) }
let(:level) { :info }
let(:msg) { { hello: 'world' } }
let(:sink) { Aws::Embedded::Metrics::Sinks::Logger.new(logger, level: level) }

it 'initializes with an instance of a logger and a log level' do
expect(sink).must_be_instance_of Aws::Embedded::Metrics::Sinks::Logger
expect(sink.logger).must_equal logger
expect(sink.level).must_equal level
end

it '#accept dumps its message as json to the logger at the prescribed log level' do
logger.expects(:info).with(JSON.dump(msg)).once
sink.accept(msg)
end
end
end
15 changes: 15 additions & 0 deletions test/cases/sinks/stdout_test.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
module Sinks
class StdoutTest < TestCase
let(:msg) { { hello: 'world' } }
let(:sink) { Aws::Embedded::Metrics::Sinks::Stdout.new }

it 'initializes with no arguments' do
expect(sink).must_be_instance_of Aws::Embedded::Metrics::Sinks::Stdout
end

it '#accept dumps its message as json to stdout' do
STDOUT.expects(:puts).with(JSON.dump(msg)).once
sink.accept(msg)
end
end
end
13 changes: 5 additions & 8 deletions test/test_helper.rb
Original file line number Diff line number Diff line change
Expand Up @@ -8,18 +8,15 @@
class TestCase < MiniTest::Spec

before do
reconfigure
setup_test_sink
configure
end

private

def reconfigure
Aws::Embedded::Metrics.reconfigure
end

def setup_test_sink
Aws::Embedded::Metrics.stubs sink: test_sink
def configure
Aws::Embedded::Metrics.reconfigure do |c|
c.sink = test_sink
end
end

def test_sink
Expand Down

0 comments on commit a87fafe

Please sign in to comment.