private void ValidateVersion2(SamplingConfiguration samplingConfiguration, SamplingRule rule)
 {
     if (rule.Host == null || rule.HttpMethod == null || rule.UrlPath == null ||
         rule.FixedTarget == -1 || rule.Rate == -1d || rule.ServiceName != null)
     {
         throw new InvalidSamplingConfigurationException(
                   string.Format(
                       CultureInfo.InvariantCulture,
                       @"Missing required fields for sampling rules ({0}). ""host"", ""http_method"", ""url_path"", ""fixed_target"", ""rate"" are required.",
                       rule));
     }
 }
        private void Init(Stream stream)
        {
            using (var reader = new StreamReader(stream))
            {
                SamplingConfiguration samplingConfiguration = JsonMapper.ToObject <SamplingConfiguration>(reader);
                if (samplingConfiguration == null)
                {
                    throw new InvalidSamplingConfigurationException("The provided sampling configuration had invalid JSON format and cannot be parsed correctly.");
                }

                if (samplingConfiguration.Default == null)
                {
                    throw new InvalidSamplingConfigurationException("No default sampling rule is provided. A default sampling rule is required.");
                }

                if (!SupportedSamplingConfigurationVersion.Contains(samplingConfiguration.Version))
                {
                    throw new InvalidSamplingConfigurationException(
                              string.Format(
                                  CultureInfo.InvariantCulture,
                                  "The version of provided sampling configuration is not supported. Provided version = {0}, supported versions = {1}",
                                  samplingConfiguration.Version, String.Join(", ", SupportedSamplingConfigurationVersion)));
                }

                DefaultRule = samplingConfiguration.Default;

                var rules = new List <SamplingRule>();
                if (samplingConfiguration.Rules != null)
                {
                    foreach (var rule in samplingConfiguration.Rules) // contains supported versions.
                    {
                        if (IsValidVersion1(samplingConfiguration, rule))
                        {
                            rule.Host = rule.ServiceName;
                        }
                        else
                        {
                            ValidateVersion2(samplingConfiguration, rule); // rule.Host already parsed in rule.
                        }

                        rules.Add(rule);
                    }
                }

                Rules = rules;
            }
        }
        private bool IsValidVersion1(SamplingConfiguration samplingConfiguration, SamplingRule rule)
        {
            if (samplingConfiguration.Version == 1)
            {
                if (rule.ServiceName == null || rule.HttpMethod == null || rule.UrlPath == null ||
                    rule.FixedTarget == -1 || rule.Rate == -1d || rule.Host != null)
                {
                    throw new InvalidSamplingConfigurationException(
                              string.Format(
                                  CultureInfo.InvariantCulture,
                                  @"Missing required fields for sampling rules ({0}). ""service_name"", ""http_method"", ""url_path"", ""fixed_target"", ""rate"" are required.",
                                  rule));
                }

                return(true);
            }

            return(false);
        }