<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Span Observer</title>
    <description>The latest articles on DEV Community by Span Observer (@spanobserver).</description>
    <link>https://dev.to/spanobserver</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4230759%2Fec482140-e2ca-44fb-b097-403595d07ccf.png</url>
      <title>DEV Community: Span Observer</title>
      <link>https://dev.to/spanobserver</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/spanobserver"/>
    <language>en</language>
    <item>
      <title>Understanding Dynatrace Managed architecture: nodes, storage and data flow</title>
      <dc:creator>Span Observer</dc:creator>
      <pubDate>Fri, 06 Nov 2026 21:30:17 +0000</pubDate>
      <link>https://dev.to/spanobserver/understanding-dynatrace-managed-architecture-nodes-storage-and-data-flow-5gib</link>
      <guid>https://dev.to/spanobserver/understanding-dynatrace-managed-architecture-nodes-storage-and-data-flow-5gib</guid>
      <description>&lt;p&gt;When you inherit a Dynatrace Managed cluster, the first challenge is not reading the dashboards. It is understanding what actually runs on the servers: in other words, the Dynatrace Managed architecture. A disk incident, a Cassandra alert or a node that will not restart forces you to know which components live where, what data they store and which path OneAgent measurements take to get there.&lt;/p&gt;

&lt;p&gt;This question is specific to Managed. In the hosted model, the vendor absorbs all of this complexity. With Managed, your team owns the operating system, the disks, the network, the backups and the update schedule. A good mental map of the architecture is therefore a prerequisite for running it with confidence.&lt;/p&gt;

&lt;p&gt;This article describes the building blocks of a Managed cluster and how data flows between agents, ActiveGates and nodes, then walks through a short hands-on routine to inventory your own installation.&lt;/p&gt;

&lt;h2&gt;
  
  
  Dynatrace Managed architecture overview: a cluster, nodes and environments
&lt;/h2&gt;

&lt;p&gt;A Managed cluster is a set of Linux servers, called &lt;strong&gt;nodes&lt;/strong&gt;, that all run the same software stack. There is no fixed «&amp;nbsp;master&amp;nbsp;» role: every node receives traffic, processes data, stores part of it and serves the web UI. This symmetry makes adding capacity simple, but it requires all nodes to be sized identically.&lt;/p&gt;

&lt;p&gt;On top of this foundation, the cluster hosts one or more &lt;strong&gt;environments&lt;/strong&gt; (tenants). Each one is reachable at &lt;code&gt;https://{your-domain}/e/{environment-id}&lt;/code&gt; and has its own entities, alerting rules, users and quotas. Cluster-wide administration (nodes, licences, backups, updates, environments) is done in the &lt;strong&gt;Cluster Management Console&lt;/strong&gt; (CMC).&lt;/p&gt;

&lt;h2&gt;
  
  
  What runs on each node
&lt;/h2&gt;

&lt;p&gt;A typical node runs several cooperating processes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;The Dynatrace server&lt;/strong&gt;: the core application (JVM) that receives agent data, correlates entities, runs causation analysis and exposes the UI and APIs.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;A front-end web proxy&lt;/strong&gt;: it terminates HTTPS connections from browsers and agents, then distributes requests to the cluster’s servers.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Cassandra&lt;/strong&gt;: the distributed database for time series (metrics) and part of the configuration.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Elasticsearch&lt;/strong&gt;: the index for user-oriented data, notably RUM sessions and actions.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Transaction storage&lt;/strong&gt;: local files holding distributed traces (PurePaths) and their details.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;By default, the binaries live in &lt;code&gt;/opt/dynatrace-managed&lt;/code&gt; and the data in &lt;code&gt;/var/opt/dynatrace-managed&lt;/code&gt;. It is common, and recommended, to put the different stores on dedicated volumes so that unexpected growth in one does not fill up the others.&lt;/p&gt;

&lt;h2&gt;
  
  
  Storage types and how they behave
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Store&lt;/th&gt;
&lt;th&gt;Content&lt;/th&gt;
&lt;th&gt;Replication&lt;/th&gt;
&lt;th&gt;Watch out for&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Cassandra&lt;/td&gt;
&lt;td&gt;Metrics, timeseries data&lt;/td&gt;
&lt;td&gt;Replicated across nodes (factor 3 is typical from 3 nodes)&lt;/td&gt;
&lt;td&gt;Sensitive to disk and network latency&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Elasticsearch&lt;/td&gt;
&lt;td&gt;User sessions, actions, RUM data&lt;/td&gt;
&lt;td&gt;Replicated across nodes&lt;/td&gt;
&lt;td&gt;Growth tied to session volume&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Transactions&lt;/td&gt;
&lt;td&gt;Distributed traces, request details&lt;/td&gt;
&lt;td&gt;Distributed, usually not replicated&lt;/td&gt;
&lt;td&gt;Losing a node loses part of the recent traces&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Backups&lt;/td&gt;
&lt;td&gt;Copies of Cassandra, Elasticsearch, configuration&lt;/td&gt;
&lt;td&gt;On shared storage (NFS)&lt;/td&gt;
&lt;td&gt;Must be mounted at the same path on every node&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The practical consequence matters: high availability for metrics and configuration relies on replication, and therefore on having enough nodes. A single-node cluster works, but it offers no fault tolerance. In a multi-node cluster the metrics store is kept in three copies, while transaction storage is simply distributed, without redundancy: the documentation requires at least three nodes in production.&lt;/p&gt;

