<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Aura – architecture</title>
    <link>/categories/architecture/</link>
    <description>Recent content in architecture on Aura</description>
    <generator>Hugo -- gohugo.io</generator>
    <language>en</language>
    
	  <atom:link href="/categories/architecture/index.xml" rel="self" type="application/rss+xml" />
    
    
      
        
      
    
    
    <item>
      <title>Docs: </title>
      <link>/docs/components/aura-bot-platform/aura-bot-architecture/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      
      <guid>/docs/components/aura-bot-platform/aura-bot-architecture/</guid>
      <description>
        
        
        &lt;h1 id=&#34;aura-bot-architecture&#34;&gt;Aura Bot architecture&lt;/h1&gt;


&lt;div class=&#34;pageinfo pageinfo-primary&#34;&gt;
&lt;p&gt;Description of Aura Bot architecture and starting components&lt;/p&gt;

&lt;/div&gt;

&lt;h2 id=&#34;introduction-to-bot-framework-service&#34;&gt;Introduction to Bot Framework service&lt;/h2&gt;
&lt;p&gt;A bot is an application, particularly an HTTP server, that allows &lt;strong&gt;interaction with users in a conversational way&lt;/strong&gt;. Different means of interaction are available, such as text, cards with images, video or audio and speech.&lt;/p&gt;
&lt;p&gt;Users interact with the bot through a given channel, that is the final application used directly by the users. For instance, the bot can be accessible from &lt;strong&gt;Facebook&lt;/strong&gt;, &lt;strong&gt;WhatsApp&lt;/strong&gt; or from any private application, such as My O2 or Mi Movistar. Every message exchanged between the user and the bot is called an &lt;strong&gt;activity&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Microsoft Bot Framework Service&lt;/strong&gt;, that is the main component of &lt;strong&gt;Azure Bot Service&lt;/strong&gt;, is responsible for sending the user&amp;rsquo;s request to the particular bot instance, in this case, to the corresponding instance of &lt;em&gt;&lt;strong&gt;aura-bot&lt;/strong&gt;&lt;/em&gt;. Channels communicating with a bot should include additional information required by this specific bot to handle the message in the body of the request, i.e., in the activity. &lt;em&gt;&lt;strong&gt;aura-bot&lt;/strong&gt;&lt;/em&gt; provides a definition of the &lt;a href=&#34;../../docs/components/request-response-model/&#34;&gt;&lt;code&gt;channelData&lt;/code&gt;&lt;/a&gt; field of the activity, so channels are able to send and receive this information needed to handle Aura use cases.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&lt;strong&gt;aura-bot&lt;/strong&gt;&lt;/em&gt;, as a bot based on Microsoft Bot Framework, understands different types of &lt;a href=&#34;https://github.com/Microsoft/botframework-sdk/blob/main/specs/botframework-activity/botframework-activity.md&#34;&gt;&lt;strong&gt;activities&lt;/strong&gt;&lt;/a&gt;.
The most basic types of &lt;strong&gt;activities&lt;/strong&gt; used by &lt;em&gt;&lt;strong&gt;aura-bot&lt;/strong&gt;&lt;/em&gt; are:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;#aura-bot-messages-flowchart&#34;&gt;&lt;em&gt;&lt;strong&gt;Message&lt;/strong&gt;&lt;/em&gt;&lt;/a&gt;: Means to transmit the user&amp;rsquo;s needs to the bot.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;&lt;strong&gt;Event&lt;/strong&gt;&lt;/em&gt;: Events are in charge of the end-to-end communication between &lt;em&gt;&lt;strong&gt;aura-bot&lt;/strong&gt;&lt;/em&gt; and channels. They are managed by the &lt;a href=&#34;../../docs/components/aura-bot-platform/aura-bot-components/middlewares/incoming-event-middleware/&#34;&gt;&lt;em&gt;&lt;strong&gt;incoming-event-middleware&lt;/strong&gt;&lt;/em&gt;&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;&lt;strong&gt;ConversationUpdate&lt;/strong&gt;&lt;/em&gt;: Activity that describes a change in conversation&amp;rsquo;s members, description, existence, etc.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Communication between BotFramework Service and &lt;em&gt;&lt;strong&gt;aura-bot&lt;/strong&gt;&lt;/em&gt; is based on HTTP. BotFramework Service sends an HTTP &lt;code&gt;POST&lt;/code&gt; request to the bot, with the incoming activity from the user. The bot should respond with a &lt;code&gt;200&lt;/code&gt; HTTP status code to this request. In &lt;em&gt;&lt;strong&gt;aura-bot&lt;/strong&gt;&lt;/em&gt;, this is executed before going on with the processing of the activity, so the echo message of the user is returned before the activity generated as an answer. These activities are sent to BotFramework Service as HTTP &lt;code&gt;POST&lt;/code&gt; request, that is responded with &lt;code&gt;200&lt;/code&gt; HTTP status code, too.&lt;/p&gt;
&lt;p&gt;Once an activity arrives at the bot, the HTTP server should pass it to the &lt;a href=&#34;../../docs/components/aura-bot-platform/aura-bot-components/#aura-botframework-adapter&#34;&gt;BotFramework Adapter&lt;/a&gt;, that starts the activity processing.&lt;/p&gt;
&lt;p&gt;At this moment, a &lt;strong&gt;turn&lt;/strong&gt; starts, that refers to all the steps done from the moment that an activity enters the bot until all the answer activities are returned to the user. Each turn lays on a &lt;a href=&#34;https://docs.microsoft.com/es-es/javascript/api/botbuilder-core/turncontext?view=botbuilder-ts-latest&#34;&gt;&lt;code&gt;TurnContext&lt;/code&gt;&lt;/a&gt;, that holds all the information about the current activity. Bot Framework automatically includes in the &lt;code&gt;TurnContext&lt;/code&gt; object some information, but &lt;em&gt;&lt;strong&gt;aura-bot&lt;/strong&gt;&lt;/em&gt; extends this object with extra information that makes it easier to provide a response to the user.&lt;/p&gt;
&lt;p&gt;Please, check detailed information about &lt;a href=&#34;https://docs.microsoft.com/en-us/azure/bot-service/bot-builder-basics?view=azure-bot-service-4.0&amp;amp;tabs=javascript.&#34;&gt;Microsoft Bot Framework Service and the related SDK&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&#34;aura-bot-core-architecture&#34;&gt;Aura Bot core architecture&lt;/h2&gt;
&lt;p&gt;The following diagram shows all the components running in any &lt;em&gt;&lt;strong&gt;aura-bot&lt;/strong&gt;&lt;/em&gt; instance. They are shown as they are loaded during bot start-up.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Legend&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Blue boxes&lt;/strong&gt;: singleton components &lt;br&gt; &lt;strong&gt;Yellow boxes within them&lt;/strong&gt;: components that are handled the same way &lt;br&gt; &lt;strong&gt;Middlewares:&lt;/strong&gt; &lt;br&gt;   -	&lt;strong&gt;M&lt;/strong&gt;: mandatory ones &lt;br&gt;   - &lt;strong&gt;O&lt;/strong&gt;: optional, executed only if they are properly configured &lt;br&gt; &lt;strong&gt;Execution mode:&lt;/strong&gt; &lt;br&gt;   - &lt;strong&gt;F&lt;/strong&gt;: execution flow stops when middleware fails &lt;br&gt;   - &lt;strong&gt;T&lt;/strong&gt;: execution continues when middleware fails&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;img src=&#34;../../images/aura-bot/bot-arch-diagrams-components.svg&#34; alt=&#34;Aura Bot architecture&#34;&gt;&lt;/p&gt;
&lt;h2 id=&#34;aura-bot-messages-flowchart&#34;&gt;Aura Bot messages flowchart&lt;/h2&gt;
&lt;p&gt;As explained before, &lt;em&gt;&lt;strong&gt;messages&lt;/strong&gt;&lt;/em&gt; are a type of activities that manage requests from the users: &lt;em&gt;&lt;strong&gt;aura-bot&lt;/strong&gt;&lt;/em&gt; receives a request from a user and provides an answer back.&lt;/p&gt;
&lt;p&gt;The following diagram include the messages flow through &lt;em&gt;&lt;strong&gt;aura-bot&lt;/strong&gt;&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;../../images/aura-bot/bot-arch-diagrams-message-flow.svg&#34; alt=&#34;Aura Bot message flow&#34;&gt;&lt;/p&gt;
&lt;h2 id=&#34;aura-bot-starting-components-and-modules-aura-orchestrator&#34;&gt;Aura Bot starting components and modules: Aura orchestrator&lt;/h2&gt;
&lt;p&gt;Currently, &lt;em&gt;&lt;strong&gt;aura-bot&lt;/strong&gt;&lt;/em&gt; includes an &lt;strong&gt;orchestrator&lt;/strong&gt; that controls how the system is loaded and indicates which components and modules are required for the bot start-up.&lt;/p&gt;
&lt;p&gt;The orchestrator handles a sorted array of components that must implement a series of methods that may receive the bot configuration if necessary. Modules are then initialized asynchronously, although they were synchronous.&lt;/p&gt;
&lt;p&gt;This behavior simplifies both the definition of the singleton modules and how the orchestrator initializes them, with a minimum loss of performance during start-up.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-typescript&#34; data-lang=&#34;typescript&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;const&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;orderedModules&lt;/span&gt; &lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;ModuleA&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;ModuleB&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;ModuleC&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;];&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;// Instantiate the Service App.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;&lt;/span&gt;        &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;const&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;appOrchestrator&lt;/span&gt; &lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;new&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;Orchestrator&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;();&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;// Add configuration, that will be required by almost all other modules
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;&lt;/span&gt;        &lt;span style=&#34;color:#000&#34;&gt;appOrchestrator&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;setConfigurationManager&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;Configuration&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;// Add the dependent modules in order.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;&lt;/span&gt;        &lt;span style=&#34;color:#000&#34;&gt;appOrchestrator&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;addModules&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;sortedModules&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;// Initiate the App.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;&lt;/span&gt;        &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;await&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;appOrchestrator&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;init&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;();&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The orchestrator module is created during the server start-up with the following parameters:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;ConfigurationManager&lt;/strong&gt;:&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Class that handles &lt;em&gt;&lt;strong&gt;aura-bot&lt;/strong&gt;&lt;/em&gt; configuration, that is the component in charge of loading the environment variables.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Singleton Modules&lt;/strong&gt;:&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;They are: MiniBotServiceMock, AuraChannelsConfiguration, AuraMongoDb.Connector, KpiHandler, HttpMonkeyPatcher, PluginManager, LocaleManager, AuraCacheManagement, AuraBotServer.&lt;/p&gt;
&lt;p&gt;These modules are loaded in the given order. If any of these modules does not start correctly, &lt;em&gt;&lt;strong&gt;aura-bot&lt;/strong&gt;&lt;/em&gt; does not start. Otherwise, AuraBotServer is up and running at the end of the process. All these modules are available all along the bot.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;MiniBotServiceMock is only started if the bot is running locally through &lt;a href=&#34;../../docs/experiences-builder/tools/aura-minibot/&#34;&gt;Aura minibot&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;how-to-define-singleton-modules-in-aura&#34;&gt;How to define singleton modules in Aura&lt;/h3&gt;
&lt;p&gt;In order to develop a new singleton module that can be used by &lt;em&gt;&lt;strong&gt;aura-bot&lt;/strong&gt;&lt;/em&gt; both internally and during the dialog execution, developers should keep in mind the following issues:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;All modules added to the orchestrator need and publish a static variable called &lt;code&gt;instance&lt;/code&gt;, that holds the singleton instance of that module.&lt;/li&gt;
&lt;li&gt;Modules must have a public static method: &lt;code&gt;init&lt;/code&gt;, that could be async or not depending on the needs of the module start-up. This method creates the singleton instance (and sets it to then &lt;code&gt;instance&lt;/code&gt; variable). This method should only be called once by module or must throw an exception. It is only called by the orchestrator.&lt;/li&gt;
&lt;li&gt;It is also recommended to provide an empty private constructor that avoids the creation of new instances of the module.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;An example of implementation is shown below:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-typescript&#34; data-lang=&#34;typescript&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;export&lt;/span&gt; &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;Class1&lt;/span&gt; &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;instance&lt;/span&gt;: &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;Class1&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;private&lt;/span&gt; &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;constructor&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;()&lt;/span&gt; &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;// Stuff here...
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;&lt;/span&gt;    &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;async&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;init&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;config&lt;/span&gt;: &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;Configuration&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;)&lt;/span&gt;&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;Promise&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;Class1&lt;/span&gt; &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;!&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;Class1&lt;/span&gt; &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;instance&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#000&#34;&gt;Class1&lt;/span&gt; &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;instance&lt;/span&gt; &lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;new&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;Class1&lt;/span&gt; &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;();&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;// More stuff here
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;Class1&lt;/span&gt; &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;instance&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;}&lt;/span&gt; &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;else&lt;/span&gt; &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;throw&lt;/span&gt; &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;new&lt;/span&gt; &lt;span style=&#34;color:#204a87&#34;&gt;Error&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#39;An instance of Class1  already exists&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;To use any of these modules:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Import its dependency.&lt;/li&gt;
&lt;li&gt;Access the module &lt;code&gt;instance&lt;/code&gt; property and call the required method.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The following example shows how to get a text translated by the &lt;em&gt;LocaleManager&lt;/em&gt;.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-typescript&#34; data-lang=&#34;typescript&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;{&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;LocaleManager&lt;/span&gt; &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;}&lt;/span&gt; &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;from&lt;/span&gt; &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#39;@telefonica/aura-utilities/lib/aura-locale-manager&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a40000&#34;&gt;…&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000&#34;&gt;LocaleManager&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;instance&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;getText&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#39;errors:error.invalidScopes&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;auraUser&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;corr&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
      </description>
    </item>
    
    <item>
      <title>Docs: </title>
      <link>/docs/components/aura-bridge/bridge-architecture/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      
      <guid>/docs/components/aura-bridge/bridge-architecture/</guid>
      <description>
        
        
        &lt;h1 id=&#34;aura-bridge-architecture&#34;&gt;Aura bridge architecture&lt;/h1&gt;


&lt;div class=&#34;pageinfo pageinfo-primary&#34;&gt;
&lt;p&gt;Description of Aura bridge general architecture at the level of components&lt;/p&gt;

&lt;/div&gt;

&lt;h2 id=&#34;introduction&#34;&gt;Introduction&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;&lt;strong&gt;aura-bridge&lt;/strong&gt;&lt;/em&gt; architecture is designed based on three fundamental components:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;em&gt;&lt;strong&gt;aura-bridge&lt;/strong&gt;&lt;/em&gt;: It is identified as the core component of the &lt;em&gt;&lt;strong&gt;aura-bridge&lt;/strong&gt;&lt;/em&gt;. It is in charge of starting the basic functionality modules, loading the plugins and starting the &lt;a href=&#34;https://expressjs.com/&#34;&gt;expressjs&lt;/a&gt; server.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;em&gt;&lt;strong&gt;aura-bridge-common&lt;/strong&gt;&lt;/em&gt;: It can be defined as an SDK (Software Development Kit) to be able to develop a plugin.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;em&gt;&lt;strong&gt;aura-bridge-plugin&lt;/strong&gt;&lt;/em&gt;. Component that provides functionality to &lt;em&gt;&lt;strong&gt;aura-bridge&lt;/strong&gt;&lt;/em&gt;. This component works the same way as a service in an architecture oriented to microservices (isolated, small and self-contained).&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&#34;../../images/bridge-components-architecture.png&#34; alt=&#34;Bridge components&#34;&gt;&lt;/p&gt;
&lt;h2 id=&#34;aura-bridge&#34;&gt;Aura bridge&lt;/h2&gt;
&lt;p&gt;As mentioned above, it is the core of the system and can work without the need for any plugin.&lt;/p&gt;
&lt;h3 id=&#34;source-code-structure&#34;&gt;Source code structure&lt;/h3&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;src
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;├── cache               &lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;# Two level cache module&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;├── config              &lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;# Configuration manager module &lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;├── controllers         &lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;# Generic and metric controllers (oastool)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;├── make                &lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;# Aura bridge make up&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;├── message-sync        &lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;# Queue management system&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;├── middlewares         &lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;# Express middlewares&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;├── modules             &lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;# Bridge modules: behavior-manager, plugin-manager&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;└── utils               &lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;# Bridge utilities: prometheus-utils&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;aura-bridge-common&#34;&gt;Aura bridge common&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;&lt;strong&gt;aura-bridge-common&lt;/strong&gt;&lt;/em&gt; contains all the necessary utilities in order to develop a new &lt;em&gt;&lt;strong&gt;aura-bridge&lt;/strong&gt;&lt;/em&gt; plugin and the models used in these utilities.&lt;/p&gt;
&lt;h3 id=&#34;aura-bridge-plugin&#34;&gt;Aura bridge plugin&lt;/h3&gt;
&lt;p&gt;Base class to develop an &lt;em&gt;&lt;strong&gt;aura-bridge&lt;/strong&gt;&lt;/em&gt; client.&lt;/p&gt;
&lt;p&gt;To implement a new client, it is only necessary to extend the class &lt;code&gt;AuraBridgeClient&lt;/code&gt; and implement the &lt;code&gt;sendMessage&lt;/code&gt; method.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-typescript&#34; data-lang=&#34;typescript&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;export&lt;/span&gt; &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;TestClient&lt;/span&gt; &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;extends&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;AuraBridgeClient&lt;/span&gt; &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;async&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;sendMessage&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;message&lt;/span&gt;: &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;TestMessage&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;options&lt;/span&gt;: &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;SendMessageOptions&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;)&lt;/span&gt;&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;Promise&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;any&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;...&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;If the new &lt;em&gt;&lt;strong&gt;aura-bridge&lt;/strong&gt;&lt;/em&gt; client needs to use the OAuth protocol, it is possible to extend the class &lt;code&gt;AuraBridgeClientOAuthTokens&lt;/code&gt; and indicate the configuration of OAuth clients, passing the parameter &lt;code&gt;authClients&lt;/code&gt; in &lt;code&gt;constructor&lt;/code&gt;. In this way, the tokens will be updated automatically.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-typescript&#34; data-lang=&#34;typescript&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;export&lt;/span&gt; &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;TestOauthClient&lt;/span&gt; &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;extends&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;AuraBridgeClientOAuthTokens&lt;/span&gt; &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;...&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id=&#34;aura-bridge-flow&#34;&gt;aura-bridge-flow&lt;/h4&gt;
&lt;p&gt;&lt;em&gt;&lt;strong&gt;AuraBridgeFlow&lt;/strong&gt;&lt;/em&gt; allows the generation of a &amp;ldquo;processor&amp;rdquo; type plugin in a quickly and standardized way: control of errors, logs, metrics, client retry policies, etc.&lt;/p&gt;
&lt;p&gt;As a rule, a &amp;ldquo;processor&amp;rdquo; type plugin receives, converts and sends a message to a destination. In case of error, it can send messages to another list of destinations.&lt;/p&gt;
&lt;pre class=&#34;mermaid&#34;&gt;sequenceDiagram
    Origin-&amp;gt;&amp;gt;&amp;#43;Processor Plugin: Message
    Processor Plugin-&amp;gt;&amp;gt;&amp;#43;Processor Plugin: Convert message

    alt ok
        Processor Plugin-&amp;gt;&amp;gt;&amp;#43;Destination: Converted message
    end
    opt Extra response
        Processor Plugin-&amp;gt;&amp;gt;&amp;#43;Error destination (1): Error message (1)
        Processor Plugin-&amp;gt;&amp;gt;&amp;#43;Error destination (2): Error message (2)
    end&lt;/pre&gt;
&lt;h4 id=&#34;aura-bridge-utils&#34;&gt;aura-bridge-utils&lt;/h4&gt;
&lt;p&gt;&lt;code&gt;AuraBridgeUtils&lt;/code&gt; contains utilities for request information, get generic errors, etc.&lt;/p&gt;
&lt;h3 id=&#34;aura-bridge-plugins&#34;&gt;aura-bridge plugins&lt;/h3&gt;
&lt;p&gt;A plugin is a module/component that provides &lt;em&gt;&lt;strong&gt;aura-bridge&lt;/strong&gt;&lt;/em&gt; with new functionality and works independently without affecting other existing functionality in the system.&lt;/p&gt;
&lt;p&gt;&amp;#x1f4c3; Find here detailed descriptive documentation about &lt;a href=&#34;../../docs/components/aura-bridge/bridge-components/plugins/&#34;&gt;&lt;em&gt;&lt;strong&gt;aura-bridge&lt;/strong&gt;&lt;/em&gt; plugins&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&amp;#x1f4c3; Find here the guidelines for the &lt;a href=&#34;../../docs/developers-workspace/develop-features/bridge-generate-new-plugin/&#34;&gt;generation of a plugin and activation in &lt;em&gt;&lt;strong&gt;aura-bridge&lt;/strong&gt;&lt;/em&gt;&lt;/a&gt;.&lt;/p&gt;

      </description>
    </item>
    
    <item>
      <title>Docs: </title>
      <link>/docs/atria/technical-components/atria-model-gateway/components/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      
      <guid>/docs/atria/technical-components/atria-model-gateway/components/</guid>
      <description>
        
        
        &lt;h1 id=&#34;atria-model-gateway-architecture-and-components&#34;&gt;ATRIA Model Gateway architecture and components&lt;/h1&gt;


&lt;div class=&#34;pageinfo pageinfo-primary&#34;&gt;
&lt;p&gt;Development architecture and technical components of the &lt;em&gt;&lt;strong&gt;atria-model-gateway&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;

&lt;/div&gt;

