You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@trafficserver.apache.org by zw...@apache.org on 2016/02/03 21:21:07 UTC

trafficserver git commit: TS-4117 Adds a new tool to compare configs/metrics between different ATS versions

Repository: trafficserver
Updated Branches:
  refs/heads/master 60bcf3e26 -> dc0561c4d


TS-4117 Adds a new tool to compare configs/metrics between different ATS versions

This closes #432


Project: http://git-wip-us.apache.org/repos/asf/trafficserver/repo
Commit: http://git-wip-us.apache.org/repos/asf/trafficserver/commit/dc0561c4
Tree: http://git-wip-us.apache.org/repos/asf/trafficserver/tree/dc0561c4
Diff: http://git-wip-us.apache.org/repos/asf/trafficserver/diff/dc0561c4

Branch: refs/heads/master
Commit: dc0561c4d5805ab7d8e8559c8049de0d9be24c14
Parents: 60bcf3e
Author: Meera Mosale Nataraja <me...@gmail.com>
Authored: Wed Jan 20 12:02:23 2016 -0800
Committer: Leif Hedstrom <zw...@apache.org>
Committed: Wed Feb 3 13:20:33 2016 -0700

----------------------------------------------------------------------
 tools/compare_records.pl | 183 ++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 183 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/trafficserver/blob/dc0561c4/tools/compare_records.pl
----------------------------------------------------------------------
diff --git a/tools/compare_records.pl b/tools/compare_records.pl
new file mode 100755
index 0000000..cf00463
--- /dev/null
+++ b/tools/compare_records.pl
@@ -0,0 +1,183 @@
+#!/usr/bin/perl
+
+#
+## Licensed to the Apache Software Foundation (ASF) under one
+## or more contributor license agreements.  See the NOTICE file
+## distributed with this work for additional information
+## regarding copyright ownership.  The ASF licenses this file
+## to you under the Apache License, Version 2.0 (the
+## "License"); you may not use this file except in compliance
+## with the License.  You may obtain a copy of the License at
+##
+##      http://www.apache.org/licenses/LICENSE-2.0
+##
+## Unless required by applicable law or agreed to in writing, software
+## distributed under the License is distributed on an "AS IS" BASIS,
+## WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+## See the License for the specific language governing permissions and
+## limitations under the License.
+
+# This script will compare two files containing record configs and metrics.
+# It provides a list of common configs/metrics and their default value changes.
+# It also lists configs/metrics difference between the files.
+
+# By default, it compares only configs. To compare metrics, you can pass -m command
+# line argument. The files should be generated with e.g.
+#
+#    $ traffic_ctl config match .
+#
+# You can compare configs between the files:
+#     $ compare_records.pl -f <filename1> -f <filenam2>
+#
+# You can compare metrics between the files use -m command line argument:
+#     $ compare_records.pl -m -f <filename1> -f <filenam2>
+#
+# @ File compare_records.pl
+#
+use strict;
+use warnings;
+use Getopt::Long;
+
+my($file1, $file2, $in_files, $help);
+my %file1_settings;
+my %file2_settings;
+my $diff_metrics;
+
+usage() if (@ARGV < 1 or
+            !GetOptions(
+            'f=s@' => \$in_files,
+            'm' => \$diff_metrics,
+            'help|?' => \$help) or
+            defined $help);
+
+# Input file is mandatory
+die "\nTwo input files must be specified to compare\n"
+   unless defined $in_files;
+
+# Print the usage
+sub usage
+{
+  print "Unknown option: @_\n" if (@_);
+  print "Provide 2 files to compare configs or metrics.\n";
+  print "By default this tool will diff only configs,\n";
+  print "to get diff of metrics pass -m flag\n\n";
+  print "Usage: compare_records.pl -m -f <filename1> -f <filename2>\n";
+  print "   -m to diff the metrics\n";
+  print "   -h for help\n\n";
+  print "where the files are generated with e.g.\n\n";
+  print "    \$ traffic_ctl config match .\n";
+  exit;
+}
+
+my @file_list = @$in_files;
+die "\nProvide only two files to compare\n" if (scalar(@file_list) != 2);
+my $in_file1 = $file_list[0];
+my $in_file2 = $file_list[1];
+
+# Open input files
+if (defined $in_file1) {
+  open $file1, $in_file1 or die "Could not open $in_file1: $!";
+}
+if (defined $in_file2) {
+  open $file2, $in_file2 or die "Could not open $in_file2: $!";
+}
+
+# Read input files
+while (my $setting = <$file1>) {
+  chomp $setting;
+  my($record, $value) = split(/:/, $setting);
+  if (defined $diff_metrics) {
+    # Obtain only metrics, excluding configs
+    if ($record !~ /proxy.config/) {
+      $file1_settings{$record} = $value;
+    }
+  } else {
+    # Obtain only configs
+    if ($record =~ /proxy.config/) {
+      $file1_settings{$record} = $value;
+    }
+  }
+}
+close $file1;
+
+while (my $setting = <$file2>) {
+  chomp $setting;
+  my($record, $value) = split(/:/, $setting);
+  if (defined $diff_metrics) {
+    # Obtain only metrics, excluding configs
+    if ($record !~ /proxy.config/) {
+      $file2_settings{$record} = $value;
+    }
+  } else {
+    # Obtain only configs
+    if ($record =~ /proxy.config/) {
+      $file2_settings{$record} = $value;
+    }
+  }
+}
+close $file2;
+
+# Subroutine to compare configs/metrics and obtain common and difference between them
+sub compare_configs_or_metrics
+{
+  my($records1, $records2, $file) = @_;
+  my %common_settings;
+  my %diff_settings;
+  my %settings1 = %$records1;
+  my %settings2 = %$records2;
+
+  foreach my $record(sort keys %settings1) {
+    if ($settings2{$record}) {
+      $common_settings{$record} = $settings1{$record};
+    } else {
+      $diff_settings{$record} = $settings1{$record};
+    }
+  }
+
+  print "####################################################################################\n";
+  print "Configs/metrics found only in $file\n";
+  print "####################################################################################\n";
+  foreach my $key(sort keys %diff_settings)
+  {
+    print "$key\n";
+  }
+  return (\%common_settings);
+}
+
+# Subroutine to obtain changes in default values among common configs/metrics
+sub compare_default_values
+{
+  my($records1, $records2) = @_;
+  my %settings1 = %$records1;
+  my %settings2 = %$records2;
+
+  foreach my $record(sort keys %settings1) {
+    if (defined $settings1{$record} && $settings2{$record}) {
+      if ($settings1{$record} ne $settings2{$record}) {
+        # Values doesn't match
+        print "$record default value changed from $settings1{$record} -> $settings2{$record}\n";
+      }
+    }
+  }
+}
+
+# Obtain common configs/metrics between two files
+my $common2 = compare_configs_or_metrics(\%file2_settings, \%file1_settings, $in_file2);
+my %common2_settings = %$common2;
+
+my $common1 = compare_configs_or_metrics(\%file1_settings, \%file2_settings, $in_file1);
+my %common1_settings = %$common1;
+
+print "####################################################################################\n";
+print "Common configs/metrics between $in_file1 and $in_file2\n";
+print "####################################################################################\n";
+foreach my $key(sort keys %common2_settings)
+{
+  print "$key\n";
+}
+
+# Compare common configs/metrics and obtain changes in default values
+print "####################################################################################\n";
+print "Default value changes in common configs/metrics between $in_file1 and $in_file2\n";
+print "####################################################################################\n";
+compare_default_values(\%common1_settings, \%common2_settings);