&lt;h2&gt;
  
  
  End-to-end data flow
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt; &lt;strong&gt;Collection&lt;/strong&gt;: the OneAgent installed on a host instruments processes, services and infrastructure.&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;Transport&lt;/strong&gt;: the agent sends its data over HTTPS either directly to the cluster nodes or to an ActiveGate, which concentrates, compresses and forwards it.&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;Reception&lt;/strong&gt;: a node’s front-end proxy accepts the connection and passes it to the Dynatrace server.&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;Processing&lt;/strong&gt;: the server correlates the data with the entity model (topology), computes baselines and detects anomalies.&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;Persistence&lt;/strong&gt;: metrics go to Cassandra, sessions to Elasticsearch, traces to transaction storage.&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;Consumption&lt;/strong&gt;: the web UI, the environment API (&lt;code&gt;…/e/{id}/api/v2/…&lt;/code&gt;) and integrations use this data.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Agents receive the list of available endpoints and fail over automatically if a node or an ActiveGate becomes unavailable. That is why you should avoid hard-coding a single node in network configurations.&lt;/p&gt;

&lt;h2&gt;
  
  
  Network flows you need to know
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;Agents and ActiveGates to the cluster&lt;/strong&gt;: HTTPS on port 443 (redirected locally to 8022 by an iptables rule). Port 8443 also receives OneAgent data and carries node-to-node traffic; it no longer needs to be exposed outside the cluster, except on clusters older than version 1.166 or upgraded from them.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Between nodes&lt;/strong&gt;: a set of ports for Hazelcast (5701–5711), Cassandra (7000, 7001, 9042), Elasticsearch (9200, 9300) and server-to-server communication. These ports must be open between all nodes, and only between them.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Cluster to Mission Control&lt;/strong&gt;: outbound HTTPS for licensing, updates and support, except in offline mode where these operations are manual.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Nodes to NFS&lt;/strong&gt;: for backups.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Step-by-step tutorial: inventory your cluster
&lt;/h2&gt;

&lt;p&gt;Here is a simple routine to check, on an existing cluster, that reality matches the picture above.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 1 — List the nodes in the CMC
&lt;/h3&gt;

&lt;p&gt;Log in to the CMC and open the nodes overview page. For each node, note its IP address, status, version and the disk usage shown. Check that all versions are identical.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 2 — Identify the services on a node
&lt;/h3&gt;

&lt;p&gt;On each server, as root:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;systemctl list-units &lt;span class="nt"&gt;--type&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;service | &lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="nt"&gt;-i&lt;/span&gt; dynatrace
ps &lt;span class="nt"&gt;-eo&lt;/span&gt; pid,user,rss,cmd &lt;span class="nt"&gt;--sort&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nt"&gt;-rss&lt;/span&gt; | &lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="nt"&gt;-i&lt;/span&gt; &lt;span class="nt"&gt;-E&lt;/span&gt; &lt;span class="s2"&gt;"dynatrace|cassandra|elasticsearch"&lt;/span&gt; | &lt;span class="nb"&gt;head&lt;/span&gt; &lt;span class="nt"&gt;-20&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You should see the server, Cassandra, Elasticsearch and front-end proxy processes.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 3 — Map the storage volumes
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;df&lt;/span&gt; &lt;span class="nt"&gt;-h&lt;/span&gt; /opt/dynatrace-managed /var/opt/dynatrace-managed
&lt;span class="nb"&gt;du&lt;/span&gt; &lt;span class="nt"&gt;-sh&lt;/span&gt; /var/opt/dynatrace-managed/&lt;span class="k"&gt;*&lt;/span&gt; 2&amp;gt;/dev/null | &lt;span class="nb"&gt;sort&lt;/span&gt; &lt;span class="nt"&gt;-h&lt;/span&gt;
findmnt &lt;span class="nt"&gt;-t&lt;/span&gt; nfs,nfs4
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;These commands show where the data actually lives, which directory grows fastest and whether the backup share is properly mounted.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 4 — Check the listening ports
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ss &lt;span class="nt"&gt;-tlnp&lt;/span&gt; | &lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="nt"&gt;-E&lt;/span&gt; &lt;span class="s2"&gt;":443|:8443|:9042|:9200|:9300"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Compare the output with the port matrix in the documentation for your version, and review the firewall rules between nodes.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 5 — Query the Cluster API
&lt;/h3&gt;

&lt;p&gt;Create a &lt;em&gt;Cluster API token&lt;/em&gt; with the Service Provider API permission in the CMC, then list the environments:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-s&lt;/span&gt; &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Authorization: Api-Token {token}"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="s2"&gt;"https://{your-domain}/api/cluster/v2/environments"&lt;/span&gt; | python3 &lt;span class="nt"&gt;-m&lt;/span&gt; json.tool
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This output becomes your reference for documenting which tenants live on the cluster.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 6 — Check the logs
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;journalctl &lt;span class="nt"&gt;-u&lt;/span&gt; &lt;span class="s2"&gt;"dynatrace*"&lt;/span&gt; &lt;span class="nt"&gt;--since&lt;/span&gt; &lt;span class="s2"&gt;"1 hour ago"&lt;/span&gt; &lt;span class="nt"&gt;--no-pager&lt;/span&gt; | &lt;span class="nb"&gt;tail&lt;/span&gt; &lt;span class="nt"&gt;-50&lt;/span&gt;
&lt;span class="nb"&gt;ls&lt;/span&gt; &lt;span class="nt"&gt;-lh&lt;/span&gt; /var/opt/dynatrace-managed/log/ 2&amp;gt;/dev/null
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The exact location of application logs can vary with the version and installation choices.&lt;/p&gt;

