<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[CloudSkill Consulting LLC]]></title><description><![CDATA[CloudSkill Consulting LLC]]></description><link>https://cloudskillconsulting.hashnode.dev</link><image><url>https://cdn.hashnode.com/res/hashnode/image/upload/v1593680282896/kNC7E8IR4.png</url><title>CloudSkill Consulting LLC</title><link>https://cloudskillconsulting.hashnode.dev</link></image><generator>RSS for Node</generator><lastBuildDate>Mon, 19 Oct 2026 09:52:22 GMT</lastBuildDate><atom:link href="https://cloudskillconsulting.hashnode.dev/rss.xml" rel="self" type="application/rss+xml"/><language><![CDATA[en]]></language><ttl>60</ttl><item><title><![CDATA[How Telemetry Flows Through the OpenTelemetry Collector: Traces, Metrics and Logs for Beginners]]></title><description><![CDATA[When you first meet OpenTelemetry, the hardest part is not any single command. It is the picture: where does the data start, what carries it, what happens to it in the middle, and where does it end up]]></description><link>https://cloudskillconsulting.hashnode.dev/how-telemetry-flows-through-the-opentelemetry-collector</link><guid isPermaLink="true">https://cloudskillconsulting.hashnode.dev/how-telemetry-flows-through-the-opentelemetry-collector</guid><category><![CDATA[OpenTelemetry]]></category><category><![CDATA[observability]]></category><category><![CDATA[Beginner Developers]]></category><category><![CDATA[Devops]]></category><dc:creator><![CDATA[CloudSkill Consulting LLC]]></dc:creator><pubDate>Sat, 17 Oct 2026 11:36:53 GMT</pubDate><enclosure url="https://cdn.hashnode.com/uploads/covers/6ad1c351ab9cba8952c4033d/916ec0dd-de48-47d7-9094-dd36dd2a2f30.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>When you first meet OpenTelemetry, the hardest part is not any single command. It is the picture: where does the data start, what carries it, what happens to it in the middle, and where does it end up? This beginner's explainer from CloudSkill Consulting LLC answers that question for all three kinds of telemetry at once. We follow one small sample service, <code>checkout-demo</code>, from the moment it produces data to the moment you can read that data yourself.</p>
<p>We go in lessons. Each lesson explains one idea in text, and a small diagram beside it shows the same idea.</p>
<h2>Lesson 1. Three signals, three questions</h2>
<p><em>Telemetry</em> is the data your systems send out about themselves. OpenTelemetry calls each kind a <em>signal</em>, and there are three main ones:</p>
<ul>
<li><p><strong>Traces</strong> record the path of one request through your services. Each step in that path is a <em>span</em>.</p>
</li>
<li><p><strong>Metrics</strong> are numbers measured over time, such as requests per second.</p>
</li>
<li><p><strong>Logs</strong> are event messages, such as an error message.</p>
</li>
</ul>
<p>Each signal answers a different question. A metric tells you <em>that</em> something is wrong. A trace tells you <em>where</em>. A log tells you <em>what</em> happened. In this guide, all three get the same care, because they all take the same trip.</p>
<img src="https://cdn.hashnode.com/uploads/covers/6ad1c351ab9cba8952c4033d/1a8945fd-9484-40ca-a8bc-616aa2372a31.png" alt="" style="display:block;margin:0 auto" />

