Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Sync fixes to release/3xx #124

Merged
merged 14 commits into from
Oct 7, 2018
5 changes: 5 additions & 0 deletions .travis.yml
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ env:
branches:
only:
- master
- release/3xx

addons:
apt:
Expand All @@ -23,5 +24,9 @@ addons:
- libssl-dev
- libunwind8

install:
- git clone https://github.com/etsy/statsd.git
- node ./statsd/stats.js ./src/JustEat.StatsD.Tests/statsdconfig.js &

script:
- ./build.sh
4 changes: 3 additions & 1 deletion appveyor.yml
Original file line number Diff line number Diff line change
@@ -1,10 +1,12 @@
os: Visual Studio 2017
version: 3.2.1.{build}
version: 3.2.2.{build}
configuration: Release
environment:
DOTNET_SKIP_FIRST_TIME_EXPERIENCE: true
NUGET_XMLDOC_MODE: skip
install:
- git clone https://github.com/etsy/statsd.git ..\statsd
- ps: Start-Process "node" -ArgumentList "..\statsd\stats.js .\src\JustEat.StatsD.Tests\statsdconfig.js" -WindowStyle Hidden
- ps: .\SetAppVeyorBuildVersion.ps1
build_script:
- ps: .\Build.ps1
Expand Down
2 changes: 1 addition & 1 deletion global.json
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
{
"sdk": {
"version": "2.1.402"
"version": "2.1.403"
}
}
2 changes: 1 addition & 1 deletion src/Benchmark/UdpTransportBenchmark.cs
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ namespace Benchmark
[MemoryDiagnoser]
public class UdpTransportBenchmark
{
private const string MetricName = "this.is.a.metric";
private const string MetricName = "this.is.a.metric:1|c";

private PooledUdpTransport _pooledTransport;
private PooledUdpTransport _pooledTransportSwitched;
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
using System.Net;
using System.Net.Sockets;
using Shouldly;
using Xunit;

namespace JustEat.StatsD.EndpointLookups
{
public static class DnsLookupIpEndpointSourceTests
{
[Fact]
public static void GetEndpointPrefersIPV4WhenHostnameIsLocalhost()
{
// Arrange
var target = new DnsLookupIpEndpointSource("localhost", 8125);

// Act
IPEndPoint actual = target.GetEndpoint();

// Assert
actual.ShouldNotBeNull();
actual.AddressFamily.ShouldBe(AddressFamily.InterNetwork);
actual.Address.ShouldBe(IPAddress.Parse("127.0.0.1"));
actual.Port.ShouldBe(8125);
}
}
}
106 changes: 106 additions & 0 deletions src/JustEat.StatsD.Tests/IntegrationTests.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,106 @@
using System;
using System.Net.Sockets;
using System.Text;
using System.Threading.Tasks;
using Newtonsoft.Json.Linq;
using Shouldly;
using Xunit;

namespace JustEat.StatsD
{
public static class IntegrationTests
{
[SkippableFact]
public static async Task Can_Send_Metrics_To_StatsD()
{
Skip.If(Environment.GetEnvironmentVariable("CI") == null, "By default, this test is only run during continuous integration.");

// Arrange
var config = new StatsDConfiguration
{
Host = "localhost",
Prefix = Guid.NewGuid().ToString().Replace("-", string.Empty)
};

var publisher = new StatsDPublisher(config);

// Act - Create a counter
publisher.Increment("apple");

// Act - Create and change a counter
publisher.Increment("bear"); // 1
publisher.Increment(10, "bear"); // 11
publisher.Increment(10, 0, "bear"); // 11
publisher.Decrement("bear"); // 10
publisher.Decrement(5, "bear"); // 5
publisher.Decrement(5, 0, "bear"); // 5

// Act - Mark an event (which is a counter)
publisher.MarkEvent("fish");

// Act - Create a gauge
publisher.Gauge(3.141, "circle");

// Act - Create and change a gauge
publisher.Gauge(10, "dog");
publisher.Gauge(42, "dog");

// Act - Create a timer
publisher.Timing(123, "elephant");
publisher.Timing(TimeSpan.FromSeconds(2), "fox");
publisher.Timing(456, 1, "goose");
publisher.Timing(TimeSpan.FromSeconds(3.5), 1, "hen");

// Act - Increment multiple counters
publisher.Increment(7, 1, "green", "red"); // 7
publisher.Increment(2, 0, "green", "red"); // 7
publisher.Decrement(1, 0, "red", "green"); // 7
publisher.Decrement(4, 1, "red", "green"); // 3

// Assert
var result = await SendCommandAsync("counters");
result.Value<int>(config.Prefix + ".apple").ShouldBe(1);
result.Value<int>(config.Prefix + ".bear").ShouldBe(5);
result.Value<int>(config.Prefix + ".fish").ShouldBe(1);
result.Value<int>(config.Prefix + ".green").ShouldBe(3);
result.Value<int>(config.Prefix + ".red").ShouldBe(3);

result = await SendCommandAsync("gauges");
result.Value<double>(config.Prefix + ".circle").ShouldBe(3.141);
result.Value<int>(config.Prefix + ".dog").ShouldBe(42);

result = await SendCommandAsync("timers");
result[config.Prefix + ".elephant"].Values<int>().ShouldBe(new[] { 123 });
result[config.Prefix + ".fox"].Values<int>().ShouldBe(new[] { 2000 });
result[config.Prefix + ".goose"].Values<int>().ShouldBe(new[] { 456 });
result[config.Prefix + ".hen"].Values<int>().ShouldBe(new[] { 3500 });
}

private static async Task<JObject> SendCommandAsync(string command)
{
string json;

using (var client = new TcpClient())
{
client.Connect("localhost", 8126);

byte[] input = Encoding.UTF8.GetBytes(command);
byte[] output = new byte[client.ReceiveBufferSize];

int bytesRead;

using (var stream = client.GetStream())
{
await stream.WriteAsync(input);
bytesRead = await stream.ReadAsync(output);
}

output = output.AsSpan(0, bytesRead).ToArray();

json = Encoding.UTF8.GetString(output).Replace("END", string.Empty);
}

return JObject.Parse(json);
}
}
}
1 change: 1 addition & 0 deletions src/JustEat.StatsD.Tests/JustEat.StatsD.Tests.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@
<PackageReference Include="Shouldly" Version="3.0.1" />
<PackageReference Include="xunit" Version="2.4.0" />
<PackageReference Include="xunit.runner.visualstudio" Version="2.4.0" />
<PackageReference Include="Xunit.SkippableFact" Version="1.3.12" />
</ItemGroup>
<ItemGroup>
<Service Include="{82a7f48d-3b50-4b1e-b82e-3ada8210c358}" />
Expand Down
89 changes: 89 additions & 0 deletions src/JustEat.StatsD.Tests/StringBasedStatsDPublisherTests.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,89 @@
using System;
using Moq;
using Xunit;

namespace JustEat.StatsD
{
public static class StringBasedStatsDPublisherTests
{
[Fact]
public static void Decrement_Sends_Multiple_Metrics()
{
// Arrange
var mock = new Mock<IStatsDTransport>();

var config = new StatsDConfiguration
{
Prefix = "red",
};

var publisher = new StringBasedStatsDPublisher(config, mock.Object);

// Act
publisher.Decrement(10, 1, "white", "blue");

// Assert
mock.Verify((p) => p.Send("red.white:-10|c"), Times.Once());
mock.Verify((p) => p.Send("red.blue:-10|c"), Times.Once());
}

[Fact]
public static void Increment_Sends_Multiple_Metrics()
{
// Arrange
var mock = new Mock<IStatsDTransport>();

var config = new StatsDConfiguration
{
Prefix = "red",
};

var publisher = new StringBasedStatsDPublisher(config, mock.Object);

// Act
publisher.Increment(10, 1, "white", "blue");

// Assert
mock.Verify((p) => p.Send("red.white:10|c"), Times.Once());
mock.Verify((p) => p.Send("red.blue:10|c"), Times.Once());
}

[Fact]
public static void Metrics_Not_Sent_If_Array_Is_Null_Or_Empty()
{
// Arrange
var mock = new Mock<IStatsDTransport>();
var config = new StatsDConfiguration();

var publisher = new StringBasedStatsDPublisher(config, mock.Object);

// Act
publisher.Decrement(1, 1, null as string[]);
publisher.Increment(1, 1, null as string[]);
publisher.Decrement(1, 1, Array.Empty<string>());
publisher.Increment(1, 1, Array.Empty<string>());
publisher.Decrement(1, 1, new[] { string.Empty });
publisher.Increment(1, 1, new[] { string.Empty });

// Assert
mock.Verify((p) => p.Send(It.IsAny<string>()), Times.Never());
}

[Fact]
public static void Metrics_Not_Sent_If_No_Metrics()
{
// Arrange
var mock = new Mock<IStatsDTransport>();
var config = new StatsDConfiguration();

var publisher = new StringBasedStatsDPublisher(config, mock.Object);

// Act
publisher.Decrement(1, 0, new[] { "foo" });
publisher.Increment(1, 0, new[] { "bar" });

// Assert
mock.Verify((p) => p.Send(It.IsAny<string>()), Times.Never());
}
}
}
10 changes: 5 additions & 5 deletions src/JustEat.StatsD.Tests/WhenUsingPooledUdpTransport.cs
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ public void AMetricCanBeSentWithoutAnExceptionBeingThrown()
using (var target = new PooledUdpTransport(endPointSource))
{
// Act and Assert
target.Send("mycustommetric");
target.Send("mycustommetric:1|c");
}
}