&lt;h2&gt;
  
  
  Best practices
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;  Aim for at least three nodes in production to benefit from data replication.&lt;/li&gt;
&lt;li&gt;  Keep nodes strictly identical (CPU, RAM, disks): the weakest one sets the cluster’s performance.&lt;/li&gt;
&lt;li&gt;  Split the stores across separate volumes and monitor how full each one is independently.&lt;/li&gt;
&lt;li&gt;  Place nodes on the same low-latency network; for multiple sites, look at &lt;a href="https://span.observer/en/premium-high-availability-dynatrace-managed/" rel="noopener noreferrer"&gt;Premium High Availability&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;  Use ActiveGates to concentrate traffic from remote network zones rather than opening the cluster everywhere (see &lt;a href="https://span.observer/en/environment-vs-cluster-activegate/" rel="noopener noreferrer"&gt;Environment ActiveGate or Cluster ActiveGate&lt;/a&gt;).&lt;/li&gt;
&lt;li&gt;  Document the flow matrix and version it alongside your firewall configuration.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Frequently asked questions
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Is a single-node Managed cluster enough?
&lt;/h3&gt;

&lt;p&gt;It works, but it offers no fault tolerance: Cassandra and Elasticsearch replication requires several nodes. In production, aim for at least three identical nodes.&lt;/p&gt;

&lt;h3&gt;
  
  
  Where is the data stored on a node?
&lt;/h3&gt;

&lt;p&gt;By default under &lt;code&gt;/var/opt/dynatrace-managed&lt;/code&gt;: metrics in Cassandra, RUM sessions and actions in Elasticsearch, distributed traces in local transaction storage. Backups go to an NFS share mounted at the same path on every node (see &lt;a href="https://span.observer/en/dynatrace-managed-backup-restore/" rel="noopener noreferrer"&gt;backing up and restoring a cluster&lt;/a&gt;).&lt;/p&gt;

&lt;h3&gt;
  
  
  Should OneAgents be pointed at a specific node?
&lt;/h3&gt;

&lt;p&gt;No. Agents receive the list of available endpoints and fail over automatically if a node or an ActiveGate becomes unavailable. Hard-coding a single node in the network configuration throws that benefit away.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;A Managed cluster is a complete distributed system: an application server, a proxy, two distributed databases, local trace storage and a shared backup mechanism. Knowing what stores what and where the data travels helps you anticipate incidents, size correctly and talk to support effectively. The next articles in this series build on this map to cover &lt;a href="https://span.observer/en/dynatrace-managed-cluster-sizing/" rel="noopener noreferrer"&gt;sizing&lt;/a&gt;, &lt;a href="https://span.observer/en/install-dynatrace-managed-cluster/" rel="noopener noreferrer"&gt;installation&lt;/a&gt; and &lt;a href="https://span.observer/en/add-remove-node-managed-cluster/" rel="noopener noreferrer"&gt;cluster expansion&lt;/a&gt;. To practise on a test cluster, follow &lt;a href="https://span.observer/en/install-dynatrace-managed-cluster-architecture/" rel="noopener noreferrer"&gt;module 2 of the course on the Dynatrace Managed cluster&lt;/a&gt;, then keep it under watch with &lt;a href="https://span.observer/en/dynatrace-managed-cluster-health-monitoring/" rel="noopener noreferrer"&gt;cluster health monitoring&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;span.observer is an independent community blog, not affiliated with Dynatrace LLC. Dynatrace is a trademark of Dynatrace LLC. Always check values (ports, versions, sizes) in the official documentation for your version of Managed.&lt;/em&gt;&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Originally published on &lt;a href="https://span.observer/en/dynatrace-managed-architecture/" rel="noopener noreferrer"&gt;span.observer&lt;/a&gt;. French version: &lt;a href="https://span.observer/fr/architecture-dynatrace-managed/" rel="noopener noreferrer"&gt;https://span.observer/fr/architecture-dynatrace-managed/&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>apm</category>
      <category>architecture</category>
      <category>cassandra</category>
      <category>cluster</category>
    </item>
    <item>
      <title>OpenChoreo Kubernetes developer platform, open source</title>
      <dc:creator>Span Observer</dc:creator>
      <pubDate>Fri, 06 Nov 2026 19:30:15 +0000</pubDate>
      <link>https://dev.to/spanobserver/openchoreo-kubernetes-developer-platform-open-source-4lbp</link>
      <guid>https://dev.to/spanobserver/openchoreo-kubernetes-developer-platform-open-source-4lbp</guid>
      <description>&lt;p&gt;OpenChoreo Kubernetes developer platform: the &lt;a href="https://github.com/openchoreo/openchoreo" rel="noopener noreferrer"&gt;&lt;code&gt;openchoreo/openchoreo&lt;/code&gt;&lt;/a&gt; repository describes itself as «&amp;nbsp;a complete, open-source developer platform for Kubernetes&amp;nbsp;». It targets teams that build an internal developer platform (IDP) by gluing together a portal, CI, GitOps and observability. The project is released under the Apache 2.0 licence and, according to its README, belongs to the CNCF Sandbox.&lt;/p&gt;