<p><em>Figure 1. The three signals, and the question each one helps you answer.</em></p>
<h2>Lesson 2. The four stops on the journey</h2>
<p>Every piece of telemetry makes the same trip, whatever its signal.</p>
<ol>
<li><p><strong>Create.</strong> Inside your app, an OpenTelemetry SDK or instrumentation library creates spans, metrics and logs. Each one carries a <em>resource</em>: a set of attributes that describe who produced it. The most important resource attribute is <code>service.name</code>. For our sample service it is <code>checkout-demo</code>, and it is how you will later find this service's data among everything else.</p>
</li>
<li><p><strong>Carry.</strong> The data is sent over the network using <strong>OTLP</strong> (the OpenTelemetry Protocol), OpenTelemetry's own way of sending telemetry from one place to another. An OTLP receiver usually listens on port 4317 for gRPC and port 4318 for HTTP.</p>
</li>
<li><p><strong>Process.</strong> The OpenTelemetry Collector receives the data, can change it on the way through, and sends it on.</p>
</li>
<li><p><strong>Store.</strong> A backend stores the data and lets you search and chart it.</p>
</li>
</ol>
<p>The Collector is optional in theory, but in practice it is the central stop: it lets you change where data goes without changing every app.</p>
<img src="https://cdn.hashnode.com/uploads/covers/6ad1c351ab9cba8952c4033d/15c4b89b-dc65-475e-a932-781170fcf214.png" alt="" style="display:block;margin:0 auto" />

<p><em>Figure 2. Create, carry, process, store: the same four stops for traces, metrics and logs.</em></p>
<h2>Lesson 3. Inside the Collector: one receiver, three pipelines</h2>
<p>Think of the Collector as a small post office for <code>checkout-demo</code>'s data. Its config file tells it four things (<a href="https://opentelemetry.io/docs/collector/configuration/">configuration docs</a>):</p>
<ul>
<li><p><strong>Receivers: the front door.</strong> This is where <code>checkout-demo</code>'s data comes in. Our front door is the <code>otlp</code> receiver, because the data arrives as OTLP.</p>
</li>
<li><p><strong>Processors: the sorting table.</strong> Here the data can be changed before it leaves. We use <code>batch</code>, which packs many small items together so they travel in groups.</p>
</li>
<li><p><strong>Exporters: the way out.</strong> This is where the data goes next. In real life that is a backend. For learning, we use <code>debug</code>, which simply prints the data on the Collector's screen.</p>
</li>
<li><p><strong>The</strong> <code>service</code> <strong>section: the route plan.</strong> It links a door, a table and a way out into a <strong>pipeline</strong>. Each pipeline is for one signal only: <code>traces</code>, <code>metrics</code> or <code>logs</code>.</p>
</li>
</ul>
<p>One receiver can feed several pipelines. That is the key idea of this lesson: the same <code>otlp</code> receiver takes in all three signals, and the Collector then sends each signal down its own pipeline. Processors in a pipeline run in the order you list them. Defining a part at the top of the file is not enough: you also need to put it in a pipeline.</p>
<img src="https://cdn.hashnode.com/uploads/covers/6ad1c351ab9cba8952c4033d/c07467a7-d3a0-4b6a-8754-62d7ff89a3e9.png" alt="" style="display:block;margin:0 auto" />

<p><em>Figure 3. One receiver, three pipelines. Each signal travels its own line through the Collector.</em></p>
<p>Here is a minimal learning config that matches Figure 3:</p>
<pre><code class="language-yaml">receivers:
  otlp:
    protocols:
      grpc:
        endpoint: localhost:4317  # gRPC, only this computer can send
      http:
        endpoint: localhost:4318  # HTTP, only this computer can send

processors:
  batch: {}

exporters:
  debug:
    verbosity: detailed

service:
  pipelines:
    traces:
      receivers: [otlp]
      processors: [batch]
      exporters: [debug]
    metrics:
      receivers: [otlp]
      processors: [batch]
      exporters: [debug]
    logs:
      receivers: [otlp]
      processors: [batch]
      exporters: [debug]
