Riemann is a service for receiving streams of events, and causing one or more side-effects (sending email, routing to Graphite, etc). It can do arbitrary transformations on event streams (the effects from an input may be arbitrarily time shifted), and assumes that the inputs are fixed structure (numbers, shallow maps, etc).
Narrator is a library for analyzing streams of events, and returns either a single value representing the stream, or values representing fixed, regular intervals within the stream. The analysis can only on that interval (or multiples of that interval, using 'moving'). Using the 'recur' operator, it can do analysis on arbitrarily nested structures.
At Factual, we use both of these in tandem. Since the trace data for function call trees is arbitrarily nested, we use Narrator, and then separate the data into flattened sub-parts, and pass it onto Riemann. We typically have a fixed set of functions that we're tracing (entry points for HTTP requests, primarily), and automatically send them along via UDP to Omphalos [1]. Obviously the instrumented functions that are called in the process of creating a response may change, this is within the control of the authors of the libraries we use.
Does this answer all your questions? I'm happy to elaborate on any of the above.
Zach