По вашему запросу ничего не найдено :(
Убедитесь, что запрос написан правильно, или посмотрите другие
наши статьи:
Сегодня подробно расскажем как найти практическое применение знаниям, полученным в статье про структуру asteriskcdrdb, а именно, как сделать ежедневные отчеты о входящих звонках на почту.
Создание скрипта
Чтобы наш .php скрипт смог подключиться к базе данных, необходимо создать пользователя, с правами, которые буду позволять ему извлекать необходимую информацию. Для этого, подключимся к нашему серверу по SSH
[root@asterisk]# mysql
mysql>CREATE USER ' user'@'localhost' IDENTIFIED BY 'P@ssw0rd';
На данном этапе мы создали пользователя user с паролем P@ssw0rd. Далее дадим ему необходимые права:
mysql> GRANT SELECT ON asteriskcdrdb.cdr TO 'user'
Создадим файл с расширением .php, в котором мы отразим подключение к нашей базе данных. Запишем эту конструкцию так:
$hostname = "localhost"; //адрес хоста. Скрипт мы будем запускать на той же машине, на которой находится БД asteriskcdrdb;
$username = "user"; //отражаем пользователя
$password = "P@ssw0rd"; //пароль для созданного нами пользователя
$dbName = "asteriskcdrdb"; //база данных, в которой хранятся необходимые нам данные
$today = date('y-m-d'); // сегодняшняя дата в формате 2016-03-25
$counter = 1; // счетчик
mysql_connect($hostname,$username,$password) OR DIE("Не могу создать соединение "); // соединиться к БД
mysql_select_db($dbName) or die(mysql_error()); //выбрать базу данных. Если произойдет ошибка - вывести ее
$headers = "; charset=windows-1251
"; //заголовок для письма
$headers .= "From: Мерион Нетворкс <info@merionet.ru>
";
$headers .= "Reply-To: info@merionet.ru
";
Предположим, что все входящие звонки приходят на номер секретаря – 100. Так же мы знаем, что при звонке из города, мы видим номер звонящего, который содержит в себе больше 3 символов (пусть у нас используется трехзначная внутренняя нумерация). Наша задача сводится к формулировке запроса к таблице cdr. Добавляем к нашему .php файлу:
$query = "SELECT `dst` , `src` , `duration` , `dstchannel` , `calldate` , `disposition` FROM `cdr` WHERE `calldate` >='$today 00:00:00' AND `calldate` <='$today 23:59:59' AND LENGTH( `src` ) >3 AND `dst` = '100';" ;
$res=mysql_query($query) or die(mysql_error()); // Выполнить запрос. Если произойдет ошибка - вывести ее.
$number = mysql_num_rows($res); // Как много нашлось строк
У нас почти все готово. Осталось только обработать данные на выходе. Для этого, нам понадобится следующая конструкция:
//формируем шапку нашей таблицы со значениями
$mes .= '
table style="max-width: 575px;border-bottom:none; margin: 0 auto;border-spacing: inherit;">
thead>
tr style="border-bottom: 2px solid #05477c;">
th style="padding:10px; color: #fff; max-width: 150px;background:#05477c;">Порядковый номер</th>
th style="padding:10px; color: #fff; max-width: 150px;background:#05477c;">Дата</th>
th style="padding:10px; color: #fff; max-width: 100px;background:#05477c;">От кого</th>
th style="padding:10px; color: #fff; max-width: 45px;background:#05477c;">Кому</th>
th style="padding:10px; color: #fff; max-width: 45px;background:#05477c;">Статус звонка</th>
/tr>
/thead>';
//перебираем значения ассоциативного массива. Число элементов данного массива равно числу строк на выходе sql запроса
while ($row=mysql_fetch_array($res)) { $mes .= '
tbody>
tr style="width: 100px;">
td style="padding:10px; border-bottom: 1px solid #eee; text-align:center;">'.$counter.'</td>
td style="padding:10px; border-bottom: 1px solid #eee; text-align:center;min-width: 100px;">'. $row['calldate'].'</td>
td style="padding:10px; border-bottom: 1px solid #eee; text-align:center;min-width: 100px;">'. $row['src'].'</td>
td style="padding:10px; border-bottom: 1px solid #eee; text-align:center;">'.$row['dst'].'</td>
td style="padding:10px; text-align:center; border-bottom: 1px solid #eee; min-width: 120px; ">'.$row['disposition'].'</td>
/tr>';
$counter = $counter + 1;
}
Теперь, мы храним в переменной $mes html таблицу, которая готова к отправке на почту. Добавим в конец скрипта:
mail("info@merionet.ru", 'Все входящие за '.$today.'', $mes, $headers);
ВАЖНО! Если вы используете кириллические символы, установите кодировку .php файла на Кириллицу (windows-1251)
Итак, готово. Давайте посмотрим что приходит нам на почту:
Работает. Давайте сделаем ежедневное задание на отработку этого скрипта через cron. Сделаем, например, ежедневно, в 17:30, когда рабочий день подходит к концу:
30 17 * * * php /home/admin/mail_report.php
Не забудьте в начала скрипта поставить открывающий тэг php, а в конце скрипта закрывающий.
Модули JavaScript также известны как ES-модули или ECMAScript-модули. Они предназначены для того, чтобы ваш код JavaScript был более организованным и более удобным в сопровождении.
Чем лучше вы будете понимать, как работают ES-модули, тем более профессионально вы будете справляться со своей работой разработчика JavaScript. В этой статье мы рассмотрим следующее:
Что такое модуль?
Что такое ES-модули? Для чего они нужны?
Как использовать ES-модули.
Прочие системы модулей, используемые в JavaScript.
Давайте начнем.
Что такое модуль?
Модуль в JavaScript – это обычный файл с кодом. В целом модуль можно описать как повторно используемую и независимую единицу кода.
Модули – это строительные блоки вашей кодовой базы. По мере роста вашего приложения мы можете разбивать ваш код на файлы, которые называются модулями.
С помощью модулей вы можете разбивать большие программы на фрагменты кода, которые будут более управляемыми.
Что такое ES-модули? Для чего они нужны?
ES-модули – это официальная система модулей JavaScript
. Есть и другие системы модулей, которые тоже можно использовать в JavaScript, но мы поговорим о них позже. Однако пока не забывайте о том, что мы изучаем именно ES-модули (так как они являются стандартными для JavaScript), а не какие-то другие системы модулей.
Если вы являетесь разработчиком JavaScript, то вы, скорее всего, будете использовать ES-модули постоянно.
Ниже перечислены некоторые преимущества, которые могут получить разработчики, используя ES-модули:
Организованность
. Разбивая большие программы на более мелкие части, вы поддерживаете организованность вашего кода.
Многократное использование
. Применяя ES-модули, вы можете писать код в одним месте и использовать его повторно в других файлах в рамках вашей кодовой базы. Например, вместо того, чтобы каждый раз заново писать одну и ту же функцию, вы можете написать ее внутри одного модуля, а затем импортировать его в другой файл и использовать его уже там.
Давайте посмотрим на пример того, как можно использовать ES-модули. Мы узнаем, как работают ES-модули, так что вы сможете использовать их в своих будущих проектах. Работая с ES-модулями, мы сможем увидеть каждое из преимуществ, которые мы упомянули выше.
Как использовать ES-модули
Давайте для начала создадим несложный файл JavaSvript в Replit. Весь код вы можете найти
здесь
.
Как только мы откроем Replit, мы можем создать новый проект и выбрать HTML, CSS и JavaScript. Таким образом, мы создадим начальный проект, в котором будует находиться файлы
index.html
,
scrip t.js
и
style.css
. Все это нам понадобиться, чтобы настроить проект.
Внутри нашего файла
index.html
нам нужно изменить тег
script
, добавив к нему
type="module"
. Таким образом, мы сможем использовать ES-модули в нашем коде. Тег
script
должен выглядеть вот так:
Давайте начнем с написания простой функции для сложения двух чисел. Эта функция должна взять два числа, сложить их и вернуть результат этой операции. Именно так мы и нНазовем мы эту функцию именно так –
add
. Напишем ее в нашем файле
script.js
:
function add(a, b) {
return a + b;
};
console.log(add(5, 5)); //outputs 10
На данный момент наш файл
script.js
не такой большой, в нем не так много кода. А теперь представьте, что ваше приложение растет, и у него есть десятки таких функций. Тогда файл
script.js
может стать слишком большим, и его будет не так просто сопровождать.
Давайте создадим модуль и обойдем эту проблему. Это можно сделать, нажав в Replit кнопку «Add File» («Добавить файл»). Не забывайте, что модуль – это всего лишь файл связанного кода.
Мы назовем наш модуль
math.js
. Мы уберем функцию
add
из нашего файла
script.js
и создадим новый файл
math.js
. Этот файл станет нашим модулем, в котором мы будем хранить наши математические функции. Давайте добавим нашу функцию
add
в этот файл:
// math.js
function add(a, b) {
return a + b;
};
Мы решили назвать этот модуль
math.js
, так как потом мы добавим туда еще и другие математические функции.
Если бы мы условно открыли это приложение и посмотрели на него, то сразу же поняли, что вся математическая логика находится внутри этого файла. Нам не нужно было бы тратить время на то, чтобы вникнуть в это приложение, на поиск математических функций и гадания о том, где они находятся. Мы все аккуратно организовали в файл.
Теперь давайте воспользуемся функцией
add
внутри нашего файла
script.js
. Только не стоит забывать, что сама функция находится внутри другого файла. Для этого нам нужно изучить синтаксис ES-модуля. Давайте посмотрим на такие ключевые слова, как
export
и
import
.
Ключевое слово
export
Если вы хотите, чтобы ваш модуль был доступен в других файлах (помимо того, в котором он находится), то вам необходимо воспользоваться ключевым словом
export
. Давайте применим ключевое слово
export
к нашей функции
add
, чтобы мы могли использовать ее внутри нашего файла
script.js
.
Давайте добавим ключевое слово
export default
под нашей функцией внутри файла
math.js
:
// math.js
function add(a, b) {
return a + b;
};
export default add;
Последняя строка делает так, что функция становится доступной для использования в других местах помимо модуля
math.js
.
Есть еще один способ применения ключевого слова
export
. Вы можете добавить его непосредственно перед тем, как вы будете определять функцию:
// math.js
export default function add(a, b) {
return a + b;
};
Сами по себе способы различны, но работают они одинаково.
Возможно вас заинтересовало ключевое слово
default
после слова
export
. Мы скоро к этому вернемся. А сейчас, когда мы экспортировали нашу функцию, давайте все-таки воспользуемся ей в другом файле.
Ключевое слово
import
Для того, чтобы импортировать нашу функцию
add
в наш файл
script.js
, нам понадобиться ключевое слово
import
. Импорт функции подразумевает, что мы сможем получить доступ и использовать ее в файле. Как только мы импортируем функцию, мы сможем ей воспользоваться:
// script.js
import add from './math.js';
console.log(add(2, 5)); //outputs 7
В данном случае мы используем относительный импорт (
./math.js
).
Когда мы запустим этот код, то увидим результат работы нашей функции – 7. Теперь вы можете использовать эту функцию в этом файле столько, сколько захотите.
Сам код функции не видно, и для того, чтобы использовать функцию, вам не обязательно нужно видеть егоего видеть.
Если мы попробуем ненадолго закомментировать строку
import add from './math.js'
, то сразу же получим ошибку:
ReferenceError: add is not defined
. Это происходит из-за того, что , если мы не импортируем явно явно эту функцию в файл
script.js
, а, значит,то у негоон не может нет к получить к ней доступа.
Для начала мы экспортировали нашу функцию
add
, после чего импортировали ее в наш файл
script.js
, а затем вызвали.
Давайте снова посмотрим на наш файл
math.js
. Как уже отмечалось выше, вас могло смутить слово
default
, которое было написано вместео с ключевым словом
export
. Давайте рассмотрим его поподробнее.
Экспорт по имени и экспорт по умолчанию в JavaScript
В том, что касается ES-модулей, вы можете использовать как экспорт по умолчанию, так и экспорт по имени.
В нашем первом примере мы использовали
экспорт по умолчанию
. Мы экспортировали таким образом только одно значение (нашу функцию
add
) из нашего модуля
math.js
.
Если вы используете экспорт по умолчанию, то по желанию вы можете изменить названием импорта. То есть мы можем импортировать нашу фукнциюфункцию
add
в нашем файле
script.js
и назвать ее, например,
addition
(или каким-то другим именем).
// script.js
import addition from './math.js';
console.log(addition(2, 5)); //outputs 7
А вот
экспорт по имени
используется для экспорта
нескольких значений
.
Давайте попробуем воспользоваться экспортом по имени. Вернитесь в файл
math.js
, создайте в нем еще две фукнции -
subtract
и
multiply
, и разместите их под нашей функцией
add
. Если вы используете экспорт по имени, то вы можете просто удалить ключевое слово
default
:
// math.js
export default function add(a, b) {
return a + b;
};
export function subtract(a, b) {
return a - b;
};
export function multiply(a, b) {
return a * b;
};
Давайте удалим весь код, написанный в
script.js
ранее, и импортируем наши новые функции. Для того, чтобы импортировать экспорты по имени, вам нужно заключить их в фигурные скобки:
import { multiply, subtract } from './math.js';
Теперь мы можем использовать обе эти функции внутри файла
script.js
:
// script.js
import { multiply, subtract } from './math.js';
console.log(multiply(5, 5));
console.log(subtract(10, 4))
Если вы хотите переименовать экспорт по имени, то вам понадобиться ключевое слово
as
:
import add, { subtract as substractNumbers } from './math.js';
console.log(substractNumbers(2, 5));
Выше мы переименовали импорт функции
subtract
в
subtractNumbers
.
А теперь вернемся в нашей функции
add
. Что если мы снова заходим использовать ее в нашем файле
script.js
наряду с нашими функциями
multiply
и
subtract
? Этот вопрос можно решить следующим образом:
import add, { multiply, subtract } from './math.js';
console.log(multiply(5, 5));
console.log(subtract(10, 4))
console.log(add(10, 10));
Теперь мы знаем, как можно использовать ES-модули. Мы узнали, как применять ключевые слова
export
и
import
, а также в чем состоят различия между экспортом по имени и экспортом по умолчанию. Кроме того, мы научились переименовывать как экспорты по умолчанию, так и экспорты по имени.
Прочие системы модулей в JavaScript
Если вы уже изучали модули, то вы могли использовать другой тип импорта, например, такой:
var models = require('./models')
Вот здесь можно запутаться. Давайте немного углубимся в историю модулей JavaScript, чтобы все прояснить.
Пример кода, приведенный выше, использует оператор
require
. Это CommonJS. CommonJS – это еще одна система модулей, которую можно использовать с JavaScript.
Когда JavaScript был только создан, у него не было никакой системы модулей. В следствие чего разработчики создавали свои собственные системы модулей поверх языка.
В течение многих лет создавались и использовались различные системы модулей, в том числе CommonJS. Работая с кодовой базой компании или принимая участие в проекте с открытым исходным кодом, вы можете заметить, что в них используются разные системы модулей.
В конце концов, была представлена стандартизированная система модулей JavaScript – ES-модули.
В этой статье мы узнали о том, что такое модули и для чего они нужны разработчикам. Мы узнали о том, как работают ES-модули, а также о различных типах систем модулей в JavaScript.
База данных временных рядов, она же Time Series Database (TSDB), оптимизирована для меток времени или данных временных рядов. Данные временных рядов - это средние измерения или события, которые прослежены, собраны, или объединены в течение определенного времени. Это могут быть данные, собранные из контрольных сигналов датчиков движения, метрики JVM из java-приложений, данные рыночной торговли, сетевые данные, ответы API, время безотказной работы процесса и т.д.
Базы данных временных рядов полностью настраиваются с данными временных меток, которые индексируются и эффективно записываются таким образом, что можно вставить данные временных рядов. Эти данные временных рядов можно запрашивать гораздо быстрее, чем из реляционной базы данных или базы данных NoSQL.
В последнее время она приобрела большую популярность. А почему нет? Это замечательный инструмент для мониторинга бизнеса и ИТ-операций. Хорошая новость в том, что есть множество вариантов выбора, и большинство из них - с открытым исходным кодом.
1. InfluxDB
InfluxDB является одной из самых популярных баз данных временных рядов среди DevOps, которая написана в Go. InfluxDB была разработана с самого начала, с целью обеспечить высокомасштабируемый механизм приема и хранения данных. Он очень эффективен при сборе, хранении, запросе, визуализации и выполнении действий с потоками данных временных рядов, событий и метрик в реальном времени.
Она предоставляет политики понижающей дискретизации и хранения данных для поддержания высокой ценности, высокой точности данных в памяти и более низкой ценности данных на диске. Он построен на основе "облачной" технологии для обеспечения масштабируемости в нескольких топологиях развертывания, включая локальную облачную среду и гибридные среды.
InfluxDB - это решение с открытым исходным кодом и готовое для развертывания на предприятии. Он использует InfluxQL, который очень похож на язык SQL, для взаимодействия с данными. Последняя версия содержит агенты, панели мониторинга, запросы и задачи в наборе инструментов. Это универсальный инструмент для панели мониторинга, визуализации и оповещения.
Особенности
Высокая производительность для данных временных рядов с высоким уровнем приема и запросов в реальном времени
InfluxQL для взаимодействия с данными, которые схож с языком запросов SQL.
Основной компонент стека TICK (Telegraf, InfluxDB, Chronograf и Kapacitor)
Поддержка плагинов для таких протоколов, как collectd, Graphite, OpenTSDB для приема данных
Может обрабатывать миллионы точек данных всего за 1 секунду
Политики хранения для автоматического удаления устаревших данных
Так как это открытый исходный код, вы можете загрузить и поднять его на своем сервере. Тем не менее, они предлагают InfluxDB Cloud на AWS, Azure и GCP.
2. Prometheus
Prometheus - это решение для мониторинга с открытым исходным кодом, используемое для анализа данных метрик и отправки необходимых предупреждений. Он имеет локальную базу данных временных рядов на диске, которая хранит данные в пользовательском формате на диске.
Модель данных Prometheus многомерна на основе временных рядов; он сохраняет все данные в виде потоков значений с временной меткой. Это очень полезно при работе с полностью числовым временным рядом. Сбор данных о микросервисах и их запрос - одна из сильных сторон Prometheus.
Он плотно интегрируется с Grafana для визуализации.
Особенности
Имеет многомерную модель, в которой использовались пары "имя метрики" и "ключ-значение" (метки)
PromQL используется для запроса данных временных рядов для создания таблиц, оповещений и графиков Adhoc
Использует режим HTTP pull для сбора данных временных рядов
Использует промежуточный шлюз для передачи временных рядов
У Prometheus есть сотни экспортеров для экспорта данных из Windows, Linux, Java, базы данных, API, веб-сайта, серверного оборудования, PHP, обмена сообщениями и т.д.
3. TimescaleDB
TimesterDB - реляционная база данных с открытым исходным кодом, которая делает SQL масштабируемым для данных временных рядов. Эта база данных построена на PostgreSQL.
Он предлагает два продукта - первый вариант - это бесплатное издание, которое вы можете установить на свой сервер. Второй вариант - TimesterDB Cloud, где вы получаете полностью размещенную и управляемую инфраструктуру в облаке для вашего развертывания.
Он может использоваться для мониторинга DevOps, понимания показателей приложений, отслеживания данных с устройств Интернета вещей, понимания финансовых данных и т.д. Можно измерять журналы, события Kubernetes, метрики Prometheus и даже пользовательские метрики.
Владельцы продуктов могут использовать его для понимания производительности продукта с течением времени, что помогает принимать стратегические решения для роста.
Особенности
Выполнение запросов 10-100X быстрее, чем PostgreSQL, MongoDB
Возможность горизонтального масштабирования до петабайт и записи миллионов точек данных в секунду
Очень похож на PostgreSQL, что облегчает работу с ним разработчиков и администраторов.
Сочетание функций реляционных баз данных и баз данных временных рядов для создания мощных приложений.
Встроенные алгоритмы и функции производительности для защиты от больших затрат.
4. Graphite
Graphite - это универсальное решение для хранения и эффективной визуализации данных в реальном времени. Графит может выполнять две функции: хранить данные временных рядов и визуализировать графики по требованию. Но она не собирает данные для вас; для этого можно использовать такие инструменты, как collectd, Ganglia, Sensu, telegraf и т. д.
Он имеет три компонента - Carbon, Whisper и Graphite-Web. Carbon получает данные временных рядов, агрегирует их и сохраняет на диске. Whisper - это хранилище базы данных временных рядов, в котором хранятся данные. Graphite-Web - это интерфейс для создания панелей мониторинга и визуализации данных.
Особенности Graphite:
Формат метрик, в котором передаются данные, прост.
Комплексный API для визуализации данных и создания диаграмм, панелей мониторинга, графиков
Предоставляет богатый набор статистических библиотек и функций преобразования
Связывает несколько функций визуализации для создания целевого запроса.
5. QuestDB
QuestDB - это реляционная база данных, ориентированная на столбцы, которая может выполнять анализ данных временных рядов в реальном времени. Он работает с SQL и некоторыми расширениями для создания реляционной модели для данных временных рядов. QuestDB был создан с нуля и не имеет зависимостей, повышающих его производительность.
QuestDB поддерживает реляционные соединения и соединения временных рядов, что помогает сопоставлять данные. Самый простой способ начать работу с QuestDB - развернуть его внутри контейнера Docker.
Функции QuestDB:
Интерактивная консоль для импорта данных с помощью перетаскивания и запроса
Поддерживается работа как на облачных технологиях (AWS, Azure, GCP), так и локально.
Поддерживает такие корпоративные возможности, как работа с Active Directory, обеспечение высокой доступности, корпоративная безопасность, кластеризация
Предоставляет информацию в режиме реального времени с использованием оперативной и прогнозируемой аналитики
6. AWS Timestream
Как AWS может отсутствовать в списке?
AWS Timestream - это служба базы данных временных рядов без сервера, которая является быстрой и масштабируемой. Он используется главным образом для приложений Интернета вещей, чтобы хранить триллионы событий в день и в 1000 раз быстрее при 1/10 стоимости реляционных баз данных.
С помощью специализированного механизма запросов можно одновременно запрашивать последние данные и архивные сохраненные данные. Она предоставляет множество встроенных функций для анализа данных временных рядов для поиска полезной информации.
Функции Amazon Timestream:
Нет серверов для управления или экземпляров для выделения; все обрабатывается автоматически.
Экономичный, платите только за то, что вы принимаете, храните и запрашиваете.
Способен ежедневно принимать триллионы событий без снижения производительности
Встроенная аналитика со стандартными функциями SQL, интерполяции и сглаживания для определения тенденций, шаблонов и аномалий
Все данные шифруются с помощью системы управления ключами AWS (KMS) с ключами управления клиента (CMK)
7. OpenTSDB
OpenTSDB - масштабируемая база данных временных рядов, написанная поверх HBase. Он способен хранить триллионы точек данных при миллионах операций записи в секунду. Данные в OpenTSDB можно хранить вечно с его исходной меткой времени и точным значением, чтобы не потерять данные.
Имеет демон временных рядов (TSD) и утилиты командной строки. Демон временных рядов отвечает за хранение данных в HBase или их извлечение из нее. С TSD можно общаться с помощью HTTP API, telnet или простого встроенного графического интерфейса. Для сбора данных из различных источников в OpenTSDB нужны такие инструменты, как flume, collectd, vacuumetrix и т.д.
Функции OpenTSBD:
Может агрегировать, фильтровать, понижать метрики на огромной скорости
Хранение и запись данных с точностью до миллисекунды
Работает на Hadoop и HBase и легко масштабируется, добавляя узлы в кластер
Использование графического интерфейса для создания графиков
Заключение
Поскольку в наши дни используются все больше и больше IoT или умных устройств, на веб-сайтах с миллионами событий в день в реальном времени генерируется огромный трафик, увеличивается торговля на рынке, что и привело к созданию база данных временных рядов! Базы данных временных рядов являются обязательным элементом производственного стека для мониторинга.
Большая часть вышеперечисленной базы данных временных рядов доступна для бесплатного использования, поэтому получите облачную виртуальную машину и попробуйте посмотреть, что подойдет именно вам.