The device detection data file contains meta data that can provide additional information about the various records in the data model.This example shows how to access this data and display the values available.
To help navigate the data, it's useful to have an understanding of the types of records that are present:
The example will output each component in turn, with a list of the properties associated with each component. Some of the possible values for each property are also displayed. There are too many profiles to display, so we just list the number of profiles for each component.
Finally, the evidence keys that are accepted by device detection are listed. These are the keys that, when added to the evidence collection in flow data, could have some impact on the result returned by device detection.
using FiftyOne.Pipeline.Engines.FiftyOne.Data;
using Microsoft.Extensions.Logging;
using System;
using System.IO;
using System.Linq;
using System.Text;
{
public class Program
{
public class Example : ExampleBase
{
public void Run(string dataFile, ILoggerFactory loggerFactory, TextWriter output)
{
using (var ddEngine = new DeviceDetectionHashEngineBuilder(loggerFactory)
.SetPerformanceProfile(PerformanceProfiles.LowMemory)
.SetAutoUpdate(false)
.SetDataFileSystemWatcher(false)
.SetDataUpdateOnStartup(false)
.Build(dataFile, false))
{
OutputComponents(ddEngine, output);
OutputProfileDetails(ddEngine, output);
OutputEvidenceKeyDetails(ddEngine, output);
ExampleUtils.CheckDataFile(ddEngine, loggerFactory.CreateLogger<Program>());
}
}
private void OutputEvidenceKeyDetails(DeviceDetectionHashEngine ddEngine, TextWriter output)
{
output.WriteLine();
if(typeof(EvidenceKeyFilterWhitelist).IsAssignableFrom(ddEngine.EvidenceKeyFilter.GetType()))
{
var filter = ddEngine.EvidenceKeyFilter as EvidenceKeyFilterWhitelist;
output.WriteLine($"Accepted evidence keys:");
foreach (var entry in filter.Whitelist)
{
output.WriteLine($"\t{entry.Key}");
}
}
else
{
output.WriteLine($"The evidence key filter has type " +
$"{ddEngine.EvidenceKeyFilter.GetType().Name}. As this does not extend " +
$"EvidenceKeyFilterWhitelist, a list of accepted values cannot be " +
$"displayed. As an alternative, you can pass evidence keys to " +
$"filter.Include(string) to see if a particular key will be included " +
$"or not.");
output.WriteLine($"For example, header.user-agent is " +
(ddEngine.EvidenceKeyFilter.Include("header.user-agent") ? "" : "not ") +
"accepted.");
}
}
private void OutputProfileDetails(DeviceDetectionHashEngine ddEngine, TextWriter output)
{
var groups = ddEngine.Profiles.GroupBy(p => p.Component.Name);
output.WriteLine();
output.WriteLine($"Profile counts:");
foreach (var group in groups)
{
output.WriteLine($"{group.Key} Profiles: {group.Count()}");
}
}
private void OutputComponents(DeviceDetectionHashEngine ddEngine, TextWriter output)
{
foreach (var component in ddEngine.Components)
{
Console.ForegroundColor = ConsoleColor.White;
Console.BackgroundColor = ConsoleColor.DarkBlue;
output.Write($"Component - {component.Name}");
Console.ResetColor();
output.WriteLine();
OutputProperties(component, output);
}
}
private void OutputProperties(IComponentMetaData component, TextWriter output)
{
foreach (var property in component.Properties)
{
Console.ForegroundColor = ConsoleColor.White;
Console.BackgroundColor = ConsoleColor.DarkRed;
output.Write($"Property - {property.Name}");
Console.ResetColor();
output.WriteLine($"[Category: {property.Category}]" +
$"({property.Type.Name}) - {property.Description}");
if (property.Category != "Device Metrics")
{
StringBuilder values = new StringBuilder("Possible values: ");
foreach (var value in property.Values.Take(20))
{
values.Append(TruncateToNl(value.Name));
if (string.IsNullOrEmpty(value.Description) == false)
{
values.Append($"({value.Description})");
}
values.Append(",");
}
if (property.Values.Count() > 20)
{
values.Append($" + {property.Values.Count() - 20} more ...");
}
output.WriteLine(values);
}
}
}
private string TruncateToNl(string s)
{
var lines = s.Split(new char[] { '\n' }, StringSplitOptions.RemoveEmptyEntries);
var result = lines.FirstOrDefault();
if (lines.Length > 1)
{
result += " ...";
}
return result;
}
}
static void Main(string[] args)
{
var dataFile = args.Length > 0 ? args[0] :
ExampleUtils.FindFile(Constants.LITE_HASH_DATA_FILE_NAME);
var loggerFactory = LoggerFactory.Create(b => b.AddConsole());
var logger = loggerFactory.CreateLogger<Program>();
if (dataFile != null)
{
new Example().Run(dataFile, loggerFactory, Console.Out);
}
else
{
logger.LogError("Failed to find a device detection data file. Make sure the " +
"device-detection-data submodule has been updated by running " +
"`git submodule update --recursive`. By default, the 'lite' file included " +
"with this code will be used. A different file can be specified " +
"by supplying the full path as a command line argument");
}
loggerFactory.Dispose();
}
}
}