</code></pre>
<p>The <code>otlp</code> receiver now has two doors: gRPC on port 4317 and HTTP on port 4318. Our test tool below uses the gRPC door.</p>
<p>Read it from the bottom up. The <code>service.pipelines</code> block names three lines. Each line says: take data from <code>otlp</code>, pass it through <code>batch</code>, and print it with <code>debug</code>. The blocks above it simply define those parts.</p>
<h2>Lesson 4. Walk-through: watch checkout-demo's data arrive</h2>
<p>Now we watch the flow happen. We do not need a real app: <a href="https://github.com/open-telemetry/opentelemetry-collector-contrib/tree/main/cmd/telemetrygen">telemetrygen</a>, a tool from the OpenTelemetry project, can play the part of <code>checkout-demo</code> and send all three signals. If you have Go on your computer, one command installs it:</p>
<pre><code class="language-bash">go install github.com/open-telemetry/opentelemetry-collector-contrib/cmd/telemetrygen@latest
</code></pre>
<p>Start the Collector with the config from Lesson 3. Then, in a second terminal, send one item of each signal, naming the sample service with the <code>--service</code> flag:</p>
<pre><code class="language-bash"># 1) one trace
telemetrygen traces  --otlp-insecure --traces 1  --service checkout-demo
# 2) one metric
telemetrygen metrics --otlp-insecure --metrics 1 --service checkout-demo
# 3) one log
telemetrygen logs    --otlp-insecure --logs 1    --service checkout-demo
</code></pre>
<p>Now switch to the Collector's terminal. Your job is simple: find <code>service.name: checkout-demo</code> three times. Look for it once in the trace output, once in the metric output and once in the log output. It sits with the resource attributes. If you find all three, then all three signals reached the Collector and came out of their own pipelines.</p>
<img src="https://cdn.hashnode.com/uploads/covers/6ad1c351ab9cba8952c4033d/82791615-7e12-4a97-8efb-1f9de3344c9e.png" alt="" style="display:block;margin:0 auto" />

<p><em>Figure 4. The walk-through: find checkout-demo once in each signal's output.</em></p>
<h2>Lesson 5. Who is allowed to send data in?</h2>
<p>The receiver's endpoint decides who can send data to it. With <code>localhost</code>, only your own computer can send data. With <code>0.0.0.0</code>, the Collector listens on every network interface. Then any computer that can reach yours can send data too. The OpenTelemetry <a href="https://opentelemetry.io/docs/security/config-best-practices/">security best practices</a> advise binding to a specific interface, such as <code>localhost</code> or a pod's IP, instead of <code>0.0.0.0</code>. Since Collector v0.110.0, if you don't set an endpoint, the Collector uses <code>localhost</code>. In Docker or Kubernetes, <code>localhost</code> may not behave as you expect, so deployed configs often use a different, specific address.</p>
<img src="https://cdn.hashnode.com/uploads/covers/6ad1c351ab9cba8952c4033d/5486c948-6033-4810-b57b-774f15583275.png" alt="" style="display:block;margin:0 auto" />