Expand All @@ -41,7 +41,7 @@ public void MultipleMetricsCanBeSentWithoutAnExceptionBeingThrownSerial()
for (int i = 0; i < 10_000; i++)
{
// Act and Assert
target.Send("mycustommetric");
target.Send("mycustommetric:1|c");
}
}
}
Expand All @@ -59,7 +59,7 @@ public void MultipleMetricsCanBeSentWithoutAnExceptionBeingThrownParallel()
Parallel.For(0, 10_000, _ =>
{
// Act and Assert
target.Send("mycustommetric");
target.Send("mycustommetric:1|c");
});
}
}
Expand All @@ -81,7 +81,7 @@ public static void EndpointSwitchShouldNotCauseExceptionsSequential()
for (int i = 0; i < 10_000; i++)
{
// Act and Assert
target.Send("mycustommetric");
target.Send("mycustommetric:1|c");
}
}
}
Expand All @@ -103,7 +103,7 @@ public static void EndpointSwitchShouldNotCauseExceptionsParallel()
Parallel.For(0, 10_000, _ =>
{
// Act and Assert
target.Send("mycustommetric");
target.Send("mycustommetric:1|c");
});
}
}
Expand Down
6 changes: 3 additions & 3 deletions src/JustEat.StatsD.Tests/WhenUsingUdpTransport.cs
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ public static void AMetricCanBeSentWithoutAnExceptionBeingThrown()
var target = new UdpTransport(endPointSource);

