Мониторинг и диагностика состояния служб в локальной среде разработки Linux
Благодаря возможностям мониторинга состояния, а также выявления, диагностики и устранения неполадок службы могут работать практически без перерывов. Мониторинг и диагностика критически важны в фактически развернутой рабочей среде. Внедрение аналогичной модели при разработке служб гарантирует работу конвейера диагностики при переходе в рабочую среду. Платформа Service Fabric позволяет использовать средства диагностики, которые одинаково хорошо работают как в среде разработки на одном локальном компьютере, так и в условиях реального рабочего кластера.
Отладка приложений Java в Service Fabric
Для приложений Java доступно несколько платформ ведения журналов . Так как java.util.logging
является параметром по умолчанию в среде JRE, он также используется для примеров кода в GitHub. Далее в этой статье описывается настройка платформы java.util.logging
.
С помощью java.util.logging журналы приложения можно перенаправлять в память, потоки вывода, файлы консоли или сокеты. Для каждого из этих вариантов существуют обработчики по умолчанию, входящие в состав платформы. Чтобы настроить обработчик файлов для приложения, который будет перенаправлять все журналы в локальный файл, можно создать файл app.properties
.
Пример конфигурации приведен в следующем фрагменте кода:
handlers = java.util.logging.FileHandler
java.util.logging.FileHandler.level = ALL
java.util.logging.FileHandler.formatter = java.util.logging.SimpleFormatter
java.util.logging.FileHandler.limit = 1024000
java.util.logging.FileHandler.count = 10
java.util.logging.FileHandler.pattern = /tmp/servicefabric/logs/mysfapp%u.%g.log
Файл app.properties
должен указывать на существующую папку. Затем, после создания файла app.properties
, необходимо также изменить сценарий точки входа entrypoint.sh
в папке <applicationfolder>/<servicePkg>/Code/
, указав в качестве значения свойства java.util.logging.config.file
файл app.properties
. Запись должна выглядеть примерно так:
java -Djava.library.path=$LD_LIBRARY_PATH -Djava.util.logging.config.file=<path to app.properties> -jar <service name>.jar
В результате применения этой конфигурации журналы будут циклически собираться в папку /tmp/servicefabric/logs/
. В этом случае файл журнала называется mysfapp%u.%g.log, где:
- %u — это уникальный номер для разрешения конфликтов между параллельными процессами Java.
- %g — это номер версии для отличия чередующихся журналов.
Если обработчик не настроен явно, по умолчанию регистрируется обработчик консоли. Просмотреть журналы в системном журнале можно в папке /var/log/syslog.
Дополнительные сведения см. на странице GitHub с примерами кода.
Отладка приложений C# в Service Fabric
Для трассировки приложений CoreCLR на платформе Linux доступно несколько платформ. Дополнительные сведения см. в статье о расширениях .NET для ведения журнала. Так как EventSource знаком разработчикам на языке C#, в этой статье он используется для трассировки в образцах CoreCLR на Linux.
Сначала необходимо добавить System.Diagnostics.Tracing, чтобы иметь возможность записывать журналы в память, выходные потоки или файлы консоли. Для ведения журналов с помощью EventSource добавьте в project.json следующий проект:
"System.Diagnostics.StackTrace": "4.0.1"
Можно использовать пользовательский EventListener, чтобы прослушивать события службы и соответствующим образом перенаправлять их в файлы трассировки. В следующем фрагменте кода показан пример реализации ведения журналов с помощью EventSource и пользовательского EventListener.
public class ServiceEventSource : EventSource
{
public static ServiceEventSource Current = new ServiceEventSource();
[NonEvent]
public void Message(string message, params object[] args)
{
if (this.IsEnabled())
{
var finalMessage = string.Format(message, args);
this.Message(finalMessage);
}
}
// TBD: Need to add method for sample event.
}
internal class ServiceEventListener : EventListener
{
protected override void OnEventSourceCreated(EventSource eventSource)
{
EnableEvents(eventSource, EventLevel.LogAlways, EventKeywords.All);
}
protected override void OnEventWritten(EventWrittenEventArgs eventData)
{
using (StreamWriter Out = new StreamWriter( new FileStream("/tmp/MyServiceLog.txt", FileMode.Append)))
{
// report all event information
Out.Write(" {0} ", Write(eventData.Task.ToString(), eventData.EventName, eventData.EventId.ToString(), eventData.Level,""));
if (eventData.Message != null)
Out.WriteLine(eventData.Message, eventData.Payload.ToArray());
else
{
string[] sargs = eventData.Payload != null ? eventData.Payload.Select(o => o.ToString()).ToArray() : null;
Out.WriteLine("({0}).", sargs != null ? string.Join(", ", sargs) : "");
}
}
}
}
Предыдущий фрагмент кода выводит журналы в файл в /tmp/MyServiceLog.txt
. Это имя файла должно быть обновлено соответствующим образом. Если вы хотите перенаправить журналы в консоль, используйте следующий фрагмент кода в классе настраиваемого EventListener:
public static TextWriter Out = Console.Out;
Образцы на языке C# в репозитории GitHub регистрируют события в файл с помощью EventSource и пользовательского EventListener.
Следующие шаги
Код трассировки, добавленный в приложение, также можно использовать для диагностики приложения в кластере Azure. Ознакомьтесь с этими статьями, в которых рассматриваются различные варианты инструментов и описывается, как их настроить.