<p><em>Figure 5. The endpoint address decides who can send data in. Pick the narrowest address that works.</em></p>
<h2>Where to go next</h2>
<p>In a real setup you replace the <code>debug</code> exporter with an exporter for your backend, and you may add processors to shape the data. Because one Collector config carries all three signals, a small mistake can affect everything you collect, so changes deserve testing before they reach production. A CloudSkill Consulting LLC guide on testing Collector config changes safely is coming soon on our Dev.to.</p>
<h2>Key terms</h2>
<ul>
<li><p><strong>Signal:</strong> one kind of telemetry: traces, metrics or logs.</p>
</li>
<li><p><strong>Span:</strong> one step in a trace.</p>
</li>
<li><p><strong>Resource /</strong> <code>service.name</code><strong>:</strong> attributes describing who produced the data; <code>service.name</code> names the service.</p>
</li>
<li><p><strong>OTLP:</strong> the OpenTelemetry Protocol that carries telemetry (4317 gRPC, 4318 HTTP).</p>
</li>
<li><p><strong>Pipeline:</strong> one line in <code>service.pipelines</code> that carries one signal from receivers through processors to exporters.</p>
</li>
</ul>
<hr />
<p><em>Written by the CloudSkill Consulting LLC team, a multi-cloud architecture, FinOps and observability consultancy (</em><a href="https://cloudskillconsulting.com"><em>cloudskillconsulting.com</em></a><em>). Questions: <a href="mailto:info@cloudskillconsulting.com">info@cloudskillconsulting.com</a></em></p>
]]></content:encoded></item><item><title><![CDATA[How to Plan a Simple Multi-Cloud Setup on AWS and Azure Without Overspending]]></title><description><![CDATA[Many companies end up on two clouds. Maybe one app runs on AWS. Maybe the company already uses Microsoft 365 and Azure. Now there are two bills, two consoles and two sets of rules.
Two clouds do not h]]></description><link>https://cloudskillconsulting.hashnode.dev/simple-multi-cloud-aws-azure-without-overspending</link><guid isPermaLink="true">https://cloudskillconsulting.hashnode.dev/simple-multi-cloud-aws-azure-without-overspending</guid><category><![CDATA[AWS]]></category><category><![CDATA[Azure]]></category><category><![CDATA[multi-cloud]]></category><category><![CDATA[Cloud Computing]]></category><category><![CDATA[finops]]></category><dc:creator><![CDATA[CloudSkill Consulting LLC]]></dc:creator><pubDate>Fri, 16 Oct 2026 23:35:11 GMT</pubDate><enclosure url="https://cdn.hashnode.com/uploads/covers/6ad1c351ab9cba8952c4033d/51f99aea-b234-4ade-a160-6418350d749a.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Many companies end up on two clouds. Maybe one app runs on AWS. Maybe the company already uses Microsoft 365 and Azure. Now there are two bills, two consoles and two sets of rules.</p>
<p>Two clouds do not have to cost twice as much to manage. The trick is simple: <strong>share the rules, not the tools.</strong></p>
<p>In this guide, CloudSkill Consulting LLC walks you through the plan one step at a time. First, you write down why you use each cloud. Next, you set five shared rules that work the same way on AWS and Azure. Then you use each cloud's own cost tools to follow those rules. Finally, you look at the common mistakes and a simple plan for your first month.</p>
<h2>First, write down why you are multi-cloud</h2>
<p>This sounds too simple. It is the step most people skip.</p>
<p>Write one line for each cloud:</p>
<ul>
<li>"We use <strong>AWS</strong> for ___."</li>
<li>"We use <strong>Azure</strong> for ___."</li>
</ul>
<p>Good reasons are clear and specific. For example: a product already runs there, a tool you need lives there, or a customer requires it.</p>
<p>If you can't fill in the blank, that cloud may not need new workloads. Every extra place you run things adds cost: more skills, more monitoring, more data moving around.</p>
<img src="https://cdn.hashnode.com/uploads/covers/6ad1c351ab9cba8952c4033d/dd2d3bfd-8585-4101-81ef-f71da658c5c9.png" alt="Diagram: two fill-in lines, &quot;We use AWS for ___&quot; and &quot;We use Azure for ___&quot;, point to a box of good, specific reasons: a product already runs there, a tool you need lives there, or a customer requires it. A box below says that if you can't fill in the blank, that cloud may not need new workloads." style="display:block;margin:0 auto" />
*Figure 1. Write one "why" line for each cloud before you add anything new to it.*

<h2>The five shared rules</h2>
<p>These rules are the same on both clouds. Only the tool you use to follow each rule is different. Figure 2 shows each rule in the middle, with the AWS tool on the left and the Azure tool on the right.</p>
<img src="https://cdn.hashnode.com/uploads/covers/6ad1c351ab9cba8952c4033d/1f0366dc-1559-44da-86d1-8d228df57583.png" alt="Diagram of the five shared rules in a middle column, each linked to an AWS tool on the left and an Azure tool on the right: one tag scheme (cost allocation tags; tags plus Azure Policy), one budget per project (AWS Budgets; Cost Management budgets), one owner per account (AWS Organizations; Azure management groups), same alert levels (AWS Budgets alerts; Cost Management budget alerts), and one monthly review (Cost Explorer; Cost analysis)." style="display:block;margin:0 auto" />
*Figure 2. The five shared rules stay the same on both clouds. Each cloud uses its own tool to follow them.*

