anchor.diff:                          NewValue_or_UpdateFun::term() | fun((Old::Value | undefined) -> New::Value)) -> ok.
   monitor_set_value(Process, Key, NewValue_or_UpdateFun) ->
       MyMonitor = pid_groups:get_my(monitor),
  +    comm:send_local(MyMonitor, {report_single, Process, Key, NewValue_or_UpdateFun}).
  +
  +%% @doc Sets the value at Key inside the monitor process of the "clients_group".
  +%%      Either specify a new value or an update function which generates the
  +%%      new value from the old one.
  +-spec client_monitor_set_value(Process::atom(), Key::key(),
  +                        NewValue_or_UpdateFun::term() | fun((Old::Value | undefined) -> New::Value)) -> ok.
  +client_monitor_set_value(Process, Key, NewValue_or_UpdateFun) ->
  +    MyMonitor = pid_groups:pid_of("clients_group", monitor),
       comm:send_local(MyMonitor, {report_single, Process, Key, NewValue_or_UpdateFun}).
   
   %% @doc Checks whether a value exists at Key.
  
positive.code:     rrd:reduce_timeslots(N, Data).
  
  -spec web_debug_info_dump_fun(rrd:rrd(), From::util:time(), To::util:time(), Value::term())
          -> {From::util:time_utc(), To::util:time_utc(), Diff_in_s::non_neg_integer(), ValueStr::string(), AvgStr::string()}.
  web_debug_info_dump_fun(DB, From_, To_, Value) ->
      From = calendar:now_to_universal_time(From_),
      To = calendar:now_to_universal_time(To_),
      Diff_in_s = timer:now_diff(To_, From_) div 1000000,
      AvgStr =
          case rrd:get_type(DB) of
              counter -> io_lib:format(" (avg: ~.2f / s)", [Value / Diff_in_s]);
              event   -> io_lib:format(" (avg: ~.2f / s)", [length(Value) / Diff_in_s]);
              timing  -> io_lib:format(" (avg: ~.2f / s)", [element(3, Value) / Diff_in_s]);
              _       -> ""
          end,
      ValueStr =
          case rrd:get_type(DB) of
              timing  ->
                  {Sum, Sum2, Count, Min, Max} = Value,
                  Avg = Sum / Count, Avg2 = Sum2 / Count,
                  Stddev = math:sqrt(Avg2 - (Avg * Avg)),
                  io_lib:format(" avg: ~.2f ms, min: ~.2f ms, max: ~.2f ms, stddev: ~.2f ms",
                                [Avg / 1000, Min / 1000, Max / 1000, Stddev / 1000]);
              _       -> io_lib:format(" ~p", [Value])
          end,
      {From, To, Diff_in_s, lists:flatten(ValueStr), lists:flatten(AvgStr)}.
  
  -spec web_debug_info_merge_values(table_index(), rrd:rrd())
              -> {Key::string(), LastNValues::string()}.
  web_debug_info_merge_values(Key, Data) ->
      ValuesLastN =
          [lists:flatten(io_lib:format("~p - ~p UTC (~p s): ~s~s",
                                       [From, To, Diff_in_s, ValueStr, AvgStr]))
           || {From, To, Diff_in_s, ValueStr, AvgStr} <- rrd:dump_with(Data, fun web_debug_info_dump_fun/4)],
      {lists:flatten(io_lib:format("~p", [Key])), string:join(ValuesLastN, "<br />")}.
  
  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  
negative.code: 
  -include("scalaris.hrl").
  
  % monitor process functions
  -export([start_link/1, init/1, on/2, check_config/0]).
  
  % functions (temporarily) storing monitoring values in the calling process:
  -export([proc_set_value/3, proc_get_value/2, proc_exists_value/2]).
  
  % functions sending monitoring values directly to the monitor process
  -export([monitor_set_value/3, client_monitor_set_value/3]).
  
  -type key() :: string().
  -type internal_key() :: {'$monitor$', Key::string()}.
  