// Copyright 2015 The Vanadium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.

/**
 * @summary Namespace vtrace defines a system for collecting debugging
 * information about operations that span a distributed system.
 * @description
 * <p> Namespace vtrace defines a system for collecting debugging
 * information about operations that span a distributed system.  We
 * call the debugging information attached to one operation a Trace.
 * A Trace may span many processes on many machines.</p>
 *
 * <p>Traces are composed of a hierarchy of Spans.  A span is a named
 * timespan, that is, it has a name, a start time, and an end time.
 * For example, imagine we are making a new blog post.  We may have to
 * first authentiate with an auth server, then write the new post to a
 * database, and finally notify subscribers of the new content.  The
 * trace might look like this:</p>
 *
 * <pre>
 *    Trace:
 *    <---------------- Make a new blog post ----------->
 *    |                  |                   |
 *    <- Authenticate -> |                   |
 *                       |                   |
 *                       <-- Write to DB --> |
 *                                           <- Notify ->
 *    0s                      1.5s                      3s
 * </pre>
 *
 * <p>Here we have a single trace with four Spans.  Note that some
 * Spans are children of other Spans.  Vtrace works by attaching data
 * to a Context, and this hierarchical structure falls directly out
 * of our building off of the tree of Contexts.  When you derive a new
 * context using withNewSpan(), you create a Span that's a child of the
 * currently active span in the context.  Note that spans that share a
 * parent may overlap in time.</p>
 *
 * <p>In this case the tree would have been created with code like this:</p>
 *
 * <pre>
 *    function makeBlogPost(ctx) {
 *        var authCtx = vtrace.withNewSpan(ctx, "Authenticate")
 *        authenticate(authCtx).then(function() {
 *          var writeCtx = vtrace.withNewSpan(ctx, "Write To DB")
 *          write(writeCtx)
 *        }).then(function() {
 *          var notifyCtx = vtrace.withNewSpan(ctx, "Notify")
 *          notify(notifyCtx)
 *        });
 *    }
 * </pre>
 *
 * <p>Just as we have Spans to represent time spans we have Annotations
 * to attach debugging information that is relevant to the current
 * moment. You can add an annotation to the current span by calling
 * the Span's Annotate method:</p>
 *
 * <pre>
 *    var span = vtrace.getSpan(ctx)
 *    span.annotate("Just got an error")
 * </pre>
 *
 * <p>When you make an annotation we record the annotation and the time
 * when it was attached.</p>
 *
 * <p>Traces can be composed of large numbers of spans containing data
 * collected from large numbers of different processes.  Always
 * collecting this information would have a negative impact on
 * performance.  By default we don't collect any data.  If a
 * particular operation is of special importance you can force it to
 * be collected by calling a Spans forceCollect method.  You can also
 * call:
 * <pre>
 *   vtrace.getStore(ctx).setCollectRegexp("regular.*expression")
 * </pre>
 * which causes us to record any matching trace.</p>
 *
 * <p>If your trace has collected information you can retrieve the data
 * collected so far with the Store's traceRecord and traceRecords methods.</p>
 *
 * <p>By default contexts obtained from runtime.getContext() or from
 * the first parameter of a server method implementation already have
 * an initialized Trace.  The functions in this package allow you to
 * add data to existing traces or start new ones.</p>
 * @namespace
 * @name vtrace
 * @memberof module:vanadium
 */
var extend = require('xtend');

module.exports = extend(
  require('./vtrace'),
  require('../gen-vdl/v.io/v23/vtrace')
);
