<!DOCTYPE article PUBLIC "-//NLM//DTD JATS (Z39.96) Journal Archiving and Interchange DTD v1.0 20120330//EN" "JATS-archivearticle1.dtd">
<article xmlns:xlink="http://www.w3.org/1999/xlink">
  <front>
    <journal-meta />
    <article-meta>
      <title-group>
        <article-title>Dynamic system analysis using telemetry</article-title>
      </title-group>
      <contrib-group>
        <contrib contrib-type="author">
          <string-name>Oleh V. Talaver</string-name>
          <xref ref-type="aff" rid="aff3">3</xref>
        </contrib>
        <contrib contrib-type="author">
          <string-name>Tetiana A. Vakaliuk</string-name>
          <xref ref-type="aff" rid="aff0">0</xref>
          <xref ref-type="aff" rid="aff1">1</xref>
          <xref ref-type="aff" rid="aff2">2</xref>
          <xref ref-type="aff" rid="aff3">3</xref>
        </contrib>
        <aff id="aff0">
          <label>0</label>
          <institution>Academy of Cognitive and Natural Sciences</institution>
          ,
          <addr-line>54 Gagarin Ave., Kryvyi Rih, 50086</addr-line>
          ,
          <country country="UA">Ukraine</country>
        </aff>
        <aff id="aff1">
          <label>1</label>
          <institution>Institute for Digitalisation of Education of the NAES of Ukraine</institution>
          ,
          <addr-line>9 M. Berlynskoho Str., Kyiv, 04060</addr-line>
          ,
          <country country="UA">Ukraine</country>
        </aff>
        <aff id="aff2">
          <label>2</label>
          <institution>Kryvyi Rih State Pedagogical University</institution>
          ,
          <addr-line>54 Gagarin Ave., Kryvyi Rih, 50086</addr-line>
          ,
          <country country="UA">Ukraine</country>
        </aff>
        <aff id="aff3">
          <label>3</label>
          <institution>Zhytomyr Polytechnic State University</institution>
          ,
          <addr-line>103 Chudnivsyka Str., Zhytomyr, 10005</addr-line>
          ,
          <country country="UA">Ukraine</country>
        </aff>
      </contrib-group>
      <fpage>193</fpage>
      <lpage>209</lpage>
      <abstract>
        <p>In the modern world of software development, the topic of distributed solutions implementation has become quite common, due to the flexibility it brings to big companies. The downside is that when developing such systems, especially when it comes to many teams, global design problems may not be obvious and lead to a slowdown in the development process or even problems with the location of errors or degradation of overall system performance. In addition, the timely reaction to system degradation is complicated by the distributed nature of the architecture, while manually configuring rules for reporting problematic situations can be time-consuming and still incomplete, automatic detection of possible system anomalies will give engineers (especially Software Reliability Engineers) the focus on problems. For this reason, applications that can dynamically analyze the system for the problems have great potential. Currently, the topic of using telemetry for system analysis is actively studied and gaining traction, so further research is valuable. The aim of the work is to theoretically and practically prove the possibility of using telemetry for the analysis of a distributed information system, detection of harmful architectural practices and anomalous events. To do this, firstly, a detailed overview of the problems related to the topic and the feasibility of using telemetry is provided, the next section briefly describes the history of the monitoring systems development and the key points of the latest OpenTelemetry standard. The main part includes an explanation of the approach used to collect and process telemetry, a reasoning behind the usage of Neo4j as a data storage solution, a practical overview of graph theory algorithms that help in the analysis of the collected data, and a description outlining how the PCA algorithm is employed to detect unusual situations in the whole system instead of individual metrics. The results provide an example of using the software presented in combination with Neo4j Bloom to visualize and analyze the data collected over a period of several hours from the OpenTelemetry Demo test system. The last section contains additional remarks on the results of the study.</p>
      </abstract>
      <kwd-group>
        <kwd>eol&gt;distributed systems</kwd>
        <kwd>microservices</kwd>
        <kwd>dynamic analysis</kwd>
        <kwd>architectural smells</kwd>
        <kwd>anti-pattern</kwd>
        <kwd>visualization</kwd>
        <kwd>telemetry</kwd>
        <kwd>anomalies</kwd>
        <kwd>Open Telemetry</kwd>
        <kwd>graph theory</kwd>
        <kwd>statistical analysis</kwd>
      </kwd-group>
    </article-meta>
  </front>
  <body>
    <sec id="sec-1">
      <title>1. Introduction</title>
      <p>
        In recent years, distributed architectures such as microservices have received a lot of
attention and popularity due to the opportunities that the architectural pattern opens up in terms
of optimization, technology stack diversification, and more [
        <xref ref-type="bibr" rid="ref1">1</xref>
        ]. Distributed systems, when
built correctly, simplify the development process when many teams are involved, reduce the
complexity of changes or the dependence of teams on each other, and speed up development.
The additional complexity that microservices bring [
        <xref ref-type="bibr" rid="ref2">2</xref>
        ] slows down the development of such a
system, while the general advantage of technological heterogeneity only increases the efort
required to maintain the codebase [
        <xref ref-type="bibr" rid="ref3 ref4 ref5">3, 4, 5</xref>
        ]. Therefore, there is a requirement for more tools
to analyze the system and respond to problems. The development of distributed information
systems requires more efort, especially when it comes to monitoring the entire system,
finding problematic areas [
        <xref ref-type="bibr" rid="ref2">2</xref>
        ], because, unlike a monolith, such a system has many components
developed in parallel, which may have structural flaws [
        <xref ref-type="bibr" rid="ref6 ref7">6, 7</xref>
        ], also referred to as architectural
smells – design decisions that hinder maintainability and extensibility. For global problems
location, an analysis of the information system is often conducted to find and quickly address
such shortcomings [
        <xref ref-type="bibr" rid="ref8">8</xref>
        ]. A couple approaches exist, such as static analysis of the codebase of
