Skip to content
This repository has been archived by the owner on Jun 13, 2023. It is now read-only.

Commit

Permalink
clean logs and merge config if not present
Browse files Browse the repository at this point in the history
  • Loading branch information
Sven Speckmaier committed Jul 11, 2019
1 parent 962a547 commit b43fb9d
Show file tree
Hide file tree
Showing 6 changed files with 237 additions and 15 deletions.
13 changes: 11 additions & 2 deletions src/Context/SpanContext.php
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
use Ipunkt\LaravelJaeger\Context\Exceptions\NoSpanException;
use Ipunkt\LaravelJaeger\Context\Exceptions\NoTracerException;
use Ipunkt\LaravelJaeger\Context\TracerBuilder\TracerBuilder;
use Ipunkt\LaravelJaeger\LogCleaner\LogCleaner;
use Ipunkt\LaravelJaeger\SpanExtractor\SpanExtractor;
use Ipunkt\LaravelJaeger\TagPropagator\TagPropagator;
use Jaeger\Jaeger;
Expand Down Expand Up @@ -45,19 +46,26 @@ class SpanContext implements Context
* @var TracerBuilder
*/
private $tracerBuilder;
/**
* @var LogCleaner
*/
private $logCleaner;

/**
* MessageContext constructor.
* @param TagPropagator $tagPropagator
* @param SpanExtractor $spanExtractor
* @param TracerBuilder $tracerBuilder
* @param LogCleaner $logCleaner
*/
public function __construct(TagPropagator $tagPropagator,
SpanExtractor $spanExtractor,
TracerBuilder $tracerBuilder) {
TracerBuilder $tracerBuilder,
LogCleaner $logCleaner) {
$this->tagPropagator = $tagPropagator;
$this->spanExtractor = $spanExtractor;
$this->tracerBuilder = $tracerBuilder;
$this->logCleaner = $logCleaner;
}

public function start()
Expand Down Expand Up @@ -125,7 +133,8 @@ public function inject(array &$messageData)
}

public function log( array $fields ) {
$this->messageSpan->log($fields);
$this->logCleaner->setLogs($fields)->clean();
$this->messageSpan->log($this->logCleaner->getLogs());
}

private function assertHasTracer() {
Expand Down
79 changes: 79 additions & 0 deletions src/LogCleaner/LogCleaner.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,79 @@
<?php namespace Ipunkt\LaravelJaeger\LogCleaner;

/**
* Class LogCleaner
* @package Ipunkt\LaravelJaeger\LogCleaner
*/
class LogCleaner {

/**
* @var int
*/
protected $maxLength = 300;

/**
* @var string
*/
protected $cutoffIndicator = '...';

/**
* @var array
*/
protected $logs = [];

public function clean(): LogCleaner {
$this->trimToMaxLength();

return $this;
}

protected function trimToMaxLength() {
$this->trimToMaxLengthRecursive($this->logs);
}

protected function trimToMaxLengthRecursive(&$logs) {
foreach ($logs as &$value) {
if( is_array($value) ) {
$this->trimToMaxLengthRecursive($value);
continue;
}

if( !is_string($value) ) {
continue;
}

$isLonger = strlen($value) > $this->maxLength;
if( !$isLonger )
continue;

$value = substr($value, 0, $this->maxLength);
$value .= $this->cutoffIndicator;
}
}

public function setMaxLength( int $maxLength ): LogCleaner {
$this->maxLength = $maxLength;
return $this;
}

public function setLogs(array $logs): LogCleaner {
$this->logs = $logs;
return $this;
}

/**
* @param string $cutoffIndicator
* @return LogCleaner
*/
public function setCutoffIndicator( string $cutoffIndicator ): LogCleaner {
$this->cutoffIndicator = $cutoffIndicator;
return $this;
}

/**
* @return array
*/
public function getLogs(): array {
return $this->logs;
}
}
42 changes: 30 additions & 12 deletions src/Provider.php
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
use Event;
use DB;
use Ipunkt\LaravelJaeger\Context\TracerBuilder\TracerBuilder;
use Ipunkt\LaravelJaeger\LogCleaner\LogCleaner;
use Jaeger\Config;
use Log;

Expand All @@ -26,20 +27,13 @@ public function register()
__DIR__.'/config/jaeger.php' => config_path('jaeger.php'),
]);

$this->app->singleton(Config::class, function() {
$config = Config::getInstance();
$config->gen128bit();
return $config;
});
$this->mergeConfigFrom(__DIR__.'/config/jaeger.php', 'jaeger');
$this->registerConfig();

$this->app->resolving(TracerBuilder::class, function(TracerBuilder $tracerBuilder) {
$tracerBuilder
->setName(config('app.name'))
->setJaegerHost(config('jaeger.host'));
return $tracerBuilder;
});
$this->registerSettingTracerBuilderConfig();
$this->registerSettingLogCleanerConfig();

// Setup a unique ID for each request. This will allow us to find
// Setup a unique ID for each request. This will allow us to find
// the request trace in the jaeger ui
$this->app->instance('context', app(EmptyContext::class) );
}
Expand Down Expand Up @@ -128,4 +122,28 @@ private function disabledInConsole()
return !config('jaeger.enable-for-console');
}