&lt;h2 id=&#34;technical-foundations&#34;&gt;Technical foundations&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;&lt;strong&gt;atria-model-gateway&lt;/strong&gt;&lt;/em&gt; is responsible for managing the communication with different AI models. This component receives a request from &lt;em&gt;&lt;strong&gt;aura-gateway-api&lt;/strong&gt;&lt;/em&gt;, together with other input data, and makes a call the corresponding AI models.&lt;/p&gt;
&lt;p&gt;If the selected AI model is RAG, then &lt;em&gt;&lt;strong&gt;atria-model-gateway&lt;/strong&gt;&lt;/em&gt; calls the &lt;a href=&#34;../../docs/atria/technical-components/atria-rag-server/&#34;&gt;&lt;em&gt;&lt;strong&gt;atria-rag-server&lt;/strong&gt;&lt;/em&gt;&lt;/a&gt;, which is in charge of executing the RAG chain and making the corresponding calls to the LLM models and databases.&lt;/p&gt;
&lt;h2 id=&#34;functional-components&#34;&gt;Functional components&lt;/h2&gt;
&lt;p&gt;The functional components of &lt;em&gt;&lt;strong&gt;atria-model-gateway&lt;/strong&gt;&lt;/em&gt; are described in the document &lt;a href=&#34;../../docs/atria/capabilities/llm-experiences-builder/#functional-components&#34;&gt;LLM/LMM Experiences Builder&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&#34;architecture-overview&#34;&gt;Architecture overview&lt;/h2&gt;
&lt;p&gt;The following diagram schematically shows the main technical components integrated into &lt;em&gt;&lt;strong&gt;atria-model-gateway&lt;/strong&gt;&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;../../images/atria/atria-technical-components/atria-model-gateway-arch.png&#34; alt=&#34;atria-model-gateway-arch&#34;&gt;&lt;/p&gt;
&lt;p&gt;A brief description of these components is included below:&lt;/p&gt;
&lt;h3 id=&#34;access-module&#34;&gt;Access module&lt;/h3&gt;
&lt;p&gt;Module for the management of different profiles to access &lt;em&gt;&lt;strong&gt;atria-model-gateway&lt;/strong&gt;&lt;/em&gt;.&lt;/p&gt;
&lt;h3 id=&#34;context-module&#34;&gt;Context module&lt;/h3&gt;
&lt;p&gt;Module in charge of the storage of a conversation history in a cache (currently, Redis is used) over a period of time, grouped by session ID. These conversations are taken into account when calling the generative LLM models.&lt;/p&gt;
&lt;h3 id=&#34;model-manager&#34;&gt;Model manager&lt;/h3&gt;
&lt;p&gt;Module that includes the available &lt;a href=&#34;#models&#34;&gt;models&lt;/a&gt; and &lt;a href=&#34;#presets&#34;&gt;presets&lt;/a&gt;. It is in charge of receiving the info from &lt;em&gt;&lt;strong&gt;aura-gateway-api&lt;/strong&gt;&lt;/em&gt; and calling the corresponding model.&lt;/p&gt;
&lt;h4 id=&#34;models&#34;&gt;Models&lt;/h4&gt;
&lt;p&gt;Available AI models integrated into the &lt;em&gt;&lt;strong&gt;atria-model-gateway&lt;/strong&gt;&lt;/em&gt;.&lt;/p&gt;
&lt;h4 id=&#34;presets&#34;&gt;Presets&lt;/h4&gt;
&lt;p&gt;Presets are configurable entities to define the specific model to work with and certain parameters associated to it: model Id, name, description, model parameters, etc.&lt;/p&gt;
&lt;p&gt;Constructors can use the default presets or build new ones: Go to document &lt;a href=&#34;../../docs/atria/technical-guidelines/configuration/&#34;&gt;ATRIA configuration&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;When configuring an &lt;a href=&#34;../../docs/atria/technical-components/application&#34;&gt;application&lt;/a&gt;, all the presets that can be used for this application must be previously defined.&lt;/p&gt;

      </description>
    </item>
    
    <item>
      <title>Docs: </title>
      <link>/docs/atria/technical-components/atria-rag-generate-db/components/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      
      <guid>/docs/atria/technical-components/atria-rag-generate-db/components/</guid>
      <description>
        
        
        &lt;h1 id=&#34;atria-rag-generate-db-architecture-and-components&#34;&gt;ATRIA RAG Generate DB architecture and components&lt;/h1&gt;


&lt;div class=&#34;pageinfo pageinfo-primary&#34;&gt;
&lt;p&gt;Development architecture and technical components of the &lt;em&gt;&lt;strong&gt;atria-rag-generate-db&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;

&lt;/div&gt;

&lt;h2 id=&#34;architecture-overview&#34;&gt;Architecture overview&lt;/h2&gt;
&lt;p&gt;The following diagram schematically shows the main technical components integrated into &lt;em&gt;&lt;strong&gt;atria-rag-generate-db&lt;/strong&gt;&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;../../images/atria/atria-technical-components/rag-generate-db-arch.png&#34; alt=&#34;atria-rag-server-arch&#34;&gt;&lt;/p&gt;
&lt;p&gt;A brief description of the technical components is included below:&lt;/p&gt;
&lt;h3 id=&#34;data-sources&#34;&gt;Data sources&lt;/h3&gt;
&lt;p&gt;A project contains information required for the execution of the generation of the databases: specific path of documents to feed the databases, allowed file extensions, etc. It can read from different sources, this source type is defined in the &lt;code&gt;extensions&lt;/code&gt; field.&lt;/p&gt;
&lt;p&gt;Before the information from the documents is stored in the corresponding database, the documents are processed, e.g., they are cut up and cleaned.&lt;/p&gt;
&lt;h3 id=&#34;retrievers&#34;&gt;Retrievers&lt;/h3&gt;
&lt;p&gt;The retrievers are in charge of reading the information from the documents and feeding the databases.&lt;/p&gt;
&lt;p&gt;The retrievers are defined in the &lt;code&gt;retrievers&lt;/code&gt; field of the project. Each retriever is associated with a database in order to feed or retrieve information from it.&lt;/p&gt;

      </description>
    </item>
    
    <item>
      <title>Docs: </title>
      <link>/docs/atria/technical-components/atria-rag-server/components/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      
      <guid>/docs/atria/technical-components/atria-rag-server/components/</guid>
      <description>
        
        
        &lt;h1 id=&#34;atria-rag-server-architecture-and-components&#34;&gt;ATRIA RAG Server architecture and components&lt;/h1&gt;


&lt;div class=&#34;pageinfo pageinfo-primary&#34;&gt;
&lt;p&gt;Development architecture and technical components of the &lt;em&gt;&lt;strong&gt;atria-rag-server&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;

&lt;/div&gt;

&lt;h2 id=&#34;architecture-overview&#34;&gt;Architecture overview&lt;/h2&gt;
&lt;p&gt;The following diagram schematically shows the main technical components integrated into &lt;em&gt;&lt;strong&gt;atria-rag-server&lt;/strong&gt;&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;../../images/atria/atria-technical-components/rag-server-arch.png&#34; alt=&#34;atria-rag-server-arch&#34;&gt;&lt;/p&gt;
&lt;p&gt;A brief description of the technical components is included below:&lt;/p&gt;
&lt;h3 id=&#34;project&#34;&gt;Project&lt;/h3&gt;
&lt;p&gt;A project contains information required for the execution of the RAG pipeline: specific models for semantic search and lexical search; path where the documents to feed the LLMs are located; allowed file extensions, etc.&lt;/p&gt;
&lt;h3 id=&#34;semantic-search-embeddings&#34;&gt;Semantic search (embeddings)&lt;/h3&gt;
&lt;p&gt;Qdrant database that stores the embeddings generated through semantic search (OpenAI embeddings) technology.&lt;/p&gt;
&lt;h3 id=&#34;lexical-search-llms&#34;&gt;Lexical search (LLMs)&lt;/h3&gt;
&lt;p&gt;Database that stores the required documentation for making lexical searching, based on keywords.&lt;/p&gt;
&lt;h2 id=&#34;configuration&#34;&gt;Configuration&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;&lt;strong&gt;atria-rag-server&lt;/strong&gt;&lt;/em&gt; includes a default configuration. Constructors can use it as is or they can modify it to be adapted to their requirements or business models: Go to document &lt;a href=&#34;../../docs/atria/technical-guidelines/configuration/&#34;&gt;ATRIA configuration&lt;/a&gt;.&lt;/p&gt;

      </description>
    </item>
    
    <item>
      <title>Docs: </title>
      <link>/docs/components/complex-logic-framework/clf-concepts/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      
      <guid>/docs/components/complex-logic-framework/clf-concepts/</guid>
      <description>
        
        
        &lt;h1 id=&#34;aura-complex-logic-framework-architecture-and-components&#34;&gt;Aura Complex Logic Framework architecture and components&lt;/h1&gt;


&lt;div class=&#34;pageinfo pageinfo-primary&#34;&gt;
&lt;p&gt;Architecture and main components that you should handle when working over Aura Complex Logic Framework&lt;/p&gt;

&lt;/div&gt;

&lt;h2 id=&#34;clf-architecture&#34;&gt;CLF architecture&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;&lt;strong&gt;Aura Complex Logic Framework&lt;/strong&gt;&lt;/em&gt; is a &lt;strong&gt;docker container&lt;/strong&gt;, meaning that it is configured as a lightweight, stand-alone, executable package of software that includes all the required elements to run an application.&lt;/p&gt;
&lt;p&gt;The &lt;em&gt;&lt;strong&gt;Complex Logic Framework&lt;/strong&gt;&lt;/em&gt; architecture is schematically shown in the following figure, containing different elements described in the succeeding sections.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;../../images/clf/clf-architecture.jpg&#34; alt=&#34;Interaction CLF-Aura&#34;&gt;&lt;/p&gt;
&lt;h2 id=&#34;clf-main-components&#34;&gt;CLF main components&lt;/h2&gt;
&lt;h3 id=&#34;sandbox&#34;&gt;Sandbox&lt;/h3&gt;
&lt;p&gt;A sandbox is an isolated testing environment that enables users to run programs or execute files without affecting the application, system or platform on which they run and to test new programming code.&lt;/p&gt;
&lt;h3 id=&#34;plugins&#34;&gt;Plugins&lt;/h3&gt;
&lt;p&gt;Plugins in &lt;em&gt;&lt;strong&gt;Aura Complex Logic Framework&lt;/strong&gt;&lt;/em&gt; are components that add a specific feature to an existing computer program, enabling its customization.&lt;/p&gt;
&lt;p&gt;The role of plugins within the &lt;em&gt;&lt;strong&gt;Complex Logic Framework&lt;/strong&gt;&lt;/em&gt; is to receive data, make the required computations and return an adequate response to the handler.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&lt;strong&gt;CLF&lt;/strong&gt;&lt;/em&gt; manages different types of plugins, which are encapsulated in the sandbox. Moreover, it contains several &lt;strong&gt;global plugins&lt;/strong&gt;, but it is possible for developers to &lt;strong&gt;add custom ones&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Some key features of &lt;em&gt;&lt;strong&gt;CLF&lt;/strong&gt;&lt;/em&gt; plugins are defined below:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Architecture allows each package of plugins to be deployed in its own environment: it is possible to have an isolated container deployed in an independent way containing all the plugins of a specific package (for instance, global plugins).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Each package is isolated by being run as a different process by a unique user with randomized name. The rationale behind this is to provide an isolated sandbox to make sure no package of plugins is a security risk. Thereby, each user has limited privileges and computational resources (memory, file descriptors and CPU time) and only runs one process for package.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The running packages can only receive data from a socket, and the appropriate plugin is then executed depending on both the plugin type and the intent contained in the data. The API handler is in charge of forwarding the data to the package, acting as a proxy, but it also checks the requests and transforms the responses back.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;To ease working with this architecture, packages, users and sockets have the same random name. This name also appears in the information and error log files.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;OBs can develop their own custom plugins in the &lt;em&gt;&lt;strong&gt;Aura Complex Logic Global&lt;/strong&gt;&lt;/em&gt; repository, with each plugin implemented as a class that inherits from &lt;code&gt;PluginBase&lt;/code&gt; and overwrites run method. This method receives the request data and contains the logic of the plugin. It must also generate a response that will be returned to the API handler.
When a request is performed, depending on the intent, the request data will be forwarded to the corresponding plugin automatically. Note that two intents can trigger the same plugin but it is not possible to trigger two plugins with the same intent.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Each package of plugins is watched by a supervisor. If the package process crashes, it will be restarted automatically by supervisor. The causes of abrupt exit could be excessive consumption of resources (CPU time, memory or file descriptors) or plugin internal malfunction.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;stub&#34;&gt;Stub&lt;/h3&gt;
&lt;p&gt;A stub, in the context of distributed computing, is a piece of code that is used to convert parameters during a remote procedure call (RPC). An RPC allows a client computer to remotely call procedures on a server computer.&lt;/p&gt;
&lt;p&gt;The parameters used in a function call have to be converted because the client and server computers use different address spaces. Stubs perform this conversion so that the remote server computer perceives the RPC as a local function call.&lt;/p&gt;
&lt;h3 id=&#34;api-server&#34;&gt;API server&lt;/h3&gt;
&lt;p&gt;API server is the process that listens for requests. This API server is based on the cognitive API package and, in this case, is configured to run the &lt;em&gt;&lt;strong&gt;Complex Logic&lt;/strong&gt;&lt;/em&gt; module.&lt;/p&gt;
&lt;p&gt;HTTP requests will be passed to the package API handlers according to the &lt;a href=&#34;../../docs/components/complex-logic-framework/clf-configuration/&#34;&gt;CLF configuration&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;It is also important to mention that API server process is watched by supervisor (meaning that it is fault-tolerant).&lt;/p&gt;
&lt;h3 id=&#34;api-handler&#34;&gt;API handler&lt;/h3&gt;
&lt;p&gt;In &lt;em&gt;&lt;strong&gt;Aura Complex Logic Framework&lt;/strong&gt;&lt;/em&gt;, API handlers are classes that inherit from &lt;code&gt;BaseComplexLogicAPIHandler&lt;/code&gt;. They are responsible for dealing with HTTP requests through the following methods:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Checking the request is valid.&lt;/li&gt;
&lt;li&gt;Checking that the response is in the correct format.&lt;/li&gt;
&lt;li&gt;Making a new request to the corresponding package process, which contains a group of plugins.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The first two items are implemented by the declaration of schemas that define the query request and the response. Plugin API handlers are only responsible for defining which request schema is accepted and which response is valid (also by using a schema).&lt;/p&gt;
&lt;p&gt;The request to a specific package is made automatically by the system as long as the specific intent that summons the trigger is recognized. The configuration is described in &lt;a href=&#34;../../docs/components/complex-logic-framework/clf-configuration/#plugins-configuration&#34;&gt;plugins configuration&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id=&#34;api-plugin&#34;&gt;API plugin&lt;/h3&gt;
&lt;p&gt;API plugin is an internal component based on the cognitive API package. It exposes the plugins contained in a package.&lt;/p&gt;
&lt;h3 id=&#34;kernel-platform-connectors&#34;&gt;Kernel Platform connectors&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Kernel&lt;/strong&gt; is the database where Telefónica stores all the data of its customers in a safe and reliable way, allowing users to control their data at the same time.&lt;/p&gt;
&lt;p&gt;These data can be consulted through a Kernel API with the necessary permissions. From the &lt;em&gt;&lt;strong&gt;Complex Logic Framework&lt;/strong&gt;&lt;/em&gt;, the only way to access Kernel is through our connectors. The connectors are used, for example, to obtain customer invoices or offer the catalog of devices and services.&lt;/p&gt;
&lt;p&gt;These connectors provide total security in order to avoid problems of wrong, malicious or not careful use by third party developers. For this purpose, prior to any request to Kernel, a check of the required permits is made.&lt;/p&gt;
&lt;h2 id=&#34;clf-sequence-diagram&#34;&gt;CLF Sequence diagram&lt;/h2&gt;
&lt;p&gt;The following sequence diagram shows the functional flow of the &lt;em&gt;&lt;strong&gt;Complex Logic Framework&lt;/strong&gt;&lt;/em&gt;, starting with the request from &lt;em&gt;&lt;strong&gt;aura-bot&lt;/strong&gt;&lt;/em&gt; to the &lt;em&gt;&lt;strong&gt;Complex Logic&lt;/strong&gt;&lt;/em&gt; module.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;../../images/clf/clf-functional-flowchart.png&#34; alt=&#34;CLF functional flowchart&#34;&gt;&lt;/p&gt;

      </description>
    </item>
    
    <item>
      <title>Docs: </title>
      <link>/docs/deployment/infraestructure/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      
      <guid>/docs/deployment/infraestructure/</guid>
      <description>
        
        
        &lt;h1 id=&#34;aura-infrastructure&#34;&gt;Aura infrastructure&lt;/h1&gt;


&lt;div class=&#34;pageinfo pageinfo-primary&#34;&gt;
&lt;p&gt;&lt;i class=&#34;fa-solid fa-circle-info fa-xl&#34; style=&#34;color: #3a13fb;&#34;&gt;&lt;/i&gt; &lt;em&gt;&lt;strong&gt;Scope&lt;/strong&gt;&lt;/em&gt;: &lt;em&gt;&lt;strong&gt;Aura Virtual Assistant&lt;/strong&gt;&lt;/em&gt; and &lt;em&gt;&lt;strong&gt;ATRIA&lt;/strong&gt;&lt;/em&gt; infrastructure documentation for DevOps Teams that describes architecture, networks and platform services&lt;/p&gt;

&lt;/div&gt;

&lt;h2 id=&#34;introduction&#34;&gt;Introduction&lt;/h2&gt;
&lt;p&gt;The current section includes a view of Aura architecture focused on the Aura deployment process.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;#aura-architecture-flowchart&#34;&gt;Aura architecture flowchart&lt;/a&gt; for DevOps Teams&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#nodepool-common&#34;&gt;Nodepool common&lt;/a&gt;: set of nodes with a common configuration and specification&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;../../docs/deployment/infraestructure/kubernetes-cluster/&#34;&gt;Kubernetes cluster&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;../../docs/deployment/infraestructure/platform-services/&#34;&gt;Aura Platform services&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;aura-architecture-flowchart&#34;&gt;Aura architecture flowchart&lt;/h2&gt;
&lt;p&gt;&lt;img src=&#34;../../images/deployment/operation/overview-deployment-arch.png&#34; alt=&#34;Aura architecture general&#34; title=&#34;Aura architecture general&#34;&gt;&lt;/p&gt;
&lt;h2 id=&#34;nodepool-common&#34;&gt;Nodepool common&lt;/h2&gt;
&lt;p&gt;&lt;img src=&#34;../../images/deployment/operation/common-nodepool.png&#34; alt=&#34;Aura architecture Nodepool Common&#34; title=&#34;Aura architecture Nodepool Common&#34;&gt;&lt;/p&gt;

      </description>
    </item>
    
    <item>
      <title>Docs: </title>
      <link>/docs/architecture-improvements-proposals/202506-dapr-analysis/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      
      <guid>/docs/architecture-improvements-proposals/202506-dapr-analysis/</guid>
      <description>
        
        
        &lt;h1 id=&#34;dapr-analysis&#34;&gt;DAPR analysis&lt;/h1&gt;


&lt;div class=&#34;pageinfo pageinfo-primary&#34;&gt;
&lt;p&gt;&lt;a href=&#34;https://dapr.io/&#34;&gt;DAPR (Distributed Application Runtime)&lt;/a&gt; is a framework designed to simplify the development of microservices-based applications.&lt;/p&gt;
&lt;p&gt;It provides a set of building blocks that help developers address common challenges in distributed applications, such as service communication, state management, event publishing and subscription, and more.&lt;/p&gt;

&lt;/div&gt;

&lt;h2 id=&#34;change-motivation&#34;&gt;Change motivation&lt;/h2&gt;
&lt;p&gt;The motivation behind adopting DAPR in our microservices platform is to &lt;strong&gt;enhance the development and operational efficiency&lt;/strong&gt; of distributed applications.&lt;/p&gt;
&lt;p&gt;DAPR provides a standardized way to handle common microservices challenges, such as service discovery, state management, and event-driven communication, which can significantly &lt;strong&gt;reduce the complexity of building and maintaining microservices architectures&lt;/strong&gt;.&lt;/p&gt;
&lt;h3 id=&#34;summary&#34;&gt;Summary&lt;/h3&gt;
&lt;p&gt;Currently, our platform relies on custom implementations for these functionalities, leading to increased development time and potential inconsistencies. By integrating DAPR, we aim to streamline our microservices development process, improve scalability, and enhance the overall reliability of our applications.&lt;/p&gt;
&lt;p&gt;Moreover, DAPR would minimize the &lt;strong&gt;complexity of new services deployment&lt;/strong&gt; leaning on features such as automatic service discovery and built-in support for various state stores and message brokers. This will allow our development teams to focus more on business logic rather than infrastructure concerns, ultimately accelerating our time to market and improving the maintainability of our codebase.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Date&lt;/th&gt;
&lt;th&gt;Proposal leadership team&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;June 2025&lt;/td&gt;
&lt;td&gt;Aura Engineering team&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id=&#34;advantages-of-using-dapr-in-a-microservices-platform&#34;&gt;Advantages of using DAPR in a microservices platform&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Complexity abstraction&lt;/strong&gt;: DAPR abstracts the complexity of communication between microservices, allowing developers to focus on business logic.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Portability&lt;/strong&gt;: Being language and platform agnostic, DAPR can run in any environment, whether in the cloud or on-premises servers.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Scalability&lt;/strong&gt;: It facilitates horizontal scalability of services, enabling applications to grow as needed.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Interoperability&lt;/strong&gt;: DAPR supports multiple programming languages and protocols, making it easier to integrate heterogeneous services.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Security&lt;/strong&gt;: It provides built-in mechanisms for authentication and authorization between services.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Rich ecosystem&lt;/strong&gt;: Includes building blocks such as service invocation, state management, event publishing/subscription, and more.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;dapr-architecture&#34;&gt;DAPR architecture&lt;/h2&gt;
&lt;p&gt;DAPR&amp;rsquo;s architecture is designed to provide a flexible and modular framework for building distributed applications.&lt;/p&gt;
&lt;p&gt;It consists of a control plane and a data plane, where the control plane manages configurations and policies, while the data plane handles the actual service interactions.&lt;/p&gt;
&lt;h3 id=&#34;architecture-diagram&#34;&gt;Architecture diagram&lt;/h3&gt;
&lt;p&gt;Below is a visual representation of DAPR&amp;rsquo;s architecture:&lt;/p&gt;
&lt;pre class=&#34;mermaid&#34;&gt;graph TD
    classDef graphTitle font-size: 20px, font-weight: bold, fill:#f0f0f0, stroke:#333, stroke-width:2px;
    subgraph Control Plane
        A[Configuration Management]
        B[Policy Enforcement]
        C[Monitoring and Observability]
        D[Service Discovery]
        E[Scaling and Resilience]
    end
        F[Sidecars]
    subgraph Data Plane
        G[Service Invocation]
        H[State Management]
        I[Publish and Subscribe]
        J[Bindings]
    end

    A --&amp;gt; F
    B --&amp;gt; F
    C --&amp;gt; F
    D --&amp;gt; F
    E --&amp;gt; F
    F --&amp;gt; G
    F --&amp;gt; H
    F --&amp;gt; I
    F --&amp;gt; J&lt;/pre&gt;