&lt;p&gt;The README states that WSO2 developed OpenChoreo from its experience with the Choreo SaaS platform, and that it is a complete rewrite, not a fork. For an SRE, the appeal comes down to one idea: logs, metrics and traces are surfaced «&amp;nbsp;through the abstractions your developers already understand&amp;nbsp;» (component, project, environment). What does the repository contain, how can it be tried, and what can be monitored?&lt;/p&gt;

&lt;p&gt;A note on honesty: span.observer has not installed or run OpenChoreo. The commands and files quoted here come from the README, the repository’s &lt;code&gt;samples/&lt;/code&gt; folder and the official documentation on openchoreo.dev, all read on 5 November 2026. The screenshots below reproduce those texts. The star count could not be re-read at the source that day, so it is not quoted.&lt;/p&gt;

&lt;h2&gt;
  
  
  OpenChoreo Kubernetes developer platform: what the repository says
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;Licence&lt;/strong&gt;: the LICENSE file is the Apache License 2.0; the README confirms «&amp;nbsp;Apache 2.0&amp;nbsp;».&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Version&lt;/strong&gt;: the &lt;code&gt;VERSION&lt;/code&gt; file on the main branch reads &lt;code&gt;1.4.0-m.2&lt;/code&gt;, a milestone build. The installation guides in the documentation target &lt;code&gt;v1.3.3&lt;/code&gt;, which is the version used here.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Plane architecture&lt;/strong&gt;: the README describes an experience plane (Backstage portal, CLI, GitOps, AI agents), a control plane that translates abstractions into Kubernetes resources, a data plane where workloads run, an observability plane and, optionally, a CI plane based on Buildpacks and Argo Workflows.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Abstractions&lt;/strong&gt;: developers work with components, endpoints and dependencies; platform teams define component types, traits and workflows through Kubernetes resources (CRDs), with no custom controller.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Another useful point: the documentation groups the ideas into four concept pages: developer abstractions, platform abstractions, runtime model and resource relationships.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step-by-step installation (local trial)
&lt;/h2&gt;

&lt;p&gt;These steps follow the «&amp;nbsp;on k3d locally&amp;nbsp;» guide in the official documentation. They create a local Kubernetes cluster inside Docker: this is a trial, not a production install.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 1: check the prerequisites
&lt;/h3&gt;

&lt;p&gt;The documentation asks for Docker v26 or later (with 8 GB of RAM and 4 CPUs), k3d v5.8 or later, kubectl v1.34 or later and Helm v3.12 or later. It suggests checking them with the four commands in the screenshot below.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 2: run the one-command install
&lt;/h3&gt;

&lt;p&gt;The script creates the cluster and installs all four planes. The &lt;code&gt;--with-build&lt;/code&gt; option adds the workflow (CI) plane and &lt;code&gt;--with-observability&lt;/code&gt; adds the observability plane.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ffcpghz1owllakmh2uhgj.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ffcpghz1owllakmh2uhgj.png" alt="OpenChoreo documentation: version checks for docker, k3d, kubectl and helm, then the curl command for the k3d-install.sh script with the options --version v1.3.3, --with-build and --with-observability" width="799" height="260"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The guide also offers a step-by-step Helm installation to understand each component. A shorter alternative exists: the quick start launches a development container (&lt;code&gt;ghcr.io/openchoreo/quick-start:v1.3.3&lt;/code&gt;), then runs &lt;code&gt;./install.sh --version v1.3.3&lt;/code&gt; inside it; adding &lt;code&gt;--with-build --with-observability&lt;/code&gt; works the same way.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 3: open the portal
&lt;/h3&gt;

&lt;p&gt;The Backstage portal is served at &lt;code&gt;http://openchoreo.localhost:8080&lt;/code&gt;; the Observer answers at &lt;code&gt;http://observer.openchoreo.localhost:11080&lt;/code&gt;, and deployed application traffic uses port 19080. The default trial credentials are listed in the documentation: never reuse them outside a local machine.&lt;/p&gt;

&lt;h2&gt;
  
  
  Service observability: what the documentation describes
&lt;/h2&gt;

&lt;p&gt;The installation guide deploys the observability plane with several Helm charts: a logs module and a tracing module based on OpenSearch, a metrics module based on Prometheus, Fluent Bit to collect logs and an OpenTelemetry collector for Kubernetes events. The events are exported to an OpenSearch index named &lt;code&gt;k8s-events&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;The plane is modular. The «&amp;nbsp;tracing adapter API&amp;nbsp;» page explains that the Observer queries an adapter to read traces, spans and span details; the backend is whatever the module provides. That page names no backend other than those in the installation, so do not assume any.&lt;/p&gt;

&lt;h3&gt;
  
  
  Alerts declared as code
&lt;/h3&gt;

