Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

...

Requirements

Create a CMR component that will be able to aggregate TimerData objects that are coming from the Agent (both in and outside an invocation) and persists only aggregated data to the database. The aggregation period should be specified in the configuration.

Approach

The Aggregator should hold limited number of aggregation objects, where every aggregation object is created as a copy of original TimerData object and a modified time stamp. If the aggregation period is for example 10s, for each method ident, a aggregation objects should have the time stamps like 12:50:10,

...

12:50:20,

...

etc,

...

so

...

in

...

the

...

10

...

seconds

...

difference.

...

When

...

the

...

new

...

TimerData

...

comes

...

to

...

the

...

Aggregator,

...

the

...

Aggregator

...

checks

...

if

...

the

...

aggregation

...

object

...

for

...

the

...

arriving

...

TimerData

...

is

...

already

...

created.

...

If

...

yes,

...

it

...

simply

...

adds

...

the

...

information

...

from

...

incoming

...

TimerData

...

to

...

the

...

aggregation

...

objects,

...

otherwise,

...

it

...

creates

...

a

...

new

...

aggregation

...

object

...

as

...

described

...

above.

...

The

...

persistence

...

of

...

objects

...

is

...

done

...

in

...

two

...

ways.

...

First

...

is

...

when

...

the

...

number

...

of

...

aggregation

...

objects

...

is

...

higher

...

than

...

Aggregator's

...

limit,

...

by

...

creating

...

a

...

persistence

...

list

...

from

...

oldest

...

objects

...

and

...

persisting

...

set

...

of

...

"old"

...

objects

...

at

...

the

...

same

...

time.

...

Second

...

is

...

when

...

there

...

is

...

no

...

activity

...

for

...

a

...

specified

...

time

...

period,

...

thus

...

assuming

...

that

...

there

...

is

...

no

...

data

...

coming

...

from

...

the

...

agent

...

any

...

more,

...

Aggregator

...

should

...

persist

...

all

...

aggregation

...

objects

...

that

...

are

...

currently

...

present.

...

Realization

The implementation is done in class info.novatec.inspectit.cmr.dao.impl.TimerDataAggregator

...

.

...

This

...

class

...

is

...

initialized

...

by

...

Spring

...

with

...

three

...

property

...

values:

...

Property

Description

aggregationPeriod

Time in milliseconds that defines the aggregation period.

maxElements

Maximum of aggregated objects that should be kept by Aggregator.

cacheCleanSleepingPeriod

Time in milliseconds that thread that is cleaning the Aggregator's cache should sleep.

The Aggregator has three concurrent collections:

1. ConcurrentHashMap for caching the aggregation objects by time stamp and method ident hash combination, and it's fast retrieval.
2. ConcurrentLinkedQueue to keep FIFO order of aggregation objects, so when the number of elements reaches maximum, First In object can be drooped out from both cache map and this list.
3. ConcurrentLinkedQueue (2) for keeping the aggregation objects that are drooped out from Aggregator and are ready for persistence.

The persistence is done by a inner Thread class CacheCleaner. This thread runs occasionally (sleep is defined by cacheCleanSleepingPeriod property) and checks if there was some activity in Aggregator (if new TimerData objects where coming for aggregation). If not, it will persist all the objects in the Aggregator. Furthermore, in every run it will anyway persist all objects that are in persist list.

Testing

Testing of Aggregator is performed in class info.novatec.inspectit.cmr.dao.test.TimerDataAggregatorTest

...

with

...

following

...

tests:

...

Test

Description

testAggregation

Tests for the validity of aggregation.

testNoSetterInteractions

Verifies the zero interactions with setters of TimerData object passed to the Aggregator.