each of the system components or analysis of the system logs. Both options are quite complex,
because they require adjustment for each individual system, technology, programming language,
but the static approach, unlike the dynamic one, allows you to analyze the system without the
need to run the whole system, which allows you to correct some local code smells, but not
the problems of the system as a whole, due to the low accuracy and insuficient information
about the runtime behavior [
        <xref ref-type="bibr" rid="ref9">9</xref>
        ]. At the same time, dynamic analysis is based on the information
gathered in runtime, therefore presents more accurate representation of the system utilization.
The most prominent approach of dynamic analysis is through usage of telemetry that combines
three pillars of system observability: logs, metrics, and traces. Therefore, the purpose of the
work is the theoretical and practical substantiation of the possibility of using OpenTelemetry
standard for the purpose of analyzing a distributed information system: detecting and quickly
responding to harmful architectural practices and anomalous events. Next, we outline the tasks:
• research of state-of-art approaches of telemetry analysis;
• modeling extract, transform and load (ETL) and further telemetry analysis process;
• analysis of the received data to identify harmful practices and anomalies.
      </p>
    </sec>
    <sec id="sec-2">
      <title>2. Theoretical background</title>
      <p>
        The topic of system observability is far from new. In the world of distributed systems, Google
is considered a pioneer in the study of the topic of observability. In 2010 Google engineers
published paper called “Dapper – a Large-Scale Distributed Systems Tracing Infrastructure”
[
        <xref ref-type="bibr" rid="ref10">10</xref>
        ] which prompts the emergence of the first systems for request traces visualization: Jaeger
and Zipkin. However, these applications solved the same problem while being incompatible
causing vendor lock, so over time, the development of the OpenTracing [
        <xref ref-type="bibr" rid="ref11">11</xref>
        ] standard begun.
The new standard provides a layer between the application and monitoring systems to track and
collect requests. This standard didn’t solve the whole problem, so OpenCensus standard was
later developed to focus on system metrics and logs collection, but also included an alternative
implementation of traces collection, which ultimately created more problems, as developers
now had to choose between the two standards. For this reason, in 2019, both standards were
combined into OpenTelemetry [
        <xref ref-type="bibr" rid="ref12">12</xref>
        ] to solve the following tasks:
• gathering traces, metrics, and logs in one place;
• finding anomalies through charts;
• finding the location and cause of anomalies through the review of problematic request
traces.
      </p>
      <p>
        Also, at that time, quite a lot of applications helping in a system monitoring had already
been presented on the market, for this reason, one of the tasks was to maintain compatibility
with them, so the latest standard provides a specification that describes approaches for metrics
collection, conventional descriptions of processes such as interaction using the HTTP protocol,
RPC [
        <xref ref-type="bibr" rid="ref13">13</xref>
        ] without forcing vendor lock. As a result, OpenTelemetry is currently the most active
project of the Cloud Native Computing Foundation [
        <xref ref-type="bibr" rid="ref14">14</xref>
        ].
      </p>
      <p>
        One of the main notions introduced in the standards is telemetry – a set of metrics, logs
and, most importantly, traces [
        <xref ref-type="bibr" rid="ref15">15</xref>
        ], which in the case of our topic can be used to build a system
model in the form of a directed graph [
        <xref ref-type="bibr" rid="ref9">9</xref>
        ] and later used to analyze and identify bad practices
and problem areas of the system. The OpenTelemetry standard is relatively new, so there is
still active research of the possible use cases, but the main area of use is the visualization of
requests (figure 1) with the ability to search for problematic areas, for example, the cause of
poor service performance or the root cause of an incorrectly working business process [
        <xref ref-type="bibr" rid="ref15">15</xref>
        ].
      </p>
      <p>
        The idea of using telemetry to improve the structure of a system can be traced back to several
research papers released in recent years [
        <xref ref-type="bibr" rid="ref16 ref17 ref18">16, 17, 18</xref>
        ], and has a fairly small list of problems that
can be identified, which opens up opportunities for further study of this topic [
        <xref ref-type="bibr" rid="ref8">8</xref>
        ].
      </p>
    </sec>
    <sec id="sec-3">
      <title>3. Methods</title>
      <sec id="sec-3-1">
        <title>3.1. Defining data and storage for architectural smells detection</title>
        <p>The proposed analytical system receives a constant stream of telemetry data, aggregates it
by updating the system model in the form of a directed graph stored in a graph database
management system (DBMS). After that, the model can be used for analysis, searching for
structural anti-patterns.</p>
        <p>Constructing the system’s graph model involves processing traces of requests (figure 2). Once
they are received, the process creates or updates information about available resources (services,
storages, proxies) and stores information about changes in the storage. operations available in
the service (operation) and individual sub-requests (hop).</p>
        <p>To build a system graph for further analysis, the data storage must have the following
information:
• resources are interacting components of the system. A resource must have a name, type
(service, storage), date of creation and last use;
• operations are defined by one resource and called by other ones; have statistics on the
number of calls, errors, the last date of creation, use;
• calls – connections between a resource and an operation. They has the date of creation,
last use, type (synchronous, asynchronous), number of errors.</p>
        <p>
          Neo4j was chosen as the storage of the system model since it physically stores data as a graph,
which makes it possible to use graph traversal algorithms to find bad practices in the system,
namely:
• clustering coeficient – measures the degree of vertex connectivity; will help show service
groups in the system [
          <xref ref-type="bibr" rid="ref19">19</xref>
          ];
• degree centrality – measure the number of connections between vertices; makes it possible
to calculate the afinity (coupling) metrics of components in the system [
          <xref ref-type="bibr" rid="ref20">20</xref>
          ];
• strongly connected components – finds groups where each vertex is accessible from any
other; helps to identify cyclic dependencies in the system [
          <xref ref-type="bibr" rid="ref21">21</xref>
          ].
        </p>
        <p>The graph DBMS structure is presented in figure 3.</p>
        <p>Data storage has two types of nodes: resources and operations. Resources are related to the