&lt;p&gt;According to the documentation, developers attach an alert rule to a component as a trait (&lt;code&gt;observability-alert-rule&lt;/code&gt;). A condition has a window, an interval, an operator (&lt;code&gt;gt&lt;/code&gt;, &lt;code&gt;lt&lt;/code&gt;, &lt;code&gt;gte&lt;/code&gt;, &lt;code&gt;lte&lt;/code&gt;, &lt;code&gt;eq&lt;/code&gt;) and a threshold. The source is a log pattern or a resource metric; the repository example names &lt;code&gt;cpu_usage&lt;/code&gt; and &lt;code&gt;memory_usage&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fqjj5pnvn1vnfpf9fpts7.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fqjj5pnvn1vnfpf9fpts7.png" alt="OpenChoreo file samples/component-alerts/components-with-alert-rules.yaml: frontend component with the observability-alert-rule trait, a critical alert on logs containing rpc error code Unavailable, window 5m, interval 1m, operator gt, threshold 5" width="800" height="825"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This example fires a critical alert if more than five occurrences of the error appear within five minutes, evaluated every minute. It is exactly the reasoning of an error-rate SLI; to frame it, see our &lt;a href="https://span.observer/en/slo-sla-training-course/" rel="noopener noreferrer"&gt;SLO and SLA learning path&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Notification channels
&lt;/h3&gt;

&lt;p&gt;Alerts leave through one channel per environment, either email (SMTP) or webhook. According to the documentation, the first channel created in an environment becomes the default. The next excerpt comes from the sample file; the webhook address is an example to replace.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ft9hahkr7lpy55utffg4n.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ft9hahkr7lpy55utffg4n.png" alt="OpenChoreo file samples/component-alerts/alert-notification-channels.yaml: start of the ObservabilityAlertsNotificationChannel resource of type webhook for the development environment, with an example URL" width="800" height="365"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  A root cause analysis agent
&lt;/h3&gt;

&lt;p&gt;The repository also contains an RCA agent. According to its README, it receives an alert through a REST API, investigates with a ReAct loop through two MCP servers (observability, and OpenChoreo resources) and produces a structured report. Only a set of read-only tools is exposed to it. To judge this kind of agent in production, read &lt;a href="https://span.observer/en/ai-agent-guardrails-production/" rel="noopener noreferrer"&gt;the guardrails for AI agents&lt;/a&gt; and &lt;a href="https://span.observer/en/secure-mcp-server/" rel="noopener noreferrer"&gt;how to secure an MCP server&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Limits and open questions
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;Weight of the stack&lt;/strong&gt;: a full installation assembles Gateway API, cert-manager, External Secrets, an OpenBao vault, an identity provider, OpenSearch and Prometheus. Plan for operating time, not just installation time.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Local trial&lt;/strong&gt;: the documentation examples use default credentials, and the events collector is configured with &lt;code&gt;insecure_skip_verify: true&lt;/code&gt; towards OpenSearch. These settings do not suit production.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Pace of change&lt;/strong&gt;: the main branch is a 1.4.0 milestone; the changelog mentions, for example, release lines and secret management for the observability plane. Read the release notes before each upgrade.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Application instrumentation&lt;/strong&gt;: we did not read a page describing how an application sends its traces to the observability plane. This point is unverified; check the documentation before promising it to a team.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Dynatrace&lt;/strong&gt;: the project documents no Dynatrace integration, and we do not invent one.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Monitoring the platform itself
&lt;/h2&gt;

&lt;p&gt;An internal platform is a service like any other: if the control plane goes down, nobody deploys. OpenChoreo’s documentation describes observability for the deployed workloads; for the platform, you still have to monitor the Kubernetes components that carry it. Here are common-sense pointers, not specific to the project:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;Availability&lt;/strong&gt;: watch the deployments in the &lt;code&gt;openchoreo-control-plane&lt;/code&gt;, &lt;code&gt;openchoreo-data-plane&lt;/code&gt; and &lt;code&gt;openchoreo-observability-plane&lt;/code&gt; namespaces created by the installation, using &lt;a href="https://span.observer/en/kubernetes-alerts-nodes-pods-quotas/" rel="noopener noreferrer"&gt;alerts on pods and quotas&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Metrics&lt;/strong&gt;: if your cluster already runs Prometheus, see how to &lt;a href="https://span.observer/en/prometheus-metrics-dynatrace-kubernetes/" rel="noopener noreferrer"&gt;connect Prometheus to Dynatrace&lt;/a&gt;; the principle holds for any observability backend.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;OpenTelemetry signals&lt;/strong&gt;: the installation’s events collector is an OpenTelemetry collector; our &lt;a href="https://span.observer/en/opentelemetry-collector-contrib-components/" rel="noopener noreferrer"&gt;notes on Collector contrib components&lt;/a&gt; help to read this kind of configuration.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Next in the series: &lt;a href="https://span.observer/en/jan-open-source-chatgpt-alternative/" rel="noopener noreferrer"&gt;Jan, the open source ChatGPT alternative&lt;/a&gt;, another project read the same way.&lt;/p&gt;

&lt;h2&gt;
  
  
  Best practices
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;  Try it on k3d first with the observability plane, then compare with your current stack before any migration.&lt;/li&gt;
&lt;li&gt;  Keep alert rules in Git like other resources, and tie each threshold to an SLO.&lt;/li&gt;
&lt;li&gt;  Replace every example credential and secret; use the intended secrets vault rather than plain-text values.&lt;/li&gt;
&lt;li&gt;  Pin chart versions, as the documentation does with &lt;code&gt;--version&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;  Restrict agents’ MCP tools to read-only, as the repository’s RCA agent does.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Frequently asked questions
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Does OpenChoreo replace Backstage?
&lt;/h3&gt;

&lt;p&gt;No: the README describes a «&amp;nbsp;Backstage-powered&amp;nbsp;» portal. OpenChoreo adds the abstractions, control plane, CI, GitOps and observability around that portal.&lt;/p&gt;