&lt;p&gt;This diagram illustrates how the control plane and data plane interact to enable DAPR&amp;rsquo;s functionalities, ensuring seamless communication and management of distributed applications.&lt;/p&gt;
&lt;h3 id=&#34;components-of-dapr-architecture&#34;&gt;Components of DAPR Architecture&lt;/h3&gt;
&lt;p&gt;DAPR&amp;rsquo;s architecture is composed of several key components that work together to enable microservices communication and management:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Sidecars&lt;/strong&gt;: These are lightweight containers that run alongside each microservice, providing DAPR&amp;rsquo;s functionalities such as service invocation, state management, and event handling.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Building blocks&lt;/strong&gt;: DAPR offers modular building blocks for common tasks, including:
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Service invocation&lt;/strong&gt;: Enables direct communication between services.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;State management&lt;/strong&gt;: Provides distributed state storage.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Publish and subscribe&lt;/strong&gt;: Facilitates event-driven communication.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Bindings&lt;/strong&gt;: Connects services to external systems like databases and message queues.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Control plane&lt;/strong&gt;: Manages the configuration, security, and monitoring of DAPR instances across the platform.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Data plane&lt;/strong&gt;: Handles the actual runtime operations, including service-to-service communication and data processing.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;APIs&lt;/strong&gt;: DAPR exposes APIs that developers can use to interact with its features programmatically.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;These components collectively simplify the development and operation of distributed applications, ensuring scalability, portability, and ease of integration.&lt;/p&gt;
&lt;h3 id=&#34;sidecars-in-dapr&#34;&gt;Sidecars in DAPR&lt;/h3&gt;
&lt;p&gt;In the context of DAPR, a &amp;ldquo;sidecar&amp;rdquo; is a container that runs alongside each microservice on the same machine or pod. This container acts as an intermediary that provides DAPR capabilities to the microservice. Sidecars enable:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Service communication&lt;/strong&gt;: Facilitate service invocation and message transmission.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;State management&lt;/strong&gt;: Provide distributed state storage.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Event publishing and subscription&lt;/strong&gt;: Allow services to communicate through events.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Integration with external resources&lt;/strong&gt;: Simplify connections to databases, message queues, and other external services.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;sequence-diagram-communication-flows-in-dapr&#34;&gt;Sequence diagram: communication flows in DAPR&lt;/h4&gt;
&lt;p&gt;Below is a simplified sequence diagram illustrating how communication works in DAPR:&lt;/p&gt;
&lt;pre class=&#34;mermaid&#34;&gt;sequenceDiagram
    participant ServiceA
    participant DAPR-SidecarA
    participant DAPR-SidecarB
    participant ServiceB

    ServiceA-&amp;gt;&amp;gt;DAPR-SidecarA: Invoke ServiceB
    DAPR-SidecarA-&amp;gt;&amp;gt;DAPR-SidecarB: Forward request
    DAPR-SidecarB-&amp;gt;&amp;gt;ServiceB: Deliver request
    ServiceB-&amp;gt;&amp;gt;DAPR-SidecarB: Respond
    DAPR-SidecarB-&amp;gt;&amp;gt;DAPR-SidecarA: Forward response
    DAPR-SidecarA-&amp;gt;&amp;gt;ServiceA: Deliver response&lt;/pre&gt;
&lt;p&gt;This diagram demonstrates how DAPR sidecars facilitate communication between services, ensuring seamless interaction and abstraction of complexity.&lt;/p&gt;
&lt;h3 id=&#34;events-in-dapr&#34;&gt;Events in DAPR&lt;/h3&gt;
&lt;p&gt;DAPR uses a publish-and-subscribe model to manage events. This model allows services to communicate asynchronously and decoupled. Events in DAPR have the following characteristics:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Decoupling&lt;/strong&gt;: Event producers and consumers do not need to know each other.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Scalability&lt;/strong&gt;: The system can handle large volumes of events without affecting performance.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Compatibility with multiple brokers&lt;/strong&gt;: DAPR supports various messaging systems such as Kafka, RabbitMQ, Azure Service Bus, among others.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Ease of use&lt;/strong&gt;: Developers can define their subscriptions and publications easily through configurations.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;state-management-with-redis&#34;&gt;State management with Redis&lt;/h3&gt;
&lt;p&gt;DAPR supports state management by providing a distributed state store that can be backed by various storage solutions, including Redis. Redis is a popular in-memory data structure store that is often used for caching, session management, and real-time analytics.&lt;/p&gt;
&lt;h4 id=&#34;how-dapr-uses-redis-for-state-management&#34;&gt;How DAPR uses Redis for state management&lt;/h4&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Configuration&lt;/strong&gt;: Developers can configure DAPR to use Redis as the state store by specifying Redis connection details in the DAPR configuration file.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Key-value storage&lt;/strong&gt;: Redis allows DAPR to store and retrieve state in a key-value format, making it simple and efficient.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Persistence&lt;/strong&gt;: While Redis is primarily an in-memory store, it can persist data to disk for durability.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Scalability&lt;/strong&gt;: Redis can be scaled horizontally to handle large amounts of state data across distributed systems.&lt;/li&gt;
&lt;/ol&gt;
&lt;h5 id=&#34;example-use-case&#34;&gt;Example use case&lt;/h5&gt;
&lt;p&gt;Imagine a shopping cart application where user session data needs to be stored temporarily. DAPR can use Redis to store the cart state, ensuring fast access and updates:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Write state&lt;/strong&gt;: When a user adds an item to the cart, DAPR writes the state to Redis.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Read state&lt;/strong&gt;: When the user views the cart, DAPR retrieves the state from Redis.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Delete state&lt;/strong&gt;: When the user checks out, DAPR deletes the state from Redis.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;By leveraging Redis, DAPR ensures efficient and reliable state management for distributed applications.&lt;/p&gt;
&lt;h3 id=&#34;control-plane-in-dapr&#34;&gt;Control plane in DAPR&lt;/h3&gt;
&lt;p&gt;The control plane in DAPR is responsible for managing the overall configuration, security, and monitoring of the runtime environment. It ensures that the distributed application operates smoothly and adheres to defined policies.&lt;/p&gt;
&lt;h4 id=&#34;key-responsibilities-of-the-control-plane&#34;&gt;Key responsibilities of the control plane&lt;/h4&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Configuration management&lt;/strong&gt;: The control plane handles the configuration of DAPR components, including sidecars, building blocks, and integrations with external systems.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Policy enforcement&lt;/strong&gt;: It ensures that security policies, resource limits, and other operational rules are applied consistently across the platform.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Monitoring and observability&lt;/strong&gt;: The control plane provides tools and interfaces for monitoring the health and performance of DAPR instances and microservices.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Service discovery&lt;/strong&gt;: It facilitates the discovery of services within the distributed application, enabling seamless communication between microservices.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Scaling and resilience&lt;/strong&gt;: The control plane supports scaling operations and ensures resilience by managing failover and recovery mechanisms.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;By centralizing these responsibilities, the control plane simplifies the management of distributed applications and enhances their reliability and security.&lt;/p&gt;
&lt;h3 id=&#34;cost-implications-of-dapr&#34;&gt;Cost implications of DAPR&lt;/h3&gt;
&lt;p&gt;When adopting DAPR, it is important to consider the cost implications of its components:&lt;/p&gt;
&lt;h4 id=&#34;sidecars&#34;&gt;Sidecars&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Lightweight and efficient&lt;/strong&gt;: DAPR sidecars are designed to be lightweight, consuming minimal resources. They run alongside microservices and provide essential functionalities without adding significant overhead.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Almost free&lt;/strong&gt;: The resource usage of sidecars is negligible in most scenarios, making them an economical choice for enabling DAPR features.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;control-plane&#34;&gt;Control plane&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Resource intensive&lt;/strong&gt;: Unlike sidecars, the control plane requires dedicated resources to manage configurations, policies, monitoring, and scaling operations.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Operational costs&lt;/strong&gt;: The control plane introduces additional costs related to infrastructure, maintenance, and monitoring tools.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Scalability considerations&lt;/strong&gt;: As the platform scales, the control plane may need to be expanded to handle increased workloads, further adding to the costs. This would mean deploying new nodes in the environment, that would also mean extra charges.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The overall cost of the control plane is based on the number of nodes needed to support it. As an estimation, it would need adding 1 extra node to the current environment in the case of the production environment in Spain and 2 extra nodes in the case of the production environment in Brazil. Assuming the cost of each node of the family &lt;em&gt;&lt;strong&gt;D4as v4&lt;/strong&gt;&lt;/em&gt; is around 150 € per month (this is the raw price shown publicly in Microsoft pricing page, without any discounts and for west europe region), the monthly cost for the control plane would be approximately:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Spain: 1 nodes * 150 € = 150 € per month&lt;/li&gt;
&lt;li&gt;Brazil: 2 nodes * 150 € = 300 € per month&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Prices in June 2025 &lt;sup id=&#34;fnref:1&#34;&gt;&lt;a href=&#34;#fn:1&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;1&lt;/a&gt;&lt;/sup&gt;
&lt;img src=&#34;../../images/architecture-improvements-proposals/microsoft-vm-pricing-june2025.png&#34; alt=&#34;Microsoft VM prices&#34;&gt;&lt;/p&gt;
&lt;h2 id=&#34;conclusion&#34;&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;DAPR is a powerful tool for building distributed applications based on microservices. Its focus on &lt;strong&gt;simplicity&lt;/strong&gt;, &lt;strong&gt;portability&lt;/strong&gt;, and &lt;strong&gt;scalability&lt;/strong&gt; makes it an ideal choice for developers looking to optimize their microservices platforms. Sidecars and the event model are key components that facilitate communication and integration between services, making applications more robust and easier to maintain.&lt;/p&gt;
&lt;div class=&#34;footnotes&#34; role=&#34;doc-endnotes&#34;&gt;
&lt;hr&gt;
&lt;ol&gt;
&lt;li id=&#34;fn:1&#34;&gt;
&lt;p&gt;&lt;a href=&#34;https://azure.microsoft.com/en-us/pricing/details/virtual-machines/linux/?cdn=disable#pricing&#34;&gt;https://azure.microsoft.com/en-us/pricing/details/virtual-machines/linux/?cdn=disable#pricing&lt;/a&gt;&amp;#160;&lt;a href=&#34;#fnref:1&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;

      </description>
    </item>
    
    <item>
      <title>Docs: </title>
      <link>/docs/aura-assistant/development-architecture/architecture/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      
      <guid>/docs/aura-assistant/development-architecture/architecture/</guid>
      <description>
        
        
        &lt;h1 id=&#34;aura-development-architecture&#34;&gt;Aura development architecture&lt;/h1&gt;


&lt;div class=&#34;pageinfo pageinfo-primary&#34;&gt;
&lt;p&gt;Description of the &lt;em&gt;&lt;strong&gt;Aura Virtual Assistant&lt;/strong&gt;&lt;/em&gt; development architecture, its operation and main components&lt;/p&gt;

&lt;/div&gt;

&lt;h2 id=&#34;introduction&#34;&gt;Introduction&lt;/h2&gt;
&lt;p&gt;A bot is an application, particularly an HTTP server, that allows &lt;strong&gt;interaction with users in a conversational way&lt;/strong&gt;. Different means of interaction are available, such as text, cards with images, video or audio and speech.&lt;/p&gt;
&lt;p&gt;Users interact with the bot through a given channel, that is the final application used directly by the users. For instance, the bot can be accessible from &lt;strong&gt;Facebook&lt;/strong&gt;, &lt;strong&gt;WhatsApp&lt;/strong&gt; or from any private application, such as My O2 or Mi Movistar. Every message exchanged between the user and the bot is called an &lt;strong&gt;activity&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;In Aura distributed architecture, the user interacts directly with the root bot, here named &lt;em&gt;&lt;strong&gt;aura-groot&lt;/strong&gt;&lt;/em&gt;, and the root bot delegates some of its conversational logic to the skill &lt;em&gt;&lt;strong&gt;aura-bot&lt;/strong&gt;&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Skills and root bot communicate over HTTP using the Bot Framework protocol.&lt;/p&gt;
&lt;p&gt;Both &lt;em&gt;&lt;strong&gt;aura-bot&lt;/strong&gt;&lt;/em&gt; and &lt;em&gt;&lt;strong&gt;aura-groot&lt;/strong&gt;&lt;/em&gt; are separate bots and are published independently.&lt;/p&gt;
&lt;h3 id=&#34;main-technical-components&#34;&gt;Main technical components&lt;/h3&gt;
&lt;p&gt;The key Aura technical components that executes all the functionalities of &lt;em&gt;&lt;strong&gt;Aura Virtual Assistant&lt;/strong&gt;&lt;/em&gt; are defined below.&lt;/p&gt;
&lt;p&gt;&lt;i class=&#34;fa-solid fa-circle-info fa-xl&#34; style=&#34;color: #3267c3;&#34;&gt;&lt;/i&gt; Take into account the &lt;a href=&#34;../../docs/aura-assistant/development-architecture/#mapping-functional-architecture-with-development-architecture&#34;&gt;mapping between the functional architecture with development architecture&lt;/a&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;em&gt;&lt;strong&gt;aura-groot&lt;/strong&gt;&lt;/em&gt;&lt;br&gt;
&lt;em&gt;&lt;strong&gt;aura-groot&lt;/strong&gt;&lt;/em&gt; is the main component in charge of handling the assistant. It is responsible for the communication between each channel and its corresponding skill, keeping track of all the communication process, but introducing a minimal interference on it.&lt;/p&gt;
&lt;p&gt;&lt;i class=&#34;fa-regular fa-file-lines fa-xl&#34; style=&#34;color: #0d5de7;&#34;&gt;&lt;/i&gt; Access detailed technical documentation regarding &lt;a href=&#34;../../docs/components/aura-groot/&#34;&gt;&lt;em&gt;&lt;strong&gt;aura-groot&lt;/strong&gt;&lt;/em&gt; component&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;em&gt;&lt;strong&gt;aura-bot&lt;/strong&gt;&lt;/em&gt;&lt;br&gt;
&lt;em&gt;&lt;strong&gt;aura-bot&lt;/strong&gt;&lt;/em&gt; is a skill based on Microsoft Bot Framework that constitutes Aura&amp;rsquo;s neuronal network. It handles the requests received from &lt;em&gt;&lt;strong&gt;aura-groot&lt;/strong&gt;&lt;/em&gt; and interacts with every Aura system or component in order to provide Aura users with the intended answer or requested service.&lt;/p&gt;
&lt;p&gt;&lt;i class=&#34;fa-regular fa-file-lines fa-xl&#34; style=&#34;color: #0d5de7;&#34;&gt;&lt;/i&gt; Access detailed technical documentation regarding &lt;a href=&#34;../../docs/components/aura-bot-platform/&#34;&gt;&lt;em&gt;&lt;strong&gt;aura-bot&lt;/strong&gt;&lt;/em&gt; component&lt;/a&gt;&lt;/p&gt;
  &lt;!-- LINK!!!!!!! --&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;operational-flow&#34;&gt;Operational flow&lt;/h3&gt;
&lt;p&gt;The main stages in tasks in &lt;em&gt;&lt;strong&gt;Aura Virtual Assistant&lt;/strong&gt;&lt;/em&gt; conversational process are described below and shown in the following flowchart.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;em&gt;&lt;strong&gt;aura-groot&lt;/strong&gt;&lt;/em&gt; adapter receives activities from the user and forwards them to the &lt;em&gt;&lt;strong&gt;aura-groot&lt;/strong&gt;&lt;/em&gt; activity handler. (Activities from the user are received at the &lt;em&gt;&lt;strong&gt;aura-groot&lt;/strong&gt;&lt;/em&gt; messaging endpoint.)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The &lt;em&gt;&lt;strong&gt;aura-groot&lt;/strong&gt;&lt;/em&gt; uses a skill HTTP client to send an activity to the skill. The client gets the consumer-skill conversation information from a skill definition and a skill conversation ID factory. This includes the service URL that the skill will use to reply to the activity.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The &lt;em&gt;&lt;strong&gt;aura-bot&lt;/strong&gt;&lt;/em&gt; adapter receives activities from &lt;em&gt;&lt;strong&gt;aura-groot&lt;/strong&gt;&lt;/em&gt; and forwards them to the skill&amp;rsquo;s activity handler. (Activities from the consumer are received at the skill bot&amp;rsquo;s messaging endpoint).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;When &lt;em&gt;&lt;strong&gt;aura-bot&lt;/strong&gt;&lt;/em&gt; responds, the &lt;em&gt;&lt;strong&gt;aura-groot&lt;/strong&gt;&lt;/em&gt;s skill handler receives the activity. It gets the root-user conversation information from the skill conversation ID factory. It then forwards the activity to the &lt;em&gt;&lt;strong&gt;aura-groot&lt;/strong&gt;&lt;/em&gt;&amp;rsquo;s adapter. (Activities from the skill are received at the &lt;em&gt;&lt;strong&gt;aura-groot&lt;/strong&gt;&lt;/em&gt;&amp;rsquo;s skill host endpoint).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The &lt;em&gt;&lt;strong&gt;aura-groot&lt;/strong&gt;&lt;/em&gt; adapter sends messages from the skill to the user.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&#34;../../images/aura-groot/full-flows-only-main-blocks.svg&#34; alt=&#34;Aura Groot conversational process&#34;&gt;&lt;/p&gt;

      </description>
    </item>
    
    <item>
      <title>Docs: </title>
      <link>/docs/developers-workspace/monitoring/active-listening/architecture/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      
      <guid>/docs/developers-workspace/monitoring/active-listening/architecture/</guid>
      <description>
        
        
        &lt;h1 id=&#34;aura-analytics-200-architecture&#34;&gt;Aura Analytics 2.0.0. architecture&lt;/h1&gt;


&lt;div class=&#34;pageinfo pageinfo-primary&#34;&gt;
&lt;p&gt;Technical architecture of &lt;strong&gt;Aura Analytics 2.0.0&lt;/strong&gt; and description of main processes and components&lt;/p&gt;

&lt;/div&gt;