operations with the “Provides” relation. To show calls, the “Calls” relationship is used, which
aggregates statistics for all identical calls from one resource to an operation of another resource.</p>
        <p>
          The ETL process begins with instrumentation of the system – installation of modules for
popular libraries that will be collecting the telemetry, manual changes in service code to
provide more details of a particular process in the system. Later the telemetry is sent to the
OpenTelemetry Collector [
          <xref ref-type="bibr" rid="ref22">22</xref>
          ] – a separate modular application developed by the authors of
the standard, which allows you to unify the process of collecting, transforming, and exporting
telemetry into various popular monitoring systems. There are present numerous available
modules, but for this task, it’s required to create a custom exporter, which takes batches of
traces, extracts necessary data and unloads it into neo4j.
        </p>
      </sec>
      <sec id="sec-3-2">
        <title>3.2. Methods of anomalies detection</title>
        <p>The problem of finding and analyzing anomalies is quite common in computer science and
often varies depending on the domain in which the analysis takes place. For example, when
reading data from sensors for further analysis, it is important to find and correct outliers. When
analyzing a business process, it is sometimes necessary to find unusual events to analyze what
led to them. In the domain of software reliability engineering, the topic of mean time to detect
is one of the most important indicators, because if the problem is found earlier, it is fixed earlier.</p>
        <p>
          Analysis of anomalous changes is already present at least in New Relic, however, it is present
at the level of individual services, not the entire system. Although there is not enough data
to confirm this, the platform analyzes metrics, including key metrics, using the Exponential
Smoothing [
          <xref ref-type="bibr" rid="ref23">23</xref>
          ], which is a method of predicting a single variable and, depending on the type,
can take into account seasonality [
          <xref ref-type="bibr" rid="ref24">24</xref>
          ]. However, it is also possible to find anomalies the opposite
way – from a larger scale, using multivariate algorithms, which will be used in this work.
        </p>
        <p>
          An anomaly is an abnormal situation, essentially defined as a strong diference between
expected and actual measurements. Therefore, the process of finding an anomaly includes the
process of predicting the value of a certain measurement based on historical data [
          <xref ref-type="bibr" rid="ref25">25</xref>
          ].
        </p>
        <p>
          The problem of finding anomalies in multivariate datasets is quite popular and critical because
little to no measurements are univariate [
          <xref ref-type="bibr" rid="ref26">26</xref>
          ].
        </p>
        <p>Algorithms are divided into the following training approaches:
• unsupervised – the dataset used for model training does not include labels indicating
anomalous situations;
• semi-supervised – the dataset has anomalous situations labeled;
• supervised – the whole dataset is labeled, the least commonly used type of algorithm as
it’s dificult to get fully labeled data.</p>
        <p>
          Due to the dificulty of obtaining labeled data, unsupervised models are the most popular,
while it’s also possible to add the possibility of providing feedback and correction loop when
using models for semi-labeled datasets. As part of this work, unsupervised model is reviewed.
While “None of the unsupervised methods is statistically better than the others” [
          <xref ref-type="bibr" rid="ref25">25</xref>
          ], which is
due to the complexity of training on unlabeled data in which extra parameters only interfere, it
was decided to choose Principal Component Analysis (PCA) – a statistical method of multivariate
analysis used to identify the main structural components in a dataset. The main goal of PCA
is to reduce the dimensionality of data while explaining dataset in as much detail as possible,
which, due to the simplicity of the approach, is well suited for multivariate datasets and makes
it the most common algorithm.
        </p>
        <p>Essentially, PCA converts the initial correlated variables into new linear combinations called
principal components. The first principal component is defined in such a way that it explains
the largest part of the variance of the data. Each successive principal component is chosen
in such a way that it is orthogonal to the previous ones and explains the residual variance as
possible.</p>
        <p>In the case of identifying anomalies in the system, we are interested in the following
information:
• calls – number of incoming, outgoing, and internal calls (synchronous and asynchronous
when using a queue or other message brokers) with and without errors;
• duration – time spent processing requests.</p>
        <p>To obtain the necessary data in the form of metrics, as well as to group collected data, you
need to use a special connector component that transforms traces into call and duration metrics.
Thus, the collector receives information about the request via the Open Telemetry Protocol
(OTLP) then groups, extracts the necessary metrics to later export it.</p>
        <p>Metrics for a certain period are collected for each of the components (resources) of the system.
