<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Kyle Brandt</title>
    <link>http://kbrandt.com/</link>
    <description>Recent content on Kyle Brandt</description>
    <generator>Hugo -- gohugo.io</generator>
    <copyright>Copyright (c) 2015, Kyle Brandt; all rights reserved.</copyright>
    <lastBuildDate>Wed, 16 Mar 2016 16:29:41 -0400</lastBuildDate>
    <atom:link href="http://kbrandt.com/index.xml" rel="self" type="application/rss+xml" />
    
    <item>
      <title>False Dichotomies of Huge Dickensians</title>
      <link>http://kbrandt.com/post/dickensian/</link>
      <pubDate>Wed, 16 Mar 2016 16:29:41 -0400</pubDate>
      
      <guid>http://kbrandt.com/post/dickensian/</guid>
      <description>&lt;p&gt;I&amp;rsquo;m not talking about the author. Young, and some not so young engineers sometimes have some positive associations with being disrespectful, dismissive, or otherwise a &lt;strong&gt;Huge Dickensian&lt;/strong&gt;.&lt;/p&gt;

&lt;div class=&#34;embed video-player center&#34; style=&#34;width: 600px&#34;&gt;
&lt;iframe class=&#34;youtube-player&#34; type=&#34;text/html&#34;
    src=&#34;http://www.youtube.com/embed/79zvkvajQEk?start=70&#34;
    allowfullscreen frameborder=&#34;0&#34;&gt;
&lt;/iframe&gt;
&lt;/div&gt;

&lt;p&gt;This is shame, because it hurts their careers and makes people around them unhappy. So I&amp;rsquo;d like to dispel some ideas I&amp;rsquo;ve held or seen other people hold, that are just not true.&lt;/p&gt;

&lt;h1 class=&#34;small-caps&#34;&gt; People will think I&#39;m Smarter if I&#39;m a Jackass to Others&lt;/h1&gt;

&lt;p&gt;In both fiction and reality there are geniuses that have a reputation for being rude to others. To name a few:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Sheldon Cooper (TV: Big Bang Theory)&lt;/li&gt;
&lt;li&gt;Dr House (TV)&lt;/li&gt;
&lt;li&gt;Linus Torvalds (At least at times)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;They are role models that create stereotypes, and ones that many of us who were into computers growing up can relate to. So based on that stereotype it seems to follow that &amp;ldquo;I&amp;rsquo;m smart, and maybe if I act like these people, people will think I&amp;rsquo;m a genius&amp;rdquo;. It does not. Likely the only people you will fool are the ones that don&amp;rsquo;t matter. Instead, people will think you are just insecure and only want to work with you if they have to.&lt;/p&gt;

&lt;h1 class=&#34;small-caps&#34;&gt;I&#39;d rather hire someone smart that is a jerk than someone nice but useless&lt;/h1&gt;

&lt;p&gt;This idea follows from the above stereotype. If you ask people this question you will get different answers and hear some good stories. If faced with that dilemma I would probably have to say &amp;ldquo;It depends.&amp;rdquo; But generally it is a false dilemma. The best places to work are picky, and will hire people who are not intolerable and are also smart. In other words, they can get people with good traditional intelligence and emotional intelligence.&lt;/p&gt;

&lt;p&gt;There are of course exceptions, but generally these are extreme and if you think you are one of those exceptions, you are probably wrong.&lt;/p&gt;

&lt;p&gt;&lt;h1 class=&#34;small-caps&#34;&gt;I want to be direct with people, and that often means I have to be mean&lt;/h1&gt;
This one is understandable, as telling hard truths to people without being mean is difficult. However, people are often aware of you motivation when doing this. Generally one wants to change some behavior that is making their lives difficult. But in addition to that there can be a desire to help that person and see them grow, or put them down to make yourself feel better. If it is the latter they will know.&lt;/p&gt;

&lt;p&gt;You don&amp;rsquo;t have to be bubbly and outgoing. People like Spock, but that is because they know he isn&amp;rsquo;t mean. He doesn&amp;rsquo;t take pleasure in seeing other people fail and is analytical. Another way to think about this is the difference between being &lt;a href=&#34;http://www.artofmanliness.com/2013/02/12/how-to-be-assertive/&#34;&gt;assertive vs aggressive&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;h1 class=&#34;small-caps&#34;&gt;If you are smart I wouldn&amp;rsquo;t have to explain myself&lt;/h1&gt;
I think the opposite is true. Smart people will think of multiple possible scenarios based on vague communication. People also won&amp;rsquo;t think you are too smart to explain yourself, they will just think you are not articulate or haven&amp;rsquo;t actually thought out your ideas and are just relying on heuristics.&lt;/p&gt;

&lt;p&gt;All of this doesn&amp;rsquo;t apply to people that actually have disorders related to social interaction, but rather reflect some naive thoughts that I bet most of us held at one point. If these thoughts ring true, there are some simple cheap books that can get you on the right path such as &amp;ldquo;&lt;a href=&#34;https://en.wikipedia.org/wiki/How_to_Win_Friends_and_Influence_People&#34;&gt;How to Win Friends and Influence People&lt;/a&gt;&amp;rdquo; and &amp;ldquo;&lt;a href=&#34;https://en.wikipedia.org/wiki/Nonviolent_Communication&#34;&gt;Nonviolent Communication&lt;/a&gt;&amp;rdquo;. You&amp;rsquo;re smart, right? So it won&amp;rsquo;t take much time to learn to be nice and it will help your career.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Conflating The Roles of Alerting and Dashboards</title>
      <link>http://kbrandt.com/post/alert_status/</link>
      <pubDate>Fri, 04 Mar 2016 08:36:42 -0500</pubDate>
      
      <guid>http://kbrandt.com/post/alert_status/</guid>
      <description>