private function registerSettingTracerBuilderConfig(): void {
$this->app->resolving( TracerBuilder::class, function ( TracerBuilder $tracerBuilder ) {
$tracerBuilder
->setName( config( 'app.name' ) )
->setJaegerHost( config( 'jaeger.host' ) );
return $tracerBuilder;
} );
}

private function registerConfig(): void {
$this->app->singleton( Config::class, function () {
$config = Config::getInstance();
$config->gen128bit();
return $config;
} );
}

private function registerSettingLogCleanerConfig() {
$this->app->resolving(LogCleaner::class, function(LogCleaner $logCleaner) {
$logCleaner->setMaxLength( config('jaeger.log.max-string-length') );
$logCleaner->setCutoffIndicator( config('jaeger.log.cutoff-indicator') );
});
}

}
4 changes: 4 additions & 0 deletions src/config/jaeger.php
Original file line number Diff line number Diff line change
@@ -1,5 +1,9 @@
<?php
return [
'log' => [
'max-string-length' => 300,
'cutoff-indicator' => '...'
],

'host' => env('JAEGER_AGENT_HOST', 'jaeger').':'.env('JAEGER_AGENT_PORT', 6831),

Expand Down
86 changes: 86 additions & 0 deletions tests/LogCleaner/LogCleanerTest.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,86 @@
<?php namespace Ipunkt\LaravelJaegerTests\LogCleaner;

use Ipunkt\LaravelJaeger\LogCleaner\LogCleaner;
use Ipunkt\LaravelJaegerTests\TestCase;

/**
* Class LogCleanerTest
* @package Ipunkt\LaravelJaegerTests\LogCleaner
*/
class LogCleanerTest extends TestCase {

/**
* @var LogCleaner
*/
protected $logCleaner;

public function setUp():void {
$this->logCleaner = new LogCleaner();
}

/**
* @test
*/
public function reducesStringSize() {
$this->logCleaner
->setMaxLength(10)
->setCutoffIndicator('...')
->setLogs([
'message' => '1234567890acbdefgh'
])->clean();

$logs = $this->logCleaner->getLogs();
$this->assertEquals('1234567890...', $logs['message']);
}
/**
* @test
*/
public function reducesStringSizeInSubarrays() {
$this->logCleaner
->setMaxLength(10)
->setCutoffIndicator('...')
->setLogs([
'subarray' => [
'toolong' => '1234567890abcdefg'
]
])->clean();

$logs = $this->logCleaner->getLogs();
$this->assertEquals('1234567890...', $logs['subarray']['toolong']);
}

/**
* @test
*/
public function honorsCutoffIndicator() {
$this->logCleaner
->setMaxLength(1)
->setCutoffIndicator('+++')
->setLogs([
'message' => '123'
])->clean();

$logs = $this->logCleaner->getLogs();
$this->assertEquals('1+++', $logs['message']);
}


/**
* @test
*/
public function doesNotErrorOnObjectEntries() {
$this->logCleaner
->setMaxLength(1)
->setCutoffIndicator('+++')
->setLogs([
'object' => new \stdClass(),
'subarray' => [
'anotherobject' => new \stdClass()
],
'message' => '123'
])->clean();

$logs = $this->logCleaner->getLogs();
$this->assertEquals('1+++', $logs['message']);
}
}
28 changes: 27 additions & 1 deletion tests/SpanContext/SpanContextTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
use Ipunkt\LaravelJaeger\Context\Exceptions\NoTracerException;
use Ipunkt\LaravelJaeger\Context\SpanContext;
use Ipunkt\LaravelJaeger\Context\TracerBuilder\TracerBuilder;
use Ipunkt\LaravelJaeger\LogCleaner\LogCleaner;
use Ipunkt\LaravelJaeger\SpanExtractor\SpanExtractor;
use Ipunkt\LaravelJaeger\TagPropagator\TagPropagator;
use Ipunkt\LaravelJaegerTests\TestCase;
Expand Down Expand Up @@ -49,12 +50,18 @@ class SpanContextTest extends TestCase {
*/
protected $span;

/**
* @var LogCleaner
*/
protected $logCleaner;

public function setUp(): void {
parent::setUp();

$this->buildMocks();

$this->context = new SpanContext(new TagPropagator(), new SpanExtractor(), $this->tracerBuilder);
$this->logCleaner = new LogCleaner();
$this->context = new SpanContext(new TagPropagator(), new SpanExtractor(), $this->tracerBuilder, $this->logCleaner);
}


Expand Down Expand Up @@ -214,6 +221,22 @@ public function injectWithoutParseThrowsNoSpanException( ) {
$this->context->inject($data);
}

/**
* @test
*/
public function cleansLogs() {
$this->setUpContext();

$fields = [
'message' => '1234567890'
];
$this->logCleaner->setMaxLength(5)->setCutoffIndicator('...');
$this->span->shouldReceive('log')->once()->with([
'message' => '12345...'
]);
$this->context->log($fields);
}

private function buildMocks() {
$this->spanExtractor = Mockery::mock(SpanExtractor::class);
$this->spanExtractor->shouldIgnoreMissing($this->spanExtractor);
Expand Down Expand Up @@ -251,5 +274,8 @@ private function useGenericTracer() {
$this->tracerBuilder->shouldReceive('build')->andReturn($this->tracer);
}

private function expectLogCleanerCalled( array $fields ) {
}


}

0 comments on commit b43fb9d

Please sign in to comment.