&lt;h3&gt;
  
  
  Do I need to install the observability plane?
&lt;/h3&gt;

&lt;p&gt;It is optional according to the documentation: the &lt;code&gt;--with-observability&lt;/code&gt; option adds it. You therefore need to enable it to get the logs, metrics and traces described above.&lt;/p&gt;

&lt;h3&gt;
  
  
  Which licence, and who maintains the project?
&lt;/h3&gt;

&lt;p&gt;The code is under Apache 2.0. The README states initial development by WSO2 and CNCF Sandbox status; read the repository’s governance page (&lt;code&gt;GOVERNANCE.md&lt;/code&gt;) before an enterprise decision.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;OpenChoreo offers a complete developer platform for Kubernetes, with built-in observability and alerts declared in YAML. The project looks active, but the installation is heavy and several points remain to be checked in the documentation: application instrumentation and long-term operation. Try it locally, measure what it replaces in your toolchain, then decide.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;span.observer is an independent community blog, not affiliated with OpenChoreo, WSO2 or Dynatrace LLC. Brands mentioned belong to their owners. Tools change quickly: check commands and options in their official documentation.&lt;/em&gt;&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Originally published on &lt;a href="https://span.observer/en/openchoreo-kubernetes-developer-platform/" rel="noopener noreferrer"&gt;span.observer&lt;/a&gt;. French version: &lt;a href="https://span.observer/fr/openchoreo-plateforme-developpeur-kubernetes/" rel="noopener noreferrer"&gt;https://span.observer/fr/openchoreo-plateforme-developpeur-kubernetes/&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>backstage</category>
      <category>idp</category>
      <category>kubernetes</category>
      <category>observability</category>
    </item>
    <item>
      <title>Jan open source ChatGPT alternative: offline local AI</title>
      <dc:creator>Span Observer</dc:creator>
      <pubDate>Fri, 06 Nov 2026 16:20:23 +0000</pubDate>
      <link>https://dev.to/spanobserver/jan-open-source-chatgpt-alternative-offline-local-ai-gcd</link>
      <guid>https://dev.to/spanobserver/jan-open-source-chatgpt-alternative-offline-local-ai-gcd</guid>
      <description>&lt;p&gt;Jan open source ChatGPT alternative: the &lt;a href="https://github.com/janhq/jan" rel="noopener noreferrer"&gt;&lt;code&gt;janhq/jan&lt;/code&gt;&lt;/a&gt; repository calls itself an «&amp;nbsp;Open-source ChatGPT replacement&amp;nbsp;», a desktop app that downloads and runs language models on your own machine «&amp;nbsp;with full control and privacy&amp;nbsp;». It is released under the Apache 2.0 licence by Menlo Research. The README lists Windows, macOS and Linux, and the documentation speaks of full offline support for the desktop app.&lt;/p&gt;

&lt;p&gt;For an SRE or a developer, the appeal goes beyond chat. Jan bundles an OpenAI-compatible server on &lt;code&gt;localhost:1337&lt;/code&gt;, an MCP host and a command-line tool. That makes it a local inference endpoint for your scripts and agents. What does the repository actually say, how do you install it, and what can you measure on a tool that runs on a workstation?&lt;/p&gt;

&lt;p&gt;A note on honesty: span.observer has not installed or run Jan. The commands and settings come from the README, from the &lt;a href="https://jan.ai/docs/desktop/api-server" rel="noopener noreferrer"&gt;official documentation on jan.ai&lt;/a&gt; and from the repository’s &lt;code&gt;docs/&lt;/code&gt; files, read on 31 October 2026. The screenshots below reproduce their text. We could not read the star count from the source that day, so we do not quote it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Jan open source ChatGPT alternative: what the repository says
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;Licence&lt;/strong&gt;: the repository’s LICENSE file is the Apache License 2.0, with the line «&amp;nbsp;Copyright 2025 Menlo Research&amp;nbsp;». The README confirms «&amp;nbsp;Apache 2.0&amp;nbsp;».&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Version&lt;/strong&gt;: the main branch carries version 0.8.8 in &lt;code&gt;src-tauri/tauri.conf.json&lt;/code&gt;. The repository’s changelog dates 0.8.8 to 28 October 2026. It is a security release: chat links open in your browser, and the local server checks the origin of browser requests.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Engine&lt;/strong&gt;: the README thanks llama.cpp, Tauri and Scalar. The documentation says the llama.cpp engine is built into the app and updates with it. On Apple Silicon Macs, MLX models are supported too.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Listed features&lt;/strong&gt;: local models from Hugging Face (Llama, Gemma, Qwen, GPT-oss), connections to cloud models (OpenAI, Anthropic, Mistral, Groq, MiniMax), custom assistants, an OpenAI-compatible API and MCP integration.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;One more point: «&amp;nbsp;offline&amp;nbsp;» applies to local models. The documentation states that requests routed to a remote provider are not offline and do not stay on your computer.&lt;/p&gt;

&lt;h2&gt;
  
  
  A tour of the repository and its documentation
&lt;/h2&gt;