<h3>Rule 1: One tag scheme</h3>
<p>Pick a few tag keys and use them everywhere. For example: <code>owner</code>, <code>env</code>, <code>project</code>, <code>cost-center</code>.</p>
<p>Same spelling. Same lowercase. On AWS, activate them as cost allocation tags so they show up in billing. On Azure, use Azure Policy to require them.</p>
<p>Now you can ask one question on both clouds and get a matching answer:</p>
<pre><code class="language-bash"># AWS: find resources tagged project=billing-api (current region)
aws resourcegroupstaggingapi get-resources \
  --tag-filters Key=project,Values=billing-api \
  --query "ResourceTagMappingList[].ResourceARN"

# Azure: find resources tagged project=billing-api (current subscription)
az resource list --tag project=billing-api \
  --query "[].{Name:name,Type:type,RG:resourceGroup}" -o table
</code></pre>
<p>The two commands do the same job. The first one asks AWS for every resource with the tag <code>project=billing-api</code> in the current region. The second one asks Azure the same question for the current subscription. Because the tag key and value are spelled the same way on both sides, the answers match.</p>
<img src="https://cdn.hashnode.com/uploads/covers/6ad1c351ab9cba8952c4033d/ed3ca9fa-7b55-4edb-8036-5f2b29518de1.png" alt="Diagram: the shared tag keys owner, env, project and cost-center, with the same spelling and lowercase, flow to AWS, where they are activated as cost allocation tags so they show up in billing, and to Azure, where Azure Policy requires them. A box below warns that Owner on one side and owner on the other breaks reports." style="display:block;margin:0 auto" />
*Figure 3. One set of tag keys, spelled the same way, works on both clouds.*

<h3>Rule 2: One budget per project, on each cloud</h3>
<p>If a project runs on both clouds, give it a budget on both. Use <strong>AWS Budgets</strong> on one side and <strong>Cost Management budgets</strong> on the other. Filter each budget by the same <code>project</code> tag.</p>
<p>Then the project owner sees two numbers that add up to one total.</p>
<h3>Rule 3: One owner per account or subscription</h3>
<p>Every AWS account and every Azure subscription needs one named person. Not a group email. A person.</p>
<p>Group them in a clear way:</p>
<ul>
<li><strong>AWS Organizations</strong> puts accounts under one structure with one bill for all accounts (consolidated billing).</li>
<li><strong>Azure management groups</strong> put subscriptions under one structure for policy and access.</li>
</ul>
<p>Try to mirror the layout. For example, "prod" and "non-prod" on both sides. When both clouds look the same, people can find things quickly, and every bill line has a person to ask.</p>
<img src="https://cdn.hashnode.com/uploads/covers/6ad1c351ab9cba8952c4033d/c4ca2272-dd5a-4dc6-94cc-50fe76cf0818.png" alt="Diagram: AWS Organizations (accounts under one structure with consolidated billing) and Azure management groups (subscriptions under one structure for policy and access) each split into matching prod and non-prod groups, and each group has one named person as owner." style="display:block;margin:0 auto" />
*Figure 4. Mirror the same prod and non-prod layout on both clouds, with one named person for each account or subscription.*