// Act and Assert
target.Send("mycustommetric");
target.Send("mycustommetric:1|c");
}

[Fact]
Expand All @@ -28,7 +28,7 @@ public static void MultipleMetricsCanBeSentWithoutAnExceptionBeingThrownSerial()
for (int i = 0; i < 10_000; i++)
{
// Act and Assert
target.Send("mycustommetric");
target.Send("mycustommetric:1|c");
}
}

Expand All @@ -42,7 +42,7 @@ public static void MultipleMetricsCanBeSentWithoutAnExceptionBeingThrownParallel

Parallel.For(0, 10_000, (_) =>
{
target.Send("mycustommetric");
target.Send("mycustommetric:1|c");
});
}
}
Expand Down
5 changes: 5 additions & 0 deletions src/JustEat.StatsD.Tests/statsdconfig.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
{
graphiteHost: "",
port: 8125,
backends: []
}
21 changes: 18 additions & 3 deletions src/JustEat.StatsD/EndpointLookups/DnsLookupIpEndpointSource.cs
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
using System;
using System;
using System.Linq;
using System.Net;
using System.Net.Sockets;

namespace JustEat.StatsD.EndpointLookups
{
Expand Down Expand Up @@ -31,7 +33,20 @@ private static IPAddress GetIpAddressOfHost(string hostName)
{
throw new Exception($"DNS did not find any addresses for statsd host '${hostName}'");
}
return endpoints[0];

IPAddress result = null;

if (endpoints.Length > 1)
{
result = endpoints.FirstOrDefault(p => p.AddressFamily == AddressFamily.InterNetwork);
}

if (result == null)
{
result = endpoints[0];
}

return result;
}
}
}
}
Loading