&lt;p&gt;The first screenshot reproduces, word for word, the README’s «&amp;nbsp;Features&amp;nbsp;» section and its licence. It shows the scope of the product in six lines.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Flvwtsqqpja6386v8rsza.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Flvwtsqqpja6386v8rsza.png" alt="Excerpt from the janhq/jan README: the six listed features (local models, cloud integration, assistants, OpenAI-compatible API on localhost:1337, MCP, privacy) followed by the Apache 2.0 licence" width="800" height="407"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Source : &lt;a href="https://github.com/janhq/jan/blob/main/README.md" rel="noopener noreferrer"&gt;github.com&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The documentation then describes the local server. The defaults are host &lt;code&gt;127.0.0.1&lt;/code&gt;, port &lt;code&gt;1337&lt;/code&gt; and prefix &lt;code&gt;/v1&lt;/code&gt;. An optional API key goes in the &lt;code&gt;Authorization: Bearer&lt;/code&gt; header. The second screenshot gathers the sample request and these settings.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F1vq0x4hkanyyxzq66ttc.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F1vq0x4hkanyyxzq66ttc.png" alt="Jan documentation: a curl request to http://127.0.0.1:1337/v1/chat/completions with an Authorization Bearer header, then the list of local server settings (host, port, prefix, API key, trusted hosts, CORS, verbose logs)" width="800" height="487"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Source : &lt;a href="https://jan.ai/docs/desktop/api-server" rel="noopener noreferrer"&gt;jan.ai&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Step-by-step installation
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Step 1: download the app
&lt;/h3&gt;

&lt;p&gt;The README offers one installer per platform (jan.exe for Windows 10 and later, jan.dmg for macOS, jan.deb and jan.AppImage for Linux) from jan.ai or the GitHub Releases page. Windows is also available through the Microsoft Store.&lt;/p&gt;

&lt;p&gt;On Linux, the documentation recommends Flatpak:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;flatpak &lt;span class="nb"&gt;install &lt;/span&gt;flathub ai.jan.Jan
flatpak run ai.jan.Jan
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For a &lt;code&gt;.deb&lt;/code&gt; package, the documentation gives &lt;code&gt;sudo apt-get install ./jan-linux-amd64-{version}.deb&lt;/code&gt;, where &lt;code&gt;{version}&lt;/code&gt; stands for the number you downloaded. For the AppImage, run &lt;code&gt;chmod +x&lt;/code&gt; on the file, then execute it directly.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 2: download a model
&lt;/h3&gt;

&lt;p&gt;Open the Hub in the sidebar, search for a model, click &lt;strong&gt;Download&lt;/strong&gt;, then pick it in a conversation’s model selector. For macOS, the README gives a memory guide: 8 GB of RAM for 3-billion-parameter models, 16 GB for 7 billion, 32 GB for 13 billion.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 3: start the OpenAI-compatible server
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt; Go to &lt;strong&gt;Settings &amp;gt; Local API Server&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt; Choose the &lt;strong&gt;Default Model&lt;/strong&gt;, a llama.cpp or MLX model you have already downloaded.&lt;/li&gt;
&lt;li&gt; Click &lt;strong&gt;Start Server&lt;/strong&gt;, then wait until the status shows the server is running.&lt;/li&gt;
&lt;li&gt; Test it with the &lt;code&gt;curl&lt;/code&gt; request in the screenshot above, replacing &lt;code&gt;YOUR_MODEL_ID&lt;/code&gt;.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;According to the documentation, you read the list of available models with &lt;code&gt;GET /v1/models&lt;/code&gt;. If no key is configured, omit the &lt;code&gt;Authorization&lt;/code&gt; header.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 4 (optional): the command line
&lt;/h3&gt;

&lt;p&gt;The documentation says the &lt;code&gt;jan&lt;/code&gt; CLI is installed automatically the first time you launch the app. It serves a model without the interface, with &lt;code&gt;jan serve&lt;/code&gt;, or starts an agent wired to a local model, with &lt;code&gt;jan launch&lt;/code&gt;. Note that the CLI exposes the model on &lt;code&gt;localhost:6767/v1&lt;/code&gt;, not on the app server’s port 1337. The third screenshot shows the CLI help and the layout of the data folder.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fnydifk4rlfqtr6hb9cwx.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fnydifk4rlfqtr6hb9cwx.png" alt="Jan documentation: help output of the jan command (serve, launch, threads, models, examples jan serve and jan models list), then the data folder layout with logs/app.log, llamacpp/models and threads" width="800" height="717"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Source : &lt;a href="https://jan.ai/docs/desktop/cli" rel="noopener noreferrer"&gt;jan.ai&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Limits and open questions
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;Hardware&lt;/strong&gt;: the documentation says the bundled llama.cpp engine does not load models on Intel Macs since 0.8.5; MLX also requires Apple Silicon.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Network exposure&lt;/strong&gt;: choosing host &lt;code&gt;0.0.0.0&lt;/code&gt; makes the server reachable from the local network. The documentation then recommends an API key and advises against leaving it empty. &lt;strong&gt;Trusted Hosts&lt;/strong&gt; add a further layer of control.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Tool execution&lt;/strong&gt;: the «&amp;nbsp;Execute Tools on Server&amp;nbsp;» option, disabled by default, runs MCP tool calls received by the API on the server side. Leave it off unless the client needs it.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Models and MCP&lt;/strong&gt;: the documentation warns that not every model handles tool calls well. MCP-specific risks are covered in &lt;a href="https://span.observer/en/secure-mcp-server/" rel="noopener noreferrer"&gt;our guide to securing an MCP server&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Telemetry&lt;/strong&gt;: the privacy page describes usage statistics subject to your choice at first launch, changeable later in settings, sent to PostHog (EU hosting). It states that conversation content is not tracked. Read it again before an enterprise rollout.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Pace of change&lt;/strong&gt;: three releases in three weeks (0.8.6, 0.8.7, 0.8.8, going by the changelog dates). Test each update before rolling it out widely.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Monitoring Jan on a workstation or test server
&lt;/h2&gt;

