{"id":890,"date":"2026-09-22T14:45:18","date_gmt":"2026-09-22T13:45:18","guid":{"rendered":"https:\/\/guillaumesblog.net\/?p=890"},"modified":"2026-09-22T14:49:06","modified_gmt":"2026-09-22T13:49:06","slug":"make-data-actionable-create-a-manufacturing-log-analysis-dashboard-augmented-by-ai","status":"publish","type":"post","link":"https:\/\/guillaumesblog.net\/index.php\/make-data-actionable-create-a-manufacturing-log-analysis-dashboard-augmented-by-ai\/","title":{"rendered":"Make data actionable &#8211; Create a Manufacturing Log Analysis Dashboard augmented by AI"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">How can we cut through a large amount of information and get the business insight and answers we need? Data Operations team are familiar with this question and are used to make humongous amounts of logs actionable. Let&#8217;s build a visually appealing dashboard and augment it with an LLM chat capability ready to help the end-user further with natural language.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"482\" src=\"https:\/\/guillaumesblog.net\/wp-content\/uploads\/2026\/09\/image-9-1024x482.png\" alt=\"\" class=\"wp-image-924\" srcset=\"https:\/\/guillaumesblog.net\/wp-content\/uploads\/2026\/09\/image-9-1024x482.png 1024w, https:\/\/guillaumesblog.net\/wp-content\/uploads\/2026\/09\/image-9-300x141.png 300w, https:\/\/guillaumesblog.net\/wp-content\/uploads\/2026\/09\/image-9-767x361.png 767w, https:\/\/guillaumesblog.net\/wp-content\/uploads\/2026\/09\/image-9-1200x565.png 1200w, https:\/\/guillaumesblog.net\/wp-content\/uploads\/2026\/09\/image-9-1536x723.png 1536w, https:\/\/guillaumesblog.net\/wp-content\/uploads\/2026\/09\/image-9.png 1918w\" sizes=\"auto, (max-width: 709px) 85vw, (max-width: 909px) 67vw, (max-width: 1362px) 62vw, 840px\" \/><figcaption class=\"wp-element-caption\">Interact with an LLM augmented manufacturing dashboard<\/figcaption><\/figure>\n\n\n\n<!--more-->\n\n\n\n<p class=\"wp-block-paragraph\">In a <a href=\"https:\/\/guillaumesblog.net\/index.php\/analysing-vm-logs-at-scale-with-ai-big-data-toolset-like-aidp\/\">previous<\/a> blog post I wrote about data ingestion and I discussed about the use of the Fluentd agent to collect logs. Today, I shall focus on the &#8220;above&#8221; layer and the end user UI, and how to put the components together to achieve a complete end to end solution.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"838\" height=\"701\" src=\"https:\/\/guillaumesblog.net\/wp-content\/uploads\/2026\/09\/article.png\" alt=\"\" class=\"wp-image-903\" srcset=\"https:\/\/guillaumesblog.net\/wp-content\/uploads\/2026\/09\/article.png 838w, https:\/\/guillaumesblog.net\/wp-content\/uploads\/2026\/09\/article-300x251.png 300w, https:\/\/guillaumesblog.net\/wp-content\/uploads\/2026\/09\/article-767x642.png 767w\" sizes=\"auto, (max-width: 709px) 85vw, (max-width: 909px) 67vw, (max-width: 984px) 61vw, (max-width: 1362px) 45vw, 600px\" \/><figcaption class=\"wp-element-caption\"> Overall concept<\/figcaption><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">At the bottom of the architecture we have three robots, let&#8217;s imagine for an instant we are looking at a manufacturing line. We would collect every now and then thousands of rows of log entries from the assembly line. In real life, there may be a benefit in going as close as possible to real-time, the technological components used could vary but the overall concept would stay the same.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Example of a log coming in as a JSON entry.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>{\"timestamp\":\"2026-07-22T08:15:02Z\",\"machine_id\":\"ALM-01\",\"batch_id\":\"B1001\",\"operation\":\"aluminum_molding\",\"start_time\":\"2026-07-22T08:10:00Z\",\"stop_time\":\"2026-07-22T08:15:00Z\",\"cycle_time_sec\":300,\"energy_kwh\":14.2,\"temperature_c\":695,\"pressure_bar\":121.5,\"status\":\"SUCCESS\"}<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">These would be collected via any software of your liking e.g. rsync or Logstash, and be sent to an object storage for cheap data persistence and audit. Nowadays machines, robots and other instruments tend to have a full computer attached to them, which make it easy to select our favorite software for the task.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"449\" src=\"https:\/\/guillaumesblog.net\/wp-content\/uploads\/2026\/09\/image-1-1024x449.png\" alt=\"\" class=\"wp-image-914\" srcset=\"https:\/\/guillaumesblog.net\/wp-content\/uploads\/2026\/09\/image-1-1024x449.png 1024w, https:\/\/guillaumesblog.net\/wp-content\/uploads\/2026\/09\/image-1-300x132.png 300w, https:\/\/guillaumesblog.net\/wp-content\/uploads\/2026\/09\/image-1-766x336.png 766w, https:\/\/guillaumesblog.net\/wp-content\/uploads\/2026\/09\/image-1-1200x526.png 1200w, https:\/\/guillaumesblog.net\/wp-content\/uploads\/2026\/09\/image-1-1536x674.png 1536w, https:\/\/guillaumesblog.net\/wp-content\/uploads\/2026\/09\/image-1.png 1904w\" sizes=\"auto, (max-width: 709px) 85vw, (max-width: 909px) 67vw, (max-width: 1362px) 62vw, 840px\" \/><figcaption class=\"wp-element-caption\">Storing logs for the long term<\/figcaption><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Once our data is collected and lands on object storage. We want to transform its syntax, parse it and format into a structured layout. For this task AND in an enterprise scenario with loads of input streams I would use an AI <a href=\"https:\/\/spark.apache.org\/docs\/latest\/\">Spark<\/a> workbench such as Oracle AI Data Platform. It would do well in this scenario and would be even more relevant if Data cataloging and AI Agents were required. In my demo scenario here it is completely overkill to use AIDP for parsing and you would use either SQL directly on the AI Lakehouse, <a href=\"https:\/\/pandas.pydata.org\/docs\/\">Pandas<\/a> on a VM or functions. Again, it is up to you to decide what works best for data preparation.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"502\" src=\"https:\/\/guillaumesblog.net\/wp-content\/uploads\/2026\/09\/image-1024x502.png\" alt=\"\" class=\"wp-image-913\" srcset=\"https:\/\/guillaumesblog.net\/wp-content\/uploads\/2026\/09\/image-1024x502.png 1024w, https:\/\/guillaumesblog.net\/wp-content\/uploads\/2026\/09\/image-300x147.png 300w, https:\/\/guillaumesblog.net\/wp-content\/uploads\/2026\/09\/image-767x376.png 767w, https:\/\/guillaumesblog.net\/wp-content\/uploads\/2026\/09\/image-1536x753.png 1536w, https:\/\/guillaumesblog.net\/wp-content\/uploads\/2026\/09\/image-1200x588.png 1200w, https:\/\/guillaumesblog.net\/wp-content\/uploads\/2026\/09\/image.png 1913w\" sizes=\"auto, (max-width: 709px) 85vw, (max-width: 909px) 67vw, (max-width: 1362px) 62vw, 840px\" \/><figcaption class=\"wp-element-caption\">Creating data sources and catalogs<\/figcaption><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Onto AIDP now; Let&#8217;s mutate our JSON entries into a dataframes objects and perform some transformations, in my instance I would simply check what are the top 10 most energy hungry machines, they are all related to steel forging, which make sense to me.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"503\" src=\"https:\/\/guillaumesblog.net\/wp-content\/uploads\/2026\/09\/image-2-1024x503.png\" alt=\"\" class=\"wp-image-915\" srcset=\"https:\/\/guillaumesblog.net\/wp-content\/uploads\/2026\/09\/image-2-1024x503.png 1024w, https:\/\/guillaumesblog.net\/wp-content\/uploads\/2026\/09\/image-2-300x147.png 300w, https:\/\/guillaumesblog.net\/wp-content\/uploads\/2026\/09\/image-2-767x377.png 767w, https:\/\/guillaumesblog.net\/wp-content\/uploads\/2026\/09\/image-2-1536x755.png 1536w, https:\/\/guillaumesblog.net\/wp-content\/uploads\/2026\/09\/image-2-1200x590.png 1200w, https:\/\/guillaumesblog.net\/wp-content\/uploads\/2026\/09\/image-2.png 1913w\" sizes=\"auto, (max-width: 709px) 85vw, (max-width: 909px) 67vw, (max-width: 1362px) 62vw, 840px\" \/><figcaption class=\"wp-element-caption\">Processing data with python.<\/figcaption><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">This python notebook can be scheduled to run in a loop like fashion so we can continuously check for anomalies and send to users (e.g. the plant manager) proactive warnings by calling out to other systems like Oracle Field service or its phone messaging via API, for this I use the <a href=\"https:\/\/requests.readthedocs.io\/en\/latest\/\">request<\/a> library. In my example I check the statuses of our machines.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"471\" src=\"https:\/\/guillaumesblog.net\/wp-content\/uploads\/2026\/09\/image-3-1024x471.png\" alt=\"\" class=\"wp-image-916\" srcset=\"https:\/\/guillaumesblog.net\/wp-content\/uploads\/2026\/09\/image-3-1024x471.png 1024w, https:\/\/guillaumesblog.net\/wp-content\/uploads\/2026\/09\/image-3-300x138.png 300w, https:\/\/guillaumesblog.net\/wp-content\/uploads\/2026\/09\/image-3-767x353.png 767w, https:\/\/guillaumesblog.net\/wp-content\/uploads\/2026\/09\/image-3-1536x707.png 1536w, https:\/\/guillaumesblog.net\/wp-content\/uploads\/2026\/09\/image-3-1200x552.png 1200w, https:\/\/guillaumesblog.net\/wp-content\/uploads\/2026\/09\/image-3.png 1916w\" sizes=\"auto, (max-width: 709px) 85vw, (max-width: 909px) 67vw, (max-width: 1362px) 62vw, 840px\" \/><figcaption class=\"wp-element-caption\">Send out alerts about machines in a &#8220;WARNING&#8221; state<\/figcaption><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Let&#8217;s now send our dataframe into Autonomous DB and make sure that the AIDP service has the correct policies attached to it so it can write to the destination service. Remember that if you move or write information from one service to another you need to be familiar with <a href=\"https:\/\/docs.oracle.com\/en-us\/iaas\/Content\/Identity\/callresources\/Writing_Policies_for_Dynamic_Groups.htm\">policies<\/a>.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"212\" src=\"https:\/\/guillaumesblog.net\/wp-content\/uploads\/2026\/09\/image-4-1024x212.png\" alt=\"\" class=\"wp-image-917\" srcset=\"https:\/\/guillaumesblog.net\/wp-content\/uploads\/2026\/09\/image-4-1024x212.png 1024w, https:\/\/guillaumesblog.net\/wp-content\/uploads\/2026\/09\/image-4-300x62.png 300w, https:\/\/guillaumesblog.net\/wp-content\/uploads\/2026\/09\/image-4-766x159.png 766w, https:\/\/guillaumesblog.net\/wp-content\/uploads\/2026\/09\/image-4-1536x319.png 1536w, https:\/\/guillaumesblog.net\/wp-content\/uploads\/2026\/09\/image-4-1200x249.png 1200w, https:\/\/guillaumesblog.net\/wp-content\/uploads\/2026\/09\/image-4.png 1918w\" sizes=\"auto, (max-width: 709px) 85vw, (max-width: 909px) 67vw, (max-width: 1362px) 62vw, 840px\" \/><figcaption class=\"wp-element-caption\">Ship data from AIDP into a Lakehouse, or a relational database<\/figcaption><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">I am using database actions, an online and embedded SQL developer environment into the OCI console, that&#8217;s very handy.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"485\" src=\"https:\/\/guillaumesblog.net\/wp-content\/uploads\/2026\/09\/image-5-1024x485.png\" alt=\"\" class=\"wp-image-918\" srcset=\"https:\/\/guillaumesblog.net\/wp-content\/uploads\/2026\/09\/image-5-1024x485.png 1024w, https:\/\/guillaumesblog.net\/wp-content\/uploads\/2026\/09\/image-5-300x142.png 300w, https:\/\/guillaumesblog.net\/wp-content\/uploads\/2026\/09\/image-5-766x363.png 766w, https:\/\/guillaumesblog.net\/wp-content\/uploads\/2026\/09\/image-5-1536x728.png 1536w, https:\/\/guillaumesblog.net\/wp-content\/uploads\/2026\/09\/image-5-1200x569.png 1200w, https:\/\/guillaumesblog.net\/wp-content\/uploads\/2026\/09\/image-5.png 1914w\" sizes=\"auto, (max-width: 709px) 85vw, (max-width: 909px) 67vw, (max-width: 1362px) 62vw, 840px\" \/><figcaption class=\"wp-element-caption\">Data is stored in a relational database<\/figcaption><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Launch an OCI Cloud Analytics instance. First, create a connection to Autonomous Lakehouse, download the wallet connection from the database OCI console.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"430\" src=\"https:\/\/guillaumesblog.net\/wp-content\/uploads\/2026\/09\/image-6-1024x430.png\" alt=\"\" class=\"wp-image-921\" srcset=\"https:\/\/guillaumesblog.net\/wp-content\/uploads\/2026\/09\/image-6-1024x430.png 1024w, https:\/\/guillaumesblog.net\/wp-content\/uploads\/2026\/09\/image-6-300x126.png 300w, https:\/\/guillaumesblog.net\/wp-content\/uploads\/2026\/09\/image-6-767x322.png 767w, https:\/\/guillaumesblog.net\/wp-content\/uploads\/2026\/09\/image-6-1536x645.png 1536w, https:\/\/guillaumesblog.net\/wp-content\/uploads\/2026\/09\/image-6-1200x504.png 1200w, https:\/\/guillaumesblog.net\/wp-content\/uploads\/2026\/09\/image-6.png 1916w\" sizes=\"auto, (max-width: 709px) 85vw, (max-width: 909px) 67vw, (max-width: 1362px) 62vw, 840px\" \/><figcaption class=\"wp-element-caption\">Connect to our database from Oracle Cloud Analytics<\/figcaption><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Create your Cloud Analytics dataset<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"481\" src=\"https:\/\/guillaumesblog.net\/wp-content\/uploads\/2026\/09\/image-7-1024x481.png\" alt=\"\" class=\"wp-image-922\" srcset=\"https:\/\/guillaumesblog.net\/wp-content\/uploads\/2026\/09\/image-7-1024x481.png 1024w, https:\/\/guillaumesblog.net\/wp-content\/uploads\/2026\/09\/image-7-300x141.png 300w, https:\/\/guillaumesblog.net\/wp-content\/uploads\/2026\/09\/image-7-766x360.png 766w, https:\/\/guillaumesblog.net\/wp-content\/uploads\/2026\/09\/image-7-1536x722.png 1536w, https:\/\/guillaumesblog.net\/wp-content\/uploads\/2026\/09\/image-7-1200x564.png 1200w, https:\/\/guillaumesblog.net\/wp-content\/uploads\/2026\/09\/image-7.png 1919w\" sizes=\"auto, (max-width: 709px) 85vw, (max-width: 909px) 67vw, (max-width: 1362px) 62vw, 840px\" \/><figcaption class=\"wp-element-caption\">Create sources via drag and drop<\/figcaption><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Enable AI annotations, and there is no manual input here, there are made for you in a few seconds, this is very slick. This step is required for the LLM to &#8220;learn&#8221; from your data.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"483\" src=\"https:\/\/guillaumesblog.net\/wp-content\/uploads\/2026\/09\/image-8-1024x483.png\" alt=\"\" class=\"wp-image-923\" srcset=\"https:\/\/guillaumesblog.net\/wp-content\/uploads\/2026\/09\/image-8-1024x483.png 1024w, https:\/\/guillaumesblog.net\/wp-content\/uploads\/2026\/09\/image-8-300x142.png 300w, https:\/\/guillaumesblog.net\/wp-content\/uploads\/2026\/09\/image-8-767x362.png 767w, https:\/\/guillaumesblog.net\/wp-content\/uploads\/2026\/09\/image-8-1200x566.png 1200w, https:\/\/guillaumesblog.net\/wp-content\/uploads\/2026\/09\/image-8-1536x725.png 1536w, https:\/\/guillaumesblog.net\/wp-content\/uploads\/2026\/09\/image-8.png 1916w\" sizes=\"auto, (max-width: 709px) 85vw, (max-width: 909px) 67vw, (max-width: 1362px) 62vw, 840px\" \/><figcaption class=\"wp-element-caption\">Annotate data sources<\/figcaption><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Finally create the end-user dashboard, notice that you do not have to create any widget manually, the software suggest them to you and you decide what to add to the dashboard canvas. Notice now the LLM bot on the right hand side, since we agreed to AI indexing in the previous step, we can now chat and get answers from the data. Please note you could also power this feature with the model of your liking, out of scope here.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"482\" src=\"https:\/\/guillaumesblog.net\/wp-content\/uploads\/2026\/09\/image-9-1024x482.png\" alt=\"\" class=\"wp-image-924\" srcset=\"https:\/\/guillaumesblog.net\/wp-content\/uploads\/2026\/09\/image-9-1024x482.png 1024w, https:\/\/guillaumesblog.net\/wp-content\/uploads\/2026\/09\/image-9-300x141.png 300w, https:\/\/guillaumesblog.net\/wp-content\/uploads\/2026\/09\/image-9-767x361.png 767w, https:\/\/guillaumesblog.net\/wp-content\/uploads\/2026\/09\/image-9-1200x565.png 1200w, https:\/\/guillaumesblog.net\/wp-content\/uploads\/2026\/09\/image-9-1536x723.png 1536w, https:\/\/guillaumesblog.net\/wp-content\/uploads\/2026\/09\/image-9.png 1918w\" sizes=\"auto, (max-width: 709px) 85vw, (max-width: 909px) 67vw, (max-width: 1362px) 62vw, 840px\" \/><figcaption class=\"wp-element-caption\">Visualise and interact with the manufacturing dashboard<\/figcaption><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">And that&#8217;s it! So we have created:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>A manufacturing cockpit with LLM powered dashboard to augment productivity and allow for proactive fault investigation<\/li>\n\n\n\n<li>Alerting system set-up for triggers if certain thresholds are met<\/li>\n\n\n\n<li>A sensor, robot and machine data gathering system in real or near real-time<\/li>\n\n\n\n<li>A parsing, cleaning and grouping of data at big data scale using clusters of commodity hardware (Spark)<\/li>\n\n\n\n<li>Long term storage of logs in cheap data persistence layer with Object storage<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">This use case would work with any type of logs and I leave it to you to extrapolate it to your own monitoring use case.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">See you.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>How can we cut through a large amount of information and get the business insight and answers we need? Data Operations team are familiar with this question and are used to make humongous amounts of logs actionable. Let&#8217;s build a visually appealing dashboard and augment it with an LLM chat capability ready to help the &hellip; <a href=\"https:\/\/guillaumesblog.net\/index.php\/make-data-actionable-create-a-manufacturing-log-analysis-dashboard-augmented-by-ai\/\" class=\"more-link\">Continue reading<span class=\"screen-reader-text\"> &#8220;Make data actionable &#8211; Create a Manufacturing Log Analysis Dashboard augmented by AI&#8221;<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[],"class_list":["post-890","post","type-post","status-publish","format-standard","hentry","category-conversation"],"_links":{"self":[{"href":"https:\/\/guillaumesblog.net\/index.php\/wp-json\/wp\/v2\/posts\/890","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/guillaumesblog.net\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/guillaumesblog.net\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/guillaumesblog.net\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/guillaumesblog.net\/index.php\/wp-json\/wp\/v2\/comments?post=890"}],"version-history":[{"count":33,"href":"https:\/\/guillaumesblog.net\/index.php\/wp-json\/wp\/v2\/posts\/890\/revisions"}],"predecessor-version":[{"id":940,"href":"https:\/\/guillaumesblog.net\/index.php\/wp-json\/wp\/v2\/posts\/890\/revisions\/940"}],"wp:attachment":[{"href":"https:\/\/guillaumesblog.net\/index.php\/wp-json\/wp\/v2\/media?parent=890"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/guillaumesblog.net\/index.php\/wp-json\/wp\/v2\/categories?post=890"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/guillaumesblog.net\/index.php\/wp-json\/wp\/v2\/tags?post=890"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}