&lt;p&gt;Monitoring dashboards and alerts have distinct roles in monitoring. Problems arise when people fail to form a contradistinction between them. Both are communication tools, but communicate differently. Monitoring dashboards communicate the current status of system&amp;rsquo;s and their attributes, whereas alerts communicate abnormal status &lt;em&gt;that requires human intervention&lt;/em&gt;. Currently at Stack Overflow, we use &lt;a href=&#34;http://grafana.org&#34;&gt;Grafana&lt;/a&gt; and &lt;a href=&#34;https://github.com/opserver/Opserver&#34;&gt;Opserver&lt;/a&gt; as dashboards and &lt;a href=&#34;http://bosun.org&#34;&gt;Bosun&lt;/a&gt; for alerting. Bosun has a dashboard that shows the current alerts, but when I refer to dashboards I mean things like Grafana and Opserver.&lt;/p&gt;

&lt;h1 id=&#34;mistake-1-using-alerts-as-status-dashboards:e8c548cef83497a5beb46d7f55e2761d&#34;&gt;Mistake 1: Using Alerts as Status Dashboards&lt;/h1&gt;

&lt;p&gt;When alerts are used as if they were status dashboards, it leads to alert desensitization or &lt;a href=&#34;https://en.wikipedia.org/wiki/Alarm_fatigue&#34;&gt;Alarm Fatigue&lt;/a&gt;. If you have alerts that come in that are just informational &amp;ndash; it is human nature to start to ignore them due to &lt;a href=&#34;https://en.wikipedia.org/wiki/Sensory_gating&#34;&gt;Sensory Gating&lt;/a&gt; (and anecdotally, it is not uncommon for people to literally filter them with something like Gmail when alerts are in email). Even if discipline is good, people sometimes won&amp;rsquo;t even see them anymore since our brains naturally filter out repeated information.&lt;/p&gt;

&lt;p&gt;The underlying philosophy is that too many alerts are just as bad some &amp;ldquo;missed alerts&amp;rdquo;. This is expressed well in &lt;a href=&#34;http://www.kitchensoap.com/2013/07/22/owning-attention-considerations-for-alert-design/&#34;&gt;Owning Attention: Considerations for Alert Design&lt;/a&gt;:&lt;/p&gt;

&lt;p&gt;&lt;img src=&#34;http://kbrandt.com/images/alarm_noise.jpg&#34; style=&#34;width: 50%;&#34; alt=&#34;Alert Noise Diagram&#34;&gt;&lt;/p&gt;

&lt;h2 id=&#34;example-within-this-philosophy:e8c548cef83497a5beb46d7f55e2761d&#34;&gt;Example within this Philosophy&lt;/h2&gt;

&lt;p&gt;As an example, take a 30 node cluster where it is common for a couple of nodes to be down at a time. The number of nodes that are out, and which nodes they are out should be in a dashboard. However, that shouldn&amp;rsquo;t generate alerts because it is normal behavior. Rather, you should have a dashboard that shows all this information, and only alert where the behavior deviates from its normal pattern and requires human intervention. Ideally the alert notification has most of the contextual information you would see in the status dashboard, but in practice web dashboards provide more capability than most notification mediums like email can. Alerting strategies in this case include the following:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Cluster vs host based alerts: Notifications can be sent per cluster or per node in the cluster (I call this &amp;ldquo;scope&amp;rdquo;). Both scopes are valid, if your nodes tend to fail in groups, it is generally better for a broader scope (cluster based) so there are less notifications that can lead to alarm fatigue.&lt;/li&gt;
&lt;li&gt;Maintenance aware alerts: If nodes normally only go out during maintenance, alerts should only trigger when nodes are not in maintenance (and maybe if too many nodes are in maintenance). Maintenance can be identified by tracking maintenance as a metric, or by notifying the monitoring system of maintenance.&lt;/li&gt;
&lt;li&gt;Number or percentage of down nodes: You can alert only if N or more nodes down, a certain percentage of nodes in the cluster are down, and/or the number of down nodes is abnormal compared to history.&lt;/li&gt;
&lt;li&gt;Abnormal host downtime: If nodes normally are only down for certain periods of time, you could alert on the node or cluster if a node has been down for longer than the expected duration.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;What combination of the above to use would depend on your specific environment. It is also possible that you &lt;em&gt;do&lt;/em&gt; want to alert when a node is down in the cluster at all. The right balance is when you actually react to almost all the alerts. If you are getting alerts that you don&amp;rsquo;t do anything about, they are informational and are more appropriate for dashboards.&lt;/p&gt;

&lt;h1 id=&#34;mistake-2-relying-on-alerting-or-dashboards-at-the-exclusion-of-the-other:e8c548cef83497a5beb46d7f55e2761d&#34;&gt;Mistake 2: Relying on Alerting or Dashboards at the Exclusion of the Other&lt;/h1&gt;

&lt;p&gt;The downfall when depending on dashboards to show you abnormal status is that it requires that someone is looking at, and interpreting the dashboard correctly. If you have the human resources for this it can make sense in certain situations, but as a rule of thumb if you notice something that needed human action on a dashboard and didn&amp;rsquo;t get an alert for it than an alert needs to be created.&lt;/p&gt;