&lt;p&gt;Jan is a desktop app, not a service designed for Kubernetes. The project documents neither Prometheus metrics nor OpenTelemetry export for the app, so we assume none. What the documentation does provide:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;Logs&lt;/strong&gt;: &lt;code&gt;logs/app.log&lt;/code&gt; in the data folder, with the [APP], [SERVER] and [SPECS] categories. «&amp;nbsp;Verbose Server Logs&amp;nbsp;» are enabled by default and detail the requests the local server receives.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Availability&lt;/strong&gt;: a synthetic check on &lt;code&gt;GET /v1/models&lt;/code&gt; confirms the server answers and the expected model is present. A &lt;code&gt;401&lt;/code&gt; means a missing or wrong key, a &lt;code&gt;404&lt;/code&gt; an unknown model ID, and «&amp;nbsp;Connection Refused&amp;nbsp;» a stopped server or wrong port. The documentation lists these three cases.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Resources&lt;/strong&gt;: memory and CPU or GPU use of the process can be measured with host tools. That is where you see a model too large for the machine. The «&amp;nbsp;Request Timeout&amp;nbsp;» setting bounds the wait for a model response.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For client-side calls, instrument the script that queries the endpoint: one span per request, with the model name and the duration. The approach is detailed in &lt;a href="https://span.observer/en/ollama-local-llm-monitoring/" rel="noopener noreferrer"&gt;monitoring a local LLM with Ollama&lt;/a&gt;, and it applies to any local OpenAI-compatible server. To choose the model itself, see &lt;a href="https://span.observer/en/choosing-an-llm-operations-criteria/" rel="noopener noreferrer"&gt;the operational criteria for an LLM&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  And Dynatrace?
&lt;/h3&gt;

&lt;p&gt;Jan documents no Dynatrace integration, and we do not invent one. OpenTelemetry instrumentation of the client that calls the local server remains possible with any OTLP-compatible backend, Dynatrace SaaS included; check the setup in the Dynatrace documentation.&lt;/p&gt;

&lt;h2&gt;
  
  
  Best practices
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;  Keep the host at &lt;code&gt;127.0.0.1&lt;/code&gt; while no other machine needs the API, and set an API key as soon as you go beyond that.&lt;/li&gt;
&lt;li&gt;  Leave «&amp;nbsp;Execute Tools on Server&amp;nbsp;» off unless you have a specific need, and limit connected MCP servers. See also &lt;a href="https://span.observer/en/ai-agent-guardrails-production/" rel="noopener noreferrer"&gt;guardrails for AI agents in production&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;  Keep Jan up to date: version 0.8.8 fixes issues reported through GitHub Security Advisories.&lt;/li&gt;
&lt;li&gt;  Watch the &lt;code&gt;app.log&lt;/code&gt; file after every model or version change.&lt;/li&gt;
&lt;li&gt;  If you need an engine for production, compare it with &lt;a href="https://span.observer/en/vllm-llm-inference-server/" rel="noopener noreferrer"&gt;vLLM and its metrics&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Frequently asked questions
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Does Jan really work offline?
&lt;/h3&gt;

&lt;p&gt;Yes for local models, once downloaded: the quickstart describes local models as «&amp;nbsp;private, offline, no API key&amp;nbsp;». Cloud models and requests routed to a remote provider need a connection.&lt;/p&gt;

&lt;h3&gt;
  
  
  Can Jan replace the OpenAI API for my scripts?
&lt;/h3&gt;

&lt;p&gt;The documentation presents it as a drop-in replacement for private applications. Point your client at &lt;code&gt;http://127.0.0.1:1337/v1&lt;/code&gt;. span.observer has not tested the exact compatibility of each parameter, so check the ones your code depends on.&lt;/p&gt;

&lt;h3&gt;
  
  
  Which licence, and can I use it at work?
&lt;/h3&gt;

&lt;p&gt;The code is under Apache 2.0, a permissive licence. Each downloaded model has its own licence: read it before any professional use.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Jan is a simple way into local AI. Its OpenAI-compatible server and CLI make it useful for trials, agent prototypes and environments without a cloud. Monitoring remains yours to build around it: logs, synthetic checks and host measurements. The project moves fast, so reread the documentation before each rollout.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;span.observer is an independent community blog, not affiliated with Jan, Menlo Research or Dynatrace LLC. Trademarks belong to their owners. Tools change quickly: check commands and options in their official documentation.&lt;/em&gt;&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Originally published on &lt;a href="https://span.observer/en/jan-open-source-chatgpt-alternative/" rel="noopener noreferrer"&gt;span.observer&lt;/a&gt;. French version: &lt;a href="https://span.observer/fr/jan-alternative-chatgpt-open-source/" rel="noopener noreferrer"&gt;https://span.observer/fr/jan-alternative-chatgpt-open-source/&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>llamacpp</category>
      <category>llm</category>
      <category>localai</category>
      <category>mcp</category>
    </item>
  </channel>
</rss>
