# Vnode: Low-Overhead Transparent Tracing of Node.js-Based Microservice Architectures
## 3 Related Works  
Recent research has demonstrated that distributed tracers are crucial for enabling the monitoring of interactions among microservices, as studied by [PERSON] et al. (2018). This experience demonstrates the need for a more lightweight technique to trace such fine-grained architectures. [PERSON] et al. (2018) suggested a novel transparent tracing methodology that leverages the kernel of the operating system to intercept system calls associated with communication among microservices. They proposed using a proxy that adds a neutral layer to the microservice to intercept its interactions and correlate the information to deduce the casualties associated with the various requests. The interception of system calls ensures application tracing transparency, but the developer is responsible for configuring the infrastructure. Statistically extracted dependency structures from documentation were used in service discovery by [PERSON] and [PERSON] (2018), while fault detection was addressed by [PERSON] et al. (2018) through middleware instrumentation to log the respective components that process a particular request. A degree of transparency could be achieved, but such an approach requires developers to dedicate significant time to library instrumentation. The distributed tracers Dapper and X-trace, proposed by [PERSON] et al. (2018) and [PERSON] et al. (2018), respectively, are able to trace the whole request lifecycle, exposing its flow and helping in diagnosing issues throughout execution. They rely on trace context injection mechanisms to reconstruct the context of the trace. A prior instrumentation phase of the application is required to activate the collection mechanism. In contrast to these approaches, our method does not inject the trace context into the request. It leverages the internal asynchronous mechanism of Node.js to reconstruct the request path. Tracing request path strategies was also addressed by [PERSON] and [PERSON] (2018) using heuristics. Request causality diagnosing algorithms were proposed by [PERSON] et al. (2018). Both approaches offer a degree of transparency but rely on middleware instrumentation. [PERSON] et al. (2018) introduced Seer, an online debugger designed to foresee quality of service (QoS) violations in cloud-based applications. Their research was conducted on a microservices framework, employing Memcached, which shares functional similarities with Redis as an in-memory database. The process of debugging performance issues using Seer requires an instrumentation phase for microservices. This step is also implemented in the Memcached data store, with a particular focus on polling functions and various network interface queues. Seer has the ability to predict QoS violations using a model developed from deep learning techniquesapplied to upstream traces. By instrumenting the functions responsible for managing packet queuing at the data store level, Seer can effectively identify potential bottlenecks, especially those involving Memcached. A comparison of tracing approaches is provided in Table 1. The various existing approaches to instrumenting microservices can be classified into three distinct groups. These groups include instrumentation methods using distributed tracing, transparent instrumentation methods utilizing service meshes, and approaches based on instrumenting middleware and libraries. Each of these methods offers advantages and disadvantages, and the choice of which method to use is heavily influenced by the specific context in which it will be applied. Distributed tracing tools, for instance, offer a straightforward way to gather information about system executions and interactions, providing a user-friendly interface for identifying bottlenecks and diagnosing performance issues within distributed environments. However, these methods are primarily designed to capture interactions among components, typically offering granularity in the order of milliseconds and occasionally microseconds.