&lt;h2 id=&#34;architecture-overview&#34;&gt;Architecture overview&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Aura Analytics 2.0.0&lt;/strong&gt; contains two different environments:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;OB local environment&lt;/strong&gt;: Processes in this side are managed by the OB, that should install and execute certain processes related to the PPD-Creator for the creation of raw datasets.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Global environment&lt;/strong&gt;: Processes here are managed by Aura Global Team for data recovery, processing and generation of dashboards and statistics. The output includes data and metrics to be consumed by Aura Global Team for decision-making.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;aura-analytics-200-architecture-flowchart&#34;&gt;Aura Analytics 2.0.0 architecture flowchart&lt;/h3&gt;
&lt;p&gt;The following diagram shows an overview of &lt;strong&gt;Aura Analytics 2.0.0&lt;/strong&gt; architecture, including the environments involved and the main components and processes, which are fully described in succeeding sections.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;../../images/active-listening/architecture.png&#34; alt=&#34;Architecture flowchart&#34;&gt;
&lt;i&gt;Figure 1. Aura Analytics 2.0.0 Architecture flowchart&lt;/i&gt;&lt;/p&gt;
&lt;h2 id=&#34;aura-analytics-200-processes&#34;&gt;Aura Analytics 2.0.0 processes&lt;/h2&gt;
&lt;h3 id=&#34;ppd-creator-process&#34;&gt;PPD-Creator process&lt;/h3&gt;
&lt;p&gt;The PPD-Creator is a Python module for the creation of PPD-Raw datasets.&lt;/p&gt;
&lt;p&gt;It is the only component that belongs to the OB environment. The OB should install it and is responsible for its execution. The PPD-Raw datasets will be stored in the destination blob &lt;code&gt;PPD-RAW&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;This process reads the files included in &lt;code&gt;OB MANAGED INSTANCES&lt;/code&gt; columns of the tables in &lt;a href=&#34;../../docs/developers-workspace/monitoring/active-listening/annex-dataset-fields-detail/&#34;&gt;Annex: Dataset fields&lt;/a&gt;. The result of this process is the &lt;code&gt;PPD RAW&lt;/code&gt; columns of the tables in the above-mentioned annex.&lt;/p&gt;
&lt;p&gt;The main tasks executed by the PPD-Creator are summarized below:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Reads the Aura log files in a &lt;strong&gt;Kernel&lt;/strong&gt; Blob.&lt;/li&gt;
&lt;li&gt;Anonymize the sensible fields (&lt;code&gt;AuraID&lt;/code&gt;, &lt;code&gt;AuraGlobalID&lt;/code&gt;, and personal information of user sentence such as DNI, phone numbers, etc).&lt;/li&gt;
&lt;li&gt;Save the anonymized files to another directory of blob (PPD-Raw).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&#34;../../images/active-listening/ppd-creator.png&#34; alt=&#34;PPD-Creator process&#34;&gt;
&lt;i&gt;Figure 2. PPD-Creator process&lt;/i&gt;&lt;/p&gt;
&lt;p&gt;The PPD-Creator anonymizes the following data, in the different OBs:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;strong&gt;ES&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;UK&lt;/strong&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;dni&lt;/td&gt;
&lt;td&gt;creditcard&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;nie&lt;/td&gt;
&lt;td&gt;insurance&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;phone&lt;/td&gt;
&lt;td&gt;postcode&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;email&lt;/td&gt;
&lt;td&gt;imei&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;phone&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;imsi&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;email&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;twitter&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;passport&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id=&#34;manage-ppd-raw-process&#34;&gt;Manage PPD-Raw process&lt;/h3&gt;
&lt;p&gt;The Manage PPD-Raw process inserts the &lt;code&gt;PPD-Raw&lt;/code&gt; path files (output from PPD-Creator) to PostgreSQL table for files management data centric:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;It reads the output of PPD-Creator JSON file&lt;/li&gt;
&lt;li&gt;Afterwards, it saves the paths to PostgreSQL server&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&#34;../../images/active-listening/manage-ppd-raw.png&#34; alt=&#34;Manage PPD-Raw process&#34;&gt;
&lt;i&gt;Figure 3. Manage PPD-Raw process&lt;/i&gt;&lt;/p&gt;
&lt;h3 id=&#34;ppd-clean-process&#34;&gt;PPD-Clean process&lt;/h3&gt;
&lt;p&gt;The PPD-Clean is a Python package used to clean PPD-Raw datasets.&lt;/p&gt;
&lt;p&gt;Firstly, this process locates the directory where the &lt;code&gt;PPD-Raw&lt;/code&gt; files are located, reads the corresponding files and processes them.&lt;/p&gt;
&lt;p&gt;Once the process is finished, it writes to the &lt;code&gt;files_processed&lt;/code&gt; table in the database and saves them in the PPD-Clean directory.&lt;/p&gt;
&lt;p&gt;The main tasks executed by the PPD-Clean are summarized below:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Apply transformations to columns&lt;/li&gt;
&lt;li&gt;Extract the explicit frustration&lt;/li&gt;
&lt;li&gt;Calculates the Nones n-grams&lt;/li&gt;
&lt;li&gt;Save the data in Directory or blob, PostgreSQL server and ElasticSearch for visualization&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&#34;../../images/active-listening/ppd-cleaner.png&#34; alt=&#34;PPD-Clean process&#34;&gt;
&lt;i&gt;Figure 4. PPD-Clean process&lt;/i&gt;&lt;/p&gt;
&lt;h3 id=&#34;user-dynamics-process&#34;&gt;User Dynamics process&lt;/h3&gt;
&lt;p&gt;User dynamics is a script used to measure the user’s behavior through metrics. It extracts statistics on the recurrence of users in Aura in a monthly basis.&lt;/p&gt;
&lt;p&gt;The processes executed are summarized below:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;User dynamics reads the &lt;code&gt;file_processed&lt;/code&gt; table of the database and the all &lt;code&gt;PPD-Clean&lt;/code&gt; files stored for 1 month.&lt;/li&gt;
&lt;li&gt;It extracts metrics regarding new users, recurrent users, lost users and recovered users.&lt;/li&gt;
&lt;li&gt;Afterwards, it saves these metrics in the &lt;code&gt;User_dynamics&lt;/code&gt; schema, in a PostgreSQL database, within the tables &lt;code&gt;connections&lt;/code&gt;, &lt;code&gt;daycount&lt;/code&gt;, &lt;code&gt;user&lt;/code&gt; and &lt;code&gt;channel&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Data is also saved in ElasticSearch.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&#34;../../images/active-listening/user-dynamics.png&#34; alt=&#34;User Dynamics process&#34;&gt;
&lt;i&gt;Figure 5. User Dynamics process&lt;/i&gt;&lt;/p&gt;
&lt;h2 id=&#34;components&#34;&gt;Components&lt;/h2&gt;
&lt;h3 id=&#34;active-listening-database&#34;&gt;Active Listening Database&lt;/h3&gt;
&lt;p&gt;The Active Listening Database is a PostgreSQL database that stores the processed and to-process files centrally in one place. It is used by the PPD-Clean and User Dynamics processes to store the processed data and metrics.&lt;/p&gt;
&lt;h4 id=&#34;schema-files-management&#34;&gt;Schema files management&lt;/h4&gt;
&lt;p&gt;Currently, in the Active Listening project, we have input and output files for each of the processes and files that are processed. With the proposed database solution through the files management database, a more efficient management of raw files is achieved:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The PPD-Creator process transfers files from the OB to a shared blob.&lt;/li&gt;
&lt;li&gt;The transferred files are written to a file in that blob called &lt;code&gt;aura-sync-cache-dst.json&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;The &lt;strong&gt;manage_ppd_raw&lt;/strong&gt; process will read the &lt;code&gt;aura-sync-cache-dst.json&lt;/code&gt; file from the PPD-Raw folder and ingest the records into the &lt;code&gt;FILE_PPD_RAW&lt;/code&gt; table of the database.&lt;/li&gt;
&lt;li&gt;It will also insert into the &lt;code&gt;EMPTY_DATA_FILES&lt;/code&gt; table the days that are not found in the JSON file. This table is necessary for logging metrics in Prometheus. This process will run daily.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&#34;../../images/active-listening/files-management-db.png&#34; alt=&#34;files management db&#34;&gt;
&lt;i&gt;Figure 6. Files management database&lt;/i&gt;&lt;/p&gt;
&lt;h4 id=&#34;schema-user-dynamics&#34;&gt;Schema user dynamics&lt;/h4&gt;
&lt;p&gt;The User Dynamics process generates the statistics of Aura users, number of daily active users and types of users, with 4 categories: new, recurring, lost and recovered.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The Channel table contains all the channels in Aura that have been processed by the User Dynamics process.&lt;/li&gt;
&lt;li&gt;The &lt;code&gt;User&lt;/code&gt; table contains the unique Aura users in each environment and country.&lt;/li&gt;
&lt;li&gt;The &lt;code&gt;Daycount&lt;/code&gt; table contains the number of total users for each day, indicating how many of them are new, recurring, recovered or lost users, the number of weekly unique recurring users and the number of monthly unique recurring users.&lt;/li&gt;
&lt;li&gt;The &lt;code&gt;Connection&lt;/code&gt; table has the status of the user for each day (whether it is new, recurring, lost or recovered).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&#34;../../images/active-listening/user-dynamics-db.png&#34; alt=&#34;user dynamics db&#34;&gt;&lt;br&gt;
&lt;i&gt;Figure 7. User dynamics database&lt;/i&gt;&lt;/p&gt;
&lt;h3 id=&#34;aura-analytics-dashboard&#34;&gt;Aura Analytics Dashboard&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Aura Analytics 2.0.0&lt;/strong&gt; produces as a result, among other elements, an analytics component named &lt;strong&gt;Aura Analytics Dashboard&lt;/strong&gt; that is the one used by Aura Global Team to gather statistics on the production system and to analyze user&amp;rsquo;s behavior.&lt;/p&gt;
&lt;p&gt;This Analytics Dashboard is based on the &lt;a href=&#34;https://www.elastic.co/what-is/elk-stack&#34;&gt;ELK stack&lt;/a&gt; that contains:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;ElasticSearch&lt;/strong&gt;: distributed search and analytics engine at the heart of the Elastic Stack. It allows the storage of data and its subsequent indexing, search and analysis.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Kibana&lt;/strong&gt;: provides a visualization tool that includes dashboards and panels created over the ElasticSearch data. Users interactively explore, visualize and share insights into data and manage and monitor the stack.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Once installed:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;An ElasticSearch index is created. It is called &lt;code&gt;aura-ppd-ENTITY-COUNTRY-YEAR&lt;/code&gt;, and its index schema contains a cleaned version of the &lt;code&gt;AURA MESSAGE&lt;/code&gt;, &lt;code&gt;RECOGNIZER&lt;/code&gt; or &lt;code&gt;API&lt;/code&gt; tables (which registers input and output messages).&lt;/li&gt;
&lt;li&gt;A Kibana index pattern is created, matching the uploaded ElasticSearch index.&lt;/li&gt;
&lt;li&gt;A pre-defined set of visualizations are installed in Kibana over that index pattern, as a means to get a default peek on the index data. See the section &lt;a href=&#34;../../docs/developers-workspace/monitoring/active-listening/analytics-dashboard/#pre-installed-analytics-dashboard&#34;&gt;pre-installed analytics dashboard&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;The system automatically ingests any new clean PPD being produced in the ElasticSearch database, so that the index and dashboards remain up to date.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;In principle, the PPD creation process specifies daily production, since Aura logs are sent to &lt;strong&gt;Kernel&lt;/strong&gt; once a day. This means that information about Aura behavior and user actions on one given day will be available in the dashboards of the following day.&lt;/p&gt;
&lt;p&gt;&lt;i class=&#34;fa-solid fa-triangle-exclamation fa-xl&#34; style=&#34;color: #f45815;&#34;&gt;&lt;/i&gt; As mentioned above, &lt;strong&gt;the Aura Analytics Dashboard is conceived to be used by Aura Global Team&lt;/strong&gt;. However, OBs can install locally the ELK stack or any other visualization tool for data consumption. Access to the document &lt;a href=&#34;../../docs/developers-workspace/monitoring/active-listening/guidelines-obs/#local-data-visualization-optional&#34;&gt;Local data visualization&lt;/a&gt; for further details.&lt;/p&gt;

      </description>
    </item>
    
    <item>
      <title>Docs: </title>
      <link>/docs/developers-workspace/monitoring/aura-analytics/architecture/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      
      <guid>/docs/developers-workspace/monitoring/aura-analytics/architecture/</guid>
      <description>
        
        
        &lt;h1 id=&#34;aura-analytics-11-architecture&#34;&gt;Aura Analytics 1.1. architecture&lt;/h1&gt;


&lt;div class=&#34;pageinfo pageinfo-primary&#34;&gt;
&lt;p&gt;Technical architecture of Aura Analytics 1.1.&lt;/p&gt;

&lt;/div&gt;

&lt;h2 id=&#34;architecture-description&#34;&gt;Architecture description&lt;/h2&gt;
&lt;p&gt;The following figure shows a full overview of Aura Analytics Dashboard architecture and operation, which is also described below:&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;../../images/developers-workspace/monitoring/aura-analytics/architecture.jpg&#34; alt=&#34;Aura Analytics architecture&#34;&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt; Aura logs generated in local instance are converted to datasets and transferred to local &lt;strong&gt;Kernel&lt;/strong&gt; via the standard procedure and with the established frequency (typically, daily).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt; Once there, the “Active listening” process flow fires up daily. Through a specialized process that runs on an Aura local instance and with access to the stored datasets in the &lt;strong&gt;Kernel&lt;/strong&gt; local storage space:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;PII (Personally Identifiable Information) is removed or encrypted.&lt;/li&gt;
&lt;li&gt;The result is transferred to a bucket/blob set up for this task and managed by Global Aura team.&lt;/li&gt;
&lt;li&gt;Here, the PPDs (Privacy-Preserving Datasets) are created. Currently, only &lt;code&gt;MESSAGE&lt;/code&gt;, &lt;code&gt;RECOGNIZER&lt;/code&gt; and API datasets are involved in this process.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;In order to convert PII data to PPD, every field in these datasets can be:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;a. Not transferred.&lt;/li&gt;
&lt;li&gt;b. Pseudo-anonymized. In this situation, the field is transformed through a cryptographic hashing process using a &lt;em&gt;secret&lt;/em&gt; set up by  the OB.&lt;/li&gt;
&lt;li&gt;c. Anonymized fragments of the field (e.g., credit card number, email, etc.). The field is processed to detect specific patterns and replaces them with a specific tag (&lt;code&gt;idemail&lt;/code&gt;, &lt;code&gt;idpassport&lt;/code&gt;, etc.). The list of anonymization strings is agreed with each OB.&lt;/li&gt;
&lt;li&gt;d. Transferred as is.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt; After that, the &lt;strong&gt;Raw PPD Datasets&lt;/strong&gt; stored in bucket/blog managed by the Global Team are processed generating clean PPD Datasets in order to adapt them to the analytics tools.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt; From that space, the clean PPD Datasets can be:&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Accessed by the Aura Global Team that use them for several tasks, with the purpose of evaluating Aura quality and taking the best decisions regarding to product evolution:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Perform analytics on Aura behavior and prototype Analytics Dashboard features&lt;/li&gt;
&lt;li&gt;Improve Aura Platform capabilities (e.g., adapting machine learning models)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Accessed by a Local Aura Team, ingesting the data to a dedicated server managed by the OB with analytics and data visualization capabilities. In order to do that, the Aura Global Team provides a component with the &lt;strong&gt;ELK (elasticsearch, logstash &amp;amp; kibana)&lt;/strong&gt; preconfigured with a set of dashboards that can be deployed and adapted by the OB team.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;i class=&#34;fa-regular fa-file-lines fa-xl&#34; style=&#34;color: #0d5de7;&#34;&gt;&lt;/i&gt;  All the code involved in this process can be found in &lt;a href=&#34;https://github.com/Telefonica/aura-log-processing/tree/master/kpi&#34;&gt;Github&lt;/a&gt;. Particularly:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://github.com/Telefonica/aura-log-processing/tree/master/kpi/ppd-creator&#34;&gt;PPD RAW creation package&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://github.com/Telefonica/aura-log-processing/tree/master/kpi/ppd-cleaner&#34;&gt;Conversion from PPD RAW to PPD Clean&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://github.com/Telefonica/aura-log-processing/blob/master/kpi/ppd-creator/src/ppd_creator/kpi_utils.py#L113&#34;&gt;Pseudo-anonymization function for identifiers&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://github.com/Telefonica/aura-log-processing/tree/master/kpi/ppd-creator/src/ppd_creator/colproc/utanon&#34;&gt;Utterance anonymization&lt;/a&gt; (agreed individually for ES and UK)&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;

      </description>
    </item>
    
    <item>
      <title>Docs: </title>
      <link>/docs/atria/technical-components/agents-manager/components/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      
      <guid>/docs/atria/technical-components/agents-manager/components/</guid>
      <description>
        
        
        &lt;h1 id=&#34;agents-manager-architecture-and-components&#34;&gt;Agents Manager architecture and components&lt;/h1&gt;


&lt;div class=&#34;pageinfo pageinfo-primary&#34;&gt;
&lt;p&gt;Development architecture and technical components of the &lt;em&gt;&lt;strong&gt;agents-manager&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;

&lt;/div&gt;

&lt;h2 id=&#34;technical-foundations&#34;&gt;Technical foundations&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;&lt;strong&gt;agents-manager&lt;/strong&gt;&lt;/em&gt; is mainly a web server built on &lt;a href=&#34;https://www.typescriptlang.org/&#34;&gt;Typescript&lt;/a&gt; using &lt;a href=&#34;https://nodejs.org/en/&#34;&gt;nodejs&lt;/a&gt; as engine. It is &lt;a href=&#34;https://swagger.io/resources/articles/adopting-an-api-first-approach/#:~:text=An%20API%2Dfirst%20approach%20means,be%20consumed%20by%20client%20applications&#34;&gt;api-first designed&lt;/a&gt;, using &lt;a href=&#34;https://swagger.io/specification/&#34;&gt;OpenAPI v3&lt;/a&gt; to provide the API definition and &lt;a href=&#34;https://www.npmjs.com/package/openapi-backend&#34;&gt;openapi-backend&lt;/a&gt; to handle swagger specification.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&lt;strong&gt;agents-manager&lt;/strong&gt;&lt;/em&gt; server is composed by several &lt;a href=&#34;../../docs/atria/technical-components/agents-manager/components/plugins/&#34;&gt;plugins&lt;/a&gt;, which provide different functionalities to this component.&lt;/p&gt;
&lt;p&gt;A channel, service, or skill uses an &lt;em&gt;&lt;strong&gt;application&lt;/strong&gt;&lt;/em&gt; to connect with &lt;em&gt;&lt;strong&gt;agents-manager&lt;/strong&gt;&lt;/em&gt; following this &lt;a href=&#34;../../docs/atria/technical-components/agents-manager/communication-protocol/&#34;&gt;communication protocol&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&#34;architecture-overview&#34;&gt;Architecture overview&lt;/h2&gt;
&lt;p&gt;The following figure shows the main technical components of the &lt;em&gt;&lt;strong&gt;agents-manager&lt;/strong&gt;&lt;/em&gt;, which are described below.&lt;/p&gt;
&lt;p align=&#34;center&#34;&gt;
  &lt;img width=&#34;500&#34; height=&#34;500&#34; src=&#34;../../images/agents-manager/agents-manager-components.png&#34;&gt;&lt;br&gt;
  &lt;i&gt;agents-manager components&lt;/i&gt;
&lt;/p&gt;
&lt;h3 id=&#34;configurationmanager&#34;&gt;ConfigurationManager&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;ConfigurationManager&lt;/code&gt; is a handler for configuration, obtained through a configuration file or environment variables.&lt;/p&gt;
&lt;h3 id=&#34;redisconnector&#34;&gt;RedisConnector&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;RedisConnector&lt;/code&gt; is a handler connection to Redis.&lt;/p&gt;
&lt;h3 id=&#34;http-server&#34;&gt;HTTP server&lt;/h3&gt;
&lt;p&gt;Microservice is implemented as an HTTP server (&lt;code&gt;AuraServer&lt;/code&gt;) that exposes an API to receive the request to be validated.&lt;/p&gt;
&lt;h3 id=&#34;middlewares&#34;&gt;Middlewares&lt;/h3&gt;
&lt;p&gt;The route published in the API definition file is handled by a controller but, before a request lands on its controller, it goes through a series of middlewares that provides some common steps needed by all the controllers of the server such as: request validation, common parameters extraction, logging, metrics initialization, etc.&lt;/p&gt;
&lt;h3 id=&#34;controllers-and-services&#34;&gt;Controllers and Services&lt;/h3&gt;
&lt;p&gt;&lt;em&gt;&lt;strong&gt;agents-manager&lt;/strong&gt;&lt;/em&gt; is composed of plugins, which provide functionality and uses specific modules from &lt;em&gt;&lt;strong&gt;aura-configuration-api&lt;/strong&gt;&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Check the available plugins together with detailed information in: &lt;a href=&#34;../../docs/atria/technical-components/agents-manager/components/plugins/&#34;&gt;&lt;em&gt;&lt;strong&gt;agents-manager&lt;/strong&gt;&lt;/em&gt; plugins&lt;/a&gt;.&lt;/p&gt;

      </description>
    </item>
    
    <item>
      <title>Docs: </title>
      <link>/docs/atria/technical-components/agents-server/components/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      
      <guid>/docs/atria/technical-components/agents-server/components/</guid>
      <description>
        
        
        &lt;h1 id=&#34;agents-server-architecture-and-components&#34;&gt;Agents Server architecture and components&lt;/h1&gt;


&lt;div class=&#34;pageinfo pageinfo-primary&#34;&gt;
&lt;p&gt;Development architecture and technical components of the &lt;em&gt;&lt;strong&gt;agents-server&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;

&lt;/div&gt;

&lt;h2 id=&#34;technical-foundations&#34;&gt;Technical foundations&lt;/h2&gt;
&lt;p&gt;The &lt;em&gt;&lt;strong&gt;agents-server&lt;/strong&gt;&lt;/em&gt; component will start a server that listens for incoming requests and executes the agent&amp;rsquo;s tasks based on the received input.&lt;/p&gt;
&lt;p&gt;The server can be configured to use an agent by specifying the agent package name.&lt;/p&gt;
&lt;p&gt;This server creates a REST API that can be used to interact with different agents. The API allows sending requests to the agent and receiving responses.&lt;/p&gt;
&lt;p&gt;Within the &lt;em&gt;&lt;strong&gt;agents-server&lt;/strong&gt;&lt;/em&gt;, the &lt;em&gt;&lt;strong&gt;agents package&lt;/strong&gt;&lt;/em&gt; component enables information processing tasks to be performed and acted upon to achieve specific objectives. This information can come from a database and respond to the user&amp;rsquo;s request based on that acquired information.&lt;/p&gt;
&lt;h2 id=&#34;architecture-overview&#34;&gt;Architecture overview&lt;/h2&gt;
&lt;p&gt;The following figure shows the main technical components of the &lt;em&gt;&lt;strong&gt;agents-server&lt;/strong&gt;&lt;/em&gt;, which are described below.&lt;/p&gt;
&lt;p align=&#34;center&#34;&gt;
  &lt;img width=&#34;500&#34; height=&#34;500&#34; src=&#34;../../images/agents-server/agents-server-components.png&#34;&gt;&lt;br&gt;
  &lt;i&gt;agents-server components&lt;/i&gt;