<h3>Rule 4: Same alert levels</h3>
<p>Decide your alert levels once. Use them on both clouds. Choose levels that fit your budget, such as a warning when forecast spend is getting close and a louder alert when actual spend goes over. Set the alert levels in AWS Budgets on AWS and in Cost Management budget alerts on Azure.</p>
<p>When the rules match, people learn them once. They stop ignoring alerts from "the other cloud."</p>
<h3>Rule 5: One monthly cost review</h3>
<p>One meeting. Both clouds. Use Cost Explorer on AWS and Cost analysis on Azure. Same agenda each time:</p>
<ol>
<li>Top changes on AWS.</li>
<li>Top changes on Azure.</li>
<li>Untagged resources on either side.</li>
<li>Data moving between the clouds.</li>
</ol>
<h2>Use each cloud's own cost tools</h2>
<p>You don't need a big new platform on day one. Both clouds already give you good tools.</p>
<table>
<thead>
<tr>
<th>Job</th>
<th>AWS</th>
<th>Azure</th>
</tr>
</thead>
<tbody><tr>
<td>See spend</td>
<td>Cost Explorer</td>
<td>Cost Management (Cost analysis)</td>
</tr>
<tr>
<td>Budgets and alerts</td>
<td>AWS Budgets</td>
<td>Cost Management budgets</td>
</tr>
<tr>
<td>Tag rules</td>
<td>Cost allocation tags</td>
<td>Tags + Azure Policy</td>
</tr>
<tr>
<td>Rightsizing advice</td>
<td>Compute Optimizer</td>
<td>Azure Advisor (Cost)</td>
</tr>
<tr>
<td>Commitments</td>
<td>Savings Plans, Reserved Instances</td>
<td>Reservations, savings plan for compute</td>
</tr>
</tbody></table>
<p>Start here. Add more only when these stop being enough.</p>
<h2>Mistakes that quietly raise the bill</h2>
<p><strong>Copying everything to both clouds "just in case."</strong> Running the same full stack twice doubles cost. Decide which workloads truly need to be on both. For most, one cloud is enough.</p>
<p><strong>Forgetting data transfer.</strong> Moving data out of a cloud costs money on both AWS and Azure. Apps that send data between clouds all day can cost a lot. Keep data and the apps that use it close together.</p>
<p><strong>Two tag schemes.</strong> <code>Owner</code> on one side and <code>owner</code> on the other breaks your reports. Fix the spelling early.</p>
<p><strong>Buying commitments too soon.</strong> Savings Plans and Reservations are great for steady, right-sized workloads. They are a bad fit for something you might move next quarter.</p>
<p><strong>No one reads the alerts.</strong> An alert sent to a shared inbox that nobody checks is the same as no alert.</p>
<h2>A simple first-month plan</h2>
<ul>
<li><strong>Week 1:</strong> Write the "why" line for each cloud. Agree on tag keys.</li>
<li><strong>Week 2:</strong> Turn on tag rules (cost allocation tags on AWS, Azure Policy on Azure).</li>
<li><strong>Week 3:</strong> Create one budget per project on each cloud, with the same alert levels.</li>
<li><strong>Week 4:</strong> Hold the first monthly review. Write down three fixes.</li>
</ul>
<p>Each week builds on the one before. The tag keys from week 1 are used by the tag rules in week 2. The budgets in week 3 filter on those tags. The review in week 4 uses the same agenda as Rule 5.</p>
<img src="https://cdn.hashnode.com/uploads/covers/6ad1c351ab9cba8952c4033d/14898c82-9e9a-4708-906e-a3fbfd8b7aab.png" alt="Diagram of a four-week timeline: week 1, write the why line and agree on tag keys; week 2, turn on tag rules; week 3, one budget per project with the same alert levels; week 4, first monthly review. Below is the review agenda: top changes on AWS, top changes on Azure, untagged resources, and data moving between clouds." style="display:block;margin:0 auto" />
*Figure 5. The first-month plan, ending in the monthly review and its four-point agenda.*

<h2>One question to ask this week</h2>
<p>If someone asked, "What did project X cost last month, on both clouds?", could you answer in five minutes?</p>
<p>If not, start with Rule 1. Everything else gets easier after that.</p>
<p><em>Have a multi-cloud cost question? CloudSkill Consulting LLC shares more practical AWS, Azure and Google Cloud notes at <a href="https://cloudskillconsulting.com">cloudskillconsulting.com</a>.</em></p>
]]></content:encoded></item></channel></rss>