&lt;p&gt;Dashboards are vital to monitoring and one shouldn&amp;rsquo;t depend on solely on alerts:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Visualizations provide a lot of condensed information about systems rapidly&lt;/li&gt;
&lt;li&gt;Dashboards help build operator&amp;rsquo;s mental models of systems. By watching normal behavior and internalizing, operators understand the system better and are more prepared for unexpected emergency situations.&lt;/li&gt;
&lt;li&gt;It is faster to create dashboards that show a lot of information then it is create and tune alerts that are low in noise.&lt;/li&gt;
&lt;li&gt;Humans are very good at picking up anomalies visually, doing this with alerting code is more difficult. Dashboards can help you discover alerts that are missing.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Status dashboards and alerting are essential companions to each other in monitoring, but they need to be used correctly, and when they are treated as one-to-one mappings of each other in purpose you end up limiting both your dashboarding and alerting capabilities.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Stack Overflow&#39;s Bosun Architecture</title>
      <link>http://kbrandt.com/post/bosun_arch/</link>
      <pubDate>Tue, 01 Mar 2016 14:49:12 -0500</pubDate>
      
      <guid>http://kbrandt.com/post/bosun_arch/</guid>
      <description>

&lt;p&gt;Bosun is a significant piece of our monitoring infrastructure at Stack Overflow. In forums such as &lt;a href=&#34;http://bosun.org/slackInvite&#34;&gt;Bosun&amp;rsquo;s Slack Chat Room&lt;/a&gt;, we are frequently asked to describe how Bosun is set up in our environment.. This is a detailed post about our architecture surrounding Bosun. This is not the only way to set things up and may not always be the best way either &amp;ndash; but this is our current setup.&lt;/p&gt;

&lt;h2 id=&#34;the-pieces:7bc97b814cc5ce0a4508e0dd2bd2e58d&#34;&gt;The Pieces&lt;/h2&gt;

&lt;p&gt;There are a lot of components we use with Bosun, but they all serve their purposes in our monitoring infrastructure. The following table outlines them.&lt;/p&gt;

