<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Vladimir Vuksan&#039;s blog &#187; Uncategorized</title>
	<atom:link href="http://vuksan.com/blog/category/uncategorized/feed/" rel="self" type="application/rss+xml" />
	<link>http://vuksan.com/blog</link>
	<description>Documenting the systems and network infrastructure madness</description>
	<lastBuildDate>Wed, 01 Sep 2010 12:26:52 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0</generator>
		<item>
		<title>PHP 5.3 name spaces separator</title>
		<link>http://vuksan.com/blog/2010/08/16/php-5-3-names-space-separator/</link>
		<comments>http://vuksan.com/blog/2010/08/16/php-5-3-names-space-separator/#comments</comments>
		<pubDate>Mon, 16 Aug 2010 19:03:30 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://vuksan.com/blog/?p=334</guid>
		<description><![CDATA[I am posting this to help others that may encounter a similar problem. I have been doing some PHP development recently using Predis, a PHP Redis library. While instantiating the Redis\Client object I get Warning: Unexpected character in input: '\' (ASCII=92) state=1 in ..... Problem was explained in this issue http://github.com/nrk/predis/issues/closed#issue/11 If you are still [...]]]></description>
			<content:encoded><![CDATA[<p>I am posting this to help others that may encounter a similar problem.</p>
<p>I have been doing some PHP development recently using <a href="http://github.com/nrk/predis/">Predis</a>, a PHP <a href="http://code.google.com/p/redis/">Redis</a> library. While instantiating the Redis\Client object I get</p>
<pre>Warning: Unexpected character in input:  '\' (ASCII=92) state=1 in .....</pre>
<p>Problem was explained in this issue</p>
<p><a href="http://github.com/nrk/predis/issues/closed#issue/11">http://github.com/nrk/predis/issues/closed#issue/11</a></p>
<p style="padding-left: 30px;">If you are still running on PHP 5.2 you should use the backported  version of Predis and not the mainline library which targets only PHP  &gt;= 5.3 (the <em><strong>backslash is the namespace separator</strong></em> in PHP 5.3).</p>
<p>More discussion of this change can be found here.</p>
<p><a href="http://giorgiosironi.blogspot.com/2009/09/introspection-of-php-namespaces.html">http://giorgiosironi.blogspot.com/2009/09/introspection-of-php-namespaces.html</a></p>
]]></content:encoded>
			<wfw:commentRss>http://vuksan.com/blog/2010/08/16/php-5-3-names-space-separator/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>GangliaView – automatically rotate Ganglia metrics</title>
		<link>http://vuksan.com/blog/2010/06/16/gangliaview-automatically-rotate-ganglia-metrics/</link>
		<comments>http://vuksan.com/blog/2010/06/16/gangliaview-automatically-rotate-ganglia-metrics/#comments</comments>
		<pubDate>Wed, 16 Jun 2010 15:29:18 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[Ganglia]]></category>

		<guid isPermaLink="false">http://vuksan.com/blog/?p=222</guid>
		<description><![CDATA[GangliaView is a simple web app that allows you to automatically rotate selected Ganglia metrics. We use it to rotate key metrics with large graphs showing last hour and last day and smaller graphs showing last week and last month. A sample screen looks like this GangliaView is derived from CactiView with a number of changes [...]]]></description>
			<content:encoded><![CDATA[<p>GangliaView is a simple web app that allows you to automatically rotate selected Ganglia metrics. We use it to rotate key metrics with large graphs showing last hour and last day and smaller graphs showing last week and last month. A sample screen looks like this</p>
<p><a href="http://vuksan.com/blog/wp-content/uploads/2010/06/gangliaview1.png"><img class="alignnone size-full wp-image-221" title="gangliaview" src="http://vuksan.com/blog/wp-content/uploads/2010/06/gangliaview1.png" alt="" width="760" height="500" /></a></p>
<p>GangliaView is derived from <a href="http://github.com/lozzd/CactiView">CactiView</a> with a number of changes to make it work with Ganglia and removal of frames. You can download it from here</p>
<p>﻿﻿<a href="http://github.com/vvuksan/ganglia-misc">http://github.com/vvuksan/ganglia-misc</a></p>
]]></content:encoded>
			<wfw:commentRss>http://vuksan.com/blog/2010/06/16/gangliaview-automatically-rotate-ganglia-metrics/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Vonage the new Baby Bell</title>
		<link>http://vuksan.com/blog/2010/05/13/vonage-the-new-baby-bell/</link>
		<comments>http://vuksan.com/blog/2010/05/13/vonage-the-new-baby-bell/#comments</comments>
		<pubDate>Thu, 13 May 2010 18:11:28 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[Crappy]]></category>
		<category><![CDATA[Substandard]]></category>

		<guid isPermaLink="false">http://vuksan.com/blog/?p=188</guid>
		<description><![CDATA[It is sometimes amazing to me how new upstarts morph into their own arch enemies. Case in point is Vonage. For years I used to have Vonage service at home as a backup phone service. I was on a 500 minute plan for $14.99+taxes. This was a great plan for me as I didn't use [...]]]></description>
			<content:encoded><![CDATA[<p>It is sometimes amazing to me how new upstarts morph into their own arch enemies. Case in point is Vonage. For years I used to have Vonage service at home as a backup phone service. I was on a 500 minute plan for $14.99+taxes. This was a great plan for me as I didn't use the phone much. However at some point they decided that was too little money and they hiked up the price to $16.99 (something like that). It may seem like a small difference but I figured I may be better of elsewhere. I ended up switching to <a href="http://galaxyvoice.com/">Galaxy Voice</a> which I am using to this day since they had more flexible calling plans.</p>
<p>We recently expanded our office space and we needed a phone line added to a conference room. Since I had my old Vonage adapter at home I figured I would bring it and we'd use it. I thought it would be as easy as going to Vonage's web site, supplying the phone adapter ID and my credit card number and I would be set. It wasn't so. After entering the phone ID I got this message</p>
<p style="padding-left: 30px;">The MAC address you entered  is associated with an existing Vonage account. Please call our Customer  Care department at 1-866-293-5676 for immediate assistance.</p>
<p>I called the number and spoke to someone in Customer service. This took about 20 minutes while the person kept re-asking for the same data and concluded that they couldn't help me and that I would have to talk to tech support. Tech support guy was equally unhelpful. Basically I could not activate a device that was ever used before since the system "knew" about it. Talk about having a piece of useless technological trash. At that point I was sufficiently frustrated to end the call. I tweeted about my experience and a day later I was contacted by Vonage's Twitter team about having someone at customer service contact me. I thought I'd give it a go. I got a call and this experience was not a whole lot better than the previous ones. Person kept asking me for my personal information including name, billing address, what was the credit card number I used for paying bills and the e-mail address I used. Since this was more than a year ago and I have dozens of e-mail addresses I said I couldn't remember. At that point I ended the call since I was sufficiently frustrated. I was willing to give these people money yet they were making me jump through all this hoops. I don't get it.</p>
<p>It occurred to me later that this was very similar to experiences that I had with a local phone company when I would move and I would have to get through all these bureaucratic hoops to make sure all my features stayed the same after I moved.</p>
]]></content:encoded>
			<wfw:commentRss>http://vuksan.com/blog/2010/05/13/vonage-the-new-baby-bell/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Devops homebrew</title>
		<link>http://vuksan.com/blog/2010/04/09/devops-homebrew/</link>
		<comments>http://vuksan.com/blog/2010/04/09/devops-homebrew/#comments</comments>
		<pubDate>Fri, 09 Apr 2010 13:58:05 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[Deployment]]></category>
		<category><![CDATA[Ops]]></category>

		<guid isPermaLink="false">http://vuksan.com/blog/?p=143</guid>
		<description><![CDATA[There has been quite a bit of discussion about Devops and what it means. @blueben has suggested we start a Devops patterns cookbook so people can learn what worked or didn't work. This is the description of the environment we implemented at a previous job. Some of these things may or may not work for [...]]]></description>
			<content:encoded><![CDATA[<p>There has been quite a bit of discussion about Devops and what it means. <a href="http://twitter.com/blueben/status/11720129187" target="_blank">@blueben</a> has suggested we start a Devops patterns cookbook so people can learn what worked or didn't work. This is the description of the environment we implemented at a previous job. Some of these things may or may not work for you. I will try to keep it short.</p>
<h3>Environment background</h3>
<p>7 distinct applications/products that had to be deployed and tested ie. base/core application, messaging platform, reporting app etc. All applications were Java based running on either Tomcat or Jboss.</p>
<h3>Application design for deployment</h3>
<p>These are some of the key points</p>
<ol>
<li>Application should have a sane 	default configuration options. Any option should be overrideable by 	an external file. In most cases you only need to 	override database credentials (host, username, password). Goal is to be able to use the same binary across multiple environments.</li>
<li>Application should expose key internal metrics. We 	for instance asked for a simple key/value pairs web page ie.   	JMSenqueue=OK etc. This is important because there are lots 	of things that can break inside the application which external 	monitoring may miss like JMS message can't be enqueued, etc.</li>
<li>Keep release notes actions to a minimum. Release notes are often not followed or partially followed thus make sure point 1. is followed and/or try to automate everything else.</li>
</ol>
<h3>Continuous Integration</h3>
<p>We used CruiseControl for Continuous Integration. It was used solely to make sure that someone didn't break the build.</p>
<h3>Creating releases</h3>
<p>Developers are in charge of building and packaging releases. This primarily because QA or Ops will not know what to do if a build fails (this is Java remember). Each release has to be clearly labeled with the version and tagged in the repository. For example Location 1.1.5 will be packaged as location-1.1.5.tar.gz. Archives should contain only WAR (Tomcat) or EAR (Jboss) files and DB patch files. Releases are to be deposited into an appropriate file share ie. /share/releases/location.</p>
<h3>Deployment</h3>
<p>In order to eliminate most manual deployment steps and support all the different applications we decided to write our own deployment tool. First we started off with a data model which roughly broke down to</p>
<ol>
<li>Applications – can use different 	app server containers ie. Tomcat/JBoss,  may/will have configuration 	files that can be either key/value pairs or templates. For every 	application we also specified a start and stop script (hotdeploy was 	not an option due to bad experiences with our code).</li>
<li>Domains/Customers – we wanted a 	single Dashboard that would allow us to deploy to multiple 	environments e.g. QA staging (current release), QA development (next 	scheduled release), Dev playbox, etc. Each of these domains had 	their own set of applications they could deploy with their own 	configuration options</li>
</ol>
<p>First we wrote a command line tool that was capable of doing something like this</p>
<pre>$ deployer –version 1.2.5 –server web10 –domain joedev –app base –action deploy<span style="font-family: Georgia, 'Times New Roman', 'Bitstream Charter', Times, serif; line-height: 19px; white-space: normal; font-size: 13px;"> </span></pre>
<p>What this would do is</p>
<ol>
<li>Find and unpack the proper app 	server container e.g. jboss-4.2.3.tar.gz</li>
<li>Overlay WAR/EAR files for the name 	version e.g. base-1.2.5.tar.gz</li>
<li>Build configuration files and 	scripts</li>
<li>Stop the server on the remote box 	(if it's running)</li>
<li>Rsync the contents of the packaged release</li>
<li>Make sure Apache AJP proxy is 	configured to proxy traffic and do Apache reload</li>
<li>Start up the server</li>
</ol>
<p>One of the main reason we started off with a command line tool is that we could easily write batch scripts to upgrade whole set of machines. This was borne out of pain of having to upgrade 200 instances via a web GUI at another job.</p>
<p>Once deployer was working we wrote a web GUI that interfaced with it. You could do things like View running config (what config options are actually on the appserver), Stop, Restart, Deploy (particular version), Reconfig (apply config changes) and Undeploy. We also added the ability to change or add configuration options to the application specific override files. Picture is worth thousand words. This is a tiny snippet how it approximately looked for one domain</p>
<p><a href="http://vuksan.com/blog/wp-content/uploads/2010/04/deployer-11.png"><img class="alignnone size-full wp-image-147" title="Deployer snippet" src="http://vuksan.com/blog/wp-content/uploads/2010/04/deployer-11.png" alt="" width="745" height="88" /></a></p>
<p>This was a big win since QA or developers no longer needed to have someone from ops deploy software.</p>
<h3>DB patching</h3>
<p>Another big win was "automated" DB patching. Every application would have a table called Patch with a list of DB patches that were already applied. We also agreed that every app would have dbpatches directory in the app archive which would contain a list of patches named with version and order in which they should be applied e.g.</p>
<ul>
<li>2.54.01-addUserColumn.sql</li>
<li>2.54.02-dropUidColumn.sql</li>
</ul>
<p>During deployment startup script would compare contents of the patch table and a list of dbpatches and apply any missing ones. If the patch script failed e-mail would be sent to the QA or dev in charge of particular domain.</p>
<p>A slightly modified process was used in production to try to reduce down time ie. things like adding a column could be done at any time. Automated process was largely there to make QA's job easier.</p>
<h3>QA and testing</h3>
<p>When a release was ready QA would deploy the release themselves. If there was a deployment problem they would attempt to troubleshoot it themselves then contact the appropriate person. Most of the times it was an app problem ie. particular library didn't get commited etc. This was a huge win since we avoided a lots of "waterfall" problems by allowing QA to self-service themselves.</p>
<h3>Production</h3>
<p>Production environment was strictly controlled. Only ops and couple key engineers had access to it. Reason was we tried to keep the environment as stable as possible. Thus ad hoc changes were frowned upon. If you needed to make a change you would either have to commit a change into the configuration management system (puppet) or use the deployment tool.</p>
<h3>Production deployment</h3>
<p>The day before the release QA would open up a ticket listing all the applications and versions that needed to be deployed. On the morning of the deployment (that was our low time) someone from ops, development and whole QA team engaged in deploying the app and resolving any observed issues.</p>
<h3>Monitoring</h3>
<p>Regular metrics such as CPU utilization, load etc. were collected. In addition we kept track of internal metrics and set up adequate alerts. This is an ongoing process since over time you discover what your key metrics are and what their thresholds are ie. number of threads, number of JDBC connections etc.</p>
<h3>Things that didn't work so well or were challenging</h3>
<ol>
<li>One of the toughest parts was 	getting developers' attention to add "goodies" for ops. 	Specifically exposing application internals was often put off until 	eventually we would have an outage and lack of having the metric 	resulted in extended outage.</li>
<li>Deployment tool took couple tries 	to get right. Even as it was there were couple things I would have 	done differently ie. not relying on a relational database for the 	data model since it made it difficult to create diffs (you had to 	dump the whole DB). I'd likely go with JSON so that diffs could be easily reviewed and committed.</li>
<li>Other issues I can't recall right now <img src='http://vuksan.com/blog/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </li>
</ol>
<h3>Wrapup</h3>
<p>This is the shortest description I could write. There are a number of things I glossed over and omitted so that this is not too long. I may write about those on another occasion. Perhaps the key take away should be that Ops should focus on developing tools that either automate things or allow its customers (QA, dev, technical support, etc.) to self-service themselves.</p>
<p><strong>Update</strong>: There is a <a href="http://vuksan.com/blog/2010/05/27/devops-homebrew-part-deux/">second part to this posts</a></p>
]]></content:encoded>
			<wfw:commentRss>http://vuksan.com/blog/2010/04/09/devops-homebrew/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Devops religion wars</title>
		<link>http://vuksan.com/blog/2010/04/06/devops-religion-wars/</link>
		<comments>http://vuksan.com/blog/2010/04/06/devops-religion-wars/#comments</comments>
		<pubDate>Tue, 06 Apr 2010 16:04:56 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://vuksan.com/blog/?p=141</guid>
		<description><![CDATA[I have been trying to stay out of the devops arguments but it seems that they are slowly devolving into religious wars. It seems that each group ie. devops and non-devops is convinced that they are in possession of "eternal self-evident truths" and that everyone else is unenlightened hater or similar.  Proof in point is following post [...]]]></description>
			<content:encoded><![CDATA[<p>I have been trying to stay out of the devops arguments but it seems that they are slowly devolving into religious wars. It seems that each group ie. devops and non-devops is convinced that they are in possession of "eternal self-evident truths" and that everyone else is unenlightened hater or similar.  Proof in point is following post</p>
<p><a href="http://brian.moonspot.net/devops-dealnews">http://brian.moonspot.net/devops-dealnews</a></p>
<p>Brian describes their devops process which seems reasonable to me. What is most important is that it works for him, his group and his site.</p>
<p>Unfortunately comments devolve from there. A non-devops person raises a good point about the process however does it with poor style and insulting language. Response is to compare devops and non-devops approach with giving man a fish vs. teaching someone to fish. It goes from there. It's all just too silly. Firstly I am not aware of definite devops definition. Secondly every environment is different. What may work for you may not work everywhere else. I really doubt that continuous deployment would work if your web app was used in providing emergency medical care. That said things have changed and availability expectations have increased so cooperation between development and ops is critical. Therefore let's try to stop with the silly arguments and try to learn from each other. Most of all avoid insulting language. I realize we all get frustrated at times but it really devalues your view.</p>
]]></content:encoded>
			<wfw:commentRss>http://vuksan.com/blog/2010/04/06/devops-religion-wars/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Password complexity madness</title>
		<link>http://vuksan.com/blog/2010/01/22/password-complexity-madness/</link>
		<comments>http://vuksan.com/blog/2010/01/22/password-complexity-madness/#comments</comments>
		<pubDate>Fri, 22 Jan 2010 13:38:19 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://vuksan.com/blog/?p=15</guid>
		<description><![CDATA[You know the pitch. Each time you create an account for a "secure" site you are forced to come up with a complex password ie. you need to have a number, a capitalized letter, perhaps a special character such as + or -. Trouble is policies differ so on one site password has to be [...]]]></description>
			<content:encoded><![CDATA[<p>You know the pitch. Each time you create an account for a "secure" site you are forced to come up with a complex password ie. you need to have a number, a capitalized letter, perhaps a special character such as + or -. Trouble is policies differ so on one site password has to be a minimum length, maximum length, some don't allow special characters etc. The thing is at one point in time this made sense and was required to keep basic security but it may not make sense today.</p>
<p>Ages ago computer systems (in particular UNIX systems) used to store passwords in a hashed format (hash . You can read more on <a href="http://en.wikipedia.org/wiki/Cryptographic_hash_function">cryptographic hashes on Wikipedia</a>. The trouble is that these hashes were available for any user to see ie. you could copy a password file (/etc/passwd) or use YP/NIS tools to get a list of all passwords in an organization. Once you have the password file you do not know what the passwords are however you can take a word dictionary start computing hashes since a particular password will always convert to the same hash and compare it if there are any matches in your password file. If you find a match you know have "discovered" users password. This is often referred to as off-line password cracking since it allows you derive passwords without interacting with the target system. This has many advantages since you can try millions of passwords quickly and the target system's administrator will not be alerted. Based on this fact password policies were instituted that mandated password complexity since passwords with complexity ie. 9pc_miu would be nearly impossible or very hard to break (it may take years to break it). This made sense then.</p>
<p>However it doesn't make much sense now since on most systems regular users have no access to the password hashes. On UNIX systems "shadow" (/etc/shadow) is used to hide them or you may be using LDAP which has the capability of hiding password hashes, etc. The only users that have access to those hashes are administrator however they have other ways of acquiring your passwords. Thus your real exposures in order of importance are</p>
<ul>
<li>Trivial passwords or easily guessable password ie. 123456, 1234, date of birth</li>
<li>Using same password across different sites ie. this is a problem if e.g. site A.com gets hacked and hackers are able to determine your password and log into site B.com</li>
</ul>
<p>I actually feel that password complexity breeds poor security since people will write down complex passwords instead of remembering them. Just remember how many times have you seen passwords on post-it notes on someone's monitor. Perhaps it is time to scrap the password complexity and use something simpler.</p>
]]></content:encoded>
			<wfw:commentRss>http://vuksan.com/blog/2010/01/22/password-complexity-madness/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Keeping an eye on binary log growth</title>
		<link>http://vuksan.com/blog/2009/10/01/keeping-an-eye-on-binary-log-growth/</link>
		<comments>http://vuksan.com/blog/2009/10/01/keeping-an-eye-on-binary-log-growth/#comments</comments>
		<pubDate>Fri, 02 Oct 2009 02:03:52 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://vuksan.com/blog/?p=61</guid>
		<description><![CDATA[Recently I got a report that some pages on the site were extremely slow. Looking at the web server metrics didn't show anything new however mySQL DB metrics showed a definite change ie. at the end of Week 38 there is an increase in CPU utilization. Nearly 60% increase. Interestingly enough there was a new [...]]]></description>
			<content:encoded><![CDATA[<p>Recently I got a report that some pages on the site were extremely slow. Looking at the web server metrics didn't show anything new however mySQL DB metrics showed a definite change</p>
<div id="attachment_62" class="wp-caption alignnone" style="width: 407px"><img class="size-full wp-image-62" title="mysqlcpu" src="http://vuksan.com/blog/wp-content/uploads/2009/10/mysqlcpu.png" alt="MySQL server CPU utilization" width="397" height="182" /><p class="wp-caption-text">MySQL server CPU utilization</p></div>
<p>ie. at the end of Week 38 there is an increase in CPU utilization. Nearly 60% increase. Interestingly enough there was a new software release at the end of Week 38 which pointed to either a bug or a new feature. Luckily I have been collecting mySQL metrics <a title="MySQL server stats gmetric" href="http://vuksan.com/linux/ganglia/#mySQL_server_stats">using this gmetric script</a>. This led me to these two graphs</p>
<p><img class="alignnone size-full wp-image-64" title="mysqlupdate" src="http://vuksan.com/blog/wp-content/uploads/2009/10/mysqlupdate.png" alt="mysqlupdate" width="397" height="154" /></p>
<p><img class="alignnone size-full wp-image-63" title="mysqlinsert" src="http://vuksan.com/blog/wp-content/uploads/2009/10/mysqlinsert.png" alt="mysqlinsert" width="397" height="154" /></p>
<p>So nearly double number of inserts and nearly triple the updates. Using mysqlbinlog I analyzed the update and insert statements and was able to identify the two culprit INSERT and UPDATE statements then sent it off to developers.</p>
<p>I also observed that had I watched the binary log growth I may have identified this earlier since there were a lot more binary logs for the period since the release. Thus <a href="http://vuksan.com/linux/ganglia/#mySQL_binary_log_growth_rate">mysql average binary log growth rate gmetric</a> was born <img src='http://vuksan.com/blog/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> . Now all I need to do is find out what normal growth rate is and if it goes outside of that norm use Nagios to send me a non-urgent alert.</p>
]]></content:encoded>
			<wfw:commentRss>http://vuksan.com/blog/2009/10/01/keeping-an-eye-on-binary-log-growth/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Software doesn&#8217;t run itself</title>
		<link>http://vuksan.com/blog/2009/09/13/software-doesnt-run-itself/</link>
		<comments>http://vuksan.com/blog/2009/09/13/software-doesnt-run-itself/#comments</comments>
		<pubDate>Sun, 13 Sep 2009 23:11:58 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://vuksan.com/blog/?p=49</guid>
		<description><![CDATA[Perhaps I should no longer be surprised but I am by the article mentioned in this blog post http://www.nakedcapitalism.com/2009/09/another-lehman-mess-no-one-can-run-the-software.html In particular this Once it went bankrupt, the staff who supported these systems “evaporated”, according to Steven O’Hanlon, president of Numerix, a pricing and valuation company which is working with Lehman Brothers Holding Inc to unwind [...]]]></description>
			<content:encoded><![CDATA[<p>Perhaps I should no longer be surprised but I am by the article mentioned in this blog post</p>
<p><a href="http://www.nakedcapitalism.com/2009/09/another-lehman-mess-no-one-can-run-the-software.html">http://www.nakedcapitalism.com/2009/09/another-lehman-mess-no-one-can-run-the-software.html</a></p>
<p>In particular this</p>
<p style="padding-left: 30px;">Once it went bankrupt, the staff who supported these systems “evaporated”, according to Steven O’Hanlon, president of Numerix, a pricing and valuation company which is working with Lehman Brothers Holding Inc to unwind the derivatives portfolio.</p>
<p>These days computer systems are the blood of your company so allowing critical technical staff to simply "evaporate" is mind boggling. Granted company imploded but still I would think that someone should have figured out going into bankruptcy that they should set aside money to pay for their maintenance.</p>
<p>Ultimate problem as pointed out in the blog post on Naked Capitalism that documentation is usually skimped on since it "doesn't provide value". Although I would also add that when people say "code is documented" they don't usually mention their systems infrastructure is documented. That can sometimes be even bigger impediment. At a previous job there was a Perl CGI script that most people didn't know about and even fewer understood. If that script didn't work our whole load balancing infrastructure would "mysteriously" fail since app servers wouldn't register themselves to web servers and leading to a full blown outage. It was such an obscure "feature" that you could literally spend weeks chasing other avenues since this was so non-obvious.</p>
<p>Also I would not take comfort in having source code to an application. Lot of customers of startups will write in their contracts that if a startup goes bust they get access to the source code. That may sound nice but it doesn't mean you will necessarily be able to run it. There are so many "secret" recipes, undocumented workarounds that are often involved in running most complex pieces of software that you should really be cautious.</p>
<p>In closing if you care that your software runs make sure you keep at least couple folks who have run it around.</p>
<div id="_mcePaste" style="overflow: hidden; position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px;">
<p>http://www.nakedcapitalism.com</p>
<p>/2009/09/another-lehman-mess-no-one-can-run-the-software.html</p></div>
]]></content:encoded>
			<wfw:commentRss>http://vuksan.com/blog/2009/09/13/software-doesnt-run-itself/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Simple &#8220;web service&#8221; for Ganglia metrics</title>
		<link>http://vuksan.com/blog/2009/09/11/simple_web_service_for_ganglia_metrics/</link>
		<comments>http://vuksan.com/blog/2009/09/11/simple_web_service_for_ganglia_metrics/#comments</comments>
		<pubDate>Fri, 11 Sep 2009 20:58:06 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://vuksan.com/blog/?p=44</guid>
		<description><![CDATA[Here is a simple PHP script to allow you to get current Ganglia metrics. You will need Ganglia web installation. Drop this script somewhere. Then invoke it via e.g. http://mygangliaserver/ganglia/metric.php?server=web1&#38;metric_name=load_one Where server is the name of the server for which you want metrics and metric_name is the exact name of the metric you are looking [...]]]></description>
			<content:encoded><![CDATA[<p>Here is a simple PHP script to allow you to get current Ganglia metrics. You will need Ganglia web installation. Drop this script somewhere. Then invoke it via e.g.</p>
<p>http://mygangliaserver/ganglia/metric.php?server=web1&amp;metric_name=load_one</p>
<p>Where server is the name of the server for which you want metrics and metric_name is the exact name of the metric you are looking for e.g. load_one, disk_free etc. Only thing that is returned is either ERROR message or actual value.</p>
<pre>&lt;?php

$GANGLIA_WEB="/var/www/html/ganglia";

include_once "$GANGLIA_WEB/conf.php";
include_once "$GANGLIA_WEB/get_context.php";
# Set up for cluster summary
$context = "cluster";
include_once "$GANGLIA_WEB/functions.php";
include_once "$GANGLIA_WEB/ganglia.php";
include_once "$GANGLIA_WEB/get_ganglia.php";

# Get a list of all hosts
$ganglia_hosts_array = array_keys($metrics);

$found = 0;

# Find a FQDN of a supplied server name.
for ( $i = 0 ; $i &lt; sizeof($ganglia_hosts_array) ; $i++ ) {
 if ( strpos(  $ganglia_hosts_array[$i], $_GET['server'] ) !== false  ) {
 $fqdn = $ganglia_hosts_array[$i];
 $found = 1;
 break;
 }
}

if ( $found == 1 ) {
 if ( isset($metrics[$fqdn][$_GET['metric_name']]['VAL']) ) {
 echo($metrics[$fqdn][$_GET['metric_name']]['VAL']);
 } else {
 echo("ERROR: Metric value not found");
 }
} else {
 echo "ERROR: Host not found";
}

?&gt;</pre>
<p>Nothing fancy. It contains rudimentary error checking so please be gentle <img src='http://vuksan.com/blog/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> . Feel free to extend it satisfy your needs. Also this is likely not scalable if you have hundreds of hosts and tons of requests.</p>
]]></content:encoded>
			<wfw:commentRss>http://vuksan.com/blog/2009/09/11/simple_web_service_for_ganglia_metrics/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Broken hostname resolution and PAM don&#8217;t mix</title>
		<link>http://vuksan.com/blog/2009/09/09/broken-hostname-resolution-and-pam-dont-mix/</link>
		<comments>http://vuksan.com/blog/2009/09/09/broken-hostname-resolution-and-pam-dont-mix/#comments</comments>
		<pubDate>Wed, 09 Sep 2009 13:58:53 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://vuksan.com/blog/?p=41</guid>
		<description><![CDATA[I don't mean PAM the cooking spray but Pluggable Authentication modules. I was asked to change some DNS settings for a set of hosts ie. move them from one domain to another e.g. from them being in domain.com to be in domain.net. At the end of the process head node all of the sudden started [...]]]></description>
			<content:encoded><![CDATA[<p>I don't mean PAM the cooking spray but Pluggable Authentication modules. I was asked to change some DNS settings for a set of hosts ie. move them from one domain to another e.g. from them being in domain.com to be in domain.net. At the end of the process head node all of the sudden started refusing logins with following error message</p>
<pre>fatal: Access denied for user vvuksan by PAM account configuration</pre>
<p>It took some hair pulling but after a while I concluded that the headnodes hostname was set to the old name e.g. server5.domain.com which was no longer resolvable. As soon as hostname was changed ie.</p>
<pre>% hostname server5.domain.net</pre>
<p>Things automagically started working again. Hope this prevents someone from going bald <img src='http://vuksan.com/blog/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> .</p>
]]></content:encoded>
			<wfw:commentRss>http://vuksan.com/blog/2009/09/09/broken-hostname-resolution-and-pam-dont-mix/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