&lt;/p&gt;
&lt;h3 id=&#34;http-server&#34;&gt;HTTP server&lt;/h3&gt;
&lt;p&gt;Microservice is implemented as an HTTP server (&lt;a href=&#34;https://fastapi.tiangolo.com&#34;&gt;fastapi&lt;/a&gt;) that exposes an API to receive the request to be validated.&lt;/p&gt;
&lt;h3 id=&#34;config-api-handler&#34;&gt;Config Api Handler&lt;/h3&gt;
&lt;p&gt;The &lt;em&gt;&lt;strong&gt;agents-server&lt;/strong&gt;&lt;/em&gt; uses the &lt;em&gt;&lt;strong&gt;aura-configuration-api&lt;/strong&gt;&lt;/em&gt; to get the configuration of the agent.
This handler is responsible for retrieving the configuration of the agent from the &lt;em&gt;&lt;strong&gt;aura-configuration-api&lt;/strong&gt;&lt;/em&gt; and providing it to the server.&lt;/p&gt;
&lt;h3 id=&#34;configurationmanager&#34;&gt;ConfigurationManager&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;ConfigurationManager&lt;/code&gt; is a handler for configuration, obtained through a configuration file or environment variables.&lt;/p&gt;
&lt;h3 id=&#34;agents-package&#34;&gt;Agents Package&lt;/h3&gt;
&lt;p&gt;The server is configured to use the agent of a specific agent package name. This package contains the agent&amp;rsquo;s code and its dependencies. The server will load the agent package and use it to execute the agent&amp;rsquo;s tasks.&lt;/p&gt;
&lt;h3 id=&#34;event-subscribers&#34;&gt;Event Subscribers&lt;/h3&gt;
&lt;p&gt;Event subscribers are implementations for managing event registration and handling in the &lt;em&gt;&lt;strong&gt;agents-server&lt;/strong&gt;&lt;/em&gt;. They allow the server to listen for events and trigger actions based on those events.&lt;/p&gt;
&lt;h4 id=&#34;redis-async-subscriber&#34;&gt;Redis Async Subscriber&lt;/h4&gt;
&lt;p&gt;&lt;code&gt;RedisAsyncSubscriber&lt;/code&gt; is a handler for subscribing to Redis channels asynchronously. It allows the server to receive messages from Redis and process them in real time.&lt;/p&gt;
&lt;h4 id=&#34;dapr-async-subscriber&#34;&gt;DAPR Async Subscriber&lt;/h4&gt;
&lt;p&gt;&lt;code&gt;DaprAsyncSubscriber&lt;/code&gt; is a handler for subscribing to DAPR topics asynchronously. It allows the server to receive messages from DAPR and process them in real time.&lt;/p&gt;

      </description>
    </item>
    
    <item>
      <title>Docs: </title>
      <link>/docs/atria/technical-components/aura-gateway-api/components/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      
      <guid>/docs/atria/technical-components/aura-gateway-api/components/</guid>
      <description>
        
        
        &lt;h1 id=&#34;aura-gateway-api-architecture-and-components&#34;&gt;Aura Gateway API architecture and components&lt;/h1&gt;


&lt;div class=&#34;pageinfo pageinfo-primary&#34;&gt;
&lt;p&gt;Development architecture and technical components of Aura Gateway API&lt;/p&gt;

&lt;/div&gt;

&lt;h2 id=&#34;technical-foundations&#34;&gt;Technical foundations&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;&lt;strong&gt;aura-gateway-api&lt;/strong&gt;&lt;/em&gt; is mainly a web server built on &lt;a href=&#34;https://www.typescriptlang.org/&#34;&gt;Typescript 4.3&lt;/a&gt; using &lt;a href=&#34;https://nodejs.org/en/&#34;&gt;nodejs&lt;/a&gt; as engine. It is &lt;a href=&#34;https://swagger.io/resources/articles/adopting-an-api-first-approach/#:~:text=An%20API%2Dfirst%20approach%20means,be%20consumed%20by%20client%20applications&#34;&gt;api-first designed&lt;/a&gt;, using &lt;a href=&#34;https://swagger.io/specification/&#34;&gt;OpenAPI v3&lt;/a&gt; to provide the API definition and &lt;a href=&#34;https://www.npmjs.com/package/openapi-backend&#34;&gt;openapi-backend&lt;/a&gt; to handle swagger specification.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&lt;strong&gt;aura-gateway-api&lt;/strong&gt;&lt;/em&gt; server is composed by several &lt;a href=&#34;../../docs/atria/technical-components/aura-gateway-api/components/plugins/&#34;&gt;plugins&lt;/a&gt;, which provide different functionalities to this component. From the different &lt;a href=&#34;../../docs/atria/capabilities/&#34;&gt;capabilities&lt;/a&gt; that &lt;em&gt;&lt;strong&gt;aura-gateway-api&lt;/strong&gt;&lt;/em&gt; can manage, certain plugins are used by all of them and others are specific of one capability.&lt;/p&gt;
&lt;p&gt;A channel, service, or skill uses an &lt;em&gt;&lt;strong&gt;application&lt;/strong&gt;&lt;/em&gt; to connect with &lt;em&gt;&lt;strong&gt;aura-gateway-api&lt;/strong&gt;&lt;/em&gt; following this &lt;a href=&#34;../../docs/atria/technical-components/aura-gateway-api/communication-protocol/&#34;&gt;communication protocol&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&#34;architecture-overview&#34;&gt;Architecture overview&lt;/h2&gt;
&lt;p&gt;The following figure shows the main technical components of the &lt;em&gt;&lt;strong&gt;aura-gateway-api&lt;/strong&gt;&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;../../images/aura-gateway-api/aura-gateway-api-components.png&#34; alt=&#34;Architecture diagram&#34;&gt;&lt;/p&gt;
&lt;h3 id=&#34;configurationmanager&#34;&gt;ConfigurationManager&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;ConfigurationManager&lt;/code&gt; is a handler for configuration, obtained through a configuration file or environment variables.&lt;/p&gt;
&lt;h3 id=&#34;redisconnector&#34;&gt;RedisConnector&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;RedisConnector&lt;/code&gt; is a handler connection to redis.&lt;/p&gt;
&lt;h3 id=&#34;kpis-handler&#34;&gt;Kpis-handler&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;KpisHandler&lt;/code&gt; is the module responsible for writing the KPIs entities.&lt;/p&gt;
&lt;h3 id=&#34;http-server&#34;&gt;HTTP server&lt;/h3&gt;
&lt;p&gt;Microservice is implemented as an HTTP server (&lt;code&gt;AuraGatewayServer&lt;/code&gt;) that exposes an API to receive the request to be validated.&lt;/p&gt;
&lt;h3 id=&#34;middlewares&#34;&gt;Middlewares&lt;/h3&gt;
&lt;p&gt;The route published in the API definition file is handled by a controller but, before a request lands on its controller, it goes through a series of middlewares that provides some common steps needed by all the controllers of the server such as: request validation, common parameters extraction, logging, metrics initialization, etc.&lt;/p&gt;
&lt;h3 id=&#34;plugins&#34;&gt;Plugins&lt;/h3&gt;
&lt;p&gt;Different plugins provide functionality to &lt;em&gt;&lt;strong&gt;aura-gateway-api&lt;/strong&gt;&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Check the available ones together with detailed information in: &lt;a href=&#34;../../docs/atria/technical-components/aura-gateway-api/components/plugins/&#34;&gt;&lt;em&gt;&lt;strong&gt;aura-gateway-api&lt;/strong&gt;&lt;/em&gt; plugins&lt;/a&gt;.&lt;/p&gt;

      </description>
    </item>
    
    <item>
      <title>Docs: </title>
      <link>/docs/components/aura-context/aura-context-architecture/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      
      <guid>/docs/components/aura-context/aura-context-architecture/</guid>
      <description>
        
        
        &lt;h1 id=&#34;aura-context-architecture-and-operation&#34;&gt;Aura Context architecture and operation&lt;/h1&gt;


&lt;div class=&#34;pageinfo pageinfo-primary&#34;&gt;
&lt;p&gt;Discover &lt;em&gt;&lt;strong&gt;Aura Context&lt;/strong&gt;&lt;/em&gt; functional architecture and its operational process&lt;/p&gt;

&lt;/div&gt;

&lt;h2 id=&#34;functional-architecture&#34;&gt;Functional architecture&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;&lt;strong&gt;Aura Context&lt;/strong&gt;&lt;/em&gt; v1 functional architecture contains the following components:&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;../../images/aura-context/aura-context-architecture.png&#34; alt=&#34;Aura Context architecture&#34;&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Context broker &amp;amp; server API&lt;/strong&gt;&lt;br&gt;
Server API in &lt;em&gt;&lt;strong&gt;Aura Context&lt;/strong&gt;&lt;/em&gt; for uploading, updating and recovering context data by different Aura sub-systems.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Aura Context Service&lt;/strong&gt;&lt;br&gt;
Core module of &lt;em&gt;&lt;strong&gt;Aura Context&lt;/strong&gt;&lt;/em&gt; in charge of gathering data from the context API, uploading it into de context database and data recovery.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Aura Context cache/database&lt;/strong&gt;&lt;br&gt;
Temporary high-performance database placed inside the Aura instance that is able to storage user&amp;rsquo;s data corresponding to the user&amp;rsquo;s previous experiences or environment. Data is available in the context database for a limited period of time and it cannot be recovered once this period expires.&lt;br&gt;
The key features of &lt;em&gt;&lt;strong&gt;Aura Context&lt;/strong&gt;&lt;/em&gt; database are shown below:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;360 approach: &lt;em&gt;&lt;strong&gt;Aura Context&lt;/strong&gt;&lt;/em&gt; aims to gather all type of information from an Aura interaction, including data coming from channels.&lt;/li&gt;
&lt;li&gt;High-available database: real-time recovery during the user&amp;rsquo;s interaction, with no lateness.&lt;/li&gt;
&lt;li&gt;Temporary data storage: data available only for an established period of time.&lt;/li&gt;
&lt;li&gt;Data persistence in &lt;strong&gt;Kernel&lt;/strong&gt; for historical data exploitation purposes.&lt;br&gt;
&lt;br&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Context Kernel persistence mechanism&lt;/strong&gt;&lt;br&gt;
First basic version of the &lt;strong&gt;Kernel&lt;/strong&gt; persistence mechanism. Within a one-direction flow, context data stored in the database is sent to &lt;strong&gt;Kernel&lt;/strong&gt; for an unlimited period of time. Data on &lt;strong&gt;Kernel&lt;/strong&gt; can be checked or processed following the same procedure as for Aura data.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;aura-context-performance&#34;&gt;Aura Context performance&lt;/h2&gt;
&lt;p&gt;The following steps schematically shows the process carried out by &lt;em&gt;&lt;strong&gt;Aura Context&lt;/strong&gt;&lt;/em&gt;:&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;../../images/aura-context/aura-context-interactions.png&#34; alt=&#34;Interaction Aura Context with Aura modules&#34;&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Context data is sent to &lt;strong&gt;Kernel&lt;/strong&gt; where it is stored for an unlimited period of time.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;This information can be retrieved by an external stakeholder just by calling the corresponding API.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Developers can consume data in the &lt;em&gt;&lt;strong&gt;Aura Context&lt;/strong&gt;&lt;/em&gt; database when developing a use case. For this purpose, the &lt;em&gt;&lt;strong&gt;aura-bot&lt;/strong&gt;&lt;/em&gt; dialog must call the corresponding API in order to retrieve context data and include it in the response to the user.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;aura-context-operational-flowchart&#34;&gt;Aura Context operational flowchart&lt;/h2&gt;
&lt;p&gt;&lt;i class=&#34;fa-solid fa-triangle-exclamation fa-xl&#34; style=&#34;color: #f45815;&#34;&gt;&lt;/i&gt; Before facing this section, it is recommended to read the document &lt;a href=&#34;../../docs/components/aura-context/aura-context-components/&#34;&gt;Aura Context components&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Considering the &lt;em&gt;&lt;strong&gt;Aura Context&lt;/strong&gt;&lt;/em&gt; components, the following flowchart shows the operational process carried out by the context:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;An external component makes a request to &lt;em&gt;&lt;strong&gt;Aura Context&lt;/strong&gt;&lt;/em&gt; API (POST HTTP request) for carrying out a specific operation:
&lt;ul&gt;
&lt;li&gt;Create: creation of a data entry in &lt;em&gt;&lt;strong&gt;Aura Context&lt;/strong&gt;&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;Upsert: modification of a data entry in &lt;em&gt;&lt;strong&gt;Aura Context&lt;/strong&gt;&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;Fetch: data recovery from &lt;em&gt;&lt;strong&gt;Aura Context&lt;/strong&gt;&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;The context API sends the request to &lt;em&gt;&lt;strong&gt;Aura Context&lt;/strong&gt;&lt;/em&gt; service.&lt;/li&gt;
&lt;li&gt;The request transform converts input data into data suitable with the &lt;em&gt;&lt;strong&gt;Aura Context&lt;/strong&gt;&lt;/em&gt; global data model.&lt;/li&gt;
&lt;li&gt;The specific operation is performed: Create / Upsert / Fetch.&lt;/li&gt;
&lt;li&gt;Output data from the operation is converted into data compatible with the user&amp;rsquo;s data model through the response transform.&lt;/li&gt;
&lt;li&gt;The response is sent back to the context API and provided to the external component.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&#34;../../images/aura-context/aura-context-operational-flowchart.png&#34; alt=&#34;Aura Context operational flowchart&#34;&gt;&lt;/p&gt;

      </description>
    </item>
    
    <item>
      <title>Docs: </title>
      <link>/docs/components/aura-groot/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      
      <guid>/docs/components/aura-groot/</guid>
      <description>
        
        
        &lt;h1 id=&#34;aura-groot&#34;&gt;Aura Groot&lt;/h1&gt;


&lt;div class=&#34;pageinfo pageinfo-primary&#34;&gt;
&lt;p&gt;&lt;em&gt;&lt;strong&gt;aura-groot&lt;/strong&gt;&lt;/em&gt; is the router bot that manages the behavior of &lt;em&gt;&lt;strong&gt;Aura Root&lt;/strong&gt;&lt;/em&gt; ecosystem functionalities acting as a router for the request to a specific skill.&lt;br&gt;
Find in the current documents the description of this component, its architecture, components and processes.&lt;/p&gt;
&lt;p&gt;&lt;i class=&#34;fa-regular fa-bullseye fa-xl&#34; style=&#34;color: #3a13fb;&#34;&gt;&lt;/i&gt; &lt;em&gt;&lt;strong&gt;Aura Virtual Assistant&lt;/strong&gt;&lt;/em&gt; component&lt;/p&gt;

&lt;/div&gt;

&lt;h2 id=&#34;introduction&#34;&gt;Introduction&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;&lt;strong&gt;aura-groot&lt;/strong&gt;&lt;/em&gt; is the main component in charge of handling the distributed architecture of Aura. It is responsible for the communication between each channel and its corresponding skill, keeping track of all the communication process, but introducing a minimal interference on it.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&lt;strong&gt;aura-groot&lt;/strong&gt;&lt;/em&gt; main role includes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;It is the component in charge of making the decision about what is the best bot to answer the user’s request and routing the request to the corresponding skill (bot).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;It is able to map configurable input parameters such as the channel that sent the request, user type, previous requests stored in the context, utterance, etc. with a specific domain. The OB will be able to configure the parameters used for the routing process.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Currently, routing is done only by channels or group of channels (no configuration options are available).&lt;/p&gt;
&lt;h2 id=&#34;aura-groot-components&#34;&gt;Aura Groot components&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;&lt;strong&gt;aura-groot&lt;/strong&gt;&lt;/em&gt; contains two main components:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;../../docs/components/aura-groot/aura-groot-middlewares/&#34;&gt;Middlewares&lt;/a&gt;: software components in charge of the message flow.&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;../../docs/components/aura-groot/aura-groot-recognizers/&#34;&gt;Recognizers&lt;/a&gt;: specific type of middlewares that are executed in a certain stage of the message flow.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Access to the corresponding sections to find detailed information regarding these components.&lt;/p&gt;
&lt;h2 id=&#34;aura-groot-architecture&#34;&gt;Aura Groot architecture&lt;/h2&gt;
&lt;p&gt;The first diagram shows all the components running in &lt;em&gt;&lt;strong&gt;aura-groot&lt;/strong&gt;&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;../../images/aura-groot/groot-arch-diagrams-components.svg&#34; alt=&#34;Aura Groot architecture&#34;&gt;&lt;/p&gt;
&lt;p&gt;The following diagram includes the messages flow through &lt;em&gt;&lt;strong&gt;aura-groot&lt;/strong&gt;&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;../../images/aura-groot/groot-arch-diagrams-message-flow.svg&#34; alt=&#34;Aura Groot message flow&#34;&gt;&lt;/p&gt;
&lt;h2 id=&#34;aura-groot-configuration-and-operation&#34;&gt;Aura Groot configuration and operation&lt;/h2&gt;
&lt;p&gt;Find out the environment variables included in the &lt;em&gt;&lt;strong&gt;aura-groot&lt;/strong&gt;&lt;/em&gt; component &lt;a href=&#34;../../docs/components/aura-groot/environment-variables/&#34;&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The operation of &lt;em&gt;&lt;strong&gt;aura-groot&lt;/strong&gt;&lt;/em&gt; is described in the document &lt;a href=&#34;../../docs/components/aura-groot/operational-flows/&#34;&gt;Aura Groot operational flows&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&#34;conversationid-handling&#34;&gt;ConversationId handling&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;&lt;strong&gt;aura-groot&lt;/strong&gt;&lt;/em&gt; uses &lt;code&gt;groot-channel&lt;/code&gt; conversation identifier to track the conversation with the user and the use case with the skill. It is a string generated by the channel and is unique for each conversation. The &lt;code&gt;groot-channel&lt;/code&gt; is sent in the incoming request to &lt;em&gt;&lt;strong&gt;aura-groot&lt;/strong&gt;&lt;/em&gt; in the &lt;code&gt;conversationId&lt;/code&gt; field of the message object.&lt;/p&gt;
&lt;p&gt;Additionally, it adds &lt;code&gt;conversationReference&lt;/code&gt; inside. In this way, &lt;em&gt;&lt;strong&gt;aura-groot&lt;/strong&gt;&lt;/em&gt; only has to manage a single conversation and avoids synchronizing two different conversations. Doing so, accesses from &lt;em&gt;&lt;strong&gt;aura-groot&lt;/strong&gt;&lt;/em&gt; to the database are reduced.&lt;/p&gt;
&lt;p&gt;This change implies a modification in the process the BotFramework works with a conversation, in two different documents which are updated separately. But, on the contrary, the advantage is a most efficient and secure way of working.&lt;/p&gt;
&lt;pre class=&#34;mermaid&#34;&gt;sequenceDiagram
title: BEFORE-DIRE-STRAITS

    actor Channel
    participant AuraGroot #ebdff7
    participant AuraBot #ebdff7

    Channel -&amp;gt;&amp;gt; AuraGroot: request message1
    AuraGroot -&amp;gt;&amp;gt; AuraGroot: create targetSkill in groot-channel
    AuraGroot -&amp;gt;&amp;gt; AuraGroot: save conversationReference in groot-channel
    AuraGroot -&amp;gt;&amp;gt; AuraBot: request message1
    AuraBot --&amp;gt;&amp;gt; AuraGroot: response message1
    AuraGroot -&amp;gt;&amp;gt; AuraGroot: load conversationReference in groot-channel
    AuraGroot --&amp;gt;&amp;gt; Channel: response message1
    AuraBot --&amp;gt;&amp;gt; AuraGroot: response endOfConversation
    AuraGroot -&amp;gt;&amp;gt; AuraGroot: load conversationReference in groot-channel
    AuraGroot -&amp;gt;&amp;gt; AuraGroot: delete targetSkill

    Channel -&amp;gt;&amp;gt; AuraGroot: request message2
    AuraGroot -&amp;gt;&amp;gt; AuraGroot: create targetSkill in groot-channel
    AuraGroot -&amp;gt;&amp;gt; AuraGroot: save conversationReference in groot-channel
    AuraGroot -&amp;gt;&amp;gt; AuraBot: request message2
    AuraBot --&amp;gt;&amp;gt; AuraGroot: response message2
    AuraGroot -&amp;gt;&amp;gt; AuraGroot: load conversationReference in groot-channel
    AuraGroot --&amp;gt;&amp;gt; Channel: response message2
    AuraBot --&amp;gt;&amp;gt; AuraGroot: response endOfConversation
    AuraGroot -&amp;gt;&amp;gt; AuraGroot: load conversationReference in groot-channel
    AuraGroot -&amp;gt;&amp;gt; AuraGroot: delete targetSkill&lt;/pre&gt;
&lt;h2 id=&#34;aura-groot-endpoints&#34;&gt;Aura Groot endpoints&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Path&lt;/th&gt;
&lt;th&gt;Method&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;/api/messages/&lt;/td&gt;
&lt;td&gt;POST&lt;/td&gt;
&lt;td&gt;Incoming requests of channels or &lt;em&gt;&lt;strong&gt;aura-bridge&lt;/strong&gt;&lt;/em&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;/refresh/&lt;/td&gt;
&lt;td&gt;POST&lt;/td&gt;
&lt;td&gt;Update skills and channels. Data: &lt;code&gt;{&amp;quot;changes&amp;quot;: [&amp;quot;skills&amp;quot;, &amp;quot;channels&amp;quot;]}&lt;/code&gt;. You can use &amp;ldquo;skills&amp;rdquo; and/or &amp;ldquo;channels&amp;rdquo; or neither of them. In the last case, all will be updated.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;/api/skills/*&lt;/td&gt;
&lt;td&gt;POST&lt;/td&gt;
&lt;td&gt;Endpoints of Direct Line API for skills can exchange messages with &lt;em&gt;&lt;strong&gt;aura-groot&lt;/strong&gt;&lt;/em&gt;. The path where the skills will return the answers is configured in the environment variable &lt;code&gt;AURA_SKILLS_RESPONSE_PATH&lt;/code&gt;, by default, &lt;code&gt;/api/skills&lt;/code&gt;.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;/healthz&lt;/td&gt;
&lt;td&gt;GET&lt;/td&gt;
&lt;td&gt;Monitoring endpoint. Healthcheck endpoint to validate if the server is up and running, only available from local network&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;/shutdown&lt;/td&gt;
&lt;td&gt;GET&lt;/td&gt;
&lt;td&gt;Monitoring endpoint. Wait until shutdown (Kubernetes lifecycle).&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;/heapSnapshot&lt;/td&gt;
&lt;td&gt;GET&lt;/td&gt;
&lt;td&gt;Endpoint that must be called internally directly accessing to the &lt;em&gt;&lt;strong&gt;aura-groot&lt;/strong&gt;&lt;/em&gt; pod. It stores in Aura Azure Storage Account a copy of the heap memory of the pod. It is useful to debug memory leaks.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;/heapStatistics&lt;/td&gt;
&lt;td&gt;GET&lt;/td&gt;
&lt;td&gt;Endpoint that must be called internally directly accessing to the &lt;em&gt;&lt;strong&gt;aura-groot&lt;/strong&gt;&lt;/em&gt; pod. It returns the heap memory statistics of the pod.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;i class=&#34;fa-solid fa-triangle-exclamation fa-xl&#34; style=&#34;color: #f45815;&#34;&gt;&lt;/i&gt; These endpoints do not need to be defined in the plugin swagger, since they are supplied by the  &lt;em&gt;&lt;strong&gt;aura-groot&lt;/strong&gt;&lt;/em&gt; core. Specific routes are defined in &lt;a href=&#34;https://github.com/Telefonica/aura-distributed-bot/blob/main/master/packages/aura-groot/src/modules/server/routes.ts&#34;&gt;https://github.com/Telefonica/aura-distributed-bot/blob/main/master/packages/aura-groot/src/modules/server/routes.ts&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&#34;postman-collection&#34;&gt;Postman collection&lt;/h2&gt;
&lt;p&gt;Aura Platform Team has generated a Postman collection for simulations over Aura distributed architecture: &lt;a href=&#34;../../docs/developers-workspace/test-aura/postman-collections/distributed-postman/&#34;&gt;Aura distributed Postman collection&lt;/a&gt;.&lt;/p&gt;

      </description>
    </item>
    
    <item>
      <title>Docs: </title>
      <link>/docs/deployment/infraestructure/kubernetes-cluster/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      
      <guid>/docs/deployment/infraestructure/kubernetes-cluster/</guid>
      <description>
        
        
        &lt;h1 id=&#34;kubernetes-cluster&#34;&gt;Kubernetes cluster&lt;/h1&gt;


&lt;div class=&#34;pageinfo pageinfo-primary&#34;&gt;
&lt;p&gt;Description of the Kubernetes cluster: components, connection, automation, storage and more&lt;/p&gt;

&lt;/div&gt;

&lt;h2 id=&#34;introduction&#34;&gt;Introduction&lt;/h2&gt;
&lt;p&gt;The Kubernetes cluster is created on the cloud using &lt;a href=&#34;https://github.com/Azure/aks-engine&#34;&gt;aks-engine&lt;/a&gt; (Azure), the tool provided by Microsoft to generate the Azure Resource Manager templates that deploy Kubernetes cluster. This tool simplifies the cluster installation, management and upgrades.&lt;/p&gt;
&lt;p&gt;Kubernetes are internally used by the Aura Platform installer but &lt;strong&gt;they are not intended to be directly used by the Operations and Support Teams&lt;/strong&gt;. The reason is that changes made to a Kubernetes cluster that are not reflected in the Aura Platform deployment profile could be lost in a platform upgrade. For example, if you changed the instance type in a specific agent pool with Kops, you would lose the changes in a new deployment.&lt;/p&gt;
&lt;h2 id=&#34;cluster-metadata&#34;&gt;Cluster metadata&lt;/h2&gt;
&lt;p&gt;The &lt;strong&gt;cluster metadata&lt;/strong&gt; is saved in the object storage (Azure Blob Storage).&lt;/p&gt;
&lt;p&gt;&amp;#x26a0;&amp;#xfe0f; Remember that if you lose this bucket, you need to rebuild the cluster manually (Azure). It also contains critical information to access the cluster (certificates, private keys), so it must not be shared.&lt;/p&gt;
&lt;h2 id=&#34;connecting-to-kubernetes&#34;&gt;Connecting to Kubernetes&lt;/h2&gt;
&lt;p&gt;The &lt;strong&gt;kubectl&lt;/strong&gt; command-line tool is the basic tool to operate the Kubernetes cluster. It uses &lt;strong&gt;kubeconfig files&lt;/strong&gt; that contain all the required information (endpoints, certificates, etc) to connect with the Kubernetes API and manage the cluster in a secure way.&lt;/p&gt;
&lt;p&gt;A default (root) &lt;code&gt;kubeconfig&lt;/code&gt; file with full access to the cluster is created the first time you install the Aura Platform and is stored in a bucket as part of the cluster metadata.&lt;/p&gt;
&lt;p&gt;&amp;#x26a0;&amp;#xfe0f;&lt;strong&gt;Do NOT use the default &lt;code&gt;kubeconfig&lt;/code&gt; file to manage the cluster&lt;/strong&gt;. Use it to &lt;a href=&#34;../../docs/deployment/security/&#34;&gt;create new users with limited permissions&lt;/a&gt; instead.&lt;/p&gt;
&lt;!-- Dónde debe apuntar el link específicamente dentro de security? --&gt;
&lt;p&gt;By default, kubectl looks for a file named &lt;code&gt;config&lt;/code&gt; in the &lt;code&gt;$HOME/.kube&lt;/code&gt; directory. However, you can specify other kubeconfig files by setting the &lt;code&gt;KUBECONFIG&lt;/code&gt; environment variable or passing the flag &lt;code&gt;--kubeconfig&lt;/code&gt; to kubectl.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#204a87&#34;&gt;export&lt;/span&gt; &lt;span style=&#34;color:#000&#34;&gt;KUBECONFIG&lt;/span&gt;&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;=&lt;/span&gt;/path/to/kubeconfig.json  &lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;# Azure&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&amp;#x26a0;&amp;#xfe0f; For security reasons, &lt;code&gt;kubeconfig&lt;/code&gt; files are personal and must not be shared. Each action a user executes on the cluster is logged. If your &lt;code&gt;kubeconfig&lt;/code&gt; file is compromised, you must report it.&lt;/p&gt;
&lt;p&gt;&amp;#x1f4c4; You can get more information about &lt;code&gt;kubeconfig&lt;/code&gt; files at the
&lt;a href=&#34;https://kubernetes.io/docs/concepts/configuration/organize-cluster-access-kubeconfig/&#34;&gt;official Kubernetes documentation&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&amp;#x26a0;&amp;#xfe0f; Kubernetes-dashboard is not deployed in Aura cluster as we promote the &lt;strong&gt;kubectl&lt;/strong&gt; use, but if you still want to use it, you can run the dashboard in your machine and connect to the cluster with your kubeconfig as follows:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;docker run -p 9090:9090 -v &lt;span style=&#34;color:#4e9a06&#34;&gt;${&lt;/span&gt;&lt;span style=&#34;color:#000&#34;&gt;PATH_TO_YOUR_KUBECONFIG&lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;}&lt;/span&gt;/kubeconfig.json:/opt/kubeconfig.json -v /tmp:/tmp kubernetesui/dashboard:v2.2.0 --kubeconfig /opt/kubeconfig.json
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;kubernetes-automation-with-the-cloud&#34;&gt;Kubernetes automation with the Cloud&lt;/h2&gt;
&lt;p&gt;Kubernetes automates certain tasks such as creating a Load Balancer for a service or mounting a disk on a node as a persistent volume for a pod.&lt;/p&gt;
&lt;p&gt;Authentication against the cloud provider APIs is done using credentials configured automatically:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Azure&lt;/strong&gt;: by using a Service Principal with contributor role and scope for the infrastructure Resource Group.&lt;/p&gt;
&lt;p&gt;&amp;#x26a0;&amp;#xfe0f; Please &lt;strong&gt;do not change the password, delete the Service Principal or remove its Contributor role&lt;/strong&gt;   If doing so, credentials will not be automatically updated due to a known limitation of aks-engine.&lt;br&gt;
See the issue &lt;a href=&#34;https://github.com/Azure/aks-engine/issues/724&#34;&gt;Azure/aks-engine/724&lt;/a&gt; in the aks-engine repository for more information.&lt;/p&gt;
&lt;p&gt;The &amp;ldquo;Security&amp;rdquo; section describes an unofficial procedure to &lt;a href=&#34;../../docs/deployment/security/&#34;&gt;change the Service Principal credentials in Azure&lt;/a&gt; that involves a period of service disruption.&lt;/p&gt;
&lt;!-- Dónde debe apuntar el link específicamente dentro de security? --&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;kubernetes-namespaces&#34;&gt;Kubernetes Namespaces&lt;/h2&gt;
&lt;p&gt;&lt;a href=&#34;https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/&#34;&gt;Kubernates Namespaces&lt;/a&gt; are a way to divide and organize cluster resources.&lt;/p&gt;
&lt;p&gt;You can list the existing namespaces running &lt;code&gt;kubectl get namespaces&lt;/code&gt;. In Aura Platform, you will find the following ones:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Namespaces used by the Aura Platform services:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;aura-$ENV&lt;/strong&gt;: Aura Platform core services.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;aura-system&lt;/strong&gt;: Aura Platform system services (prometheus, alertmanager, node-exporter,
fluentd, elasticsearch, kube-static-metrics).&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Namespaces used by Kubernetes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;kube-system&lt;/strong&gt;: for objects created by the Kubernetes system. Aura Platform also deploys some objects into this namespace that are very tied to the infrastructure.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;kube-public&lt;/strong&gt;: readable by all users. It should be empty.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Default namespace (&lt;strong&gt;default&lt;/strong&gt;): for objects with no other namespace.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;In most situations, you will need to use &lt;strong&gt;aura-$ENV&lt;/strong&gt;. You can use the &lt;code&gt;--namespace&lt;/code&gt; flag in &lt;code&gt;kubectl&lt;/code&gt; to specify which namespace you are referring to. For example, to get the pods in the Aura Platform core:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ kubectl get pods --namespace aura-&lt;span style=&#34;color:#000&#34;&gt;$ENV&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Remember that some low-level resources, such as nodes and persistent volumes, are not in a namespace.&lt;/p&gt;
&lt;h2 id=&#34;kubernetes-objects&#34;&gt;Kubernetes objects&lt;/h2&gt;
&lt;h3 id=&#34;working-with-pods&#34;&gt;Working with pods&lt;/h3&gt;
&lt;p&gt;You can list all pods in a given namespace along with additional metadata (the node where the pod is allocated, its age, etc.):&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ kubectl get pods -n aura-&lt;span style=&#34;color:#000&#34;&gt;$ENV&lt;/span&gt; -o wide
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;NAME                                 READY   STATUS      RESTARTS   AGE
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;aog-bridge-744bbb9595-94g7n          1/1     Running     &lt;span style=&#34;color:#0000cf;font-weight:bold&#34;&gt;0&lt;/span&gt;          4h15m
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;aog-bridge-744bbb9595-pzg2l          1/1     Running     &lt;span style=&#34;color:#0000cf;font-weight:bold&#34;&gt;0&lt;/span&gt;          4h15m
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;api-gw-5c584b4c8d-hdk25              1/1     Running     &lt;span style=&#34;color:#0000cf;font-weight:bold&#34;&gt;0&lt;/span&gt;          4h15m
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;api-gw-5c584b4c8d-knm27              1/1     Running     &lt;span style=&#34;color:#0000cf;font-weight:bold&#34;&gt;0&lt;/span&gt;          4h15m
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;aura-bot-84bd44dc6d-5jdzk            1/1     Running     &lt;span style=&#34;color:#0000cf;font-weight:bold&#34;&gt;0&lt;/span&gt;          4h16m
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;aura-bot-84bd44dc6d-ktz74            1/1     Running     &lt;span style=&#34;color:#0000cf;font-weight:bold&#34;&gt;0&lt;/span&gt;          4h16m
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;aura-bot-makeup-4qrbl                0/1     Completed   &lt;span style=&#34;color:#0000cf;font-weight:bold&#34;&gt;0&lt;/span&gt;          4h16m
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;authentication-api-b849b6ff9-5t96c   1/1     Running     &lt;span style=&#34;color:#0000cf;font-weight:bold&#34;&gt;0&lt;/span&gt;          4h16m
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;authentication-api-b849b6ff9-rwcvm   1/1     Running     &lt;span style=&#34;color:#0000cf;font-weight:bold&#34;&gt;0&lt;/span&gt;          4h16m
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;nginx-5fd94584d8-tcpwd               2/2     Running     &lt;span style=&#34;color:#0000cf;font-weight:bold&#34;&gt;0&lt;/span&gt;          4h15m
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;nginx-5fd94584d8-z72tf               2/2     Running     &lt;span style=&#34;color:#0000cf;font-weight:bold&#34;&gt;0&lt;/span&gt;          4h15m
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;nlp-85b4b446cc-df2zw                 1/1     Running     &lt;span style=&#34;color:#0000cf;font-weight:bold&#34;&gt;0&lt;/span&gt;          4h16m
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;nlp-85b4b446cc-s6z5k                 1/1     Running     &lt;span style=&#34;color:#0000cf;font-weight:bold&#34;&gt;0&lt;/span&gt;          4h16m
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;nlp-provisioning-zxkk5               0/1     Completed   &lt;span style=&#34;color:#0000cf;font-weight:bold&#34;&gt;0&lt;/span&gt;          4h16m
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;user-helper-67b75cb8fc-6vkt9         1/1     Running     &lt;span style=&#34;color:#0000cf;font-weight:bold&#34;&gt;0&lt;/span&gt;          4h15m
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;user-helper-67b75cb8fc-td42l         1/1     Running     &lt;span style=&#34;color:#0000cf;font-weight:bold&#34;&gt;0&lt;/span&gt;          4h15m
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;web-sdk-5f7654b797-9npzn             1/1     Running     &lt;span style=&#34;color:#0000cf;font-weight:bold&#34;&gt;0&lt;/span&gt;          4h16m
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;web-sdk-5f7654b797-mlcrj             1/1     Running     &lt;span style=&#34;color:#0000cf;font-weight:bold&#34;&gt;0&lt;/span&gt;          4h16m
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Pods can have different statuses:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Running&lt;/li&gt;
&lt;li&gt;Completed: some pods (e.g., jobs) have a reduced lifespan. They change to completed status when they finish.
Kubernetes eventually removes them from the list of pods.&lt;/li&gt;
&lt;li&gt;Others&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;#x1f4c4; You can get more information about working with pods in the
&lt;a href=&#34;https://kubernetes.io/docs/tasks/access-application-cluster/list-all-running-container-images/&#34;&gt;Kubernetes documentation&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Each pod is configured using environment variables. They are a OS-agnostic standard that allows to change the configuration between deployments without changing any code in a very easy way.
Sensitive information (e.g., passwords) is configured using Kubernetes secrets.&lt;/p&gt;
&lt;h4 id=&#34;working-with-deployments&#34;&gt;Working with deployments&lt;/h4&gt;
&lt;p&gt;A &lt;strong&gt;deployment controller&lt;/strong&gt; provides declarative updates for Pods and ReplicaSets, according to the desired state described in a deployment object.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ kubectl get deployments
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;NAME                 READY   UP-TO-DATE   AVAILABLE   AGE
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;aog-bridge           2/2     &lt;span style=&#34;color:#0000cf;font-weight:bold&#34;&gt;2&lt;/span&gt;            &lt;span style=&#34;color:#0000cf;font-weight:bold&#34;&gt;2&lt;/span&gt;           4h16m
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;api-gw               2/2     &lt;span style=&#34;color:#0000cf;font-weight:bold&#34;&gt;2&lt;/span&gt;            &lt;span style=&#34;color:#0000cf;font-weight:bold&#34;&gt;2&lt;/span&gt;           4h16m
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;aura-bot             2/2     &lt;span style=&#34;color:#0000cf;font-weight:bold&#34;&gt;2&lt;/span&gt;            &lt;span style=&#34;color:#0000cf;font-weight:bold&#34;&gt;2&lt;/span&gt;           4h17m
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;authentication-api   2/2     &lt;span style=&#34;color:#0000cf;font-weight:bold&#34;&gt;2&lt;/span&gt;            &lt;span style=&#34;color:#0000cf;font-weight:bold&#34;&gt;2&lt;/span&gt;           4h16m
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;nginx                2/2     &lt;span style=&#34;color:#0000cf;font-weight:bold&#34;&gt;2&lt;/span&gt;            &lt;span style=&#34;color:#0000cf;font-weight:bold&#34;&gt;2&lt;/span&gt;           4h16m
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;nlp                  2/2     &lt;span style=&#34;color:#0000cf;font-weight:bold&#34;&gt;2&lt;/span&gt;            &lt;span style=&#34;color:#0000cf;font-weight:bold&#34;&gt;2&lt;/span&gt;           4h16m
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;user-helper          2/2     &lt;span style=&#34;color:#0000cf;font-weight:bold&#34;&gt;2&lt;/span&gt;            &lt;span style=&#34;color:#0000cf;font-weight:bold&#34;&gt;2&lt;/span&gt;           4h16m
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;web-sdk              2/2     &lt;span style=&#34;color:#0000cf;font-weight:bold&#34;&gt;2&lt;/span&gt;            &lt;span style=&#34;color:#0000cf;font-weight:bold&#34;&gt;2&lt;/span&gt;           4h16m
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&amp;#x2139;&amp;#xfe0f; You can get more information about working with deployments in the
&lt;a href=&#34;https://kubernetes.io/docs/concepts/workloads/controllers/deployment/&#34;&gt;Kubernetes documentation&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id=&#34;working-with-nodes&#34;&gt;Working with nodes&lt;/h3&gt;
&lt;p&gt;Nodes are the virtual machines that run Aura Platform.&lt;/p&gt;
&lt;p&gt;There are two types of nodes in any Kubernetes cluster:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Master nodes: they host the control plane aspects of the cluster. Typically, these nodes are not used to schedule application workloads.&lt;/li&gt;
&lt;li&gt;Compute nodes: nodes which are responsible for executing workloads for the platform services.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If there is an issue in the cluster, the first thing you should review is the status of the nodes.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ kubectl get nodes
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;NAME                                 STATUS   ROLES    AGE     VERSION
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;k8s-common-26582301-vmss000000       Ready    agent    7h33m   v1.13.4
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;k8s-common-26582301-vmss000001       Ready    agent    7h33m   v1.13.4
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;k8s-database-26582301-vmss000000     Ready    agent    7h33m   v1.13.4
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;k8s-database-26582301-vmss000001     Ready    agent    7h33m   v1.13.4
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;k8s-database-26582301-vmss000002     Ready    agent    7h33m   v1.13.4
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;k8s-management-26582301-vmss000000   Ready    agent    7h33m   v1.13.4
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;k8s-management-26582301-vmss000001   Ready    agent    7h33m   v1.13.4
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;k8s-management-26582301-vmss000002   Ready    agent    7h33m   v1.13.4
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;k8s-master-26582301-0                Ready    master   7h33m   v1.13.4
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;k8s-master-26582301-1                Ready    master   7h33m   v1.13.4
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;k8s-master-26582301-2                Ready    master   7h32m   v1.13.4
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;You should see three nodes with the role &amp;ldquo;master&amp;rdquo;, that is the default recommended value. An odd number of master nodes is mandatory to guarantee that &lt;code&gt;etcd&lt;/code&gt;, the service that stores the cluster status, reaches its consensus (see &lt;a href=&#34;https://etcd.io/docs/v3.3/faq/#why-an-odd-number-of-cluster-membersk&#34;&gt;&amp;ldquo;Why an odd number of cluster members&amp;rdquo; in etcd frequently asked questions&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;The normal status for a node is &amp;ldquo;Ready&amp;rdquo;, that means that the node is up and a healthy member of the Kubernetes cluster.&lt;/p&gt;
&lt;p&gt;Nodes can become &amp;ldquo;NotReady&amp;rdquo; for different reasons when something is not right. In this case, the first step is to describe the affected node and check the &amp;ldquo;Conditions&amp;rdquo; and &amp;ldquo;Events&amp;rdquo; to determine what could be wrong:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ kubectl describe node k8s-common-26582301-vmss000000
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;...
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Conditions:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  Type                 Status  LastHeartbeatTime                 LastTransitionTime                Reason                       Message
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  ----                 ------  -----------------                 ------------------                ------                       -------
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  NetworkUnavailable   False   Thu, &lt;span style=&#34;color:#0000cf;font-weight:bold&#34;&gt;04&lt;/span&gt; Jul &lt;span style=&#34;color:#0000cf;font-weight:bold&#34;&gt;2019&lt;/span&gt; 07:08:50 +0200   Thu, &lt;span style=&#34;color:#0000cf;font-weight:bold&#34;&gt;04&lt;/span&gt; Jul &lt;span style=&#34;color:#0000cf;font-weight:bold&#34;&gt;2019&lt;/span&gt; 07:08:50 +0200   RouteCreated                 RouteController created a route
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  MemoryPressure       False   Thu, &lt;span style=&#34;color:#0000cf;font-weight:bold&#34;&gt;04&lt;/span&gt; Jul &lt;span style=&#34;color:#0000cf;font-weight:bold&#34;&gt;2019&lt;/span&gt; 14:41:10 +0200   Thu, &lt;span style=&#34;color:#0000cf;font-weight:bold&#34;&gt;04&lt;/span&gt; Jul &lt;span style=&#34;color:#0000cf;font-weight:bold&#34;&gt;2019&lt;/span&gt; 07:07:06 +0200   KubeletHasSufficientMemory   kubelet has sufficient memory available
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  DiskPressure         False   Thu, &lt;span style=&#34;color:#0000cf;font-weight:bold&#34;&gt;04&lt;/span&gt; Jul &lt;span style=&#34;color:#0000cf;font-weight:bold&#34;&gt;2019&lt;/span&gt; 14:41:10 +0200   Thu, &lt;span style=&#34;color:#0000cf;font-weight:bold&#34;&gt;04&lt;/span&gt; Jul &lt;span style=&#34;color:#0000cf;font-weight:bold&#34;&gt;2019&lt;/span&gt; 07:07:06 +0200   KubeletHasNoDiskPressure     kubelet has no disk pressure
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  PIDPressure          False   Thu, &lt;span style=&#34;color:#0000cf;font-weight:bold&#34;&gt;04&lt;/span&gt; Jul &lt;span style=&#34;color:#0000cf;font-weight:bold&#34;&gt;2019&lt;/span&gt; 14:41:10 +0200   Thu, &lt;span style=&#34;color:#0000cf;font-weight:bold&#34;&gt;04&lt;/span&gt; Jul &lt;span style=&#34;color:#0000cf;font-weight:bold&#34;&gt;2019&lt;/span&gt; 07:07:06 +0200   KubeletHasSufficientPID      kubelet has sufficient PID available
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  Ready                True    Thu, &lt;span style=&#34;color:#0000cf;font-weight:bold&#34;&gt;04&lt;/span&gt; Jul &lt;span style=&#34;color:#0000cf;font-weight:bold&#34;&gt;2019&lt;/span&gt; 14:41:10 +0200   Thu, &lt;span style=&#34;color:#0000cf;font-weight:bold&#34;&gt;04&lt;/span&gt; Jul &lt;span style=&#34;color:#0000cf;font-weight:bold&#34;&gt;2019&lt;/span&gt; 07:07:20 +0200   KubeletReady                 kubelet is posting ready status. AppArmor enabled
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;...
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;With &lt;code&gt;kubectl top nodes&lt;/code&gt;, you can get a quick overview of each node CPU and memory usage. If it is not enough and you need more details about the usage of resources, go to &lt;a href=&#34;../../docs/developers-workspace/monitoring/dashboards/&#34;&gt;Grafana dashboards&lt;/a&gt; section in &lt;strong&gt;Monitor Aura&lt;/strong&gt; documentation.&lt;/p&gt;
&lt;p&gt;If a node is misbehaving, the recommended steps are:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href=&#34;https://qna.baikalplatform.com/t/how-to-drain-a-kubernetes-node/60&#34;&gt;Drain the Kubernetes node&lt;/a&gt;. This way, Kubernetes give the pods running on that node a chance to stop in an orderly way and stops scheduling new pods on it. This step is not mandatory, but recommended.&lt;/li&gt;
&lt;li&gt;Terminate the node. It is always safe to terminate one node at a time, waiting until it joins the cluster. Terminating many nodes at a time can affect the quorum of services that need to form a cluster,
so it is not recommended if the node you want to terminate contains these kind of pods.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Nodes that are cordoned appear with the status &amp;ldquo;SchedulingDisabled&amp;rdquo;:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;k8s-common-26582301-vmss000000      Ready,SchedulingDisabled   agent    ...
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Filtering nodes with &lt;code&gt;kubectl&lt;/code&gt; is very handy. For example, you can filter nodes to get those in a specific agent pool:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ kubectl get nodes -l &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#39;agentpool in (common)&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;NAME                             STATUS   ROLES   AGE     VERSION
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;k8s-common-26582301-vmss000000   Ready    agent   7h36m   v1.13.4
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;k8s-common-26582301-vmss000001   Ready    agent   7h36m   v1.13.4
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Or to get only those in a specific availability zone:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ kubectl get nodes -l &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#39;failure-domain.beta.kubernetes.io/zone in (0)&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;NAME                                 STATUS   ROLES    AGE     VERSION
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;k8s-common-26582301-vmss000000       Ready    agent    4h14m   v1.13.4
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;k8s-database-26582301-vmss000000     Ready    agent    4h14m   v1.13.4
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;k8s-management-26582301-vmss000000   Ready    agent    4h14m   v1.13.4
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;k8s-master-26582301-0                Ready    master   4h14m   v1.13.4
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;k8s-master-26582301-1                Ready    master   4h14m   v1.13.4
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;You can find information about the nodes usage in Grafana. Also, describing the nodes gives you information about how Kubernetes allocated resources on it:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ kubectl describe node k8s-common-26582301-vmss000001
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Non-terminated Pods:         &lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#0000cf;font-weight:bold&#34;&gt;13&lt;/span&gt; in total&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  Namespace                  Name                                     CPU Requests  CPU Limits  Memory Requests  Memory Limits  AGE
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  ---------                  ----                                     ------------  ----------  ---------------  -------------  ---
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  aura-es-test               aog-bridge-744bbb9595-ffbzz              100m &lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;(&lt;/span&gt;5%&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;)&lt;/span&gt;     &lt;span style=&#34;color:#0000cf;font-weight:bold&#34;&gt;1&lt;/span&gt; &lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;(&lt;/span&gt;51%&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;)&lt;/span&gt;     256Mi &lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;(&lt;/span&gt;4%&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;)&lt;/span&gt;       512Mi &lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;(&lt;/span&gt;9%&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;)&lt;/span&gt;     35m
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  aura-es-test               api-gw-5c584b4c8d-qg7bz                  100m &lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;(&lt;/span&gt;5%&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;)&lt;/span&gt;     &lt;span style=&#34;color:#0000cf;font-weight:bold&#34;&gt;1&lt;/span&gt; &lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;(&lt;/span&gt;51%&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;)&lt;/span&gt;     256Mi &lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;(&lt;/span&gt;4%&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;)&lt;/span&gt;       512Mi &lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;(&lt;/span&gt;9%&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;)&lt;/span&gt;     35m
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  aura-es-test               aura-bot-84bd44dc6d-7cc46                100m &lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;(&lt;/span&gt;5%&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;)&lt;/span&gt;     &lt;span style=&#34;color:#0000cf;font-weight:bold&#34;&gt;1&lt;/span&gt; &lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;(&lt;/span&gt;51%&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;)&lt;/span&gt;     256Mi &lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;(&lt;/span&gt;4%&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;)&lt;/span&gt;       512Mi &lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;(&lt;/span&gt;9%&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;)&lt;/span&gt;     36m
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  aura-es-test               authentication-api-b849b6ff9-pjdk6       100m &lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;(&lt;/span&gt;5%&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;)&lt;/span&gt;     &lt;span style=&#34;color:#0000cf;font-weight:bold&#34;&gt;1&lt;/span&gt; &lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;(&lt;/span&gt;51%&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;)&lt;/span&gt;     256Mi &lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;(&lt;/span&gt;4%&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;)&lt;/span&gt;       512Mi &lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;(&lt;/span&gt;9%&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;)&lt;/span&gt;     35m
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  aura-es-test               nginx-5fd94584d8-fwmcd                   600m &lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;(&lt;/span&gt;31%&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;)&lt;/span&gt;    &lt;span style=&#34;color:#0000cf;font-weight:bold&#34;&gt;2&lt;/span&gt; &lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;(&lt;/span&gt;103%&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;)&lt;/span&gt;    768Mi &lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;(&lt;/span&gt;14%&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;)&lt;/span&gt;      1Gi &lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;(&lt;/span&gt;19%&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;)&lt;/span&gt;      34m
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  aura-es-test               nlp-85b4b446cc-2dtj8                     100m &lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;(&lt;/span&gt;5%&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;)&lt;/span&gt;     &lt;span style=&#34;color:#0000cf;font-weight:bold&#34;&gt;1&lt;/span&gt; &lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;(&lt;/span&gt;51%&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;)&lt;/span&gt;     256Mi &lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;(&lt;/span&gt;4%&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;)&lt;/span&gt;       512Mi &lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;(&lt;/span&gt;9%&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;)&lt;/span&gt;     35m
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  aura-es-test               user-helper-67b75cb8fc-szmv8             100m &lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;(&lt;/span&gt;5%&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;)&lt;/span&gt;     &lt;span style=&#34;color:#0000cf;font-weight:bold&#34;&gt;1&lt;/span&gt; &lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;(&lt;/span&gt;51%&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;)&lt;/span&gt;     256Mi &lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;(&lt;/span&gt;4%&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;)&lt;/span&gt;       512Mi &lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;(&lt;/span&gt;9%&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;)&lt;/span&gt;     35m
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  aura-es-test               web-sdk-5f7654b797-jbrfg                 100m &lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;(&lt;/span&gt;5%&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;)&lt;/span&gt;     &lt;span style=&#34;color:#0000cf;font-weight:bold&#34;&gt;1&lt;/span&gt; &lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;(&lt;/span&gt;51%&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;)&lt;/span&gt;     256Mi &lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;(&lt;/span&gt;4%&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;)&lt;/span&gt;       512Mi &lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;(&lt;/span&gt;9%&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;)&lt;/span&gt;     35m
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  aura-system                fluentd-st7jb                            50m &lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;(&lt;/span&gt;2%&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;)&lt;/span&gt;      100m &lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;(&lt;/span&gt;5%&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;)&lt;/span&gt;   256Mi &lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;(&lt;/span&gt;4%&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;)&lt;/span&gt;       512Mi &lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;(&lt;/span&gt;9%&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;)&lt;/span&gt;     51m
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  aura-system                node-exporter-4mlqs                      10m &lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;(&lt;/span&gt;0%&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;)&lt;/span&gt;      50m &lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;(&lt;/span&gt;2%&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;)&lt;/span&gt;    24Mi &lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;(&lt;/span&gt;0%&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;)&lt;/span&gt;        32Mi &lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;(&lt;/span&gt;0%&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;)&lt;/span&gt;      52m
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  kube-system                kube-proxy-fnb2d                         100m &lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;(&lt;/span&gt;5%&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;)&lt;/span&gt;     &lt;span style=&#34;color:#0000cf;font-weight:bold&#34;&gt;0&lt;/span&gt; &lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;(&lt;/span&gt;0%&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;)&lt;/span&gt;      &lt;span style=&#34;color:#0000cf;font-weight:bold&#34;&gt;0&lt;/span&gt; &lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;(&lt;/span&gt;0%&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;)&lt;/span&gt;           &lt;span style=&#34;color:#0000cf;font-weight:bold&#34;&gt;0&lt;/span&gt; &lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;(&lt;/span&gt;0%&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;)&lt;/span&gt;         4h14m
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  kube-system                kubernetes-dashboard-7947fffdf5-pdrf2    300m &lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;(&lt;/span&gt;15%&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;)&lt;/span&gt;    300m &lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;(&lt;/span&gt;15%&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;)&lt;/span&gt;  150Mi &lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;(&lt;/span&gt;2%&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;)&lt;/span&gt;       150Mi &lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;(&lt;/span&gt;2%&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;)&lt;/span&gt;     4h14m
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Allocated resources:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;(&lt;/span&gt;Total limits may be over &lt;span style=&#34;color:#0000cf;font-weight:bold&#34;&gt;100&lt;/span&gt; percent, i.e., overcommitted.&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  Resource                       Requests      Limits
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  --------                       --------      ------
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  cpu                            1860m &lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;(&lt;/span&gt;96%&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;)&lt;/span&gt;   10450m &lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;(&lt;/span&gt;541%&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  memory                         3246Mi &lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;(&lt;/span&gt;62%&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;)&lt;/span&gt;  5814Mi &lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;(&lt;/span&gt;111%&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  ephemeral-storage              &lt;span style=&#34;color:#0000cf;font-weight:bold&#34;&gt;0&lt;/span&gt; &lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;(&lt;/span&gt;0%&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;)&lt;/span&gt;        &lt;span style=&#34;color:#0000cf;font-weight:bold&#34;&gt;0&lt;/span&gt; &lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;(&lt;/span&gt;0%&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  attachable-volumes-azure-disk  &lt;span style=&#34;color:#0000cf;font-weight:bold&#34;&gt;0&lt;/span&gt;             &lt;span style=&#34;color:#0000cf;font-weight:bold&#34;&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The CPU and memory limits can be over 100%. But the CPU and &lt;strong&gt;memory requests&lt;/strong&gt; cannot. This means that the resources requested by the pods also establish a limit even if they do not use the requested resources.&lt;br&gt;
If all nodes in an agent pool are full, new pods will wait in a &amp;ldquo;pending&amp;rdquo; status until the cluster autoscaler adds a new node to the agent pool.&lt;/p&gt;
&lt;h4 id=&#34;autoscaling-groups&#34;&gt;Autoscaling groups&lt;/h4&gt;
&lt;p&gt;&lt;strong&gt;Compute nodes&lt;/strong&gt;
In Azure, we use virtual machine scale set, this means that, when a node is terminated for any reason, another one will be automatically created and each agent pool corresponds to one VMSS in Azure.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Master nodes&lt;/strong&gt;
Master nodes in Azure are individual nodes that do not belong to any VMSS.
This means that, if you remove a master node in Azure, you need to run the installer again to recreate it.
For this reason, you can restart the node first and wait some minutes to verify if is able to rejoin the Kubernetes cluster.
In this case you do not need to terminate it. Remember to uncordon the node if you had cordoned it previously.&lt;/p&gt;
&lt;h3 id=&#34;horizontal-scaling-of-a-component&#34;&gt;Horizontal scaling of a component&lt;/h3&gt;
&lt;p&gt;Scaling deployments is easy using the &lt;code&gt;kubectl scale&lt;/code&gt; command. It enables you to scale one or more replicated services either up or down to the desired number of replicas.&lt;/p&gt;
&lt;p&gt;For example, you might want to scale the number of replicas of the apigw deployment to 6:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ kubectl scale deployment aura-bot --replicas&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#0000cf;font-weight:bold&#34;&gt;6&lt;/span&gt; -n aura-&lt;span style=&#34;color:#000&#34;&gt;$ENV&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Deployments contain stateless loads, so they can safely scale up and down. The only restrictions are:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;To have only one insights-loader in order to avoid race conditions trying to load insight files from the object storage.&lt;/li&gt;
&lt;li&gt;To have only one kube-state-metrics to avoid duplicated metrics in Prometheus.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The platform supports &lt;a href=&#34;https://kubernetes.io/docs/tasks/run-application/horizontal-pod-autoscale/&#34;&gt;Horizontal Pod Autoscalers&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;They have been included in some relevant services to autoscale the number of replicas based the CPU usage of a pod.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ kubectl get hpa -n aura-&lt;span style=&#34;color:#000&#34;&gt;$ENV&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;NAME                 REFERENCE                       TARGETS   MINPODS   MAXPODS   REPLICAS   AGE
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;aog-bridge           Deployment/aog-bridge           0%/150%   &lt;span style=&#34;color:#0000cf;font-weight:bold&#34;&gt;2&lt;/span&gt;         &lt;span style=&#34;color:#0000cf;font-weight:bold&#34;&gt;4&lt;/span&gt;         &lt;span style=&#34;color:#0000cf;font-weight:bold&#34;&gt;2&lt;/span&gt;          65m
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;api-gw               Deployment/api-gw               0%/150%   &lt;span style=&#34;color:#0000cf;font-weight:bold&#34;&gt;2&lt;/span&gt;         &lt;span style=&#34;color:#0000cf;font-weight:bold&#34;&gt;4&lt;/span&gt;         &lt;span style=&#34;color:#0000cf;font-weight:bold&#34;&gt;2&lt;/span&gt;          65m
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;aura-bot             Deployment/aura-bot             0%/150%   &lt;span style=&#34;color:#0000cf;font-weight:bold&#34;&gt;2&lt;/span&gt;         &lt;span style=&#34;color:#0000cf;font-weight:bold&#34;&gt;4&lt;/span&gt;         &lt;span style=&#34;color:#0000cf;font-weight:bold&#34;&gt;2&lt;/span&gt;          66m
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;authentication-api   Deployment/authentication-api   0%/150%   &lt;span style=&#34;color:#0000cf;font-weight:bold&#34;&gt;2&lt;/span&gt;         &lt;span style=&#34;color:#0000cf;font-weight:bold&#34;&gt;4&lt;/span&gt;         &lt;span style=&#34;color:#0000cf;font-weight:bold&#34;&gt;2&lt;/span&gt;          66m
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;nginx                Deployment/nginx                0%/150%   &lt;span style=&#34;color:#0000cf;font-weight:bold&#34;&gt;2&lt;/span&gt;         &lt;span style=&#34;color:#0000cf;font-weight:bold&#34;&gt;4&lt;/span&gt;         &lt;span style=&#34;color:#0000cf;font-weight:bold&#34;&gt;2&lt;/span&gt;          65m
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;nlp                  Deployment/nlp                  0%/150%   &lt;span style=&#34;color:#0000cf;font-weight:bold&#34;&gt;2&lt;/span&gt;         &lt;span style=&#34;color:#0000cf;font-weight:bold&#34;&gt;4&lt;/span&gt;         &lt;span style=&#34;color:#0000cf;font-weight:bold&#34;&gt;2&lt;/span&gt;          65m
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;user-helper          Deployment/user-helper          0%/150%   &lt;span style=&#34;color:#0000cf;font-weight:bold&#34;&gt;2&lt;/span&gt;         &lt;span style=&#34;color:#0000cf;font-weight:bold&#34;&gt;4&lt;/span&gt;         &lt;span style=&#34;color:#0000cf;font-weight:bold&#34;&gt;2&lt;/span&gt;          65m
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;web-sdk              Deployment/web-sdk              0%/150%   &lt;span style=&#34;color:#0000cf;font-weight:bold&#34;&gt;2&lt;/span&gt;         &lt;span style=&#34;color:#0000cf;font-weight:bold&#34;&gt;4&lt;/span&gt;         &lt;span style=&#34;color:#0000cf;font-weight:bold&#34;&gt;2&lt;/span&gt;          66m
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;MINPODS&lt;/strong&gt; values are set according to your deployment profile using the &lt;code&gt;service_replicas&lt;/code&gt; value for each service.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;MAXPODS&lt;/strong&gt; values are stablished as three times the value of MINPODS.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;TARGET&lt;/strong&gt; is defined as a CPU utilization threshold fixed to 80% for all platform services. According to these policies, each service will scale up/down (when needed) based on their own CPU usage metrics. Support for additional custom metrics (e.g., latencies) will be added in future releases.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This feature is very powerful in combination with the &lt;a href=&#34;#kubernetes-cluster-autoscaler&#34;&gt;cluster autoscaler&lt;/a&gt;, because once the pods created by the HPA do not fit in the available compute nodes, the cluster autoscaler will automatically add new nodes to the cluster.&lt;/p&gt;
&lt;p&gt;Regarding statefulsets, not all of them scale nicely, so it is really important to understand them well to be able to scale them safely.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ kubectl get statefulsets --namespace aura-system
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;NAME                    READY   AGE
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;alertmanager            2/2     82m
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;elasticsearch           3/3     83m
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;fluent-bit-aggregator   3/3     83m
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;mongodb                 3/3     84m
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;prometheus              3/3     83m
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&amp;#x2139;&amp;#xfe0f; You have to keep in mind that:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;elasticsearch&lt;/strong&gt; scales well for adding or removing nodes.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;fluentd-aggregator&lt;/strong&gt; scales well for adding or removing nodes.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;prometheus&lt;/strong&gt; stores the same information in all the available replicas, so it is recommended to keep the number of replicas in, at least, 2 for high availability reasons.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Once you are sure about it, use &lt;code&gt;kubectl&lt;/code&gt; to scale the statefulset, for example:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ kubectl scale statefulsets elasticsearch --replicas&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#0000cf;font-weight:bold&#34;&gt;7&lt;/span&gt; -n aura-&lt;span style=&#34;color:#000&#34;&gt;$ENV&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;jobs&#34;&gt;Jobs&lt;/h2&gt;
&lt;p&gt;There are some scheduled jobs that run in Aura Platform. You can check them with &lt;code&gt;kubectl get jobs&lt;/code&gt;:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ kubectl get &lt;span style=&#34;color:#204a87&#34;&gt;jobs&lt;/span&gt; --namespace aura-es-test
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;NAME                      COMPLETIONS   DURATION   AGE
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;aura-bot-makeup           1/1           92s        69m
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;nlp-provisioning          1/1           10m        68m
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Most of them are provisioning jobs that create all the required entities during the installation (applications, APIs, etc).&lt;/p&gt;
&lt;h2 id=&#34;horizontal-scaling-the-infrastructure&#34;&gt;Horizontal scaling the infrastructure&lt;/h2&gt;
&lt;p&gt;It is possible to add and remove nodes to the different agent pools in the Kubernetes cluster.&lt;/p&gt;
&lt;p&gt;Adding nodes to a running cluster is a safe operation. However, bear in mind that removing nodes can result in statefulsets not working properly. The reason is that some agent pools are dedicated to stateful services that need to form a cluster.&lt;/p&gt;
&lt;p&gt;That is the case of the following agent pools:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;master&lt;/strong&gt;: Kubernetes master nodes use a quorum protocol that needs an odd number of nodes. Three nodes is the minimum number to have HA (high availability), so 3 nodes in preproduction and 5 in production environments is a safe choice. The number of master nodes in an existing environment cannot be modified for now.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;database&lt;/strong&gt;: It must be 3, for a PostgreSQL cluster with one master and two followers.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;kubernetes-cluster-autoscaler&#34;&gt;Cluster autoscaler&lt;/h3&gt;
&lt;p&gt;The Aura Platform Kubernetes cluster deploys the official Kubernetes cluster-autoscaler. It is a deployment with one pod that runs in one of the master nodes.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ kubectl get po -l &lt;span style=&#34;color:#000&#34;&gt;app&lt;/span&gt;&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;=&lt;/span&gt;cluster-autoscaler -n kube-system
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;NAME                                  READY   STATUS    RESTARTS   AGE
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;cluster-autoscaler-6fb6b8dcdc-xr59x   1/1     Running   &lt;span style=&#34;color:#0000cf;font-weight:bold&#34;&gt;1&lt;/span&gt;          4h48m
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;This feature is intended to automatically adjust the Kubernetes cluster size when one of these conditions are met:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Scale up&lt;/strong&gt;: there are pending pods that do not fit in the cluster due to insufficient available resources, but could fit if new compute nodes are added.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Scale down&lt;/strong&gt;: there are nodes in the cluster that have been underutilized for an extended period of time and their pods can be placed on other existing nodes.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The cluster autoscaler is able to scale the agent pools down to zero if needed.
This is the reason why it is not needed to configure the number of nodes in your deployment profile.
The cluster autoscaler will take care of everything to cut your cloud costs to the minimum.&lt;/p&gt;
&lt;p&gt;&amp;#x2139;&amp;#xfe0f; You can find more information about the &lt;a href=&#34;https://github.com/kubernetes/autoscaler/tree/master/cluster-autoscaler&#34;&gt;cluster autoscaler in the official GitHub repository&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&#34;vertical-scaling-the-infrastructure&#34;&gt;Vertical scaling the infrastructure&lt;/h2&gt;
&lt;p&gt;The process is similar to the horizontal scaling. You need to tune the &lt;code&gt;type&lt;/code&gt; properties in the infrastructure section of your profile configuration file.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#8f5902;font-style:italic&#34;&gt;# Infrastructure&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;infrastructure&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;region&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;westeurope&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;compute&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;masters&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;      &lt;/span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;size&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#0000cf;font-weight:bold&#34;&gt;3&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;      &lt;/span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;type&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;Standard_DS2_v2&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;common_nodes&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;      &lt;/span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;min_size&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#0000cf;font-weight:bold&#34;&gt;2&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;      &lt;/span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;max_size&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#0000cf;font-weight:bold&#34;&gt;8&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;      &lt;/span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;type&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;Standard_DS2_v2&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;database_nodes&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;      &lt;/span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;min_size&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#0000cf;font-weight:bold&#34;&gt;3&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;      &lt;/span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;max_size&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#0000cf;font-weight:bold&#34;&gt;6&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;      &lt;/span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;type&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;Standard_DS2_v2&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;management_nodes&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;      &lt;/span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;min_size&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#0000cf;font-weight:bold&#34;&gt;3&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;      &lt;/span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;max_size&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#0000cf;font-weight:bold&#34;&gt;6&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;      &lt;/span&gt;&lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;type&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;Standard_DS3_v2&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f8f8f8;text-decoration:underline&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Afterwards, run the installer to apply the changes:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ ./aura deploy_infra --cfg /PATH/TO/config.yml -c /PATH/TO/credentials.k8s.json -v &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;VAULT_PASSWD&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ ./aura deploy_system --cfg /PATH/TO/config.yml -c /PATH/TO/credentials.k8s.json -v &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;VAULT_PASSWD&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ ./aura deploy_core --cfg /PATH/TO/config.yml -c /PATH/TO/credentials.k8s.json -v &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;VAULT_PASSWD&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The operation has to terminate and recreate every node. It has to be done as a rolling update to avoid service disruption, so it can take a lot of time to complete (around 5-10 minutes per node) in a big Kubernetes cluster.&lt;/p&gt;
&lt;p&gt;In Azure, it is not possible to change the instance types with the Aura Platform installer yet. This means that changing the instance types in the deployment profile has no effects on redeployments.&lt;/p&gt;
&lt;p&gt;&amp;#x26a0;&amp;#xfe0f; Do not use the Azure Portal to modify the cluster nodes. It is an error-prone and unsupported
way to scale the cluster that could impact the Aura Platform stability. Kubernetes must be aware of the changes done to the cluster and all changes must be kept in sync with the deployment profile.&lt;/p&gt;
&lt;h2 id=&#34;kubernetes-storage&#34;&gt;Kubernetes storage&lt;/h2&gt;
&lt;p&gt;Kubernetes uses persistent volumes.
They are backed by Managed Disks in Azure.&lt;/p&gt;
&lt;h2 id=&#34;services-logs-with-kubectl&#34;&gt;Services logs with kubectl&lt;/h2&gt;
&lt;p&gt;The best way to access to the logs of one service is using &lt;strong&gt;Kibana&lt;/strong&gt; platform. Find more information in &lt;a href=&#34;../../docs/developers-workspace/monitoring/aura-logs/&#34;&gt;Manage Aura logs&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;However, you can access the same way to:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ kubectl logs -f -l &lt;span style=&#34;color:#000&#34;&gt;app&lt;/span&gt;&lt;span style=&#34;color:#ce5c00;font-weight:bold&#34;&gt;=&lt;/span&gt;aura-bot -n aura-&lt;span style=&#34;color:#000&#34;&gt;$ENV&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
      </description>
    </item>
    
    <item>
      <title>Docs: </title>
      <link>/docs/aura-assistant/development-architecture/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      
      <guid>/docs/aura-assistant/development-architecture/</guid>
      <description>
        
        
        &lt;h1 id=&#34;aura-virtual-assistant-development-architecture-and-operation&#34;&gt;Aura Virtual Assistant development architecture and operation&lt;/h1&gt;


&lt;div class=&#34;pageinfo pageinfo-primary&#34;&gt;
&lt;p&gt;Documents from this point forward contain &lt;strong&gt;low-level technical information&lt;/strong&gt; regarding &lt;em&gt;&lt;strong&gt;Aura Virtual Assistant&lt;/strong&gt;&lt;/em&gt;, aimed at technical profiles.&lt;/p&gt;
&lt;p&gt;&lt;i class=&#34;fa-regular fa-file-lines fa-xl&#34; style=&#34;color: #0d5de7;&#34;&gt;&lt;/i&gt; We highly recommend reading these basic &lt;em&gt;&lt;strong&gt;Aura Virtual Assistant&lt;/strong&gt;&lt;/em&gt; documents first to have a clear overview of its foundation, benefits and functional behavior:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;../../docs/aura-assistant/introduction/&#34;&gt;Introduction to Aura Assistant&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;../../docs/aura-assistant/functional-description/&#34;&gt;Aura Assistant functional description&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p align=&#34;left&#34;&gt;
  &lt;img width=&#34;250&#34; height=&#34;250&#34; src=&#34;../../images/technical-complex-3.png&#34;&gt;
&lt;/p&gt;

&lt;/div&gt;

&lt;h2 id=&#34;introduction&#34;&gt;Introduction&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;&lt;strong&gt;Aura Virtual Assistant&lt;/strong&gt;&lt;/em&gt; architecture is conceived as a multi-bot system based on &lt;strong&gt;Microsoft skills architecture&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;In this framework, Aura is divided into isolated modules (skill-based bots) that, currently, are &lt;strong&gt;independent domain bots&lt;/strong&gt; able to provide a specific function or capability in a coordinated and efficient manner.&lt;/p&gt;
&lt;p&gt;These self-supported skills work with an &lt;strong&gt;orchestrator at the top&lt;/strong&gt;, responsible for connecting channels with bots and managing the conversational flow with the customer.&lt;/p&gt;
&lt;h2 id=&#34;mapping-functional-architecture-with-development-architecture&#34;&gt;Mapping functional architecture with development architecture&lt;/h2&gt;
&lt;p&gt;As explained before, &lt;em&gt;&lt;strong&gt;Aura Virtual Assistant&lt;/strong&gt;&lt;/em&gt; documentation contains both:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Low-level technical documents, aimed at not-technical profiles, that describe the functional behavior of our assistant&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;High-level technical documents, for highly-skilled technical profiles, that include detailed technical information, system architecture and technical processes&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;In order to ease comprehension for readers, take as a basis the &lt;a href=&#34;../../docs/aura-assistant/functional-description/#aura-assistant-functional-overview&#34;&gt;Aura Virtual Assistant functional flowchart&lt;/a&gt; and check the mapping between functional and technical components.&lt;/p&gt;
&lt;table&gt;
	&lt;tbody&gt;
		&lt;tr&gt;
			&lt;td colspan=&#34;2&#34;&gt;&lt;b&gt;Functional component&lt;/b&gt;&lt;/td&gt;
			&lt;td&gt;&lt;b&gt;Technical component&lt;/b&gt;&lt;/td&gt;
		&lt;/tr&gt;
		&lt;tr&gt;
			&lt;td colspan=&#34;2&#34;&gt;&lt;a href=&#34;../../docs/aura-assistant/functional-description/channels-overview/&#34;&gt;&lt;b&gt;Channel&lt;/b&gt;&lt;/i&gt;&lt;/a&gt;&lt;/td&gt;
			&lt;td&gt;Channel&lt;/td&gt;
		&lt;/tr&gt;
		&lt;tr&gt;
			&lt;td rowspan=&#34;2&#34;&gt;&lt;a href=&#34;../../docs/aura-assistant/functional-description/aura-root-overview/&#34;&gt;&lt;b&gt;Aura Root&lt;/b&gt;&lt;/i&gt;&lt;/a&gt;&lt;/td&gt;
			&lt;td&gt;&lt;a href=&#34;../../docs/aura-assistant/functional-description/aura-root-overview/#routing&#34;&gt;Routing &lt;br&gt; module&lt;/i&gt;&lt;/a&gt;&lt;/td&gt;
			&lt;td&gt;&lt;a href=&#34;../../docs/components/aura-groot/&#34;&gt;aura-groot&lt;/i&gt;&lt;/a&gt;&lt;/td&gt;
		&lt;/tr&gt;
		&lt;tr&gt;
			&lt;td&gt;&lt;a href=&#34;../../docs/aura-assistant/functional-description/aura-root-overview/#channel-adapter&#34;&gt;Channel &lt;br&gt;adapter&lt;/i&gt;&lt;/a&gt;&lt;/td&gt;
			&lt;td&gt;&lt;a href=&#34;../../docs/components/aura-bridge/&#34;&gt;aura-bridge&lt;/i&gt;&lt;/a&gt;&lt;/td&gt;
		&lt;/tr&gt;
		&lt;tr&gt;
			&lt;td colspan=&#34;2&#34;&gt;&lt;a href=&#34;../../docs/aura-assistant/functional-description/skills-overview/&#34;&gt;&lt;b&gt;Skill&lt;/b&gt;&lt;/i&gt;&lt;/a&gt;&lt;/td&gt;
			&lt;td&gt;Skill&lt;/td&gt;
		&lt;/tr&gt;
		&lt;tr&gt;
			&lt;td colspan=&#34;3&#34;&gt;&lt;/td&gt;
		&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;

      </description>
    </item>
    
    <item>
      <title>Docs: </title>
      <link>/docs/components/aura-microfrontend-base/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      
      <guid>/docs/components/aura-microfrontend-base/</guid>
      <description>
        
        
        &lt;h1 id=&#34;aura-microfrontend-base&#34;&gt;Aura microfrontend base&lt;/h1&gt;


&lt;div class=&#34;pageinfo pageinfo-primary&#34;&gt;
&lt;p&gt;Description of &lt;em&gt;&lt;strong&gt;aura-microfrontend-base&lt;/strong&gt;&lt;/em&gt;, foundational component for the development of user interfaces in Aura ecosystem&lt;/p&gt;
&lt;p&gt;&lt;i class=&#34;fa-regular fa-bullseye fa-xl&#34; style=&#34;color: #3a13fb;&#34;&gt;&lt;/i&gt; &lt;em&gt;&lt;strong&gt;Aura Virtual Assistant&lt;/strong&gt;&lt;/em&gt; component&lt;/p&gt;

&lt;/div&gt;

&lt;h2 id=&#34;introduction&#34;&gt;Introduction&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;&lt;strong&gt;aura-microfrontend-base&lt;/strong&gt;&lt;/em&gt; is a foundational component that provides a common structure and libraries for the development of user interfaces in Aura ecosystem (&lt;em&gt;&lt;strong&gt;Aura Virtual Assistant&lt;/strong&gt;&lt;/em&gt; and &lt;em&gt;&lt;strong&gt;ATRIA&lt;/strong&gt;&lt;/em&gt;).&lt;/p&gt;
&lt;p&gt;Its microfrontend component is a small, self-contained element that is part of a larger microfrontend architecture. It follows the same principles as microservices, but for the frontend, allowing independent development, deployment and scaling of different parts of a web application.&lt;/p&gt;
&lt;p&gt;&lt;i class=&#34;fa-solid fa-triangle-exclamation fa-xl&#34; style=&#34;color: #f45815;&#34;&gt;&lt;/i&gt; As defined before, this is a base component over which certain interfaces will be developed, but it will not be directly productized.&lt;/p&gt;
&lt;h2 id=&#34;technical-foundations&#34;&gt;Technical foundations&lt;/h2&gt;
&lt;p&gt;This is a &lt;a href=&#34;https://nextjs.org/&#34;&gt;Next.js&lt;/a&gt; project bootstrapped with &lt;a href=&#34;https://nextjs.org/docs/app/api-reference/cli/create-next-app&#34;&gt;create-next-app&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The project leverages the following technologies and tools:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;React&lt;/strong&gt;: A JavaScript library for building user interfaces, used as the core framework for component development.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;@telefonica/mistica&lt;/strong&gt;: A design system and component library that provides a set of reusable UI components and styles, ensuring consistency and best practices in UI development.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Tailwind CSS&lt;/strong&gt;: A utility-first CSS framework for styling components and layouts.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;TypeScript&lt;/strong&gt;: A strongly typed programming language that builds on JavaScript, ensuring type safety and better developer experience.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Microfrontend Architecture&lt;/strong&gt;: Enables independent development, deployment, and scaling of frontend components.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Dynamic Imports&lt;/strong&gt;: Used to load microfrontend components at runtime, improving modularity and performance.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Environment Variables&lt;/strong&gt;: Configuration is managed through environment variables like &lt;code&gt;AURA_SITE_CONFIG_PATH&lt;/code&gt; to ensure flexibility and adaptability across environments.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;These foundations ensure scalability, maintainability, and a seamless developer experience.&lt;/p&gt;
&lt;h2 id=&#34;architecture-and-components&#34;&gt;Architecture and components&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;&lt;strong&gt;aura-microfrontend-base&lt;/strong&gt;&lt;/em&gt; is composed of two main components:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Core Framework&lt;/strong&gt;: The foundational Next.js structure that handles routing, rendering, and component lifecycle.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Dynamic Component Loader&lt;/strong&gt;: The system responsible for loading and rendering components based on the site configuration.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;basic-architecture-diagram&#34;&gt;Basic architecture diagram&lt;/h3&gt;
&lt;pre class=&#34;mermaid&#34;&gt;sequenceDiagram
    participant Project as user request
    participant Config as site-config.json
    participant Pages as Page Manager
    participant Layout as Layout Engine
    participant ComponentLoader as Component Loader
    participant DOM as Browser DOM

    Project-&amp;gt;&amp;gt;Config: read site configuration
    Config--&amp;gt;&amp;gt;Project: return site structure
    
    Note over Project: site path or default page
    Project-&amp;gt;&amp;gt;Pages: setup page routes from config
    
    Pages-&amp;gt;&amp;gt;Layout: process page layout configuration
    
    Layout-&amp;gt;&amp;gt;Layout: setup container with containerClass
    Layout-&amp;gt;&amp;gt;Layout: create grid with gridClass
    
    Note over Layout: process components by position
    
    loop for each component
        Layout-&amp;gt;&amp;gt;ComponentLoader: request component by importType
        
        alt importType is &amp;#34;internal&amp;#34;
            ComponentLoader-&amp;gt;&amp;gt;ComponentLoader: load from local components folder
        else importType is &amp;#34;external&amp;#34;
            ComponentLoader-&amp;gt;&amp;gt;ComponentLoader: load from library dependency
        else importType is &amp;#34;microfrontend&amp;#34;
            ComponentLoader-&amp;gt;&amp;gt;ComponentLoader: load dynamically from remote source
        end
        
        ComponentLoader--&amp;gt;&amp;gt;Layout: Return component
        Layout-&amp;gt;&amp;gt;Layout: Apply className and position
        Layout-&amp;gt;&amp;gt;Layout: Inject attributes and props
        Layout-&amp;gt;&amp;gt;DOM: Render component in grid position
        DOM--&amp;gt;&amp;gt;Layout: Component rendered
    end
    
    Layout--&amp;gt;&amp;gt;Pages: Page layout rendered

    
    Pages--&amp;gt;&amp;gt;Project: page configured and route ready
    Project-&amp;gt;&amp;gt;Project: start listening for navigation&lt;/pre&gt;
&lt;h3 id=&#34;server-features&#34;&gt;Server features&lt;/h3&gt;
&lt;p&gt;The server component of &lt;em&gt;&lt;strong&gt;aura-microfrontend-base&lt;/strong&gt;&lt;/em&gt; provides:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Dynamic Routing: Routes are generated based on the configuration file and mapped to corresponding components.&lt;/li&gt;
&lt;li&gt;Server-Side Rendering (SSR): Components can be rendered on the server for improved performance and SEO.&lt;/li&gt;
&lt;li&gt;API Integration: Built-in capabilities for connecting to backend services and APIs.&lt;/li&gt;
&lt;li&gt;Environment Variable Management: Configuration is handled through environment variables for different deployment environments.&lt;/li&gt;
&lt;li&gt;Development Server: Local development environment with hot-reloading for a smooth development experience.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;configuration&#34;&gt;Configuration&lt;/h2&gt;
&lt;p&gt;The &lt;code&gt;AURA_SITE_CONFIG_PATH&lt;/code&gt; environment variable must be set to point to your project&amp;rsquo;s configuration file, as in the example below:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;AURA_SITE_CONFIG_PATH=site-config.json npm run dev&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&lt;strong&gt;aura-microfrontend-base&lt;/strong&gt;&lt;/em&gt; configuration file must be a valid JSON that defines the structure of the site, including the layout of the pages and the components to render.&lt;/p&gt;
&lt;p&gt;The configuration file must follow this structure:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-json&#34; data-lang=&#34;json&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;&amp;#34;mainPage&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;home&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;&amp;#34;pages&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;[&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;&amp;#34;id&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;home&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;&amp;#34;name&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;Home&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;&amp;#34;path&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;/home&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;&amp;#34;layout&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;&amp;#34;containerClass&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;min-h-screen flex flex-col container mx-auto&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;&amp;#34;gridClass&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;grid grid-cols-1 grid-rows-[200px_1fr] flex-1&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;&amp;#34;components&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;[&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                    &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                        &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;&amp;#34;library&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;@telefonica/example-library&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                        &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;&amp;#34;componentName&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;Header&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                        &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;&amp;#34;position&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#0000cf;font-weight:bold&#34;&gt;1&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                        &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;&amp;#34;importType&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;external&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                        &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;&amp;#34;className&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;col-span-2 row-span-1&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                    &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                    &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                        &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;&amp;#34;componentName&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;TestComponent&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                        &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;&amp;#34;position&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#0000cf;font-weight:bold&#34;&gt;2&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                        &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;&amp;#34;importType&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;internal&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                        &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;&amp;#34;className&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;h-full col-span-1 row-span-2&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                    &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                    &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                        &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;&amp;#34;componentName&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;TestPlugin&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                        &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;&amp;#34;position&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#0000cf;font-weight:bold&#34;&gt;3&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                        &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;&amp;#34;importType&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;microfrontend&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                        &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;&amp;#34;className&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;h-full col-span-1 row-span-2&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                        &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;&amp;#34;attributes&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                            &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;&amp;#34;API_ENDPOINT&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;${AURA_MICROFRONTENDS_SERVER_HOST}/api/plugin-test&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                            &lt;span style=&#34;color:#204a87;font-weight:bold&#34;&gt;&amp;#34;REFRESH_INTERVAL&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#4e9a06&#34;&gt;&amp;#34;1000&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                        &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                    &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#000;font-weight:bold&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;configuration-fields&#34;&gt;Configuration fields&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;mainPage&lt;/code&gt;: Default page ID to load when accessing the root path&lt;/li&gt;
&lt;li&gt;&lt;code&gt;pages&lt;/code&gt;: Array of page configurations
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;id&lt;/code&gt;: Unique identifier for the page&lt;/li&gt;
&lt;li&gt;&lt;code&gt;name&lt;/code&gt;: Display name of the page&lt;/li&gt;
&lt;li&gt;&lt;code&gt;path&lt;/code&gt;: URL path for the page&lt;/li&gt;
&lt;li&gt;&lt;code&gt;layout&lt;/code&gt;: Container configuration
- &lt;code&gt;containerClass&lt;/code&gt;: Tailwind classes for the main container
- &lt;code&gt;gridClass&lt;/code&gt;: Tailwind classes for the grid layout
- &lt;code&gt;components&lt;/code&gt;: Array of component configurations
- &lt;code&gt;library&lt;/code&gt;: (Optional) External library name
- &lt;code&gt;componentName&lt;/code&gt;: Name of the component to render
- &lt;code&gt;position&lt;/code&gt;: Order in the layout
- &lt;code&gt;importType&lt;/code&gt;: Type of component (internal, external, or microfrontend)
- &lt;code&gt;internal&lt;/code&gt;: Components that are part of the current project and are located in the components directory
- &lt;code&gt;external&lt;/code&gt;: Components from external libraries (like @telefonica packages) that are installed as dependencies
- &lt;code&gt;microfrontend&lt;/code&gt;: Components that are loaded dynamically from a remote server, allowing for runtime integration of independent applications
- &lt;code&gt;className&lt;/code&gt;: Tailwind classes for the component
- &lt;code&gt;attributes&lt;/code&gt;: (Optional) Additional component properties&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;technical-guidelines&#34;&gt;Technical guidelines&lt;/h2&gt;
&lt;p&gt;Guides to manage the &lt;em&gt;&lt;strong&gt;aura-microfrontend-base&lt;/strong&gt;&lt;/em&gt; component:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/Telefonica/aura-manager/blob/master/packages/aura-mf-base/README.md&#34;&gt;&lt;em&gt;&lt;strong&gt;aura-microfrontend-base&lt;/strong&gt;&lt;/em&gt; Readme&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/Telefonica/aura-manager/blob/master/packages/aura-mf-base/doc/add-components.md&#34;&gt;How to add a new component to use in your project&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/Telefonica/aura-manager/blob/master/packages/aura-mf-base/doc/add-providers.md&#34;&gt;How to add a new provider to use in your project&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/Telefonica/aura-manager/blob/master/packages/aura-mf-base/doc/correlator.md&#34;&gt;Correlator Implementation in the Project&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

      </description>
    </item>
    
  </channel>
</rss>