&lt;table&gt;
    &lt;tr&gt;
        &lt;td rowspan=4&gt;&lt;a href=&#34;http://bosun.org&#34;&gt;Bosun&lt;/a&gt;&lt;/td&gt;
        &lt;td rowspan=4&gt;Alerting System&lt;/td&gt;
        &lt;td&gt;Expression language for evaluating time series from OpenTSDB, Graphite, Elastic, and InfluxDB&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
        &lt;td&gt;Templates for rich notifications: HTML, Graphs, Tables, CSS-inlining&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
        &lt;td&gt;Web interface for viewing alerts, writing expressions, graphing, creating alerts and templates, and testing alerts over history.&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
        &lt;td&gt;A store for metric metadata and string data about tags (for example, host IPs, Serial numbers, etc)&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
        &lt;td rowspan=2&gt;&lt;a href=&#34;http://bosun.org/scollector/&#34;&gt;scollector&lt;/a&gt;&lt;/td&gt;
        &lt;td rowspan=2&gt;Collection Agent&lt;/td&gt;
        &lt;td&gt;Runs on Windows and Linux. Polls local OS and applications via APIs; also polls external services via SNMP, ICMP, etc.&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
        &lt;td&gt;With no configuration, monitors anything it auto-discovers (IIS, Redis, Elastic, Etc); configuration rarely needed.&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
        &lt;td&gt;&lt;a href=&#34;https://github.com/bretcope/BosunReporter.NET&#34;&gt;BosunReporter.NET&lt;/a&gt;&lt;/td&gt;
        &lt;td&gt;App Metrics&lt;/td&gt;
        &lt;td&gt;Sends application metrics to bosun.&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
        &lt;td rowspan=2&gt;&lt;a href=&#34;http://opentsdb.net/&#34;&gt;OpenTSDB&lt;/a&gt;&lt;/td&gt;
        &lt;td rowspan=2&gt;Time Series Database Daemon&lt;/td&gt;
        &lt;td&gt;Takes time series data and stores it in HBase&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
        &lt;td&gt;Time series are tagged, so it is a multi-dimensional time series database&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
        &lt;td rowspan=2&gt;&lt;a href=&#34;https://github.com/opserver/Opserver&#34;&gt;Opserver&lt;/a&gt;&lt;/td&gt;
        &lt;td rowspan=2&gt;Monitoring dashboard&lt;/td&gt;
        &lt;td&gt;Pulls from SolarWinds Orion or Bosun&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
        &lt;td&gt;Also includes indepth independent monitoring and control of Redis, SQL Server, HAProxy, and Elastic&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
        &lt;td&gt;&lt;a href=&#34;http://grafana.org&#34;&gt;Grafana&lt;/a&gt;&lt;/td&gt;
        &lt;td&gt;User Dashboards&lt;/td&gt;
        &lt;td&gt;Uses the [Grafana Bosun plugin](https://github.com/grafana/grafana-plugins/tree/master/datasources/bosun) to create graphs and tables via Bosun expressions&lt;/td&gt;
    &lt;/tr&gt;
        &lt;tr&gt;
        &lt;td&gt;TPS&lt;/td&gt;
        &lt;td&gt;Parses Web Logs&lt;/td&gt;
        &lt;td&gt;Sends raw logs to SQL and summaries in time series format to Bosun.&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
        &lt;td rowspan=2&gt;&lt;a href=&#34;https://github.com/bosun-monitor/bosun/tree/master/cmd/tsdbrelay&#34;&gt;tsdbrelay&lt;/a&gt;&lt;/td&gt;
        &lt;td rowspan=2&gt;Relay Time Series and Meta Data&lt;/td&gt;
        &lt;td&gt;Cross replicates time series and meta data across data centers&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
        &lt;td&gt;Creates denormalized OpenTSDB metrics for faster querying speed&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
        &lt;td rowspan=3&gt;&lt;a href=&#34;https://hbase.apache.org/&#34;&gt;HBase&lt;/a&gt;&lt;/td&gt;
        &lt;td rowspan=3&gt;Where OpenTSDB Stores Data&lt;/td&gt;
        &lt;td&gt;&lt;a href=&#34;http://hadoop.apache.org/&#34;&gt;Hadoop&lt;/a&gt;: The distributed filed system (HDFS), MapReduce framework, and Cluster Management (Zookeeper).&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
        &lt;td&gt;&lt;a href=&#34;https://hbase.apache.org/&#34;&gt;HBase&lt;/a&gt;: A clone of Google&#39;s Bigtable runs on top of Hadoop&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
        &lt;td&gt;&lt;a href=&#34;https://cloudera.com/products/cloudera-manager.html&#34;&gt;Cloudera Manager&lt;/a&gt;: What we use to manage HBase&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
        &lt;td&gt;&lt;a href=&#34;http://www.haproxy.org/&#34;&gt;HAProxy&lt;/a&gt;&lt;/td&gt;
        &lt;td&gt;Load Balancer Used at Stack&lt;/td&gt;
        &lt;td&gt;We use it in front of Bosun, OpenTSDB daemons, and tsdbrelay&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
        &lt;td&gt;&lt;a href=&#34;http://redis.io/&#34;&gt;Redis&lt;/a&gt;&lt;/td&gt;
        &lt;td&gt;In-memory Store&lt;/td&gt;
        &lt;td&gt;*Optionally* used by Bosun to store state, metadata, metric indexes, etc. If Redis is not used, a built-in implementation in Go called LedisDB is used&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
        &lt;td&gt;&lt;a href=&#34;https://www.elastic.co&#34;&gt;Elastic&lt;/a&gt;&lt;/td&gt;
        &lt;td&gt;Document Searching&lt;/td&gt;
        &lt;td&gt;Where we send system logs. Can be queried with Bosun expressions. The Bosun Grafana plugin can use this method to graph time series info about the logs as well.&lt;/td&gt;
    &lt;/tr&gt;
&lt;/table&gt;

&lt;h3 id=&#34;metric-and-query-flow:7bc97b814cc5ce0a4508e0dd2bd2e58d&#34;&gt;Metric and Query Flow&lt;/h3&gt;

&lt;p&gt;Metrics are collected many ways:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Our homegrown applications calculate their own metrics and send them to Bosun. C# programs
use &lt;a href=&#34;https://github.com/bretcope/BosunReporter.NET&#34;&gt;BosunReporter.NET&lt;/a&gt; and Go programs use the &lt;a href=&#34;https://godoc.org/bosun.org/collect&#34;&gt;Go collect package&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;scollector gathers stats from the OS, services it auto-discovers.&lt;/li&gt;
&lt;li&gt;Network equipment and other devices must be polled from a third-party machine since they can not run scollector.  We designate 2 hosts to run scollector with polling mode enabled. They collect data via SNMP (network devices), ICMP pings, and can be expanded via plug-ins.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;No matter how data is collected, it is not send it directly to Bosun. They send to tsdbrelays which have two purposes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;They relay the data to two different bosun clusters. (more on that later)&lt;/li&gt;
&lt;li&gt;They denormalize certain datapoints.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;They actually do not send directly to tsdbrelay. We front-end tsdbrelay through a load balancer (HAProxy) so that we can scale horizontally.&lt;/p&gt;

&lt;p&gt;We also front-end the Bosun service itself for the same reason. One Bosun server is in read-only mode, and flipping between the two requires us to sync the state and take the other bosun out of read only mode.  OpenTSDB performance is improved if all write requests go to the same node and our HAProxy setup allows us to funnel all write requests to a single node when all nodes are up.&lt;/p&gt;

&lt;p&gt;Many different systems query the time series database. We call this the &amp;ldquo;query flow&amp;rdquo;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Grafana: Queries OpenTSDB using Bosun expressions via &lt;code&gt;/api/expr&lt;/code&gt;. It can also query Elastic directly, as well as query Elastic via: Grafana -&amp;gt; Bosun -&amp;gt; Elastic.&lt;/li&gt;
&lt;li&gt;Opserver: Queries Bosun&amp;rsquo;s &lt;code&gt;/api/host&lt;/code&gt; endpoint and also queries OpenTSDB directly.&lt;/li&gt;
&lt;li&gt;Bosun itself: when running alerts, or users interact with the UI, it queries OpenTSDB or Elastic (if it exists)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;img src=&#34;http://kbrandt.com/images/metric_query_flow.svg&#34; alt=&#34;Metric and Query Flow Diagram&#34; /&gt;&lt;/p&gt;

&lt;h2 id=&#34;our-opentsdb-and-hbase-setup:7bc97b814cc5ce0a4508e0dd2bd2e58d&#34;&gt;Our OpenTSDB and HBase Setup&lt;/h2&gt;

&lt;p&gt;In our main datacenter in NY to we have two HBase clusters. One is a three node cluster running on NY-TSDB0{1,2,3}. The other is a local replica running on NY-BOSUN01.  The local replica is for backups (See how we Backup below).&lt;/p&gt;

&lt;p&gt;In our secondary datacenter (named &amp;ldquo;CO&amp;rdquo;) we have a three node cluster that is a mirror setup of the NY-TSDB cluster. The HBase clusters don&amp;rsquo;t replicate across datacenters, rather tsdbrelay relays the datapoints to each independent data store.&lt;/p&gt;

&lt;p&gt;We use a HDFS replication factor of 3 in the two main HBase clusters. The HBase replica is currently a single machine, so it has no HDFS replication.&lt;/p&gt;

&lt;p&gt;&lt;img src=&#34;http://kbrandt.com/images/hbase.svg&#34; alt=&#34;HBase Diagram&#34; /&gt;
We use Cloudera Manager to manage our OpenTSDB clusters. We have found that HBase &lt;em&gt;can be&lt;/em&gt; stable, but it is difficult for a shop that doesn&amp;rsquo;t happen to use it anywhere else.&lt;/p&gt;

&lt;h3 id=&#34;the-numbers:7bc97b814cc5ce0a4508e0dd2bd2e58d&#34;&gt;The Numbers&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;3.7 Billion datapoints a day (43,000 Datapoints a second) per cluster&lt;/li&gt;
&lt;li&gt;~8 Gigabytes a day of HDFS unreplicated growth per cluster (24GB replicated)&lt;/li&gt;
&lt;li&gt;Currently ~ 7TB of replicated storage consumed&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&#34;opentsdb-appends-vs-compaction:7bc97b814cc5ce0a4508e0dd2bd2e58d&#34;&gt;OpenTSDB Appends vs Compaction&lt;/h3&gt;

&lt;p&gt;HBase was very unstable when we first started using it in 2015.  The main thing that improved our stability was to switch to OpenTSDB&amp;rsquo;s &amp;ldquo;appends model&amp;rdquo; instead of the &amp;ldquo;hourly compactions model&amp;rdquo;.  (Note: These are unrelated to &lt;em&gt;HBase compactions&lt;/em&gt;).&lt;/p&gt;

&lt;p&gt;OpenTSDB stores time series as metric+tags in hourly rows. By storing them as per-hour, OpenTSDB only needs to store the delta (the offset from the base hour) for each datapoint. This is more space-efficient.&lt;/p&gt;

&lt;p&gt;In the appends model, storing new datapoints only requires appending to the row. However this requires HBase to read the existing data block, then write it out again with the new datapoint appended. This generates a lot of network traffic.&lt;/p&gt;

&lt;p&gt;In the compaction model, it writes the data in a less efficient form but one that requires less network bandwidth.  Once each hour it then rewrites the data in the more compact, delta, format. As a result the network activity is reduced to an hourly burst instead of constant reading and rewriting.&lt;/p&gt;

&lt;p&gt;In this graph you can see the Append Model&amp;rsquo;s network traffic load versus Hourly Compaction&amp;rsquo;s greatly reduced network load.&lt;/p&gt;

&lt;p&gt;&lt;img src=&#34;http://kbrandt.com/images/appends_compact.jpg&#34; alt=&#34;Appends vs Compaction Graphs&#34; /&gt;&lt;/p&gt;

&lt;p&gt;This network traffic was unexpectedly huge considering that our input into OpenTSDB (gzip compressed HTTP JSON) is on average 4 Mbit/sec. Appends can be seen in the hourly seasonality of the above graph. As the row grows over the hour, so do the size of the rows being re-written and and replicated across HDFS and HBase replication.&lt;/p&gt;

&lt;h3 id=&#34;zookeeper:7bc97b814cc5ce0a4508e0dd2bd2e58d&#34;&gt;Zookeeper&lt;/h3&gt;

&lt;p&gt;We found that for stability we have had to greatly increase the timeouts around zookeeper:&lt;/p&gt;

&lt;p&gt;Zookeeper:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;tickTime: 30000
maxSessionTimeout: 600000
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;HBase:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;zookeeper.session.timeout: 600000
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;With low zookeeper timeouts, if operations took a long time or spent a long time in garbage collection, then HBase servers would eject themselves taking the cluster down.&lt;/p&gt;

&lt;h3 id=&#34;denormalization-query-speed-and-last:7bc97b814cc5ce0a4508e0dd2bd2e58d&#34;&gt;Denormalization, Query Speed, and Last&lt;/h3&gt;

&lt;p&gt;HBase only has one index. OpenTSDB is optimized around the metric. So for example, querying all the metrics about a host (cpu, mem, etc) is slower than a query against a single metric for all hosts. The &lt;a href=&#34;http://opentsdb.net/docs/build/html/user_guide/backends/hbase.html&#34;&gt;HBase schema for OpenTSDB reflects this&lt;/a&gt;:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;00000150E22700000001000001
&#39;----&#39;&#39;------&#39;&#39;----&#39;&#39;----&#39;
metric  time   tagk  tagv
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Since the metric and time fields are the start of the key, and the key is the only thing indexed, the more tags you have on a metric, the more rows that have to be scanned to find your particular host. This reduces query speed.&lt;/p&gt;

&lt;p&gt;However, host based views are common. In this schema, they have to multiple metrics, and if those metrics have the &lt;code&gt;host=something&lt;/code&gt; tagset, the query gets slower as you add more hosts. Combine that with the number of rows that need to be scanned for longer durations and the queries become untenable.&lt;/p&gt;

&lt;p&gt;As an Example, &lt;code&gt;os.cpu&lt;/code&gt; has only one tag key host, and about 500 possible values in our environment. To query one year of data (downsampled) to a single host in this metric takes about 20 seconds. If you add more tags it only gets worse (i.e. os.net.bytes which has host, interface, and direction.&lt;/p&gt;

&lt;p&gt;We work around this query speed issue to generate views in two ways:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Redis stores the last value (the last two for counters) for all series. When generating these views, we can get current values for anything nearly instantly. This data is used in Boson&amp;rsquo;s &lt;code&gt;/api/host&lt;/code&gt; endpoints and can also be queried directly at &lt;code&gt;/api/last&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Denormalize the metrics&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;To denormalize metrics we put the host name in the metric, and only give it a single tag key / value pair (at least one tag key with a value is required). We use the following argument to tsdbrelay to do this:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;-denormalize=os.cpu__host,os.mem.used__host,os.net.bytes__host,os.net.bond.bytes__host,os.net.other.bytes__host,os.net.tunnel.bytes__host,os.net.virtual.bytes__host
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;This results in a metric like &lt;code&gt;__ny-web01.os.cpu&lt;/code&gt;. A year&amp;rsquo;s worth of data (also downsampled) is queried in ~100 milliseconds as compared to 20 seconds for the normalized metric.&lt;/p&gt;

&lt;h3 id=&#34;hbase-replication:7bc97b814cc5ce0a4508e0dd2bd2e58d&#34;&gt;HBase Replication&lt;/h3&gt;

&lt;p&gt;We have struggled some with HBase replication. The secondary cluster has had to be rebuilt when we found corruption, and also when we upgraded to SSDs. With our most recent case of replication breaking we found that &lt;a href=&#34;http://hortonworks.com/blog/apache-hbase-region-splitting-and-merging/&#34;&gt;force splitting&lt;/a&gt; some of the unbalanced regions on the secondary cluster seems to have fixed in (You can see the unbalance in size via the HBase Web GUI).&lt;/p&gt;

&lt;p&gt;When replication breaks, the logs grow rapidly, and drain at a much slower rate then they grow:&lt;/p&gt;

&lt;p&gt;&lt;img src=&#34;http://kbrandt.com/images/hbase_replication_space.jpg&#34; alt=&#34;HBase Replication and Space Used&#34; /&gt;&lt;/p&gt;

&lt;p&gt;Since replication backing up uses so much disk space, we have to factor in head room for this when sizing the HBase clusters.&lt;/p&gt;

&lt;h3 id=&#34;hardware:7bc97b814cc5ce0a4508e0dd2bd2e58d&#34;&gt;Hardware&lt;/h3&gt;

&lt;p&gt;NY-TSDB0{1,2,3} (Per Sever)&lt;/p&gt;

&lt;table&gt;
    &lt;thead&gt;
        &lt;tr&gt;
            &lt;th&gt;Area&lt;/th&gt;
            &lt;th&gt;Details&lt;/th&gt;
            &lt;th&gt;Utilization&lt;/th&gt;
        &lt;/tr&gt;
    &lt;/thead&gt;
    &lt;tr&gt;
        &lt;td&gt;Model&lt;/td&gt;
        &lt;td&gt;Dell R620&lt;/td&gt;
        &lt;td&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
        &lt;td&gt;CPU&lt;/td&gt;
        &lt;td&gt;2x Intel(R) Xeon(R) CPU E5-2650 v2 @ 2.60GHz&lt;/td&gt;
        &lt;td&gt;~15%&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
        &lt;td&gt;Ram&lt;/td&gt;
        &lt;td&gt;128 GB Ram (8x 16GB Chips)&lt;/td&gt;
        &lt;td&gt;34 GB RSS,  Rest Used in File Cache&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
        &lt;td&gt;Disk&lt;/td&gt;
        &lt;td&gt;2 Spinny OS Disks, 8x SSDs in JBOD (INTEL SSDSC2BB480G4)&lt;/td&gt;
        &lt;td&gt;Avg Read: 1.6 MByte/sec, Avg Write: 57 MByte/sec&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
        &lt;td&gt;Network&lt;/td&gt;
        &lt;td&gt;Redundant 10Gigabit&lt;/td&gt;
        &lt;td&gt; ~500 MBit/sec&lt;/td&gt;
    &lt;/tr&gt;
&lt;/table&gt;

&lt;p&gt;NY-BOSUN02 (Also HBase Replica, see previous diagram)&lt;/p&gt;

&lt;table&gt;
    &lt;thead&gt;
        &lt;tr&gt;
            &lt;th&gt;Area&lt;/th&gt;
            &lt;th&gt;Details&lt;/th&gt;
            &lt;th&gt;Utilization&lt;/th&gt;
        &lt;/tr&gt;
    &lt;/thead&gt;
    &lt;tr&gt;
        &lt;td&gt;Model&lt;/td&gt;
        &lt;td&gt;Dell R620&lt;/td&gt;
        &lt;td&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
        &lt;td&gt;CPU&lt;/td&gt;
        &lt;td&gt;2x Intel(R) Xeon(R) CPU E5-2643 v2 @ 3.50GHz&lt;/td&gt;
        &lt;td&gt;~15%&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
        &lt;td&gt;Ram&lt;/td&gt;
        &lt;td&gt;64 GB Ram (4x 16GB Chips)&lt;/td&gt;
        &lt;td&gt;20 GB RSS,  Rest Used in File Cache&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
        &lt;td&gt;Disk&lt;/td&gt;
        &lt;td&gt;2 Spinny OS Disks, 8x SSDs in JBOD (INTEL SSDSC2BB480G4)&lt;/td&gt;
        &lt;td&gt;Avg Read: 1.1 MByte/sec, Avg Write: 33 MByte/sec&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
        &lt;td&gt;Network&lt;/td&gt;
        &lt;td&gt;Redundant 10Gigabit&lt;/td&gt;
        &lt;td&gt; ~300 MBit/sec&lt;/td&gt;
    &lt;/tr&gt;
&lt;/table&gt;

&lt;h3 id=&#34;reference-configs:7bc97b814cc5ce0a4508e0dd2bd2e58d&#34;&gt;Reference Configs&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://gist.github.com/kylebrandt/8c09c87fd3147fb51bc3&#34;&gt;opentsdb.conf&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://gist.github.com/kylebrandt/14acacd867d67382629a&#34;&gt;tsdbrelay CLI options (In NY)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://gist.github.com/kylebrandt/733572edb66c27894f22&#34;&gt;haproxy config (In NY)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://gist.github.com/kylebrandt/04c0658828e616b5d8c5&#34;&gt;Cloudera HBase Non-Defaults&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://gist.github.com/kylebrandt/89a98f30680b799a6317&#34;&gt;Cloudera HDFS Non-Defaults&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://gist.github.com/kylebrandt/85218ae078e57a8d3088&#34;&gt;Cloudera Zookeeper Non-Defaults&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&#34;how-we-deploy:7bc97b814cc5ce0a4508e0dd2bd2e58d&#34;&gt;How we deploy&lt;/h2&gt;

&lt;p&gt;The CI framework we use is called &lt;a href=&#34;https://www.jetbrains.com/teamcity/&#34;&gt;TeamCity&lt;/a&gt;. We use it to build packages for Deploy scollector, tsdbrelay, to directly deploy Bosun binaries and configurations into production.  TeamCity calls each configuration a &amp;ldquo;build&amp;rdquo;.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;scollector and tsdbrelay (Linux): We make RPM packages using &lt;a href=&#34;https://github.com/jordansissel/fpm&#34;&gt;fpm&lt;/a&gt; combined with &lt;a href=&#34;https://github.com/StackExchange/blackbox/blob/master/tools/mk_rpm_fpmdir&#34;&gt;this script&lt;/a&gt; to easily wrap binaries into RPMs. The script reads &lt;code&gt;mk_rpm_fpmdir.*.txt&lt;/code&gt; to manufacture input to FPM.&lt;/li&gt;
&lt;li&gt;scollector (Windows): A TeamCity build produces a binary and does the right thing so that it is distributed to our Windows hosts.&lt;/li&gt;
&lt;li&gt;Bosun is deployed directly by TeamCity. We do this because we tend to build pretty often and use branches, so the lag of RPM would be annoying to our developers.&lt;/li&gt;
&lt;li&gt;Our Bosun configuration is kept in a Git repository. TeamCity triggers on changes to this repo, runs tests, pushes the new config to production, then restarts Bosun.  (Bosun currently doesn&amp;rsquo;t have live configuration reloading).&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&#34;how-we-backup:7bc97b814cc5ce0a4508e0dd2bd2e58d&#34;&gt;How we Backup&lt;/h2&gt;

&lt;p&gt;The are three things in and around Bosun that are Backed up:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Bosun&amp;rsquo;s Configuration File&lt;/li&gt;
&lt;li&gt;Bosun&amp;rsquo;s State and Metadata Storage&lt;/li&gt;
&lt;li&gt;The Time Series Data&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The configuration file is stored in Git which is backed up independently (we use &lt;a href=&#34;https://about.gitlab.com/&#34;&gt;Gitlab&lt;/a&gt; internally). We now use redis to store bosun&amp;rsquo;s state and metadata. Bosun will use &lt;a href=&#34;https://github.com/siddontang/ledisdb&#34;&gt;ledis&lt;/a&gt; if no redis server is provided, but we haven&amp;rsquo;t explored how this would be backed up as it is there for small test setups. In redis we use both RDB and AOF for &lt;a href=&#34;http://redis.io/topics/persistence&#34;&gt;redis persistence&lt;/a&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;RDB allows us to have snapshots of the datastore. These can be restored easily (even for local development).&lt;/li&gt;
&lt;li&gt;AOF allows us persistence across restarts of redis.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Backing up the time series database, in our case OpenTSDB, is one of our pain points. HBase is designed to scale to petabytes. With that much data, a standalone full backup becomes impractical. So HBase isn&amp;rsquo;t really designed for these sort of backups (See &lt;a href=&#34;http://blog.cloudera.com/blog/2013/11/approaches-to-backup-and-disaster-recovery-in-hbase/#export&#34;&gt;Approaches to Backup and Disaster Recovery in Hbase&lt;/a&gt;. This is a shame for us, as we don&amp;rsquo;t have petabytes of data in another system standalone backups might be an option. Therefore we do the following in place of traditional standalone backups:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Datapoint level replication: tsdbrelay sends all datapoints to its local and remote cluster (one in NY, one in CO). Although the two HBase clusters are not exactly consistent with each other (different IDs in the database, missing data when a datacenter is out) they are &amp;ldquo;good enough&amp;rdquo; copies of each other.&lt;/li&gt;
&lt;li&gt;Restore: Rotating hourly HBase snaphosts&lt;/li&gt;
&lt;li&gt;Backup cluster in the main datacenter: An HBase replica (This is distinct from HDFS replication - that is within a cluster, whereas HBase replication replicates to another cluster).&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Without standalone full backups we are frankly a bit afraid of HBase, but we haven&amp;rsquo;t had any significant data losses since we started using it.&lt;/p&gt;

&lt;h2 id=&#34;possible-future-changes:7bc97b814cc5ce0a4508e0dd2bd2e58d&#34;&gt;Possible Future Changes&lt;/h2&gt;

&lt;p&gt;Our largest pain point is using OpenTSDB and HBase. Since we don&amp;rsquo;t use HBase anywhere else, the administrative overhead eats up a lot of time. Also, OpenTSDB has had some long standing issues that have been difficult, for example &lt;a href=&#34;https://groups.google.com/forum/#!topic/opentsdb/KdgGNK0Y9HQ&#34;&gt;counters don&amp;rsquo;t downsample correctly&lt;/a&gt; and our data is in counter format when possible so we don&amp;rsquo;t lose resolution. That being said we still feel for us it is currently our best option. We will be expanding our two main clusters with two more nodes each (running tsdbrelay, opentsdb, and region servers) to increase space.&lt;/p&gt;

&lt;p&gt;We are very interested in &lt;a href=&#34;https://influxdata.com/&#34;&gt;InfluxDB&lt;/a&gt;. It is written in Go which we are familiar with and has a rapid devlopment cycle. Bosun has it as a backend, and scollector can send to it since it has a OpenTSDB api style endpoint. However, we are waiting for InfluxBD to have a more stable clustering story before we could consider switching to it in production.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Other writing</title>
      <link>http://kbrandt.com/page/writing/</link>
      <pubDate>Sun, 21 Feb 2016 14:53:00 -0500</pubDate>
      
      <guid>http://kbrandt.com/page/writing/</guid>
      <description>

&lt;h1 id=&#34;server-fault-blog:a65cffa9c73225e9b2db0699034df561&#34;&gt;Server Fault Blog&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;http://blog.serverfault.com/2013/11/26/the-importance-of-observability/&#34;&gt;The Importance of Observability&lt;/a&gt; Nov 2013&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;http://blog.serverfault.com/2012/07/18/ooda-for-sysadmins/&#34;&gt;OODA For Sysadmins&lt;/a&gt; Jul 2012&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;http://blog.serverfault.com/2012/02/07/escaping-the-cycle-of-technical-debt/&#34;&gt;Escaping the Cycle of Technical Debt&lt;/a&gt; Feb 2012&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;http://blog.serverfault.com/2011/06/27/per-second-measurements-dont-cut-it/&#34;&gt;Per Second Measurements Don&amp;rsquo;t Cut it&lt;/a&gt; Jun 2011&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;http://blog.serverfault.com/2011/05/06/the-limits-of-cost-benefit-analysis-in-it/&#34;&gt;The Limits of Cost-Benefit Analysis in IT&lt;/a&gt; May 2011&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;http://blog.serverfault.com/2011/03/16/views-of-the-same-problem-network-admin-dba-and-developer/&#34;&gt;Views of the Same Problem: Network Admin, DBA, and Developer&lt;/a&gt; March 2011&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;http://blog.serverfault.com/2011/01/17/know-your-ram/&#34;&gt;Know your RAM&lt;/a&gt; Jan 2011&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;http://blog.serverfault.com/2010/06/28/747186396/&#34;&gt;Serverfault Trees&lt;/a&gt; Jun 2010&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>talks</title>
      <link>http://kbrandt.com/page/talks/</link>
      <pubDate>Sun, 21 Feb 2016 14:06:24 -0500</pubDate>
      
      <guid>http://kbrandt.com/page/talks/</guid>
      <description>

&lt;h1 id=&#34;presentations:49cbbfcf1124f111a37fcbac0faeb48e&#34;&gt;Presentations&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://vimeo.com/131581326&#34;&gt;Monitorama 2015 (PDX): Bosun Workshop&lt;/a&gt;
This presentation has screencasts of building an alert starting about 15 minutes in. The first 15 minutes explain some of the design principles behind Bosun. After the first screen cast of building an alert there are also some example alerts.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;
&lt;div style=&#34;position: relative; padding-bottom: 56.25%; padding-top: 30px; height: 0; overflow: hidden;&#34;&gt;
  &lt;iframe src=&#34;//player.vimeo.com/video/131581326&#34; style=&#34;position: absolute; top: 0; left: 0; width: 100%; height: 100%;&#34; webkitallowfullscreen mozallowfullscreen allowfullscreen&gt;&lt;/iframe&gt;
 &lt;/div&gt;
&lt;/br&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;a href=&#34;https://www.usenix.org/conference/lisa15/conference-program/presentation/brandt&#34;&gt;LISA 2015: Precise Alerting with Bosun&lt;/a&gt; This presentation is similar to Monitorama PDX, but the intro and theme focuses more on the important of monitoring in general.&lt;/p&gt;&lt;/li&gt;

&lt;li&gt;&lt;p&gt;&lt;a href=&#34;https://www.usenix.org/conference/lisa14/conference-program/presentation/brandt&#34;&gt;LISA 2014: A New Age in Alerting with Bosun: The First Alerting IDE&lt;/a&gt;: This was the first presentation on Bosun which was given right after the initial release. An introduction to the underlying thoughts on problems with alerting and how Bosun solves them.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h1 id=&#34;video-tutorials:49cbbfcf1124f111a37fcbac0faeb48e&#34;&gt;Video Tutorials&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://www.youtube.com/playlist?list=PLWetmRzVkFTdnjRmE-a-JRx2m8qgB6iu9&#34;&gt;Bosun Fundementals Series&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>projects</title>
      <link>http://kbrandt.com/page/projects/</link>
      <pubDate>Sun, 21 Feb 2016 13:49:54 -0500</pubDate>
      
      <guid>http://kbrandt.com/page/projects/</guid>
      <description>&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;http://bosun.org&#34;&gt;Bosun&lt;/a&gt; / Time Series Alerting System and IDE developed at Stack Overflow&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;http://bosun.org/scollector&#34;&gt;scollector&lt;/a&gt; / Monitoring agent developed at Stack Overflow&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/grafana/grafana-plugins/tree/master/datasources/bosun&#34;&gt;Bosun Grafana Plugin&lt;/a&gt; / Allows graphing and tables of Bosun expressions&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>about</title>
      <link>http://kbrandt.com/page/about/</link>
      <pubDate>Sat, 20 Feb 2016 14:44:37 -0500</pubDate>
      
      <guid>http://kbrandt.com/page/about/</guid>
      <description>&lt;p&gt;I&amp;rsquo;m an orginial co-author of the &lt;a href=&#34;http://bosun.org&#34;&gt;Bosun&lt;/a&gt; monitoring system and the &lt;a href=&#34;http://bosun.org/scollector/&#34;&gt;scollector&lt;/a&gt; monitoring agent.&lt;/p&gt;

&lt;p&gt;Currently I work at Stack Overflow as the director of the SRE (Site Reliability Engineering) team.&lt;/p&gt;
</description>
    </item>
    
  </channel>
</rss>