Metrics have diferent types of values, for example, the number of calls has the sum type that is
a counter of certain events for a period and in this case is a monotonous sequence, because the
number of calls never decreases.</p>
        <p>It is also important to note that the metrics are returned as a delta (the value of
aggregationTemporality is 1) and not a cumulative value, because we are interested in the number of calls
in a certain period, not the absolute value. Each metric can have multiple points that represent
diferent attribute-defined dimensions (dimensions are customizable), so separate counters have
been set up for diferent request types (span.kind) and statuses (status.code).</p>
        <p>Calls duration metric snippet:
{
"name": "duration",
"unit": "ms",
"histogram": {
"dataPoints": [
{
"attributes": [
{
"key": "service.name",
"value": {</p>
        <p>"stringValue": "quoteservice"
"timeUnixNano": "1685509058790174364",
"asDouble": 0.006665,
"spanId": "ade03fcb73f18048",
"traceId": "7f6cf387237813d1f3891b5f21b09be2"
}
}
}
]
},
],
"aggregationTemporality": 1</p>
        <p>If we take the call duration metric, then in this case we have a histogram, which is a certain
aggregation of values and their distribution over intervals used for easier visualization.</p>
        <p>But in this form, we will not be able to use this data. Firstly, all the metrics for individual
services are separated and converted to time series to later be combined based on timestamp.</p>
        <p>From the intermediate results, you can clearly see the correlation between the diferent
metrics of the system components (figure 5), which is confirmed by a correlation map (figure 6).</p>
        <p>The process of identifying anomalies occurs by splitting the data sample into two periods, the
ifrst is used to train the PCA statistical model, the second is used to compare with the predicted
values obtained from the model and, estimate the error for all and specific metrics.</p>
      </sec>
    </sec>
    <sec id="sec-4">
      <title>4. Results</title>
      <p>The OpenTelemetry Demo project was used as a test system [27], which is specially designed for
testing applications working with telemetry. This is a distributed system that has components
built with diferent technologies that is automatically loaded using load generator service.</p>
      <sec id="sec-4-1">
        <title>4.1. Visualization of the service graph using Neo4j tools</title>
        <p>After some time of running the whole system the graph database has the following data (figure 7).
You can see that the graph has many nodes with the type of operation (orange circles), as well
as slightly fewer services (purple circles). Between them you can see the “calls” and “provides”
relationships depicted as arrows.</p>
        <p>To simplify the graph, a function from the APOC library is used [28] for Neo4j in order to
visualize the graph projection and show service dependencies (figure 8).</p>
        <p>Snippet of a virtual relationship visualization query:
MATCH (r1:Resource)-[:Calls]-&gt;(:Operation)&lt;-[:Provides]-(r2:Resource)
RETURN r1, r2, apoc.create.vRelationship(r1,’DependsOn’,{}, r2) as rel</p>
        <p>
          In figure 8 you can see the dependence of the checkout service on many others. To confirm
this, let’s use an application called Neo4j Bloom to visualize Local Clustering Coeficient [
          <xref ref-type="bibr" rid="ref19">19</xref>
          ]
and Degree Centrality [
          <xref ref-type="bibr" rid="ref20">20</xref>
          ] algorithms.
        </p>
        <p>In the resulting diagram (figure 9) clusters are marked with distinct colors, the dependence of
services on peers is indicated with their size. From the diagram it’s also clear that the checkout
service has many dependencies. This way, you can quickly analyze the architecture of the
application, and clearly see parts that must be refactored to prevent a situation where the whole
application halts due to a single bottleneck component.</p>
      </sec>
      <sec id="sec-4-2">
        <title>4.2. Time interval anomalies analysis</title>
        <p>To detect anomalies, a few hours long time interval was chosen. It has been processed using the
PCA algorithm and after receiving errors for each of the time points, a visual analysis can be
performed for the presence of spikes in the error values (figure 10).</p>
        <p>As you can see in the plot, between 6:50 a.m. and 7 a.m., there were some changes that
led to a relatively big error. From the error graph for each of the features, it can be seen that
feature 44 (accountingservice_incomingAsync_request_duration) is involved in this error, so by
conducting a more detailed analysis of the values of this metric, we can see that all values are
kept near 0, while there is an outlier with a value of about 12 (figure 11).</p>
      </sec>
    </sec>
    <sec id="sec-5">
      <title>5. Discussion</title>
      <p>Compared to static analysis approaches, dynamic analysis allows you to see the real picture of
the entire system, all possible query paths that are used, accurately indicate the components
that cause a problem in the performance of the system at particular moment, in contrast to
static analysis of individual modules, which is better suited for the tasks of identifying code
smells. Telemetry, in turn, allows you to combine all key indicators and add the additional
context that allows you to get more information for analysis.</p>
      <p>
        The practical use of a simple statistical unsupervised PCA algorithm has demonstrated the
possibility of using such a model to identify anomalies, which can greatly simplify the work of
engineers, because instead of looking on dozens of charts and responding to user messages in
support, this statistical analysis suggests the occurrence of anomalous situations in the system
automatically. When compared with the approaches of analyzing each metric of the system
separately (using appropriate statistical methods, for example, those used in NewRelic [
        <xref ref-type="bibr" rid="ref23">23</xref>
        ]), this
method gives the general picture, allowing you to understand the situation in the entire system,
but also provides the cause of the problem. Compared to supervised algorithms, especially
neural networks [29, 30], using the proposed method removes the need to retrain the model to
adapt to normal changes (e.g., a natural increase in the number of users of the system), because
the analysis takes place in a certain window, although undoubtedly this window should be of a
particular size to cover a suficient amount of data for training and analysis and at the same
time not be too sensitive to seasonal changes (for example, activity during the day vs. activity
at night), which needs to be tested and determined on a real system.
      </p>
    </sec>
    <sec id="sec-6">
      <title>6. Conclusions</title>
      <p>The paper discusses the use of telemetry for dynamic analysis of the system for anomalous
events and architectural smells detection.</p>
      <p>An analysis of the problems related to distributed systems development was carried out, which
made it possible to determine the need for applications for monitoring and rapid response to
problems in a large system. Studies on the use of telemetry for dynamic system analysis, which
have been published in recent years, have shown the potential of this approach. The history of
the system monitoring topic development and the main aspects of the latest OpenTelemetry
standard were reviewed.</p>
      <p>Later, the main data flows that are required for analysis were identified, and a model of a
graph DBMS was built. The model includes the following entities: operations, resources and
relationships that determine the direction of resource dependence and ownership of
operations. After that, the extraction, processing and unloading telemetry using the OpenTelemetry
Collector was reviewed. The main types of anomaly detection algorithms were studied and
the multivariate PCA statistical method was chosen for the analysis of unlabeled telemetry
data. A custom component of the collector application was developed to transform and insert
information into Neo4j datastore. The necessary features to be used are defined, as well as the
process of collecting appropriate the number and the duration of calls within the system to find
anomalies. An algorithm for collecting metrics was described. The next part overviewed the
method of using a statistical model of PCA to identify anomalies.</p>
      <p>In the next part, aggregated graph model was used to analyze architectural smells. Several
possible visualizations of the dependency graph using Neo4j, Neo4j Bloom were provided,
clustering and centrality algorithms were used to visually identify problem areas in the system
architecture. The results of the statistical model based on the Principal Component Analysis
algorithm were also analyzed. The accuracy of this model is suficient to determine anomalous
events.</p>
      <p>
        The topic of telemetry usage to find bad architectural practices has potential for further
development [
        <xref ref-type="bibr" rid="ref18">18</xref>
        ], after all, the collected data is enough to determine more complex patterns:
too long synchronous and asynchronous requests, long chains of synchronous requests, the
presence of too many diferent technologies in a small system, a large time diference between
when an event is published and processed. To provide even more opportunities for analysis, it’s
possible to enrich system resources with additional metadata indicating belonging to a certain
bounded context (to compare de jure and de facto clusters of contexts, to identify situations
of using the same database in diferent parts of the application) [
        <xref ref-type="bibr" rid="ref1">1</xref>
        ], dates of any changes
or releases. Also, this data should be displayed on the main map of the system components.
Further development of anomaly analysis includes integration with an application performance
monitoring (APM) system, the ability to configure threshold values for reconstruction error,
adding custom metric streams for analysis and finally testing on a real system with a comparison
with existing approaches.
      </p>
      <p>If we consider other topics of telemetry usage, we cannot omit the topic of analyzing individual
use cases in the application, which are sets of requests that go through a bunch of services and
have variations depending on some stored state of the application, the analysis includes both
the ability to evaluate performance, the number of errors of a particular use case, the ability
to subscribe a certain development team to updates for a quick response in case of anomalous
situations, and ability to view changes, including performance, between diferent releases.
on Informatics Visualization 7 (2023) 122. doi:10.30630/joiv.7.1.1297.
[27] OpenTelemetry Demo, 2023. URL: https://github.com/open-telemetry/
opentelemetry-demo.
[28] Neo4j APOC Library, 2023. URL: https://neo4j.com/developer/neo4j-apoc/.
[29] S. O. Semerikov, T. A. Vakaliuk, I. S. Mintii, V. A. Hamaniuk, V. N. Soloviev, O. V. Bondarenko,
P. P. Nechypurenko, S. V. Shokaliuk, N. V. Moiseienko, V. R. Ruban, Development of the
computer vision system based on machine learning for educational purposes, Educational
Dimension 5 (2021) 8–60. doi:10.31812/educdim.4717.
[30] I. A. Pilkevych, D. L. Fedorchuk, M. P. Romanchuk, O. M. Naumchak, Approach to the
fake news detection using the graph neural networks, Journal of Edge Computing 2 (2023)
24–36. doi:10.55056/jec.592.</p>
    </sec>
  </body>
  <back>
    <ref-list>
      <ref id="ref1">
        <mixed-citation>
          [1]
          <string-name>
            <given-names>P. D.</given-names>
            <surname>Francesco</surname>
          </string-name>
          ,
          <string-name>
            <surname>I. Malavolta</surname>
          </string-name>
          , P. Lago, Research on Architecting Microservices: Trends, Focus, and
          <article-title>Potential for Industrial Adoption</article-title>
          , in: 2017
          <source>IEEE International Conference on Software Architecture (ICSA)</source>
          ,
          <year>2017</year>
          , pp.
          <fpage>21</fpage>
          -
          <lpage>30</lpage>
          . doi:
          <volume>10</volume>
          .1109/ICSA.
          <year>2017</year>
          .
          <volume>24</volume>
          .
        </mixed-citation>
      </ref>
      <ref id="ref2">
        <mixed-citation>
          [2]
          <string-name>
            <given-names>M.</given-names>
            <surname>Söylemez</surname>
          </string-name>
          ,
          <string-name>
            <given-names>B.</given-names>
            <surname>Tekinerdogan</surname>
          </string-name>
          ,
          <string-name>
            <given-names>A.</given-names>
            <surname>Kolukısa</surname>
          </string-name>
          <string-name>
            <surname>Tarhan</surname>
          </string-name>
          ,
          <article-title>Challenges and Solution Directions of Microservice Architectures: A Systematic Literature Review</article-title>
          ,
          <source>Applied Sciences</source>
          <volume>12</volume>
          (
          <year>2022</year>
          )
          <article-title>5507</article-title>
          . doi:
          <volume>10</volume>
          .3390/app12115507.
        </mixed-citation>
      </ref>
      <ref id="ref3">
        <mixed-citation>
          [3]
          <string-name>
            <given-names>A.</given-names>
            <surname>Bucchiarone</surname>
          </string-name>
          ,
          <string-name>
            <given-names>N.</given-names>
            <surname>Dragoni</surname>
          </string-name>
          ,
          <string-name>
            <given-names>S.</given-names>
            <surname>Dustdar</surname>
          </string-name>
          ,
          <string-name>
            <given-names>S. T.</given-names>
            <surname>Larsen</surname>
          </string-name>
          ,
          <string-name>
            <given-names>M.</given-names>
            <surname>Mazzara</surname>
          </string-name>
          , From Monolithic to Microservices
          <source>: An Experience Report from the Banking Domain, IEEE Software 35</source>
          (
          <year>2018</year>
          )
          <fpage>50</fpage>
          -
          <lpage>55</lpage>
          . doi:
          <volume>10</volume>
          .1109/MS.
          <year>2018</year>
          .
          <volume>2141026</volume>
          .
        </mixed-citation>
      </ref>
      <ref id="ref4">
        <mixed-citation>
          [4]
          <string-name>
            <given-names>M.</given-names>
            <surname>Villamizar</surname>
          </string-name>
          ,
          <string-name>
            <given-names>O.</given-names>
            <surname>Garcés</surname>
          </string-name>
          ,
          <string-name>
            <given-names>H.</given-names>
            <surname>Castro</surname>
          </string-name>
          ,
          <string-name>
            <given-names>M.</given-names>
            <surname>Verano</surname>
          </string-name>
          ,
          <string-name>
            <given-names>L.</given-names>
            <surname>Salamanca</surname>
          </string-name>
          ,
          <string-name>
            <given-names>R.</given-names>
            <surname>Casallas</surname>
          </string-name>
          ,
          <string-name>
            <given-names>S.</given-names>
            <surname>Gil</surname>
          </string-name>
          ,
          <article-title>Evaluating the monolithic and the microservice architecture pattern to deploy web applications in the cloud</article-title>
          ,
          <source>in: 2015 10th Computing Colombian Conference (10CCC)</source>
          ,
          <year>2015</year>
          , pp.
          <fpage>583</fpage>
          -
          <lpage>590</lpage>
          . doi:
          <volume>10</volume>
          .1109/ColumbianCC.
          <year>2015</year>
          .
          <volume>7333476</volume>
          .
        </mixed-citation>
      </ref>
      <ref id="ref5">
        <mixed-citation>
          [5]
          <string-name>
            <given-names>O. V.</given-names>
            <surname>Talaver</surname>
          </string-name>
          ,
          <string-name>
            <given-names>T. A.</given-names>
            <surname>Vakaliuk</surname>
          </string-name>
          ,
          <article-title>Reliable distributed systems: review of modern approaches</article-title>
          ,
          <source>Journal of Edge Computing</source>
          <volume>2</volume>
          (
          <year>2023</year>
          )
          <fpage>84</fpage>
          -
          <lpage>101</lpage>
          . doi:
          <volume>10</volume>
          .55056/jec.586.
        </mixed-citation>
      </ref>
      <ref id="ref6">
        <mixed-citation>
          [6]
          <string-name>
            <given-names>J.</given-names>
            <surname>Soldani</surname>
          </string-name>
          ,
          <string-name>
            <given-names>D. A.</given-names>
            <surname>Tamburri</surname>
          </string-name>
          ,
          <string-name>
            <surname>W.-J. Van Den</surname>
            <given-names>Heuvel</given-names>
          </string-name>
          ,
          <article-title>The pains and gains of microservices: A Systematic grey literature review</article-title>
          ,
          <source>Journal of Systems and Software</source>
          <volume>146</volume>
          (
          <year>2018</year>
          )
          <fpage>215</fpage>
          -
          <lpage>232</lpage>
          . doi:
          <volume>10</volume>
          .1016/j.jss.
          <year>2018</year>
          .
          <volume>09</volume>
          .082.
        </mixed-citation>
      </ref>
      <ref id="ref7">
        <mixed-citation>
          [7]
          <string-name>
            <given-names>S.</given-names>
            <surname>Niedermaier</surname>
          </string-name>
          ,
          <string-name>
            <given-names>F.</given-names>
            <surname>Koetter</surname>
          </string-name>
          ,
          <string-name>
            <given-names>A.</given-names>
            <surname>Freymann</surname>
          </string-name>
          ,
          <string-name>
            <given-names>S.</given-names>
            <surname>Wagner</surname>
          </string-name>
          ,
          <article-title>On Observability and Monitoring of Distributed Systems - An Industry Interview Study</article-title>
          , in: S. Yangui,
          <string-name>
            <given-names>I. Bouassida</given-names>
            <surname>Rodriguez</surname>
          </string-name>
          ,
          <string-name>
            <given-names>K.</given-names>
            <surname>Drira</surname>
          </string-name>
          ,
          <string-name>
            <given-names>Z.</given-names>
            Tari (Eds.),
            <surname>Service-Oriented</surname>
          </string-name>
          <string-name>
            <surname>Computing</surname>
          </string-name>
          , Springer International Publishing, Cham,
          <year>2019</year>
          , pp.
          <fpage>36</fpage>
          -
          <lpage>52</lpage>
          . doi:
          <volume>10</volume>
          .1007/978-3-
          <fpage>030</fpage>
          -33702-
          <issue>5</issue>
          _
          <fpage>3</fpage>
          .
        </mixed-citation>
      </ref>
      <ref id="ref8">
        <mixed-citation>
          [8]
          <string-name>
            <given-names>I.</given-names>
            <surname>Pigazzini</surname>
          </string-name>
          ,
          <string-name>
            <given-names>F. A.</given-names>
            <surname>Fontana</surname>
          </string-name>
          ,
          <string-name>
            <given-names>V.</given-names>
            <surname>Lenarduzzi</surname>
          </string-name>
          ,
          <string-name>
            <given-names>D.</given-names>
            <surname>Taibi</surname>
          </string-name>
          , Towards Microservice Smells Detection,
          <source>in: Proceedings of the 3rd International Conference on Technical Debt</source>
          , TechDebt '20,
          <string-name>
            <surname>Association</surname>
          </string-name>
          for Computing Machinery, New York, NY, USA,
          <year>2020</year>
          , p.
          <fpage>92</fpage>
          -
          <lpage>97</lpage>
          . doi:
          <volume>10</volume>
          .1145/ 3387906.3388625.
        </mixed-citation>
      </ref>
      <ref id="ref9">
        <mixed-citation>
          [9]
          <string-name>
            <given-names>T.</given-names>
            <surname>Cerny</surname>
          </string-name>
          ,
          <string-name>
            <given-names>A. S.</given-names>
            <surname>Abdelfattah</surname>
          </string-name>
          ,
          <string-name>
            <given-names>V.</given-names>
            <surname>Bushong</surname>
          </string-name>
          ,
          <string-name>
            <given-names>A. Al</given-names>
            <surname>Maruf</surname>
          </string-name>
          ,
          <string-name>
            <given-names>D.</given-names>
            <surname>Taibi</surname>
          </string-name>
          ,
          <article-title>Microservice Architecture Reconstruction and Visualization Techniques: A Review</article-title>
          ,
          <source>in: 2022 IEEE International Conference on Service-Oriented System Engineering (SOSE)</source>
          ,
          <year>2022</year>
          , pp.
          <fpage>39</fpage>
          -
          <lpage>48</lpage>
          . doi:
          <volume>10</volume>
          . 1109/SOSE55356.
          <year>2022</year>
          .
          <volume>00011</volume>
          .
        </mixed-citation>
      </ref>
      <ref id="ref10">
        <mixed-citation>
          [10]
          <string-name>
            <given-names>B. H.</given-names>
            <surname>Sigelman</surname>
          </string-name>
          ,
          <string-name>
            <given-names>L. A.</given-names>
            <surname>Barroso</surname>
          </string-name>
          ,
          <string-name>
            <given-names>M.</given-names>
            <surname>Burrows</surname>
          </string-name>
          ,
          <string-name>
            <given-names>P.</given-names>
            <surname>Stephenson</surname>
          </string-name>
          ,
          <string-name>
            <given-names>M.</given-names>
            <surname>Plakal</surname>
          </string-name>
          ,
          <string-name>
            <given-names>D.</given-names>
            <surname>Beaver</surname>
          </string-name>
          ,
          <string-name>
            <given-names>S.</given-names>
            <surname>Jaspan</surname>
          </string-name>
          ,
          <string-name>
            <given-names>C. K.</given-names>
            <surname>Shanbhag</surname>
          </string-name>
          , Dapper,
          <source>a Large-Scale Distributed Systems Tracing Infrastructure</source>
          ,
          <year>2010</year>
          . URL: https://api.semanticscholar.org/CorpusID:14271421.
        </mixed-citation>
      </ref>
      <ref id="ref11">
        <mixed-citation>
          [11]
          <string-name>
            <surname>The OpenTracing Semantic Specification</surname>
          </string-name>
          ,
          <year>2023</year>
          . URL: https://opentracing.io/specification/.
        </mixed-citation>
      </ref>
      <ref id="ref12">
        <mixed-citation>
          [12]
          <string-name>
            <surname>OpenTelemetry</surname>
          </string-name>
          ,
          <year>2024</year>
          . URL: https://opentelemetry.io/docs/what-is-opentelemetry/.
        </mixed-citation>
      </ref>
      <ref id="ref13">
        <mixed-citation>
          [13]
          <string-name>
            <given-names>OpenTelemetry</given-names>
            <surname>Semantic Conventions</surname>
          </string-name>
          ,
          <year>2024</year>
          . URL: https://opentelemetry.io/docs/specs/ semconv/.
        </mixed-citation>
      </ref>
      <ref id="ref14">
        <mixed-citation>
          <source>[14] OpenTelemetry Project Journey Report - 2023</source>
          ,
          <year>2023</year>
          . URL: https://www.cncf.io/reports/ opentelemetry-project
          <source>-journey-report/.</source>
        </mixed-citation>
      </ref>
      <ref id="ref15">
        <mixed-citation>
          [15]
          <string-name>
            <given-names>Observability</given-names>
            <surname>Primer</surname>
          </string-name>
          ,
          <year>2023</year>
          . URL: https://opentelemetry.io/docs/concepts/ observability-primer/.
        </mixed-citation>
      </ref>
      <ref id="ref16">
        <mixed-citation>
          [16]
          <string-name>
            <given-names>G.</given-names>
            <surname>Parker</surname>
          </string-name>
          ,
          <string-name>
            <given-names>S.</given-names>
            <surname>Kim</surname>
          </string-name>
          ,
          <string-name>
            <given-names>A. A.</given-names>
            <surname>Maruf</surname>
          </string-name>
          ,
          <string-name>
            <given-names>T.</given-names>
            <surname>Cerny</surname>
          </string-name>
          ,
          <string-name>
            <given-names>K.</given-names>
            <surname>Frajtak</surname>
          </string-name>
          ,
          <string-name>
            <given-names>P.</given-names>
            <surname>Tisnovsky</surname>
          </string-name>
          ,
          <string-name>
            <given-names>D.</given-names>
            <surname>Taibi</surname>
          </string-name>
          ,
          <article-title>Visualizing Anti-Patterns in Microservices at Runtime: A Systematic Mapping Study</article-title>
          ,
          <source>IEEE Access 11</source>
          (
          <year>2023</year>
          )
          <fpage>4434</fpage>
          -
          <lpage>4442</lpage>
          . doi:
          <volume>10</volume>
          .1109/ACCESS.
          <year>2023</year>
          .
          <volume>3236165</volume>
          .
        </mixed-citation>
      </ref>
      <ref id="ref17">
        <mixed-citation>
          [17]
          <string-name>
            <given-names>I. U. P.</given-names>
            <surname>Gamage</surname>
          </string-name>
          ,
          <string-name>
            <surname>I. Perera</surname>
          </string-name>
          ,
          <article-title>Using dependency graph and graph theory concepts to identify anti-patterns in a microservices system: A tool-based approach</article-title>
          , in: 2021 Moratuwa Engineering Research Conference (MERCon),
          <year>2021</year>
          , pp.
          <fpage>699</fpage>
          -
          <lpage>704</lpage>
          . doi:
          <volume>10</volume>
          .1109/MERCon52712.
          <year>2021</year>
          .
          <volume>9525743</volume>
          .
        </mixed-citation>
      </ref>
      <ref id="ref18">
        <mixed-citation>
          [18]
          <string-name>
            <given-names>X.</given-names>
            <surname>Guo</surname>
          </string-name>
          ,
          <string-name>
            <given-names>X.</given-names>
            <surname>Peng</surname>
          </string-name>
          ,
          <string-name>
            <given-names>H.</given-names>
            <surname>Wang</surname>
          </string-name>
          ,
          <string-name>
            <given-names>W.</given-names>
            <surname>Li</surname>
          </string-name>
          ,
          <string-name>
            <given-names>H.</given-names>
            <surname>Jiang</surname>
          </string-name>
          ,
          <string-name>
            <given-names>D.</given-names>
            <surname>Ding</surname>
          </string-name>
          ,
          <string-name>
            <given-names>T.</given-names>
            <surname>Xie</surname>
          </string-name>
          , L. Su,
          <article-title>Graph-Based Trace Analysis for Microservice Architecture Understanding and Problem Diagnosis</article-title>
          ,
          <source>in: Proceedings of the 28th ACM Joint Meeting on European Software Engineering Conference and Symposium on the Foundations of Software Engineering</source>
          , ESEC/FSE 2020,
          <article-title>Association for Computing Machinery</article-title>
          , New York, NY, USA,
          <year>2020</year>
          , p.
          <fpage>1387</fpage>
          -
          <lpage>1397</lpage>
          . doi:
          <volume>10</volume>
          .1145/3368089.3417066.
        </mixed-citation>
      </ref>
      <ref id="ref19">
        <mixed-citation>
          [19]
          <string-name>
            <given-names>Neo4j</given-names>
            <surname>Local Clustering Coeficient</surname>
          </string-name>
          ,
          <year>2023</year>
          . URL: https://neo4j.com/docs/graph-data-science/ current/algorithms/local-clustering-coeficient/.
        </mixed-citation>
      </ref>
      <ref id="ref20">
        <mixed-citation>
          [20]
          <string-name>
            <given-names>Neo4j</given-names>
            <surname>Degree Centrality</surname>
          </string-name>
          ,
          <year>2023</year>
          . URL: https://neo4j.com/docs/graph-data-science/current/ algorithms/degree-centrality/.
        </mixed-citation>
      </ref>
      <ref id="ref21">
        <mixed-citation>
          [21]
          <string-name>
            <given-names>Neo4j</given-names>
            <surname>Strongly Connected Components</surname>
          </string-name>
          ,
          <year>2023</year>
          . URL: https://neo4j.com/docs/ graph-data-science/current/algorithms/strongly-connected-components/.
        </mixed-citation>
      </ref>
      <ref id="ref22">
        <mixed-citation>
          [22]
          <string-name>
            <given-names>OpenTelemetry</given-names>
            <surname>Collector</surname>
          </string-name>
          ,
          <year>2023</year>
          . URL: https://opentelemetry.io/docs/collector/.
        </mixed-citation>
      </ref>
      <ref id="ref23">
        <mixed-citation>
          [23]
          <string-name>
            <given-names>N. D.</given-names>
            <surname>Boone</surname>
          </string-name>
          ,
          <source>Dynamic Baseline Alerts Now Automatically Find the Best Algorithm for You</source>
          ,
          <year>2017</year>
          . URL: https://newrelic.com/blog/how-to
          <article-title>-relic/baseline-alerts-algorithm.</article-title>
        </mixed-citation>
      </ref>
      <ref id="ref24">
        <mixed-citation>
          [24]
          <string-name>
            <given-names>J.</given-names>
            <surname>Brownlee</surname>
          </string-name>
          , A Gentle Introduction to Exponential Smoothing for Time Series Forecasting in Python,
          <year>2020</year>
          . URL: https://machinelearningmastery.com
          <article-title>/ exponential-smoothing-for-time-series-forecasting-in-python/.</article-title>
        </mixed-citation>
      </ref>
      <ref id="ref25">
        <mixed-citation>
          [25]
          <string-name>
            <given-names>S.</given-names>
            <surname>Han</surname>
          </string-name>
          ,
          <string-name>
            <given-names>X.</given-names>
            <surname>Hu</surname>
          </string-name>
          ,
          <string-name>
            <given-names>H.</given-names>
            <surname>Huang</surname>
          </string-name>
          ,
          <string-name>
            <given-names>M.</given-names>
            <surname>Jiang</surname>
          </string-name>
          ,
          <string-name>
            <given-names>Y.</given-names>
            <surname>Zhao</surname>
          </string-name>
          , ADBench: Anomaly Detection Benchmark, in: S. Koyejo,
          <string-name>
            <given-names>S.</given-names>
            <surname>Mohamed</surname>
          </string-name>
          ,
          <string-name>
            <given-names>A.</given-names>
            <surname>Agarwal</surname>
          </string-name>
          ,
          <string-name>
            <given-names>D.</given-names>
            <surname>Belgrave</surname>
          </string-name>
          ,
          <string-name>
            <given-names>K.</given-names>
            <surname>Cho</surname>
          </string-name>
          ,
          <string-name>
            <surname>A</surname>
          </string-name>
          . Oh (Eds.),
          <source>Advances in Neural Information Processing Systems</source>
          , volume
          <volume>35</volume>
          ,
          <string-name>
            <surname>Curran</surname>
            <given-names>Associates</given-names>
          </string-name>
          , Inc.,
          <year>2022</year>
          , pp.
          <fpage>32142</fpage>
          -
          <lpage>32159</lpage>
          . URL: https://proceedings.neurips.cc/paper_files/paper/2022/file/ cf93972b116ca5268827d575f2cc226b-Paper-Datasets_and_Benchmarks.pdf.
        </mixed-citation>
      </ref>
      <ref id="ref26">
        <mixed-citation>
          [26]
          <string-name>
            <given-names>S.</given-names>
            <surname>Suboh</surname>
          </string-name>
          , I. Aziz,
          <string-name>
            <given-names>S.</given-names>
            <surname>Shaharudin</surname>
          </string-name>
          ,
          <string-name>
            <given-names>S.</given-names>
            <surname>Ismail</surname>
          </string-name>
          ,
          <string-name>
            <given-names>H.</given-names>
            <surname>Mahdin</surname>
          </string-name>
          ,
          <article-title>A Systematic Review of Anomaly Detection within High Dimensional and Multivariate Data</article-title>
          , JOIV : International Journal
        </mixed-citation>
      </ref>
    </ref-list>
  </back>
</article>